openvibe 0.60.2 → 0.60.3

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 (312) hide show
  1. package/dist/cli/args.d.ts +1 -1
  2. package/dist/cli/args.d.ts.map +1 -1
  3. package/dist/cli/args.js.map +1 -1
  4. package/dist/cli/config-selector.d.ts.map +1 -1
  5. package/dist/cli/config-selector.js +1 -1
  6. package/dist/cli/config-selector.js.map +1 -1
  7. package/dist/cli/file-processor.d.ts +1 -1
  8. package/dist/cli/file-processor.d.ts.map +1 -1
  9. package/dist/cli/file-processor.js.map +1 -1
  10. package/dist/cli/session-picker.d.ts.map +1 -1
  11. package/dist/cli/session-picker.js +1 -1
  12. package/dist/cli/session-picker.js.map +1 -1
  13. package/dist/cli.d.ts.map +1 -1
  14. package/dist/cli.js +2 -2
  15. package/dist/cli.js.map +1 -1
  16. package/dist/core/accelerated-client.d.ts +1 -1
  17. package/dist/core/accelerated-client.d.ts.map +1 -1
  18. package/dist/core/accelerated-client.js +2 -2
  19. package/dist/core/accelerated-client.js.map +1 -1
  20. package/dist/core/accelerated-stream.d.ts +1 -1
  21. package/dist/core/accelerated-stream.d.ts.map +1 -1
  22. package/dist/core/accelerated-stream.js.map +1 -1
  23. package/dist/core/agent-session.d.ts +2 -2
  24. package/dist/core/agent-session.d.ts.map +1 -1
  25. package/dist/core/agent-session.js +1 -1
  26. package/dist/core/agent-session.js.map +1 -1
  27. package/dist/core/api-concurrency.d.ts +1 -1
  28. package/dist/core/api-concurrency.d.ts.map +1 -1
  29. package/dist/core/api-concurrency.js +3 -3
  30. package/dist/core/api-concurrency.js.map +1 -1
  31. package/dist/core/auth-storage.d.ts +2 -2
  32. package/dist/core/auth-storage.d.ts.map +1 -1
  33. package/dist/core/auth-storage.js +2 -2
  34. package/dist/core/auth-storage.js.map +1 -1
  35. package/dist/core/branded-ai.d.ts +1 -1
  36. package/dist/core/branded-ai.d.ts.map +1 -1
  37. package/dist/core/branded-ai.js.map +1 -1
  38. package/dist/core/compaction/branch-summarization.d.ts +2 -2
  39. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  40. package/dist/core/compaction/branch-summarization.js +1 -1
  41. package/dist/core/compaction/branch-summarization.js.map +1 -1
  42. package/dist/core/compaction/compaction.d.ts +2 -2
  43. package/dist/core/compaction/compaction.d.ts.map +1 -1
  44. package/dist/core/compaction/compaction.js +1 -1
  45. package/dist/core/compaction/compaction.js.map +1 -1
  46. package/dist/core/compaction/utils.d.ts +2 -2
  47. package/dist/core/compaction/utils.d.ts.map +1 -1
  48. package/dist/core/compaction/utils.js.map +1 -1
  49. package/dist/core/context-manager.d.ts +1 -1
  50. package/dist/core/context-manager.d.ts.map +1 -1
  51. package/dist/core/context-manager.js.map +1 -1
  52. package/dist/core/context-provider-interface.d.ts +1 -1
  53. package/dist/core/context-provider-interface.d.ts.map +1 -1
  54. package/dist/core/context-provider-interface.js.map +1 -1
  55. package/dist/core/context-provider-registry.d.ts +1 -1
  56. package/dist/core/context-provider-registry.d.ts.map +1 -1
  57. package/dist/core/context-provider-registry.js.map +1 -1
  58. package/dist/core/defaults.d.ts +1 -1
  59. package/dist/core/defaults.d.ts.map +1 -1
  60. package/dist/core/defaults.js.map +1 -1
  61. package/dist/core/export-html/index.d.ts +1 -1
  62. package/dist/core/export-html/index.d.ts.map +1 -1
  63. package/dist/core/export-html/index.js.map +1 -1
  64. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  65. package/dist/core/export-html/tool-renderer.js.map +1 -1
  66. package/dist/core/extensions/loader.d.ts.map +1 -1
  67. package/dist/core/extensions/loader.js +14 -14
  68. package/dist/core/extensions/loader.js.map +1 -1
  69. package/dist/core/extensions/runner.d.ts +3 -3
  70. package/dist/core/extensions/runner.d.ts.map +1 -1
  71. package/dist/core/extensions/runner.js.map +1 -1
  72. package/dist/core/extensions/types.d.ts +3 -3
  73. package/dist/core/extensions/types.d.ts.map +1 -1
  74. package/dist/core/extensions/types.js.map +1 -1
  75. package/dist/core/extensions/wrapper.d.ts +1 -1
  76. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  77. package/dist/core/extensions/wrapper.js.map +1 -1
  78. package/dist/core/keybindings.d.ts +1 -1
  79. package/dist/core/keybindings.d.ts.map +1 -1
  80. package/dist/core/keybindings.js +1 -1
  81. package/dist/core/keybindings.js.map +1 -1
  82. package/dist/core/large-context-provider.d.ts +1 -1
  83. package/dist/core/large-context-provider.d.ts.map +1 -1
  84. package/dist/core/large-context-provider.js.map +1 -1
  85. package/dist/core/messages.d.ts +3 -3
  86. package/dist/core/messages.d.ts.map +1 -1
  87. package/dist/core/messages.js.map +1 -1
  88. package/dist/core/model-registry.d.ts +1 -1
  89. package/dist/core/model-registry.d.ts.map +1 -1
  90. package/dist/core/model-registry.js +1 -1
  91. package/dist/core/model-registry.js.map +1 -1
  92. package/dist/core/model-resolver.d.ts +2 -2
  93. package/dist/core/model-resolver.d.ts.map +1 -1
  94. package/dist/core/model-resolver.js.map +1 -1
  95. package/dist/core/response-accelerator.d.ts +1 -1
  96. package/dist/core/response-accelerator.d.ts.map +1 -1
  97. package/dist/core/response-accelerator.js.map +1 -1
  98. package/dist/core/sdk.d.ts +2 -2
  99. package/dist/core/sdk.d.ts.map +1 -1
  100. package/dist/core/sdk.js +1 -1
  101. package/dist/core/sdk.js.map +1 -1
  102. package/dist/core/session-manager.d.ts +2 -2
  103. package/dist/core/session-manager.d.ts.map +1 -1
  104. package/dist/core/session-manager.js.map +1 -1
  105. package/dist/core/settings-manager.d.ts +1 -1
  106. package/dist/core/settings-manager.d.ts.map +1 -1
  107. package/dist/core/settings-manager.js.map +1 -1
  108. package/dist/core/system-prompt.d.ts +1 -1
  109. package/dist/core/system-prompt.d.ts.map +1 -1
  110. package/dist/core/system-prompt.js.map +1 -1
  111. package/dist/core/tools/bash.d.ts +1 -1
  112. package/dist/core/tools/bash.d.ts.map +1 -1
  113. package/dist/core/tools/bash.js.map +1 -1
  114. package/dist/core/tools/edit.d.ts +1 -1
  115. package/dist/core/tools/edit.d.ts.map +1 -1
  116. package/dist/core/tools/edit.js.map +1 -1
  117. package/dist/core/tools/fast-executor.d.ts +2 -2
  118. package/dist/core/tools/fast-executor.d.ts.map +1 -1
  119. package/dist/core/tools/fast-executor.js.map +1 -1
  120. package/dist/core/tools/find.d.ts +1 -1
  121. package/dist/core/tools/find.d.ts.map +1 -1
  122. package/dist/core/tools/find.js.map +1 -1
  123. package/dist/core/tools/grep.d.ts +1 -1
  124. package/dist/core/tools/grep.d.ts.map +1 -1
  125. package/dist/core/tools/grep.js.map +1 -1
  126. package/dist/core/tools/index.d.ts +1 -1
  127. package/dist/core/tools/index.d.ts.map +1 -1
  128. package/dist/core/tools/index.js.map +1 -1
  129. package/dist/core/tools/ls.d.ts +1 -1
  130. package/dist/core/tools/ls.d.ts.map +1 -1
  131. package/dist/core/tools/ls.js.map +1 -1
  132. package/dist/core/tools/read.d.ts +1 -1
  133. package/dist/core/tools/read.d.ts.map +1 -1
  134. package/dist/core/tools/read.js.map +1 -1
  135. package/dist/core/tools/write.d.ts +1 -1
  136. package/dist/core/tools/write.d.ts.map +1 -1
  137. package/dist/core/tools/write.js.map +1 -1
  138. package/dist/main.d.ts.map +1 -1
  139. package/dist/main.js +1 -1
  140. package/dist/main.js.map +1 -1
  141. package/dist/modes/interactive/components/armin.d.ts +1 -1
  142. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  143. package/dist/modes/interactive/components/armin.js.map +1 -1
  144. package/dist/modes/interactive/components/assistant-message.d.ts +2 -2
  145. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  146. package/dist/modes/interactive/components/assistant-message.js +1 -1
  147. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  148. package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
  149. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  150. package/dist/modes/interactive/components/bash-execution.js +1 -1
  151. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  152. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
  153. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  154. package/dist/modes/interactive/components/bordered-loader.js +1 -1
  155. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  156. package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
  157. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  158. package/dist/modes/interactive/components/branch-summary-message.js +1 -1
  159. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  160. package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
  161. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  162. package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  163. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  164. package/dist/modes/interactive/components/config-selector.d.ts +1 -1
  165. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  166. package/dist/modes/interactive/components/config-selector.js +1 -1
  167. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  168. package/dist/modes/interactive/components/countdown-timer.d.ts +1 -1
  169. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  170. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  171. package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
  172. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  173. package/dist/modes/interactive/components/custom-editor.js +1 -1
  174. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  175. package/dist/modes/interactive/components/custom-message.d.ts +1 -1
  176. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  177. package/dist/modes/interactive/components/custom-message.js +1 -1
  178. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  179. package/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  180. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  181. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  182. package/dist/modes/interactive/components/dynamic-border.d.ts +1 -1
  183. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  184. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  185. package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
  186. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  187. package/dist/modes/interactive/components/extension-editor.js +1 -1
  188. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  189. package/dist/modes/interactive/components/extension-input.d.ts +1 -1
  190. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  191. package/dist/modes/interactive/components/extension-input.js +1 -1
  192. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  193. package/dist/modes/interactive/components/extension-selector.d.ts +1 -1
  194. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  195. package/dist/modes/interactive/components/extension-selector.js +1 -1
  196. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  197. package/dist/modes/interactive/components/footer.d.ts +1 -1
  198. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  199. package/dist/modes/interactive/components/footer.js +1 -1
  200. package/dist/modes/interactive/components/footer.js.map +1 -1
  201. package/dist/modes/interactive/components/keybinding-hints.d.ts +1 -1
  202. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  203. package/dist/modes/interactive/components/keybinding-hints.js +1 -1
  204. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  205. package/dist/modes/interactive/components/onboarding-wizard.d.ts +2 -2
  206. package/dist/modes/interactive/components/onboarding-wizard.d.ts.map +1 -1
  207. package/dist/modes/interactive/components/onboarding-wizard.js +1 -1
  208. package/dist/modes/interactive/components/onboarding-wizard.js.map +1 -1
  209. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  210. package/dist/modes/interactive/components/session-selector-search.js +1 -1
  211. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  212. package/dist/modes/interactive/components/session-selector.d.ts +1 -1
  213. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  214. package/dist/modes/interactive/components/session-selector.js +1 -1
  215. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  216. package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
  217. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  218. package/dist/modes/interactive/components/settings-selector.js +1 -1
  219. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  220. package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
  221. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  222. package/dist/modes/interactive/components/show-images-selector.js +1 -1
  223. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  224. package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
  225. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  226. package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  227. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  228. package/dist/modes/interactive/components/skills-selector.d.ts +1 -1
  229. package/dist/modes/interactive/components/skills-selector.d.ts.map +1 -1
  230. package/dist/modes/interactive/components/skills-selector.js +1 -1
  231. package/dist/modes/interactive/components/skills-selector.js.map +1 -1
  232. package/dist/modes/interactive/components/theme-selector.d.ts +1 -1
  233. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  234. package/dist/modes/interactive/components/theme-selector.js +1 -1
  235. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  236. package/dist/modes/interactive/components/thinking-selector.d.ts +2 -2
  237. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  238. package/dist/modes/interactive/components/thinking-selector.js +1 -1
  239. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  240. package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
  241. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  242. package/dist/modes/interactive/components/tool-execution.js +1 -1
  243. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  244. package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
  245. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  246. package/dist/modes/interactive/components/tree-selector.js +1 -1
  247. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  248. package/dist/modes/interactive/components/user-message-selector.d.ts +1 -1
  249. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  250. package/dist/modes/interactive/components/user-message-selector.js +1 -1
  251. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  252. package/dist/modes/interactive/components/user-message.d.ts +1 -1
  253. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  254. package/dist/modes/interactive/components/user-message.js +1 -1
  255. package/dist/modes/interactive/components/user-message.js.map +1 -1
  256. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  257. package/dist/modes/interactive/components/visual-truncate.js +1 -1
  258. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  259. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  260. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  261. package/dist/modes/interactive/interactive-mode.js +1 -1
  262. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  263. package/dist/modes/interactive/theme/theme.d.ts +2 -2
  264. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  265. package/dist/modes/interactive/theme/theme.js +1 -1
  266. package/dist/modes/interactive/theme/theme.js.map +1 -1
  267. package/dist/modes/print-mode.d.ts +1 -1
  268. package/dist/modes/print-mode.d.ts.map +1 -1
  269. package/dist/modes/print-mode.js.map +1 -1
  270. package/dist/modes/rpc/rpc-client.d.ts +2 -2
  271. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  272. package/dist/modes/rpc/rpc-client.js.map +1 -1
  273. package/dist/modes/rpc/rpc-types.d.ts +2 -2
  274. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  275. package/dist/modes/rpc/rpc-types.js.map +1 -1
  276. package/dist/utils/image-resize.d.ts +1 -1
  277. package/dist/utils/image-resize.d.ts.map +1 -1
  278. package/dist/utils/image-resize.js.map +1 -1
  279. package/examples/extensions/antigravity-image-gen.ts +1 -1
  280. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  281. package/examples/extensions/custom-compaction.ts +1 -1
  282. package/examples/extensions/custom-footer.ts +2 -2
  283. package/examples/extensions/custom-provider-anthropic/index.ts +1 -1
  284. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  285. package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
  286. package/examples/extensions/custom-provider-qwen-cli/index.ts +1 -1
  287. package/examples/extensions/doom-overlay/doom-component.ts +2 -2
  288. package/examples/extensions/doom-overlay/doom-keys.ts +1 -1
  289. package/examples/extensions/handoff.ts +1 -1
  290. package/examples/extensions/hello.ts +1 -1
  291. package/examples/extensions/message-renderer.ts +1 -1
  292. package/examples/extensions/minimal-mode.ts +1 -1
  293. package/examples/extensions/modal-editor.ts +1 -1
  294. package/examples/extensions/overlay-qa-tests.ts +2 -2
  295. package/examples/extensions/overlay-test.ts +1 -1
  296. package/examples/extensions/plan-mode/index.ts +3 -3
  297. package/examples/extensions/preset.ts +1 -1
  298. package/examples/extensions/qna.ts +1 -1
  299. package/examples/extensions/question.ts +1 -1
  300. package/examples/extensions/questionnaire.ts +1 -1
  301. package/examples/extensions/snake.ts +1 -1
  302. package/examples/extensions/space-invaders.ts +1 -1
  303. package/examples/extensions/subagent/index.ts +4 -4
  304. package/examples/extensions/summarize.ts +2 -2
  305. package/examples/extensions/todo.ts +2 -2
  306. package/examples/extensions/tool-override.ts +1 -1
  307. package/examples/extensions/tools.ts +1 -1
  308. package/examples/extensions/truncated-tool.ts +1 -1
  309. package/examples/rpc-extension-ui.ts +1 -1
  310. package/examples/sdk/02-custom-model.ts +1 -1
  311. package/examples/sdk/12-full-control.ts +1 -1
  312. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../src/core/context-manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context Manager - Independent Architecture for Large Context Support\n * Provides 1M context window support through a third-party architecture\n * Works transparently with all models without modifying prompts\n */\n\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { getAgentDir } from \"../config.js\";\n\n/**\n * Context configuration for models\n */\nexport interface ContextConfig {\n\t/** Context window size in tokens */\n\tcontextWindow: number;\n\t/** Maximum output tokens */\n\tmaxTokens: number;\n\t/** Whether to enable chunking for large contexts */\n\tenableChunking?: boolean;\n\t/** Chunk size for processing (default: auto-calculated) */\n\tchunkSize?: number;\n\t/** Overlap between chunks (default: 2000 tokens) */\n\tchunkOverlap?: number;\n\t/** Enable context caching */\n\tenableCaching?: boolean;\n\t/** Cache TTL in seconds */\n\tcacheTTL?: number;\n}\n\n/**\n * Provider-level context configuration\n */\nexport interface ProviderContextConfig {\n\t/** Provider name */\n\tprovider: string;\n\t/** Base URL override */\n\tbaseUrl?: string;\n\t/** Default context for all models under this provider */\n\tdefaultContext?: Partial<ContextConfig>;\n\t/** Per-model context overrides */\n\tmodels?: Record<string, ContextConfig>;\n}\n\n/**\n * Global context configuration\n */\nexport interface GlobalContextConfig {\n\t/** Enable large context support globally */\n\tenabled: boolean;\n\t/** Default context window (used when model doesn't specify) */\n\tdefaultContextWindow: number;\n\t/** Default max output tokens */\n\tdefaultMaxTokens: number;\n\t/** Provider configurations */\n\tproviders: ProviderContextConfig[];\n\t/** Model-specific overrides */\n\tmodelOverrides?: Record<string, ContextConfig>;\n}\n\n/**\n * Context stats for monitoring\n */\nexport interface ContextStats {\n\t/** Total context tokens used */\n\ttokensUsed: number;\n\t/** Context window size */\n\tcontextWindow: number;\n\t/** Utilization percentage */\n\tutilization: number;\n\t/** Number of chunks processed */\n\tchunksProcessed?: number;\n\t/** Cache hit rate */\n\tcacheHitRate?: number;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: GlobalContextConfig = {\n\tenabled: true,\n\tdefaultContextWindow: 1000000, // 1M tokens\n\tdefaultMaxTokens: 65536,\n\tproviders: [],\n};\n\n/**\n * Known large context models with their configurations\n */\nexport const LARGE_CONTEXT_MODELS: Record<string, ContextConfig> = {\n\t// OpenAI\n\t\"gpt-4-turbo\": { contextWindow: 128000, maxTokens: 4096 },\n\t\"gpt-4-turbo-preview\": { contextWindow: 128000, maxTokens: 4096 },\n\t\"gpt-4o\": { contextWindow: 128000, maxTokens: 16384 },\n\t\"gpt-4o-mini\": { contextWindow: 128000, maxTokens: 16384 },\n\n\t// Anthropic\n\t\"claude-3-opus\": { contextWindow: 200000, maxTokens: 4096 },\n\t\"claude-3-sonnet\": { contextWindow: 200000, maxTokens: 4096 },\n\t\"claude-3-haiku\": { contextWindow: 200000, maxTokens: 4096 },\n\t\"claude-3-5-sonnet\": { contextWindow: 200000, maxTokens: 8192 },\n\t\"claude-3-5-haiku\": { contextWindow: 200000, maxTokens: 8192 },\n\t\"claude-sonnet-4\": { contextWindow: 200000, maxTokens: 16384 },\n\n\t// Google\n\t\"gemini-1.5-pro\": { contextWindow: 1000000, maxTokens: 8192 },\n\t\"gemini-1.5-flash\": { contextWindow: 1000000, maxTokens: 8192 },\n\t\"gemini-2.0-flash\": { contextWindow: 1000000, maxTokens: 8192 },\n\n\t// DeepSeek\n\t\"deepseek-chat\": { contextWindow: 64000, maxTokens: 4096 },\n\t\"deepseek-coder\": { contextWindow: 64000, maxTokens: 4096 },\n\t\"deepseek-reasoner\": { contextWindow: 64000, maxTokens: 8192 },\n\n\t// Mistral\n\t\"mistral-large\": { contextWindow: 128000, maxTokens: 8192 },\n\t\"mistral-medium\": { contextWindow: 32000, maxTokens: 8192 },\n\n\t// Meta Llama\n\t\"llama-3.1-405b\": { contextWindow: 128000, maxTokens: 16384 },\n\t\"llama-3.1-70b\": { contextWindow: 128000, maxTokens: 16384 },\n\t\"llama-3.1-8b\": { contextWindow: 128000, maxTokens: 16384 },\n\n\t// Qwen\n\t\"qwen-2.5-72b\": { contextWindow: 131072, maxTokens: 8192 },\n\t\"qwen-2.5-32b\": { contextWindow: 131072, maxTokens: 8192 },\n\t\"qwen-max\": { contextWindow: 1000000, maxTokens: 65536 },\n\n\t// Moonshot (Kimi)\n\t\"moonshot-v1-8k\": { contextWindow: 8192, maxTokens: 4096 },\n\t\"moonshot-v1-32k\": { contextWindow: 32768, maxTokens: 4096 },\n\t\"moonshot-v1-128k\": { contextWindow: 131072, maxTokens: 4096 },\n\n\t// Yi\n\t\"yi-lightning\": { contextWindow: 16384, maxTokens: 4096 },\n\t\"yi-large\": { contextWindow: 32768, maxTokens: 4096 },\n\t\"yi-large-turbo\": { contextWindow: 16384, maxTokens: 4096 },\n\n\t// GLM\n\t\"glm-4\": { contextWindow: 128000, maxTokens: 4096 },\n\t\"glm-4-plus\": { contextWindow: 128000, maxTokens: 4096 },\n\n\t// Default large context for unknown models\n\t\"default-large\": { contextWindow: 1000000, maxTokens: 65536 },\n};\n\n/**\n * Context Manager\n * Manages context window configuration for all models\n */\nexport class ContextManager {\n\tprivate config: GlobalContextConfig;\n\tprivate configPath: string;\n\tprivate static instance: ContextManager | null = null;\n\n\tprivate constructor() {\n\t\tthis.configPath = join(getAgentDir(), \"context-config.json\");\n\t\tthis.config = this.loadConfig();\n\t}\n\n\t/**\n\t * Get the singleton instance\n\t */\n\tstatic getInstance(): ContextManager {\n\t\tif (!ContextManager.instance) {\n\t\t\tContextManager.instance = new ContextManager();\n\t\t}\n\t\treturn ContextManager.instance;\n\t}\n\n\t/**\n\t * Load configuration from file\n\t */\n\tprivate loadConfig(): GlobalContextConfig {\n\t\ttry {\n\t\t\tif (existsSync(this.configPath)) {\n\t\t\t\tconst content = readFileSync(this.configPath, \"utf-8\");\n\t\t\t\tconst loaded = JSON.parse(content) as Partial<GlobalContextConfig>;\n\t\t\t\treturn { ...DEFAULT_CONFIG, ...loaded };\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to load context config:\", error);\n\t\t}\n\t\treturn { ...DEFAULT_CONFIG };\n\t}\n\n\t/**\n\t * Save configuration to file\n\t */\n\tsaveConfig(): void {\n\t\ttry {\n\t\t\tconst agentDir = getAgentDir();\n\t\t\tif (!existsSync(agentDir)) {\n\t\t\t\tconst { mkdirSync } = require(\"fs\");\n\t\t\t\tmkdirSync(agentDir, { recursive: true });\n\t\t\t}\n\t\t\twriteFileSync(this.configPath, JSON.stringify(this.config, null, 2));\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to save context config:\", error);\n\t\t}\n\t}\n\n\t/**\n\t * Get current configuration\n\t */\n\tgetConfig(): GlobalContextConfig {\n\t\treturn { ...this.config };\n\t}\n\n\t/**\n\t * Update configuration\n\t */\n\tupdateConfig(updates: Partial<GlobalContextConfig>): void {\n\t\tthis.config = { ...this.config, ...updates };\n\t\tthis.saveConfig();\n\t}\n\n\t/**\n\t * Get context configuration for a model\n\t */\n\tgetContextForModel(modelId: string): ContextConfig {\n\t\t// Check model overrides first\n\t\tif (this.config.modelOverrides?.[modelId]) {\n\t\t\treturn this.config.modelOverrides[modelId];\n\t\t}\n\n\t\t// Check known models\n\t\tconst normalizedId = modelId.toLowerCase();\n\t\tfor (const [pattern, config] of Object.entries(LARGE_CONTEXT_MODELS)) {\n\t\t\tif (normalizedId.includes(pattern.toLowerCase()) || pattern.toLowerCase().includes(normalizedId)) {\n\t\t\t\treturn config;\n\t\t\t}\n\t\t}\n\n\t\t// Check provider defaults\n\t\tfor (const provider of this.config.providers) {\n\t\t\tif (provider.models?.[modelId]) {\n\t\t\t\treturn provider.models[modelId];\n\t\t\t}\n\t\t}\n\n\t\t// Return default large context\n\t\treturn {\n\t\t\tcontextWindow: this.config.defaultContextWindow,\n\t\t\tmaxTokens: this.config.defaultMaxTokens,\n\t\t};\n\t}\n\n\t/**\n\t * Set context configuration for a specific model\n\t */\n\tsetContextForModel(modelId: string, config: ContextConfig): void {\n\t\tif (!this.config.modelOverrides) {\n\t\t\tthis.config.modelOverrides = {};\n\t\t}\n\t\tthis.config.modelOverrides[modelId] = config;\n\t\tthis.saveConfig();\n\t}\n\n\t/**\n\t * Register a provider with context configuration\n\t */\n\tregisterProvider(providerConfig: ProviderContextConfig): void {\n\t\tconst existingIndex = this.config.providers.findIndex((p) => p.provider === providerConfig.provider);\n\t\tif (existingIndex >= 0) {\n\t\t\tthis.config.providers[existingIndex] = providerConfig;\n\t\t} else {\n\t\t\tthis.config.providers.push(providerConfig);\n\t\t}\n\t\tthis.saveConfig();\n\t}\n\n\t/**\n\t * Enhance a model with context configuration\n\t * This is the main entry point for the third-party architecture\n\t */\n\tenhanceModel<API extends Api>(model: Model<API>): Model<API> {\n\t\tif (!this.config.enabled) {\n\t\t\treturn model;\n\t\t}\n\n\t\tconst contextConfig = this.getContextForModel(model.id);\n\n\t\treturn {\n\t\t\t...model,\n\t\t\tcontextWindow: contextConfig.contextWindow,\n\t\t\tmaxTokens: contextConfig.maxTokens,\n\t\t};\n\t}\n\n\t/**\n\t * Calculate optimal chunk size based on context window\n\t */\n\tcalculateChunkSize(contextWindow: number): number {\n\t\t// Aim for 10% of context window as chunk size\n\t\t// But cap at 32K tokens for efficiency\n\t\tconst targetChunkSize = Math.floor(contextWindow * 0.1);\n\t\treturn Math.min(targetChunkSize, 32768);\n\t}\n\n\t/**\n\t * Get context stats\n\t */\n\tgetStats(tokensUsed: number, modelId: string): ContextStats {\n\t\tconst config = this.getContextForModel(modelId);\n\t\tconst utilization = (tokensUsed / config.contextWindow) * 100;\n\n\t\treturn {\n\t\t\ttokensUsed,\n\t\t\tcontextWindow: config.contextWindow,\n\t\t\tutilization: Math.min(utilization, 100),\n\t\t};\n\t}\n\n\t/**\n\t * Check if model supports large context\n\t */\n\tisLargeContextModel(modelId: string): boolean {\n\t\tconst config = this.getContextForModel(modelId);\n\t\treturn config.contextWindow >= 100000;\n\t}\n\n\t/**\n\t * Get recommended settings for a model\n\t */\n\tgetRecommendedSettings(modelId: string): {\n\t\tcontextWindow: number;\n\t\tmaxTokens: number;\n\t\tchunkSize: number;\n\t\tenableChunking: boolean;\n\t} {\n\t\tconst config = this.getContextForModel(modelId);\n\t\tconst chunkSize = this.calculateChunkSize(config.contextWindow);\n\n\t\treturn {\n\t\t\tcontextWindow: config.contextWindow,\n\t\t\tmaxTokens: config.maxTokens,\n\t\t\tchunkSize,\n\t\t\tenableChunking: config.enableChunking ?? config.contextWindow >= 200000,\n\t\t};\n\t}\n}\n\n/**\n * Context middleware for request interception\n */\nexport class ContextMiddleware {\n\tprivate manager: ContextManager;\n\n\tconstructor() {\n\t\tthis.manager = ContextManager.getInstance();\n\t}\n\n\t/**\n\t * Process context before sending to API\n\t */\n\tprocessContext(\n\t\tmessages: unknown[],\n\t\tmodelId: string,\n\t): {\n\t\tmessages: unknown[];\n\t\ttruncated: boolean;\n\t\toriginalTokens: number;\n\t\tcontextWindow: number;\n\t} {\n\t\tconst config = this.manager.getContextForModel(modelId);\n\n\t\t// Estimate token count (rough estimation: 1 token ≈ 4 characters)\n\t\tconst messageStr = JSON.stringify(messages);\n\t\tconst estimatedTokens = Math.ceil(messageStr.length / 4);\n\n\t\t// Check if truncation is needed\n\t\tconst truncated = estimatedTokens > config.contextWindow;\n\n\t\treturn {\n\t\t\tmessages,\n\t\t\ttruncated,\n\t\t\toriginalTokens: estimatedTokens,\n\t\t\tcontextWindow: config.contextWindow,\n\t\t};\n\t}\n}\n\n/**\n * Initialize the context manager with default configuration\n */\nexport function initializeContextManager(): ContextManager {\n\tconst manager = ContextManager.getInstance();\n\n\t// Register default providers with large context support\n\tmanager.registerProvider({\n\t\tprovider: \"google\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 8192,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"anthropic\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 200000,\n\t\t\tmaxTokens: 16384,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"openai\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 128000,\n\t\t\tmaxTokens: 16384,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"deepseek\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 64000,\n\t\t\tmaxTokens: 8192,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"qwen\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 131072,\n\t\t\tmaxTokens: 8192,\n\t\t},\n\t});\n\n\treturn manager;\n}\n\n// Export singleton getter\nexport const getContextManager = () => ContextManager.getInstance();\n"]}
1
+ {"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../src/core/context-manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context Manager - Independent Architecture for Large Context Support\n * Provides 1M context window support through a third-party architecture\n * Works transparently with all models without modifying prompts\n */\n\nimport type { Api, Model } from \"@boxiaolanya2008/pi-ai\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { getAgentDir } from \"../config.js\";\n\n/**\n * Context configuration for models\n */\nexport interface ContextConfig {\n\t/** Context window size in tokens */\n\tcontextWindow: number;\n\t/** Maximum output tokens */\n\tmaxTokens: number;\n\t/** Whether to enable chunking for large contexts */\n\tenableChunking?: boolean;\n\t/** Chunk size for processing (default: auto-calculated) */\n\tchunkSize?: number;\n\t/** Overlap between chunks (default: 2000 tokens) */\n\tchunkOverlap?: number;\n\t/** Enable context caching */\n\tenableCaching?: boolean;\n\t/** Cache TTL in seconds */\n\tcacheTTL?: number;\n}\n\n/**\n * Provider-level context configuration\n */\nexport interface ProviderContextConfig {\n\t/** Provider name */\n\tprovider: string;\n\t/** Base URL override */\n\tbaseUrl?: string;\n\t/** Default context for all models under this provider */\n\tdefaultContext?: Partial<ContextConfig>;\n\t/** Per-model context overrides */\n\tmodels?: Record<string, ContextConfig>;\n}\n\n/**\n * Global context configuration\n */\nexport interface GlobalContextConfig {\n\t/** Enable large context support globally */\n\tenabled: boolean;\n\t/** Default context window (used when model doesn't specify) */\n\tdefaultContextWindow: number;\n\t/** Default max output tokens */\n\tdefaultMaxTokens: number;\n\t/** Provider configurations */\n\tproviders: ProviderContextConfig[];\n\t/** Model-specific overrides */\n\tmodelOverrides?: Record<string, ContextConfig>;\n}\n\n/**\n * Context stats for monitoring\n */\nexport interface ContextStats {\n\t/** Total context tokens used */\n\ttokensUsed: number;\n\t/** Context window size */\n\tcontextWindow: number;\n\t/** Utilization percentage */\n\tutilization: number;\n\t/** Number of chunks processed */\n\tchunksProcessed?: number;\n\t/** Cache hit rate */\n\tcacheHitRate?: number;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: GlobalContextConfig = {\n\tenabled: true,\n\tdefaultContextWindow: 1000000, // 1M tokens\n\tdefaultMaxTokens: 65536,\n\tproviders: [],\n};\n\n/**\n * Known large context models with their configurations\n */\nexport const LARGE_CONTEXT_MODELS: Record<string, ContextConfig> = {\n\t// OpenAI\n\t\"gpt-4-turbo\": { contextWindow: 128000, maxTokens: 4096 },\n\t\"gpt-4-turbo-preview\": { contextWindow: 128000, maxTokens: 4096 },\n\t\"gpt-4o\": { contextWindow: 128000, maxTokens: 16384 },\n\t\"gpt-4o-mini\": { contextWindow: 128000, maxTokens: 16384 },\n\n\t// Anthropic\n\t\"claude-3-opus\": { contextWindow: 200000, maxTokens: 4096 },\n\t\"claude-3-sonnet\": { contextWindow: 200000, maxTokens: 4096 },\n\t\"claude-3-haiku\": { contextWindow: 200000, maxTokens: 4096 },\n\t\"claude-3-5-sonnet\": { contextWindow: 200000, maxTokens: 8192 },\n\t\"claude-3-5-haiku\": { contextWindow: 200000, maxTokens: 8192 },\n\t\"claude-sonnet-4\": { contextWindow: 200000, maxTokens: 16384 },\n\n\t// Google\n\t\"gemini-1.5-pro\": { contextWindow: 1000000, maxTokens: 8192 },\n\t\"gemini-1.5-flash\": { contextWindow: 1000000, maxTokens: 8192 },\n\t\"gemini-2.0-flash\": { contextWindow: 1000000, maxTokens: 8192 },\n\n\t// DeepSeek\n\t\"deepseek-chat\": { contextWindow: 64000, maxTokens: 4096 },\n\t\"deepseek-coder\": { contextWindow: 64000, maxTokens: 4096 },\n\t\"deepseek-reasoner\": { contextWindow: 64000, maxTokens: 8192 },\n\n\t// Mistral\n\t\"mistral-large\": { contextWindow: 128000, maxTokens: 8192 },\n\t\"mistral-medium\": { contextWindow: 32000, maxTokens: 8192 },\n\n\t// Meta Llama\n\t\"llama-3.1-405b\": { contextWindow: 128000, maxTokens: 16384 },\n\t\"llama-3.1-70b\": { contextWindow: 128000, maxTokens: 16384 },\n\t\"llama-3.1-8b\": { contextWindow: 128000, maxTokens: 16384 },\n\n\t// Qwen\n\t\"qwen-2.5-72b\": { contextWindow: 131072, maxTokens: 8192 },\n\t\"qwen-2.5-32b\": { contextWindow: 131072, maxTokens: 8192 },\n\t\"qwen-max\": { contextWindow: 1000000, maxTokens: 65536 },\n\n\t// Moonshot (Kimi)\n\t\"moonshot-v1-8k\": { contextWindow: 8192, maxTokens: 4096 },\n\t\"moonshot-v1-32k\": { contextWindow: 32768, maxTokens: 4096 },\n\t\"moonshot-v1-128k\": { contextWindow: 131072, maxTokens: 4096 },\n\n\t// Yi\n\t\"yi-lightning\": { contextWindow: 16384, maxTokens: 4096 },\n\t\"yi-large\": { contextWindow: 32768, maxTokens: 4096 },\n\t\"yi-large-turbo\": { contextWindow: 16384, maxTokens: 4096 },\n\n\t// GLM\n\t\"glm-4\": { contextWindow: 128000, maxTokens: 4096 },\n\t\"glm-4-plus\": { contextWindow: 128000, maxTokens: 4096 },\n\n\t// Default large context for unknown models\n\t\"default-large\": { contextWindow: 1000000, maxTokens: 65536 },\n};\n\n/**\n * Context Manager\n * Manages context window configuration for all models\n */\nexport class ContextManager {\n\tprivate config: GlobalContextConfig;\n\tprivate configPath: string;\n\tprivate static instance: ContextManager | null = null;\n\n\tprivate constructor() {\n\t\tthis.configPath = join(getAgentDir(), \"context-config.json\");\n\t\tthis.config = this.loadConfig();\n\t}\n\n\t/**\n\t * Get the singleton instance\n\t */\n\tstatic getInstance(): ContextManager {\n\t\tif (!ContextManager.instance) {\n\t\t\tContextManager.instance = new ContextManager();\n\t\t}\n\t\treturn ContextManager.instance;\n\t}\n\n\t/**\n\t * Load configuration from file\n\t */\n\tprivate loadConfig(): GlobalContextConfig {\n\t\ttry {\n\t\t\tif (existsSync(this.configPath)) {\n\t\t\t\tconst content = readFileSync(this.configPath, \"utf-8\");\n\t\t\t\tconst loaded = JSON.parse(content) as Partial<GlobalContextConfig>;\n\t\t\t\treturn { ...DEFAULT_CONFIG, ...loaded };\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to load context config:\", error);\n\t\t}\n\t\treturn { ...DEFAULT_CONFIG };\n\t}\n\n\t/**\n\t * Save configuration to file\n\t */\n\tsaveConfig(): void {\n\t\ttry {\n\t\t\tconst agentDir = getAgentDir();\n\t\t\tif (!existsSync(agentDir)) {\n\t\t\t\tconst { mkdirSync } = require(\"fs\");\n\t\t\t\tmkdirSync(agentDir, { recursive: true });\n\t\t\t}\n\t\t\twriteFileSync(this.configPath, JSON.stringify(this.config, null, 2));\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to save context config:\", error);\n\t\t}\n\t}\n\n\t/**\n\t * Get current configuration\n\t */\n\tgetConfig(): GlobalContextConfig {\n\t\treturn { ...this.config };\n\t}\n\n\t/**\n\t * Update configuration\n\t */\n\tupdateConfig(updates: Partial<GlobalContextConfig>): void {\n\t\tthis.config = { ...this.config, ...updates };\n\t\tthis.saveConfig();\n\t}\n\n\t/**\n\t * Get context configuration for a model\n\t */\n\tgetContextForModel(modelId: string): ContextConfig {\n\t\t// Check model overrides first\n\t\tif (this.config.modelOverrides?.[modelId]) {\n\t\t\treturn this.config.modelOverrides[modelId];\n\t\t}\n\n\t\t// Check known models\n\t\tconst normalizedId = modelId.toLowerCase();\n\t\tfor (const [pattern, config] of Object.entries(LARGE_CONTEXT_MODELS)) {\n\t\t\tif (normalizedId.includes(pattern.toLowerCase()) || pattern.toLowerCase().includes(normalizedId)) {\n\t\t\t\treturn config;\n\t\t\t}\n\t\t}\n\n\t\t// Check provider defaults\n\t\tfor (const provider of this.config.providers) {\n\t\t\tif (provider.models?.[modelId]) {\n\t\t\t\treturn provider.models[modelId];\n\t\t\t}\n\t\t}\n\n\t\t// Return default large context\n\t\treturn {\n\t\t\tcontextWindow: this.config.defaultContextWindow,\n\t\t\tmaxTokens: this.config.defaultMaxTokens,\n\t\t};\n\t}\n\n\t/**\n\t * Set context configuration for a specific model\n\t */\n\tsetContextForModel(modelId: string, config: ContextConfig): void {\n\t\tif (!this.config.modelOverrides) {\n\t\t\tthis.config.modelOverrides = {};\n\t\t}\n\t\tthis.config.modelOverrides[modelId] = config;\n\t\tthis.saveConfig();\n\t}\n\n\t/**\n\t * Register a provider with context configuration\n\t */\n\tregisterProvider(providerConfig: ProviderContextConfig): void {\n\t\tconst existingIndex = this.config.providers.findIndex((p) => p.provider === providerConfig.provider);\n\t\tif (existingIndex >= 0) {\n\t\t\tthis.config.providers[existingIndex] = providerConfig;\n\t\t} else {\n\t\t\tthis.config.providers.push(providerConfig);\n\t\t}\n\t\tthis.saveConfig();\n\t}\n\n\t/**\n\t * Enhance a model with context configuration\n\t * This is the main entry point for the third-party architecture\n\t */\n\tenhanceModel<API extends Api>(model: Model<API>): Model<API> {\n\t\tif (!this.config.enabled) {\n\t\t\treturn model;\n\t\t}\n\n\t\tconst contextConfig = this.getContextForModel(model.id);\n\n\t\treturn {\n\t\t\t...model,\n\t\t\tcontextWindow: contextConfig.contextWindow,\n\t\t\tmaxTokens: contextConfig.maxTokens,\n\t\t};\n\t}\n\n\t/**\n\t * Calculate optimal chunk size based on context window\n\t */\n\tcalculateChunkSize(contextWindow: number): number {\n\t\t// Aim for 10% of context window as chunk size\n\t\t// But cap at 32K tokens for efficiency\n\t\tconst targetChunkSize = Math.floor(contextWindow * 0.1);\n\t\treturn Math.min(targetChunkSize, 32768);\n\t}\n\n\t/**\n\t * Get context stats\n\t */\n\tgetStats(tokensUsed: number, modelId: string): ContextStats {\n\t\tconst config = this.getContextForModel(modelId);\n\t\tconst utilization = (tokensUsed / config.contextWindow) * 100;\n\n\t\treturn {\n\t\t\ttokensUsed,\n\t\t\tcontextWindow: config.contextWindow,\n\t\t\tutilization: Math.min(utilization, 100),\n\t\t};\n\t}\n\n\t/**\n\t * Check if model supports large context\n\t */\n\tisLargeContextModel(modelId: string): boolean {\n\t\tconst config = this.getContextForModel(modelId);\n\t\treturn config.contextWindow >= 100000;\n\t}\n\n\t/**\n\t * Get recommended settings for a model\n\t */\n\tgetRecommendedSettings(modelId: string): {\n\t\tcontextWindow: number;\n\t\tmaxTokens: number;\n\t\tchunkSize: number;\n\t\tenableChunking: boolean;\n\t} {\n\t\tconst config = this.getContextForModel(modelId);\n\t\tconst chunkSize = this.calculateChunkSize(config.contextWindow);\n\n\t\treturn {\n\t\t\tcontextWindow: config.contextWindow,\n\t\t\tmaxTokens: config.maxTokens,\n\t\t\tchunkSize,\n\t\t\tenableChunking: config.enableChunking ?? config.contextWindow >= 200000,\n\t\t};\n\t}\n}\n\n/**\n * Context middleware for request interception\n */\nexport class ContextMiddleware {\n\tprivate manager: ContextManager;\n\n\tconstructor() {\n\t\tthis.manager = ContextManager.getInstance();\n\t}\n\n\t/**\n\t * Process context before sending to API\n\t */\n\tprocessContext(\n\t\tmessages: unknown[],\n\t\tmodelId: string,\n\t): {\n\t\tmessages: unknown[];\n\t\ttruncated: boolean;\n\t\toriginalTokens: number;\n\t\tcontextWindow: number;\n\t} {\n\t\tconst config = this.manager.getContextForModel(modelId);\n\n\t\t// Estimate token count (rough estimation: 1 token ≈ 4 characters)\n\t\tconst messageStr = JSON.stringify(messages);\n\t\tconst estimatedTokens = Math.ceil(messageStr.length / 4);\n\n\t\t// Check if truncation is needed\n\t\tconst truncated = estimatedTokens > config.contextWindow;\n\n\t\treturn {\n\t\t\tmessages,\n\t\t\ttruncated,\n\t\t\toriginalTokens: estimatedTokens,\n\t\t\tcontextWindow: config.contextWindow,\n\t\t};\n\t}\n}\n\n/**\n * Initialize the context manager with default configuration\n */\nexport function initializeContextManager(): ContextManager {\n\tconst manager = ContextManager.getInstance();\n\n\t// Register default providers with large context support\n\tmanager.registerProvider({\n\t\tprovider: \"google\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 8192,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"anthropic\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 200000,\n\t\t\tmaxTokens: 16384,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"openai\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 128000,\n\t\t\tmaxTokens: 16384,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"deepseek\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 64000,\n\t\t\tmaxTokens: 8192,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"qwen\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 131072,\n\t\t\tmaxTokens: 8192,\n\t\t},\n\t});\n\n\treturn manager;\n}\n\n// Export singleton getter\nexport const getContextManager = () => ContextManager.getInstance();\n"]}
@@ -2,7 +2,7 @@
2
2
  * Context Provider Interface
3
3
  * Defines the contract for context providers in the third-party architecture
4
4
  */
5
- import type { Api, Model } from "@mariozechner/pi-ai";
5
+ import type { Api, Model } from "@boxiaolanya2008/pi-ai";
6
6
  /**
7
7
  * Context provider interface
8
8
  * Third-party implementations should implement this interface
@@ -1 +1 @@
1
- {"version":3,"file":"context-provider-interface.d.ts","sourceRoot":"","sources":["../../src/core/context-provider-interface.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context Provider Interface\n * Defines the contract for context providers in the third-party architecture\n */\n\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\n\n/**\n * Context provider interface\n * Third-party implementations should implement this interface\n */\nexport interface IContextProvider {\n\t/** Provider name */\n\treadonly name: string;\n\n\t/** Provider version */\n\treadonly version: string;\n\n\t/**\n\t * Check if this provider supports a given model\n\t */\n\tsupportsModel(modelId: string): boolean;\n\n\t/**\n\t * Get context window for a model\n\t */\n\tgetContextWindow(modelId: string): number;\n\n\t/**\n\t * Get max output tokens for a model\n\t */\n\tgetMaxTokens(modelId: string): number;\n\n\t/**\n\t * Get full context configuration for a model\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n\n\t/**\n\t * Process messages before sending to API\n\t * Returns processed messages and metadata\n\t */\n\tprocessMessages?(messages: unknown[], modelId: string): IProcessedContext;\n\n\t/**\n\t * Handle context overflow\n\t * Called when context exceeds the window\n\t */\n\thandleOverflow?(messages: unknown[], modelId: string, tokenCount: number): IOverflowResult;\n}\n\n/**\n * Model context configuration\n */\nexport interface IModelContextConfig {\n\t/** Context window size in tokens */\n\tcontextWindow: number;\n\n\t/** Maximum output tokens */\n\tmaxTokens: number;\n\n\t/** Supports streaming */\n\tsupportsStreaming: boolean;\n\n\t/** Supports vision/image input */\n\tsupportsVision: boolean;\n\n\t/** Supports function calling */\n\tsupportsFunctions: boolean;\n\n\t/** Custom model-specific settings */\n\tcustomSettings?: Record<string, unknown>;\n}\n\n/**\n * Processed context result\n */\nexport interface IProcessedContext {\n\t/** Processed messages */\n\tmessages: unknown[];\n\n\t/** Token count */\n\ttokenCount: number;\n\n\t/** Whether context was modified */\n\tmodified: boolean;\n\n\t/** Processing metadata */\n\tmetadata?: {\n\t\tchunksUsed?: number;\n\t\tcacheHits?: number;\n\t\ttruncated?: boolean;\n\t};\n}\n\n/**\n * Overflow handling result\n */\nexport interface IOverflowResult {\n\t/** Action to take */\n\taction: \"truncate\" | \"summarize\" | \"chunk\" | \"reject\";\n\n\t/** Processed messages (if action is truncate/summarize/chunk) */\n\tmessages?: unknown[];\n\n\t/** Error message (if action is reject) */\n\terror?: string;\n\n\t/** Additional metadata */\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Context provider registry\n * Manages multiple context providers\n */\nexport interface IContextProviderRegistry {\n\t/**\n\t * Register a context provider\n\t */\n\tregister(provider: IContextProvider): void;\n\n\t/**\n\t * Unregister a context provider\n\t */\n\tunregister(name: string): void;\n\n\t/**\n\t * Get a provider by name\n\t */\n\tget(name: string): IContextProvider | undefined;\n\n\t/**\n\t * Get all registered providers\n\t */\n\tgetAll(): IContextProvider[];\n\n\t/**\n\t * Find the best provider for a model\n\t */\n\tfindProvider(modelId: string): IContextProvider | undefined;\n\n\t/**\n\t * Get context configuration from any provider\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n}\n\n/**\n * Context enhancement result\n */\nexport interface IContextEnhancement<API extends Api> {\n\t/** Enhanced model */\n\tmodel: Model<API>;\n\n\t/** Provider that enhanced the model */\n\tprovider: IContextProvider;\n\n\t/** Enhancement metadata */\n\tmetadata: {\n\t\toriginalContextWindow: number;\n\t\tenhancedContextWindow: number;\n\t\tenhanced: boolean;\n\t};\n}\n"]}
1
+ {"version":3,"file":"context-provider-interface.d.ts","sourceRoot":"","sources":["../../src/core/context-provider-interface.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context Provider Interface\n * Defines the contract for context providers in the third-party architecture\n */\n\nimport type { Api, Model } from \"@boxiaolanya2008/pi-ai\";\n\n/**\n * Context provider interface\n * Third-party implementations should implement this interface\n */\nexport interface IContextProvider {\n\t/** Provider name */\n\treadonly name: string;\n\n\t/** Provider version */\n\treadonly version: string;\n\n\t/**\n\t * Check if this provider supports a given model\n\t */\n\tsupportsModel(modelId: string): boolean;\n\n\t/**\n\t * Get context window for a model\n\t */\n\tgetContextWindow(modelId: string): number;\n\n\t/**\n\t * Get max output tokens for a model\n\t */\n\tgetMaxTokens(modelId: string): number;\n\n\t/**\n\t * Get full context configuration for a model\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n\n\t/**\n\t * Process messages before sending to API\n\t * Returns processed messages and metadata\n\t */\n\tprocessMessages?(messages: unknown[], modelId: string): IProcessedContext;\n\n\t/**\n\t * Handle context overflow\n\t * Called when context exceeds the window\n\t */\n\thandleOverflow?(messages: unknown[], modelId: string, tokenCount: number): IOverflowResult;\n}\n\n/**\n * Model context configuration\n */\nexport interface IModelContextConfig {\n\t/** Context window size in tokens */\n\tcontextWindow: number;\n\n\t/** Maximum output tokens */\n\tmaxTokens: number;\n\n\t/** Supports streaming */\n\tsupportsStreaming: boolean;\n\n\t/** Supports vision/image input */\n\tsupportsVision: boolean;\n\n\t/** Supports function calling */\n\tsupportsFunctions: boolean;\n\n\t/** Custom model-specific settings */\n\tcustomSettings?: Record<string, unknown>;\n}\n\n/**\n * Processed context result\n */\nexport interface IProcessedContext {\n\t/** Processed messages */\n\tmessages: unknown[];\n\n\t/** Token count */\n\ttokenCount: number;\n\n\t/** Whether context was modified */\n\tmodified: boolean;\n\n\t/** Processing metadata */\n\tmetadata?: {\n\t\tchunksUsed?: number;\n\t\tcacheHits?: number;\n\t\ttruncated?: boolean;\n\t};\n}\n\n/**\n * Overflow handling result\n */\nexport interface IOverflowResult {\n\t/** Action to take */\n\taction: \"truncate\" | \"summarize\" | \"chunk\" | \"reject\";\n\n\t/** Processed messages (if action is truncate/summarize/chunk) */\n\tmessages?: unknown[];\n\n\t/** Error message (if action is reject) */\n\terror?: string;\n\n\t/** Additional metadata */\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Context provider registry\n * Manages multiple context providers\n */\nexport interface IContextProviderRegistry {\n\t/**\n\t * Register a context provider\n\t */\n\tregister(provider: IContextProvider): void;\n\n\t/**\n\t * Unregister a context provider\n\t */\n\tunregister(name: string): void;\n\n\t/**\n\t * Get a provider by name\n\t */\n\tget(name: string): IContextProvider | undefined;\n\n\t/**\n\t * Get all registered providers\n\t */\n\tgetAll(): IContextProvider[];\n\n\t/**\n\t * Find the best provider for a model\n\t */\n\tfindProvider(modelId: string): IContextProvider | undefined;\n\n\t/**\n\t * Get context configuration from any provider\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n}\n\n/**\n * Context enhancement result\n */\nexport interface IContextEnhancement<API extends Api> {\n\t/** Enhanced model */\n\tmodel: Model<API>;\n\n\t/** Provider that enhanced the model */\n\tprovider: IContextProvider;\n\n\t/** Enhancement metadata */\n\tmetadata: {\n\t\toriginalContextWindow: number;\n\t\tenhancedContextWindow: number;\n\t\tenhanced: boolean;\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"context-provider-interface.js","sourceRoot":"","sources":["../../src/core/context-provider-interface.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * Context Provider Interface\n * Defines the contract for context providers in the third-party architecture\n */\n\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\n\n/**\n * Context provider interface\n * Third-party implementations should implement this interface\n */\nexport interface IContextProvider {\n\t/** Provider name */\n\treadonly name: string;\n\n\t/** Provider version */\n\treadonly version: string;\n\n\t/**\n\t * Check if this provider supports a given model\n\t */\n\tsupportsModel(modelId: string): boolean;\n\n\t/**\n\t * Get context window for a model\n\t */\n\tgetContextWindow(modelId: string): number;\n\n\t/**\n\t * Get max output tokens for a model\n\t */\n\tgetMaxTokens(modelId: string): number;\n\n\t/**\n\t * Get full context configuration for a model\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n\n\t/**\n\t * Process messages before sending to API\n\t * Returns processed messages and metadata\n\t */\n\tprocessMessages?(messages: unknown[], modelId: string): IProcessedContext;\n\n\t/**\n\t * Handle context overflow\n\t * Called when context exceeds the window\n\t */\n\thandleOverflow?(messages: unknown[], modelId: string, tokenCount: number): IOverflowResult;\n}\n\n/**\n * Model context configuration\n */\nexport interface IModelContextConfig {\n\t/** Context window size in tokens */\n\tcontextWindow: number;\n\n\t/** Maximum output tokens */\n\tmaxTokens: number;\n\n\t/** Supports streaming */\n\tsupportsStreaming: boolean;\n\n\t/** Supports vision/image input */\n\tsupportsVision: boolean;\n\n\t/** Supports function calling */\n\tsupportsFunctions: boolean;\n\n\t/** Custom model-specific settings */\n\tcustomSettings?: Record<string, unknown>;\n}\n\n/**\n * Processed context result\n */\nexport interface IProcessedContext {\n\t/** Processed messages */\n\tmessages: unknown[];\n\n\t/** Token count */\n\ttokenCount: number;\n\n\t/** Whether context was modified */\n\tmodified: boolean;\n\n\t/** Processing metadata */\n\tmetadata?: {\n\t\tchunksUsed?: number;\n\t\tcacheHits?: number;\n\t\ttruncated?: boolean;\n\t};\n}\n\n/**\n * Overflow handling result\n */\nexport interface IOverflowResult {\n\t/** Action to take */\n\taction: \"truncate\" | \"summarize\" | \"chunk\" | \"reject\";\n\n\t/** Processed messages (if action is truncate/summarize/chunk) */\n\tmessages?: unknown[];\n\n\t/** Error message (if action is reject) */\n\terror?: string;\n\n\t/** Additional metadata */\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Context provider registry\n * Manages multiple context providers\n */\nexport interface IContextProviderRegistry {\n\t/**\n\t * Register a context provider\n\t */\n\tregister(provider: IContextProvider): void;\n\n\t/**\n\t * Unregister a context provider\n\t */\n\tunregister(name: string): void;\n\n\t/**\n\t * Get a provider by name\n\t */\n\tget(name: string): IContextProvider | undefined;\n\n\t/**\n\t * Get all registered providers\n\t */\n\tgetAll(): IContextProvider[];\n\n\t/**\n\t * Find the best provider for a model\n\t */\n\tfindProvider(modelId: string): IContextProvider | undefined;\n\n\t/**\n\t * Get context configuration from any provider\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n}\n\n/**\n * Context enhancement result\n */\nexport interface IContextEnhancement<API extends Api> {\n\t/** Enhanced model */\n\tmodel: Model<API>;\n\n\t/** Provider that enhanced the model */\n\tprovider: IContextProvider;\n\n\t/** Enhancement metadata */\n\tmetadata: {\n\t\toriginalContextWindow: number;\n\t\tenhancedContextWindow: number;\n\t\tenhanced: boolean;\n\t};\n}\n"]}
1
+ {"version":3,"file":"context-provider-interface.js","sourceRoot":"","sources":["../../src/core/context-provider-interface.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * Context Provider Interface\n * Defines the contract for context providers in the third-party architecture\n */\n\nimport type { Api, Model } from \"@boxiaolanya2008/pi-ai\";\n\n/**\n * Context provider interface\n * Third-party implementations should implement this interface\n */\nexport interface IContextProvider {\n\t/** Provider name */\n\treadonly name: string;\n\n\t/** Provider version */\n\treadonly version: string;\n\n\t/**\n\t * Check if this provider supports a given model\n\t */\n\tsupportsModel(modelId: string): boolean;\n\n\t/**\n\t * Get context window for a model\n\t */\n\tgetContextWindow(modelId: string): number;\n\n\t/**\n\t * Get max output tokens for a model\n\t */\n\tgetMaxTokens(modelId: string): number;\n\n\t/**\n\t * Get full context configuration for a model\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n\n\t/**\n\t * Process messages before sending to API\n\t * Returns processed messages and metadata\n\t */\n\tprocessMessages?(messages: unknown[], modelId: string): IProcessedContext;\n\n\t/**\n\t * Handle context overflow\n\t * Called when context exceeds the window\n\t */\n\thandleOverflow?(messages: unknown[], modelId: string, tokenCount: number): IOverflowResult;\n}\n\n/**\n * Model context configuration\n */\nexport interface IModelContextConfig {\n\t/** Context window size in tokens */\n\tcontextWindow: number;\n\n\t/** Maximum output tokens */\n\tmaxTokens: number;\n\n\t/** Supports streaming */\n\tsupportsStreaming: boolean;\n\n\t/** Supports vision/image input */\n\tsupportsVision: boolean;\n\n\t/** Supports function calling */\n\tsupportsFunctions: boolean;\n\n\t/** Custom model-specific settings */\n\tcustomSettings?: Record<string, unknown>;\n}\n\n/**\n * Processed context result\n */\nexport interface IProcessedContext {\n\t/** Processed messages */\n\tmessages: unknown[];\n\n\t/** Token count */\n\ttokenCount: number;\n\n\t/** Whether context was modified */\n\tmodified: boolean;\n\n\t/** Processing metadata */\n\tmetadata?: {\n\t\tchunksUsed?: number;\n\t\tcacheHits?: number;\n\t\ttruncated?: boolean;\n\t};\n}\n\n/**\n * Overflow handling result\n */\nexport interface IOverflowResult {\n\t/** Action to take */\n\taction: \"truncate\" | \"summarize\" | \"chunk\" | \"reject\";\n\n\t/** Processed messages (if action is truncate/summarize/chunk) */\n\tmessages?: unknown[];\n\n\t/** Error message (if action is reject) */\n\terror?: string;\n\n\t/** Additional metadata */\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Context provider registry\n * Manages multiple context providers\n */\nexport interface IContextProviderRegistry {\n\t/**\n\t * Register a context provider\n\t */\n\tregister(provider: IContextProvider): void;\n\n\t/**\n\t * Unregister a context provider\n\t */\n\tunregister(name: string): void;\n\n\t/**\n\t * Get a provider by name\n\t */\n\tget(name: string): IContextProvider | undefined;\n\n\t/**\n\t * Get all registered providers\n\t */\n\tgetAll(): IContextProvider[];\n\n\t/**\n\t * Find the best provider for a model\n\t */\n\tfindProvider(modelId: string): IContextProvider | undefined;\n\n\t/**\n\t * Get context configuration from any provider\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n}\n\n/**\n * Context enhancement result\n */\nexport interface IContextEnhancement<API extends Api> {\n\t/** Enhanced model */\n\tmodel: Model<API>;\n\n\t/** Provider that enhanced the model */\n\tprovider: IContextProvider;\n\n\t/** Enhancement metadata */\n\tmetadata: {\n\t\toriginalContextWindow: number;\n\t\tenhancedContextWindow: number;\n\t\tenhanced: boolean;\n\t};\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * Context Provider Registry
3
3
  * Central registry for managing context providers in the third-party architecture
4
4
  */
5
- import type { Api, Model } from "@mariozechner/pi-ai";
5
+ import type { Api, Model } from "@boxiaolanya2008/pi-ai";
6
6
  import type { IContextEnhancement, IContextProvider, IContextProviderRegistry, IModelContextConfig } from "./context-provider-interface.js";
7
7
  /**
8
8
  * Context Provider Registry Implementation
@@ -1 +1 @@
1
- {"version":3,"file":"context-provider-registry.d.ts","sourceRoot":"","sources":["../../src/core/context-provider-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EACX,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,MAAM,iCAAiC,CAAC;AAGzC;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,wBAAwB;IACvE,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwC;IAE/D,OAAO,eAIN;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,uBAAuB,CAK5C;IAED;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAEzC;IAED;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAM7B;IAED;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE9C;IAED;;OAEG;IACH,MAAM,IAAI,gBAAgB,EAAE,CAE3B;IAED;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAW1D;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAcrD;IAED;;;OAGG;IACH,YAAY,CAAC,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAsBzE;IAED;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGxC;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG1C;IAED;;OAEG;IACH,uBAAuB,IAAI,MAAM,EAAE,CAWlC;CACD;AAED;;GAEG;AACH,eAAO,MAAM,0BAA0B,+BAA8C,CAAC;AAEtF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAIlF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAG1E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,uBAAuB,CAEpE","sourcesContent":["/**\n * Context Provider Registry\n * Central registry for managing context providers in the third-party architecture\n */\n\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\nimport type {\n\tIContextEnhancement,\n\tIContextProvider,\n\tIContextProviderRegistry,\n\tIModelContextConfig,\n} from \"./context-provider-interface.js\";\nimport { getLargeContextProvider, LargeContextProvider } from \"./large-context-provider.js\";\n\n/**\n * Context Provider Registry Implementation\n * Manages multiple context providers and routes requests to the appropriate one\n */\nexport class ContextProviderRegistry implements IContextProviderRegistry {\n\tprivate providers: Map<string, IContextProvider> = new Map();\n\tprivate defaultProvider: IContextProvider;\n\tprivate static instance: ContextProviderRegistry | null = null;\n\n\tprivate constructor() {\n\t\t// Register the large context provider as default\n\t\tthis.defaultProvider = getLargeContextProvider();\n\t\tthis.register(this.defaultProvider);\n\t}\n\n\t/**\n\t * Get the singleton instance\n\t */\n\tstatic getInstance(): ContextProviderRegistry {\n\t\tif (!ContextProviderRegistry.instance) {\n\t\t\tContextProviderRegistry.instance = new ContextProviderRegistry();\n\t\t}\n\t\treturn ContextProviderRegistry.instance;\n\t}\n\n\t/**\n\t * Register a context provider\n\t */\n\tregister(provider: IContextProvider): void {\n\t\tthis.providers.set(provider.name, provider);\n\t}\n\n\t/**\n\t * Unregister a context provider\n\t */\n\tunregister(name: string): void {\n\t\tif (name === this.defaultProvider.name) {\n\t\t\tconsole.warn(`Cannot unregister default provider: ${name}`);\n\t\t\treturn;\n\t\t}\n\t\tthis.providers.delete(name);\n\t}\n\n\t/**\n\t * Get a provider by name\n\t */\n\tget(name: string): IContextProvider | undefined {\n\t\treturn this.providers.get(name);\n\t}\n\n\t/**\n\t * Get all registered providers\n\t */\n\tgetAll(): IContextProvider[] {\n\t\treturn Array.from(this.providers.values());\n\t}\n\n\t/**\n\t * Find the best provider for a model\n\t */\n\tfindProvider(modelId: string): IContextProvider | undefined {\n\t\t// Check all providers for explicit support\n\t\tconst providers = Array.from(this.providers.values());\n\t\tfor (const provider of providers) {\n\t\t\tif (provider.supportsModel(modelId)) {\n\t\t\t\treturn provider;\n\t\t\t}\n\t\t}\n\n\t\t// Fall back to default provider\n\t\treturn this.defaultProvider;\n\t}\n\n\t/**\n\t * Get context configuration from any provider\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig {\n\t\tconst provider = this.findProvider(modelId);\n\t\tif (provider) {\n\t\t\treturn provider.getContextConfig(modelId);\n\t\t}\n\n\t\t// Default 1M context configuration\n\t\treturn {\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 65536,\n\t\t\tsupportsStreaming: true,\n\t\t\tsupportsVision: true,\n\t\t\tsupportsFunctions: true,\n\t\t};\n\t}\n\n\t/**\n\t * Enhance a model with context configuration\n\t * This is the main entry point for the third-party architecture\n\t */\n\tenhanceModel<API extends Api>(model: Model<API>): IContextEnhancement<API> {\n\t\tconst provider = this.findProvider(model.id);\n\t\tconst config = this.getContextConfig(model.id);\n\n\t\tconst originalContextWindow = model.contextWindow ?? 0;\n\t\tconst enhancedContextWindow = config.contextWindow;\n\n\t\tconst enhancedModel: Model<API> = {\n\t\t\t...model,\n\t\t\tcontextWindow: enhancedContextWindow,\n\t\t\tmaxTokens: config.maxTokens,\n\t\t};\n\n\t\treturn {\n\t\t\tmodel: enhancedModel,\n\t\t\tprovider: provider ?? this.defaultProvider,\n\t\t\tmetadata: {\n\t\t\t\toriginalContextWindow,\n\t\t\t\tenhancedContextWindow,\n\t\t\t\tenhanced: originalContextWindow !== enhancedContextWindow,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Check if a model has large context support\n\t */\n\thasLargeContext(modelId: string): boolean {\n\t\tconst config = this.getContextConfig(modelId);\n\t\treturn config.contextWindow >= 100000;\n\t}\n\n\t/**\n\t * Check if a model has 1M context\n\t */\n\thasMillionContext(modelId: string): boolean {\n\t\tconst config = this.getContextConfig(modelId);\n\t\treturn config.contextWindow >= 1000000;\n\t}\n\n\t/**\n\t * Get all models with 1M context\n\t */\n\tgetMillionContextModels(): string[] {\n\t\tconst models: string[] = [];\n\t\tconst providers = Array.from(this.providers.values());\n\n\t\tfor (const provider of providers) {\n\t\t\tif (provider instanceof LargeContextProvider) {\n\t\t\t\tmodels.push(...provider.getKnownModels().filter((id) => provider.isMillionContextModel(id)));\n\t\t\t}\n\t\t}\n\n\t\treturn Array.from(new Set(models));\n\t}\n}\n\n/**\n * Singleton getter\n */\nexport const getContextProviderRegistry = () => ContextProviderRegistry.getInstance();\n\n/**\n * Convenience function to enhance a model with context configuration\n */\nexport function enhanceModelContext<API extends Api>(model: Model<API>): Model<API> {\n\tconst registry = ContextProviderRegistry.getInstance();\n\tconst enhancement = registry.enhanceModel(model);\n\treturn enhancement.model;\n}\n\n/**\n * Convenience function to get context configuration for a model\n */\nexport function getModelContextConfig(modelId: string): IModelContextConfig {\n\tconst registry = ContextProviderRegistry.getInstance();\n\treturn registry.getContextConfig(modelId);\n}\n\n/**\n * Initialize the context provider registry\n */\nexport function initializeContextProviders(): ContextProviderRegistry {\n\treturn ContextProviderRegistry.getInstance();\n}\n"]}
1
+ {"version":3,"file":"context-provider-registry.d.ts","sourceRoot":"","sources":["../../src/core/context-provider-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EACX,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,MAAM,iCAAiC,CAAC;AAGzC;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,wBAAwB;IACvE,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwC;IAE/D,OAAO,eAIN;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,uBAAuB,CAK5C;IAED;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAEzC;IAED;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAM7B;IAED;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE9C;IAED;;OAEG;IACH,MAAM,IAAI,gBAAgB,EAAE,CAE3B;IAED;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAW1D;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAcrD;IAED;;;OAGG;IACH,YAAY,CAAC,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAsBzE;IAED;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGxC;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG1C;IAED;;OAEG;IACH,uBAAuB,IAAI,MAAM,EAAE,CAWlC;CACD;AAED;;GAEG;AACH,eAAO,MAAM,0BAA0B,+BAA8C,CAAC;AAEtF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAIlF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAG1E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,uBAAuB,CAEpE","sourcesContent":["/**\n * Context Provider Registry\n * Central registry for managing context providers in the third-party architecture\n */\n\nimport type { Api, Model } from \"@boxiaolanya2008/pi-ai\";\nimport type {\n\tIContextEnhancement,\n\tIContextProvider,\n\tIContextProviderRegistry,\n\tIModelContextConfig,\n} from \"./context-provider-interface.js\";\nimport { getLargeContextProvider, LargeContextProvider } from \"./large-context-provider.js\";\n\n/**\n * Context Provider Registry Implementation\n * Manages multiple context providers and routes requests to the appropriate one\n */\nexport class ContextProviderRegistry implements IContextProviderRegistry {\n\tprivate providers: Map<string, IContextProvider> = new Map();\n\tprivate defaultProvider: IContextProvider;\n\tprivate static instance: ContextProviderRegistry | null = null;\n\n\tprivate constructor() {\n\t\t// Register the large context provider as default\n\t\tthis.defaultProvider = getLargeContextProvider();\n\t\tthis.register(this.defaultProvider);\n\t}\n\n\t/**\n\t * Get the singleton instance\n\t */\n\tstatic getInstance(): ContextProviderRegistry {\n\t\tif (!ContextProviderRegistry.instance) {\n\t\t\tContextProviderRegistry.instance = new ContextProviderRegistry();\n\t\t}\n\t\treturn ContextProviderRegistry.instance;\n\t}\n\n\t/**\n\t * Register a context provider\n\t */\n\tregister(provider: IContextProvider): void {\n\t\tthis.providers.set(provider.name, provider);\n\t}\n\n\t/**\n\t * Unregister a context provider\n\t */\n\tunregister(name: string): void {\n\t\tif (name === this.defaultProvider.name) {\n\t\t\tconsole.warn(`Cannot unregister default provider: ${name}`);\n\t\t\treturn;\n\t\t}\n\t\tthis.providers.delete(name);\n\t}\n\n\t/**\n\t * Get a provider by name\n\t */\n\tget(name: string): IContextProvider | undefined {\n\t\treturn this.providers.get(name);\n\t}\n\n\t/**\n\t * Get all registered providers\n\t */\n\tgetAll(): IContextProvider[] {\n\t\treturn Array.from(this.providers.values());\n\t}\n\n\t/**\n\t * Find the best provider for a model\n\t */\n\tfindProvider(modelId: string): IContextProvider | undefined {\n\t\t// Check all providers for explicit support\n\t\tconst providers = Array.from(this.providers.values());\n\t\tfor (const provider of providers) {\n\t\t\tif (provider.supportsModel(modelId)) {\n\t\t\t\treturn provider;\n\t\t\t}\n\t\t}\n\n\t\t// Fall back to default provider\n\t\treturn this.defaultProvider;\n\t}\n\n\t/**\n\t * Get context configuration from any provider\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig {\n\t\tconst provider = this.findProvider(modelId);\n\t\tif (provider) {\n\t\t\treturn provider.getContextConfig(modelId);\n\t\t}\n\n\t\t// Default 1M context configuration\n\t\treturn {\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 65536,\n\t\t\tsupportsStreaming: true,\n\t\t\tsupportsVision: true,\n\t\t\tsupportsFunctions: true,\n\t\t};\n\t}\n\n\t/**\n\t * Enhance a model with context configuration\n\t * This is the main entry point for the third-party architecture\n\t */\n\tenhanceModel<API extends Api>(model: Model<API>): IContextEnhancement<API> {\n\t\tconst provider = this.findProvider(model.id);\n\t\tconst config = this.getContextConfig(model.id);\n\n\t\tconst originalContextWindow = model.contextWindow ?? 0;\n\t\tconst enhancedContextWindow = config.contextWindow;\n\n\t\tconst enhancedModel: Model<API> = {\n\t\t\t...model,\n\t\t\tcontextWindow: enhancedContextWindow,\n\t\t\tmaxTokens: config.maxTokens,\n\t\t};\n\n\t\treturn {\n\t\t\tmodel: enhancedModel,\n\t\t\tprovider: provider ?? this.defaultProvider,\n\t\t\tmetadata: {\n\t\t\t\toriginalContextWindow,\n\t\t\t\tenhancedContextWindow,\n\t\t\t\tenhanced: originalContextWindow !== enhancedContextWindow,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Check if a model has large context support\n\t */\n\thasLargeContext(modelId: string): boolean {\n\t\tconst config = this.getContextConfig(modelId);\n\t\treturn config.contextWindow >= 100000;\n\t}\n\n\t/**\n\t * Check if a model has 1M context\n\t */\n\thasMillionContext(modelId: string): boolean {\n\t\tconst config = this.getContextConfig(modelId);\n\t\treturn config.contextWindow >= 1000000;\n\t}\n\n\t/**\n\t * Get all models with 1M context\n\t */\n\tgetMillionContextModels(): string[] {\n\t\tconst models: string[] = [];\n\t\tconst providers = Array.from(this.providers.values());\n\n\t\tfor (const provider of providers) {\n\t\t\tif (provider instanceof LargeContextProvider) {\n\t\t\t\tmodels.push(...provider.getKnownModels().filter((id) => provider.isMillionContextModel(id)));\n\t\t\t}\n\t\t}\n\n\t\treturn Array.from(new Set(models));\n\t}\n}\n\n/**\n * Singleton getter\n */\nexport const getContextProviderRegistry = () => ContextProviderRegistry.getInstance();\n\n/**\n * Convenience function to enhance a model with context configuration\n */\nexport function enhanceModelContext<API extends Api>(model: Model<API>): Model<API> {\n\tconst registry = ContextProviderRegistry.getInstance();\n\tconst enhancement = registry.enhanceModel(model);\n\treturn enhancement.model;\n}\n\n/**\n * Convenience function to get context configuration for a model\n */\nexport function getModelContextConfig(modelId: string): IModelContextConfig {\n\tconst registry = ContextProviderRegistry.getInstance();\n\treturn registry.getContextConfig(modelId);\n}\n\n/**\n * Initialize the context provider registry\n */\nexport function initializeContextProviders(): ContextProviderRegistry {\n\treturn ContextProviderRegistry.getInstance();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"context-provider-registry.js","sourceRoot":"","sources":["../../src/core/context-provider-registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context Provider Registry\n * Central registry for managing context providers in the third-party architecture\n */\n\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\nimport type {\n\tIContextEnhancement,\n\tIContextProvider,\n\tIContextProviderRegistry,\n\tIModelContextConfig,\n} from \"./context-provider-interface.js\";\nimport { getLargeContextProvider, LargeContextProvider } from \"./large-context-provider.js\";\n\n/**\n * Context Provider Registry Implementation\n * Manages multiple context providers and routes requests to the appropriate one\n */\nexport class ContextProviderRegistry implements IContextProviderRegistry {\n\tprivate providers: Map<string, IContextProvider> = new Map();\n\tprivate defaultProvider: IContextProvider;\n\tprivate static instance: ContextProviderRegistry | null = null;\n\n\tprivate constructor() {\n\t\t// Register the large context provider as default\n\t\tthis.defaultProvider = getLargeContextProvider();\n\t\tthis.register(this.defaultProvider);\n\t}\n\n\t/**\n\t * Get the singleton instance\n\t */\n\tstatic getInstance(): ContextProviderRegistry {\n\t\tif (!ContextProviderRegistry.instance) {\n\t\t\tContextProviderRegistry.instance = new ContextProviderRegistry();\n\t\t}\n\t\treturn ContextProviderRegistry.instance;\n\t}\n\n\t/**\n\t * Register a context provider\n\t */\n\tregister(provider: IContextProvider): void {\n\t\tthis.providers.set(provider.name, provider);\n\t}\n\n\t/**\n\t * Unregister a context provider\n\t */\n\tunregister(name: string): void {\n\t\tif (name === this.defaultProvider.name) {\n\t\t\tconsole.warn(`Cannot unregister default provider: ${name}`);\n\t\t\treturn;\n\t\t}\n\t\tthis.providers.delete(name);\n\t}\n\n\t/**\n\t * Get a provider by name\n\t */\n\tget(name: string): IContextProvider | undefined {\n\t\treturn this.providers.get(name);\n\t}\n\n\t/**\n\t * Get all registered providers\n\t */\n\tgetAll(): IContextProvider[] {\n\t\treturn Array.from(this.providers.values());\n\t}\n\n\t/**\n\t * Find the best provider for a model\n\t */\n\tfindProvider(modelId: string): IContextProvider | undefined {\n\t\t// Check all providers for explicit support\n\t\tconst providers = Array.from(this.providers.values());\n\t\tfor (const provider of providers) {\n\t\t\tif (provider.supportsModel(modelId)) {\n\t\t\t\treturn provider;\n\t\t\t}\n\t\t}\n\n\t\t// Fall back to default provider\n\t\treturn this.defaultProvider;\n\t}\n\n\t/**\n\t * Get context configuration from any provider\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig {\n\t\tconst provider = this.findProvider(modelId);\n\t\tif (provider) {\n\t\t\treturn provider.getContextConfig(modelId);\n\t\t}\n\n\t\t// Default 1M context configuration\n\t\treturn {\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 65536,\n\t\t\tsupportsStreaming: true,\n\t\t\tsupportsVision: true,\n\t\t\tsupportsFunctions: true,\n\t\t};\n\t}\n\n\t/**\n\t * Enhance a model with context configuration\n\t * This is the main entry point for the third-party architecture\n\t */\n\tenhanceModel<API extends Api>(model: Model<API>): IContextEnhancement<API> {\n\t\tconst provider = this.findProvider(model.id);\n\t\tconst config = this.getContextConfig(model.id);\n\n\t\tconst originalContextWindow = model.contextWindow ?? 0;\n\t\tconst enhancedContextWindow = config.contextWindow;\n\n\t\tconst enhancedModel: Model<API> = {\n\t\t\t...model,\n\t\t\tcontextWindow: enhancedContextWindow,\n\t\t\tmaxTokens: config.maxTokens,\n\t\t};\n\n\t\treturn {\n\t\t\tmodel: enhancedModel,\n\t\t\tprovider: provider ?? this.defaultProvider,\n\t\t\tmetadata: {\n\t\t\t\toriginalContextWindow,\n\t\t\t\tenhancedContextWindow,\n\t\t\t\tenhanced: originalContextWindow !== enhancedContextWindow,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Check if a model has large context support\n\t */\n\thasLargeContext(modelId: string): boolean {\n\t\tconst config = this.getContextConfig(modelId);\n\t\treturn config.contextWindow >= 100000;\n\t}\n\n\t/**\n\t * Check if a model has 1M context\n\t */\n\thasMillionContext(modelId: string): boolean {\n\t\tconst config = this.getContextConfig(modelId);\n\t\treturn config.contextWindow >= 1000000;\n\t}\n\n\t/**\n\t * Get all models with 1M context\n\t */\n\tgetMillionContextModels(): string[] {\n\t\tconst models: string[] = [];\n\t\tconst providers = Array.from(this.providers.values());\n\n\t\tfor (const provider of providers) {\n\t\t\tif (provider instanceof LargeContextProvider) {\n\t\t\t\tmodels.push(...provider.getKnownModels().filter((id) => provider.isMillionContextModel(id)));\n\t\t\t}\n\t\t}\n\n\t\treturn Array.from(new Set(models));\n\t}\n}\n\n/**\n * Singleton getter\n */\nexport const getContextProviderRegistry = () => ContextProviderRegistry.getInstance();\n\n/**\n * Convenience function to enhance a model with context configuration\n */\nexport function enhanceModelContext<API extends Api>(model: Model<API>): Model<API> {\n\tconst registry = ContextProviderRegistry.getInstance();\n\tconst enhancement = registry.enhanceModel(model);\n\treturn enhancement.model;\n}\n\n/**\n * Convenience function to get context configuration for a model\n */\nexport function getModelContextConfig(modelId: string): IModelContextConfig {\n\tconst registry = ContextProviderRegistry.getInstance();\n\treturn registry.getContextConfig(modelId);\n}\n\n/**\n * Initialize the context provider registry\n */\nexport function initializeContextProviders(): ContextProviderRegistry {\n\treturn ContextProviderRegistry.getInstance();\n}\n"]}
1
+ {"version":3,"file":"context-provider-registry.js","sourceRoot":"","sources":["../../src/core/context-provider-registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context Provider Registry\n * Central registry for managing context providers in the third-party architecture\n */\n\nimport type { Api, Model } from \"@boxiaolanya2008/pi-ai\";\nimport type {\n\tIContextEnhancement,\n\tIContextProvider,\n\tIContextProviderRegistry,\n\tIModelContextConfig,\n} from \"./context-provider-interface.js\";\nimport { getLargeContextProvider, LargeContextProvider } from \"./large-context-provider.js\";\n\n/**\n * Context Provider Registry Implementation\n * Manages multiple context providers and routes requests to the appropriate one\n */\nexport class ContextProviderRegistry implements IContextProviderRegistry {\n\tprivate providers: Map<string, IContextProvider> = new Map();\n\tprivate defaultProvider: IContextProvider;\n\tprivate static instance: ContextProviderRegistry | null = null;\n\n\tprivate constructor() {\n\t\t// Register the large context provider as default\n\t\tthis.defaultProvider = getLargeContextProvider();\n\t\tthis.register(this.defaultProvider);\n\t}\n\n\t/**\n\t * Get the singleton instance\n\t */\n\tstatic getInstance(): ContextProviderRegistry {\n\t\tif (!ContextProviderRegistry.instance) {\n\t\t\tContextProviderRegistry.instance = new ContextProviderRegistry();\n\t\t}\n\t\treturn ContextProviderRegistry.instance;\n\t}\n\n\t/**\n\t * Register a context provider\n\t */\n\tregister(provider: IContextProvider): void {\n\t\tthis.providers.set(provider.name, provider);\n\t}\n\n\t/**\n\t * Unregister a context provider\n\t */\n\tunregister(name: string): void {\n\t\tif (name === this.defaultProvider.name) {\n\t\t\tconsole.warn(`Cannot unregister default provider: ${name}`);\n\t\t\treturn;\n\t\t}\n\t\tthis.providers.delete(name);\n\t}\n\n\t/**\n\t * Get a provider by name\n\t */\n\tget(name: string): IContextProvider | undefined {\n\t\treturn this.providers.get(name);\n\t}\n\n\t/**\n\t * Get all registered providers\n\t */\n\tgetAll(): IContextProvider[] {\n\t\treturn Array.from(this.providers.values());\n\t}\n\n\t/**\n\t * Find the best provider for a model\n\t */\n\tfindProvider(modelId: string): IContextProvider | undefined {\n\t\t// Check all providers for explicit support\n\t\tconst providers = Array.from(this.providers.values());\n\t\tfor (const provider of providers) {\n\t\t\tif (provider.supportsModel(modelId)) {\n\t\t\t\treturn provider;\n\t\t\t}\n\t\t}\n\n\t\t// Fall back to default provider\n\t\treturn this.defaultProvider;\n\t}\n\n\t/**\n\t * Get context configuration from any provider\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig {\n\t\tconst provider = this.findProvider(modelId);\n\t\tif (provider) {\n\t\t\treturn provider.getContextConfig(modelId);\n\t\t}\n\n\t\t// Default 1M context configuration\n\t\treturn {\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 65536,\n\t\t\tsupportsStreaming: true,\n\t\t\tsupportsVision: true,\n\t\t\tsupportsFunctions: true,\n\t\t};\n\t}\n\n\t/**\n\t * Enhance a model with context configuration\n\t * This is the main entry point for the third-party architecture\n\t */\n\tenhanceModel<API extends Api>(model: Model<API>): IContextEnhancement<API> {\n\t\tconst provider = this.findProvider(model.id);\n\t\tconst config = this.getContextConfig(model.id);\n\n\t\tconst originalContextWindow = model.contextWindow ?? 0;\n\t\tconst enhancedContextWindow = config.contextWindow;\n\n\t\tconst enhancedModel: Model<API> = {\n\t\t\t...model,\n\t\t\tcontextWindow: enhancedContextWindow,\n\t\t\tmaxTokens: config.maxTokens,\n\t\t};\n\n\t\treturn {\n\t\t\tmodel: enhancedModel,\n\t\t\tprovider: provider ?? this.defaultProvider,\n\t\t\tmetadata: {\n\t\t\t\toriginalContextWindow,\n\t\t\t\tenhancedContextWindow,\n\t\t\t\tenhanced: originalContextWindow !== enhancedContextWindow,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Check if a model has large context support\n\t */\n\thasLargeContext(modelId: string): boolean {\n\t\tconst config = this.getContextConfig(modelId);\n\t\treturn config.contextWindow >= 100000;\n\t}\n\n\t/**\n\t * Check if a model has 1M context\n\t */\n\thasMillionContext(modelId: string): boolean {\n\t\tconst config = this.getContextConfig(modelId);\n\t\treturn config.contextWindow >= 1000000;\n\t}\n\n\t/**\n\t * Get all models with 1M context\n\t */\n\tgetMillionContextModels(): string[] {\n\t\tconst models: string[] = [];\n\t\tconst providers = Array.from(this.providers.values());\n\n\t\tfor (const provider of providers) {\n\t\t\tif (provider instanceof LargeContextProvider) {\n\t\t\t\tmodels.push(...provider.getKnownModels().filter((id) => provider.isMillionContextModel(id)));\n\t\t\t}\n\t\t}\n\n\t\treturn Array.from(new Set(models));\n\t}\n}\n\n/**\n * Singleton getter\n */\nexport const getContextProviderRegistry = () => ContextProviderRegistry.getInstance();\n\n/**\n * Convenience function to enhance a model with context configuration\n */\nexport function enhanceModelContext<API extends Api>(model: Model<API>): Model<API> {\n\tconst registry = ContextProviderRegistry.getInstance();\n\tconst enhancement = registry.enhanceModel(model);\n\treturn enhancement.model;\n}\n\n/**\n * Convenience function to get context configuration for a model\n */\nexport function getModelContextConfig(modelId: string): IModelContextConfig {\n\tconst registry = ContextProviderRegistry.getInstance();\n\treturn registry.getContextConfig(modelId);\n}\n\n/**\n * Initialize the context provider registry\n */\nexport function initializeContextProviders(): ContextProviderRegistry {\n\treturn ContextProviderRegistry.getInstance();\n}\n"]}
@@ -1,3 +1,3 @@
1
- import type { ThinkingLevel } from "@mariozechner/pi-agent-core";
1
+ import type { ThinkingLevel } from "@boxiaolanya2008/pi-agent-core";
2
2
  export declare const DEFAULT_THINKING_LEVEL: ThinkingLevel;
3
3
  //# sourceMappingURL=defaults.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/core/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,eAAO,MAAM,sBAAsB,EAAE,aAAwB,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@mariozechner/pi-agent-core\";\nexport const DEFAULT_THINKING_LEVEL: ThinkingLevel = \"medium\";\n"]}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/core/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,eAAO,MAAM,sBAAsB,EAAE,aAAwB,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@boxiaolanya2008/pi-agent-core\";\nexport const DEFAULT_THINKING_LEVEL: ThinkingLevel = \"medium\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/core/defaults.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,sBAAsB,GAAkB,QAAQ,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@mariozechner/pi-agent-core\";\nexport const DEFAULT_THINKING_LEVEL: ThinkingLevel = \"medium\";\n"]}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/core/defaults.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,sBAAsB,GAAkB,QAAQ,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@boxiaolanya2008/pi-agent-core\";\nexport const DEFAULT_THINKING_LEVEL: ThinkingLevel = \"medium\";\n"]}
@@ -1,4 +1,4 @@
1
- import type { AgentState } from "@mariozechner/pi-agent-core";
1
+ import type { AgentState } from "@boxiaolanya2008/pi-agent-core";
2
2
  import { SessionManager } from "../session-manager.js";
3
3
  export interface ToolHtmlRenderer {
4
4
  renderCall(toolName: string, args: unknown): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/export-html/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAO9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,MAAM,WAAW,gBAAgB;IAChC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAChE,YAAY,CACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAChF,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GACd;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACzD;AAMD,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,gBAAgB,CAAC;CAChC;AA6ID,wBAAsB,mBAAmB,CACxC,EAAE,EAAE,cAAc,EAClB,KAAK,CAAC,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,GAC9B,OAAO,CAAC,MAAM,CAAC,CAiCjB;AACD,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBzG","sourcesContent":["import type { AgentState } from \"@mariozechner/pi-agent-core\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { basename, join } from \"path\";\nimport { APP_NAME, getExportTemplateDir } from \"../../config.js\";\nimport { getResolvedThemeColors, getThemeExportColors } from \"../../modes/interactive/theme/theme.js\";\nimport type { ToolInfo } from \"../extensions/types.js\";\nimport type { SessionEntry } from \"../session-manager.js\";\nimport { SessionManager } from \"../session-manager.js\";\nexport interface ToolHtmlRenderer {\n\trenderCall(toolName: string, args: unknown): string | undefined;\n\trenderResult(\n\t\ttoolName: string,\n\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\tdetails: unknown,\n\t\tisError: boolean,\n\t): { collapsed?: string; expanded?: string } | undefined;\n}\ninterface RenderedToolHtml {\n\tcallHtml?: string;\n\tresultHtmlCollapsed?: string;\n\tresultHtmlExpanded?: string;\n}\nexport interface ExportOptions {\n\toutputPath?: string;\n\tthemeName?: string;\n\ttoolRenderer?: ToolHtmlRenderer;\n}\nfunction parseColor(color: string): { r: number; g: number; b: number } | undefined {\n\tconst hexMatch = color.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);\n\tif (hexMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(hexMatch[1], 16),\n\t\t\tg: Number.parseInt(hexMatch[2], 16),\n\t\t\tb: Number.parseInt(hexMatch[3], 16),\n\t\t};\n\t}\n\tconst rgbMatch = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/);\n\tif (rgbMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(rgbMatch[1], 10),\n\t\t\tg: Number.parseInt(rgbMatch[2], 10),\n\t\t\tb: Number.parseInt(rgbMatch[3], 10),\n\t\t};\n\t}\n\treturn undefined;\n}\nfunction getLuminance(r: number, g: number, b: number): number {\n\tconst toLinear = (c: number) => {\n\t\tconst s = c / 255;\n\t\treturn s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n\t};\n\treturn 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\nfunction adjustBrightness(color: string, factor: number): string {\n\tconst parsed = parseColor(color);\n\tif (!parsed) return color;\n\tconst adjust = (c: number) => Math.min(255, Math.max(0, Math.round(c * factor)));\n\treturn `rgb(${adjust(parsed.r)}, ${adjust(parsed.g)}, ${adjust(parsed.b)})`;\n}\nfunction deriveExportColors(baseColor: string): { pageBg: string; cardBg: string; infoBg: string } {\n\tconst parsed = parseColor(baseColor);\n\tif (!parsed) {\n\t\treturn {\n\t\t\tpageBg: \"rgb(24, 24, 30)\",\n\t\t\tcardBg: \"rgb(30, 30, 36)\",\n\t\t\tinfoBg: \"rgb(60, 55, 40)\",\n\t\t};\n\t}\n\tconst luminance = getLuminance(parsed.r, parsed.g, parsed.b);\n\tconst isLight = luminance > 0.5;\n\tif (isLight) {\n\t\treturn {\n\t\t\tpageBg: adjustBrightness(baseColor, 0.96),\n\t\t\tcardBg: baseColor,\n\t\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 10)}, ${Math.min(255, parsed.g + 5)}, ${Math.max(0, parsed.b - 20)})`,\n\t\t};\n\t}\n\treturn {\n\t\tpageBg: adjustBrightness(baseColor, 0.7),\n\t\tcardBg: adjustBrightness(baseColor, 0.85),\n\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 20)}, ${Math.min(255, parsed.g + 15)}, ${parsed.b})`,\n\t};\n}\nfunction generateThemeVars(themeName?: string): string {\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst lines: string[] = [];\n\tfor (const [key, value] of Object.entries(colors)) {\n\t\tlines.push(`--${key}: ${value};`);\n\t}\n\tconst themeExport = getThemeExportColors(themeName);\n\tconst userMessageBg = colors.userMessageBg || \"#343541\";\n\tconst derivedColors = deriveExportColors(userMessageBg);\n\tlines.push(`--exportPageBg: ${themeExport.pageBg ?? derivedColors.pageBg};`);\n\tlines.push(`--exportCardBg: ${themeExport.cardBg ?? derivedColors.cardBg};`);\n\tlines.push(`--exportInfoBg: ${themeExport.infoBg ?? derivedColors.infoBg};`);\n\treturn lines.join(\"\\n \");\n}\ninterface SessionData {\n\theader: ReturnType<SessionManager[\"getHeader\"]>;\n\tentries: ReturnType<SessionManager[\"getEntries\"]>;\n\tleafId: string | null;\n\tsystemPrompt?: string;\n\ttools?: ToolInfo[];\n\trenderedTools?: Record<string, RenderedToolHtml>;\n}\nfunction generateHtml(sessionData: SessionData, themeName?: string): string {\n\tconst templateDir = getExportTemplateDir();\n\tconst template = readFileSync(join(templateDir, \"template.html\"), \"utf-8\");\n\tconst templateCss = readFileSync(join(templateDir, \"template.css\"), \"utf-8\");\n\tconst templateJs = readFileSync(join(templateDir, \"template.js\"), \"utf-8\");\n\tconst markedJs = readFileSync(join(templateDir, \"vendor\", \"marked.min.js\"), \"utf-8\");\n\tconst hljsJs = readFileSync(join(templateDir, \"vendor\", \"highlight.min.js\"), \"utf-8\");\n\tconst themeVars = generateThemeVars(themeName);\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst exportColors = deriveExportColors(colors.userMessageBg || \"#343541\");\n\tconst bodyBg = exportColors.pageBg;\n\tconst containerBg = exportColors.cardBg;\n\tconst infoBg = exportColors.infoBg;\n\tconst sessionDataBase64 = Buffer.from(JSON.stringify(sessionData)).toString(\"base64\");\n\tconst css = templateCss\n\t\t.replace(\"{{THEME_VARS}}\", themeVars)\n\t\t.replace(\"{{BODY_BG}}\", bodyBg)\n\t\t.replace(\"{{CONTAINER_BG}}\", containerBg)\n\t\t.replace(\"{{INFO_BG}}\", infoBg);\n\treturn template\n\t\t.replace(\"{{CSS}}\", css)\n\t\t.replace(\"{{JS}}\", templateJs)\n\t\t.replace(\"{{SESSION_DATA}}\", sessionDataBase64)\n\t\t.replace(\"{{MARKED_JS}}\", markedJs)\n\t\t.replace(\"{{HIGHLIGHT_JS}}\", hljsJs);\n}\nconst BUILTIN_TOOLS = new Set([\"bash\", \"read\", \"write\", \"edit\", \"ls\", \"find\", \"grep\"]);\nfunction preRenderCustomTools(\n\tentries: SessionEntry[],\n\ttoolRenderer: ToolHtmlRenderer,\n): Record<string, RenderedToolHtml> {\n\tconst renderedTools: Record<string, RenderedToolHtml> = {};\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\t\tconst msg = entry.message;\n\t\tif (msg.role === \"assistant\" && Array.isArray(msg.content)) {\n\t\t\tfor (const block of msg.content) {\n\t\t\t\tif (block.type === \"toolCall\" && !BUILTIN_TOOLS.has(block.name)) {\n\t\t\t\t\tconst callHtml = toolRenderer.renderCall(block.name, block.arguments);\n\t\t\t\t\tif (callHtml) {\n\t\t\t\t\t\trenderedTools[block.id] = { callHtml };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (msg.role === \"toolResult\" && msg.toolCallId) {\n\t\t\tconst toolName = msg.toolName || \"\";\n\t\t\tconst existing = renderedTools[msg.toolCallId];\n\t\t\tif (existing || !BUILTIN_TOOLS.has(toolName)) {\n\t\t\t\tconst rendered = toolRenderer.renderResult(toolName, msg.content, msg.details, msg.isError || false);\n\t\t\t\tif (rendered) {\n\t\t\t\t\trenderedTools[msg.toolCallId] = {\n\t\t\t\t\t\t...existing,\n\t\t\t\t\t\tresultHtmlCollapsed: rendered.collapsed,\n\t\t\t\t\t\tresultHtmlExpanded: rendered.expanded,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn renderedTools;\n}\nexport async function exportSessionToHtml(\n\tsm: SessionManager,\n\tstate?: AgentState,\n\toptions?: ExportOptions | string,\n): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\tconst sessionFile = sm.getSessionFile();\n\tif (!sessionFile) {\n\t\tthrow new Error(\"Cannot export in-memory session to HTML\");\n\t}\n\tif (!existsSync(sessionFile)) {\n\t\tthrow new Error(\"Nothing to export yet - start a conversation first\");\n\t}\n\tconst entries = sm.getEntries();\n\tlet renderedTools: Record<string, RenderedToolHtml> | undefined;\n\tif (opts.toolRenderer) {\n\t\trenderedTools = preRenderCustomTools(entries, opts.toolRenderer);\n\t\tif (Object.keys(renderedTools).length === 0) {\n\t\t\trenderedTools = undefined;\n\t\t}\n\t}\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries,\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: state?.systemPrompt,\n\t\ttools: state?.tools?.map((t) => ({ name: t.name, description: t.description, parameters: t.parameters })),\n\t\trenderedTools,\n\t};\n\tconst html = generateHtml(sessionData, opts.themeName);\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst sessionBasename = basename(sessionFile, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${sessionBasename}.html`;\n\t}\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\nexport async function exportFromFile(inputPath: string, options?: ExportOptions | string): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\tif (!existsSync(inputPath)) {\n\t\tthrow new Error(`File not found: ${inputPath}`);\n\t}\n\tconst sm = SessionManager.open(inputPath);\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries: sm.getEntries(),\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: undefined,\n\t\ttools: undefined,\n\t};\n\tconst html = generateHtml(sessionData, opts.themeName);\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst inputBasename = basename(inputPath, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${inputBasename}.html`;\n\t}\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/export-html/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAOjE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,MAAM,WAAW,gBAAgB;IAChC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAChE,YAAY,CACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAChF,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GACd;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACzD;AAMD,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,gBAAgB,CAAC;CAChC;AA6ID,wBAAsB,mBAAmB,CACxC,EAAE,EAAE,cAAc,EAClB,KAAK,CAAC,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,GAC9B,OAAO,CAAC,MAAM,CAAC,CAiCjB;AACD,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBzG","sourcesContent":["import type { AgentState } from \"@boxiaolanya2008/pi-agent-core\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { basename, join } from \"path\";\nimport { APP_NAME, getExportTemplateDir } from \"../../config.js\";\nimport { getResolvedThemeColors, getThemeExportColors } from \"../../modes/interactive/theme/theme.js\";\nimport type { ToolInfo } from \"../extensions/types.js\";\nimport type { SessionEntry } from \"../session-manager.js\";\nimport { SessionManager } from \"../session-manager.js\";\nexport interface ToolHtmlRenderer {\n\trenderCall(toolName: string, args: unknown): string | undefined;\n\trenderResult(\n\t\ttoolName: string,\n\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\tdetails: unknown,\n\t\tisError: boolean,\n\t): { collapsed?: string; expanded?: string } | undefined;\n}\ninterface RenderedToolHtml {\n\tcallHtml?: string;\n\tresultHtmlCollapsed?: string;\n\tresultHtmlExpanded?: string;\n}\nexport interface ExportOptions {\n\toutputPath?: string;\n\tthemeName?: string;\n\ttoolRenderer?: ToolHtmlRenderer;\n}\nfunction parseColor(color: string): { r: number; g: number; b: number } | undefined {\n\tconst hexMatch = color.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);\n\tif (hexMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(hexMatch[1], 16),\n\t\t\tg: Number.parseInt(hexMatch[2], 16),\n\t\t\tb: Number.parseInt(hexMatch[3], 16),\n\t\t};\n\t}\n\tconst rgbMatch = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/);\n\tif (rgbMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(rgbMatch[1], 10),\n\t\t\tg: Number.parseInt(rgbMatch[2], 10),\n\t\t\tb: Number.parseInt(rgbMatch[3], 10),\n\t\t};\n\t}\n\treturn undefined;\n}\nfunction getLuminance(r: number, g: number, b: number): number {\n\tconst toLinear = (c: number) => {\n\t\tconst s = c / 255;\n\t\treturn s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n\t};\n\treturn 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\nfunction adjustBrightness(color: string, factor: number): string {\n\tconst parsed = parseColor(color);\n\tif (!parsed) return color;\n\tconst adjust = (c: number) => Math.min(255, Math.max(0, Math.round(c * factor)));\n\treturn `rgb(${adjust(parsed.r)}, ${adjust(parsed.g)}, ${adjust(parsed.b)})`;\n}\nfunction deriveExportColors(baseColor: string): { pageBg: string; cardBg: string; infoBg: string } {\n\tconst parsed = parseColor(baseColor);\n\tif (!parsed) {\n\t\treturn {\n\t\t\tpageBg: \"rgb(24, 24, 30)\",\n\t\t\tcardBg: \"rgb(30, 30, 36)\",\n\t\t\tinfoBg: \"rgb(60, 55, 40)\",\n\t\t};\n\t}\n\tconst luminance = getLuminance(parsed.r, parsed.g, parsed.b);\n\tconst isLight = luminance > 0.5;\n\tif (isLight) {\n\t\treturn {\n\t\t\tpageBg: adjustBrightness(baseColor, 0.96),\n\t\t\tcardBg: baseColor,\n\t\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 10)}, ${Math.min(255, parsed.g + 5)}, ${Math.max(0, parsed.b - 20)})`,\n\t\t};\n\t}\n\treturn {\n\t\tpageBg: adjustBrightness(baseColor, 0.7),\n\t\tcardBg: adjustBrightness(baseColor, 0.85),\n\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 20)}, ${Math.min(255, parsed.g + 15)}, ${parsed.b})`,\n\t};\n}\nfunction generateThemeVars(themeName?: string): string {\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst lines: string[] = [];\n\tfor (const [key, value] of Object.entries(colors)) {\n\t\tlines.push(`--${key}: ${value};`);\n\t}\n\tconst themeExport = getThemeExportColors(themeName);\n\tconst userMessageBg = colors.userMessageBg || \"#343541\";\n\tconst derivedColors = deriveExportColors(userMessageBg);\n\tlines.push(`--exportPageBg: ${themeExport.pageBg ?? derivedColors.pageBg};`);\n\tlines.push(`--exportCardBg: ${themeExport.cardBg ?? derivedColors.cardBg};`);\n\tlines.push(`--exportInfoBg: ${themeExport.infoBg ?? derivedColors.infoBg};`);\n\treturn lines.join(\"\\n \");\n}\ninterface SessionData {\n\theader: ReturnType<SessionManager[\"getHeader\"]>;\n\tentries: ReturnType<SessionManager[\"getEntries\"]>;\n\tleafId: string | null;\n\tsystemPrompt?: string;\n\ttools?: ToolInfo[];\n\trenderedTools?: Record<string, RenderedToolHtml>;\n}\nfunction generateHtml(sessionData: SessionData, themeName?: string): string {\n\tconst templateDir = getExportTemplateDir();\n\tconst template = readFileSync(join(templateDir, \"template.html\"), \"utf-8\");\n\tconst templateCss = readFileSync(join(templateDir, \"template.css\"), \"utf-8\");\n\tconst templateJs = readFileSync(join(templateDir, \"template.js\"), \"utf-8\");\n\tconst markedJs = readFileSync(join(templateDir, \"vendor\", \"marked.min.js\"), \"utf-8\");\n\tconst hljsJs = readFileSync(join(templateDir, \"vendor\", \"highlight.min.js\"), \"utf-8\");\n\tconst themeVars = generateThemeVars(themeName);\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst exportColors = deriveExportColors(colors.userMessageBg || \"#343541\");\n\tconst bodyBg = exportColors.pageBg;\n\tconst containerBg = exportColors.cardBg;\n\tconst infoBg = exportColors.infoBg;\n\tconst sessionDataBase64 = Buffer.from(JSON.stringify(sessionData)).toString(\"base64\");\n\tconst css = templateCss\n\t\t.replace(\"{{THEME_VARS}}\", themeVars)\n\t\t.replace(\"{{BODY_BG}}\", bodyBg)\n\t\t.replace(\"{{CONTAINER_BG}}\", containerBg)\n\t\t.replace(\"{{INFO_BG}}\", infoBg);\n\treturn template\n\t\t.replace(\"{{CSS}}\", css)\n\t\t.replace(\"{{JS}}\", templateJs)\n\t\t.replace(\"{{SESSION_DATA}}\", sessionDataBase64)\n\t\t.replace(\"{{MARKED_JS}}\", markedJs)\n\t\t.replace(\"{{HIGHLIGHT_JS}}\", hljsJs);\n}\nconst BUILTIN_TOOLS = new Set([\"bash\", \"read\", \"write\", \"edit\", \"ls\", \"find\", \"grep\"]);\nfunction preRenderCustomTools(\n\tentries: SessionEntry[],\n\ttoolRenderer: ToolHtmlRenderer,\n): Record<string, RenderedToolHtml> {\n\tconst renderedTools: Record<string, RenderedToolHtml> = {};\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\t\tconst msg = entry.message;\n\t\tif (msg.role === \"assistant\" && Array.isArray(msg.content)) {\n\t\t\tfor (const block of msg.content) {\n\t\t\t\tif (block.type === \"toolCall\" && !BUILTIN_TOOLS.has(block.name)) {\n\t\t\t\t\tconst callHtml = toolRenderer.renderCall(block.name, block.arguments);\n\t\t\t\t\tif (callHtml) {\n\t\t\t\t\t\trenderedTools[block.id] = { callHtml };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (msg.role === \"toolResult\" && msg.toolCallId) {\n\t\t\tconst toolName = msg.toolName || \"\";\n\t\t\tconst existing = renderedTools[msg.toolCallId];\n\t\t\tif (existing || !BUILTIN_TOOLS.has(toolName)) {\n\t\t\t\tconst rendered = toolRenderer.renderResult(toolName, msg.content, msg.details, msg.isError || false);\n\t\t\t\tif (rendered) {\n\t\t\t\t\trenderedTools[msg.toolCallId] = {\n\t\t\t\t\t\t...existing,\n\t\t\t\t\t\tresultHtmlCollapsed: rendered.collapsed,\n\t\t\t\t\t\tresultHtmlExpanded: rendered.expanded,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn renderedTools;\n}\nexport async function exportSessionToHtml(\n\tsm: SessionManager,\n\tstate?: AgentState,\n\toptions?: ExportOptions | string,\n): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\tconst sessionFile = sm.getSessionFile();\n\tif (!sessionFile) {\n\t\tthrow new Error(\"Cannot export in-memory session to HTML\");\n\t}\n\tif (!existsSync(sessionFile)) {\n\t\tthrow new Error(\"Nothing to export yet - start a conversation first\");\n\t}\n\tconst entries = sm.getEntries();\n\tlet renderedTools: Record<string, RenderedToolHtml> | undefined;\n\tif (opts.toolRenderer) {\n\t\trenderedTools = preRenderCustomTools(entries, opts.toolRenderer);\n\t\tif (Object.keys(renderedTools).length === 0) {\n\t\t\trenderedTools = undefined;\n\t\t}\n\t}\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries,\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: state?.systemPrompt,\n\t\ttools: state?.tools?.map((t) => ({ name: t.name, description: t.description, parameters: t.parameters })),\n\t\trenderedTools,\n\t};\n\tconst html = generateHtml(sessionData, opts.themeName);\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst sessionBasename = basename(sessionFile, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${sessionBasename}.html`;\n\t}\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\nexport async function exportFromFile(inputPath: string, options?: ExportOptions | string): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\tif (!existsSync(inputPath)) {\n\t\tthrow new Error(`File not found: ${inputPath}`);\n\t}\n\tconst sm = SessionManager.open(inputPath);\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries: sm.getEntries(),\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: undefined,\n\t\ttools: undefined,\n\t};\n\tconst html = generateHtml(sessionData, opts.themeName);\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst inputBasename = basename(inputPath, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${inputBasename}.html`;\n\t}\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/export-html/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentState } from \"@mariozechner/pi-agent-core\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { basename, join } from \"path\";\nimport { APP_NAME, getExportTemplateDir } from \"../../config.js\";\nimport { getResolvedThemeColors, getThemeExportColors } from \"../../modes/interactive/theme/theme.js\";\nimport type { ToolInfo } from \"../extensions/types.js\";\nimport type { SessionEntry } from \"../session-manager.js\";\nimport { SessionManager } from \"../session-manager.js\";\nexport interface ToolHtmlRenderer {\n\trenderCall(toolName: string, args: unknown): string | undefined;\n\trenderResult(\n\t\ttoolName: string,\n\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\tdetails: unknown,\n\t\tisError: boolean,\n\t): { collapsed?: string; expanded?: string } | undefined;\n}\ninterface RenderedToolHtml {\n\tcallHtml?: string;\n\tresultHtmlCollapsed?: string;\n\tresultHtmlExpanded?: string;\n}\nexport interface ExportOptions {\n\toutputPath?: string;\n\tthemeName?: string;\n\ttoolRenderer?: ToolHtmlRenderer;\n}\nfunction parseColor(color: string): { r: number; g: number; b: number } | undefined {\n\tconst hexMatch = color.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);\n\tif (hexMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(hexMatch[1], 16),\n\t\t\tg: Number.parseInt(hexMatch[2], 16),\n\t\t\tb: Number.parseInt(hexMatch[3], 16),\n\t\t};\n\t}\n\tconst rgbMatch = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/);\n\tif (rgbMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(rgbMatch[1], 10),\n\t\t\tg: Number.parseInt(rgbMatch[2], 10),\n\t\t\tb: Number.parseInt(rgbMatch[3], 10),\n\t\t};\n\t}\n\treturn undefined;\n}\nfunction getLuminance(r: number, g: number, b: number): number {\n\tconst toLinear = (c: number) => {\n\t\tconst s = c / 255;\n\t\treturn s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n\t};\n\treturn 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\nfunction adjustBrightness(color: string, factor: number): string {\n\tconst parsed = parseColor(color);\n\tif (!parsed) return color;\n\tconst adjust = (c: number) => Math.min(255, Math.max(0, Math.round(c * factor)));\n\treturn `rgb(${adjust(parsed.r)}, ${adjust(parsed.g)}, ${adjust(parsed.b)})`;\n}\nfunction deriveExportColors(baseColor: string): { pageBg: string; cardBg: string; infoBg: string } {\n\tconst parsed = parseColor(baseColor);\n\tif (!parsed) {\n\t\treturn {\n\t\t\tpageBg: \"rgb(24, 24, 30)\",\n\t\t\tcardBg: \"rgb(30, 30, 36)\",\n\t\t\tinfoBg: \"rgb(60, 55, 40)\",\n\t\t};\n\t}\n\tconst luminance = getLuminance(parsed.r, parsed.g, parsed.b);\n\tconst isLight = luminance > 0.5;\n\tif (isLight) {\n\t\treturn {\n\t\t\tpageBg: adjustBrightness(baseColor, 0.96),\n\t\t\tcardBg: baseColor,\n\t\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 10)}, ${Math.min(255, parsed.g + 5)}, ${Math.max(0, parsed.b - 20)})`,\n\t\t};\n\t}\n\treturn {\n\t\tpageBg: adjustBrightness(baseColor, 0.7),\n\t\tcardBg: adjustBrightness(baseColor, 0.85),\n\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 20)}, ${Math.min(255, parsed.g + 15)}, ${parsed.b})`,\n\t};\n}\nfunction generateThemeVars(themeName?: string): string {\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst lines: string[] = [];\n\tfor (const [key, value] of Object.entries(colors)) {\n\t\tlines.push(`--${key}: ${value};`);\n\t}\n\tconst themeExport = getThemeExportColors(themeName);\n\tconst userMessageBg = colors.userMessageBg || \"#343541\";\n\tconst derivedColors = deriveExportColors(userMessageBg);\n\tlines.push(`--exportPageBg: ${themeExport.pageBg ?? derivedColors.pageBg};`);\n\tlines.push(`--exportCardBg: ${themeExport.cardBg ?? derivedColors.cardBg};`);\n\tlines.push(`--exportInfoBg: ${themeExport.infoBg ?? derivedColors.infoBg};`);\n\treturn lines.join(\"\\n \");\n}\ninterface SessionData {\n\theader: ReturnType<SessionManager[\"getHeader\"]>;\n\tentries: ReturnType<SessionManager[\"getEntries\"]>;\n\tleafId: string | null;\n\tsystemPrompt?: string;\n\ttools?: ToolInfo[];\n\trenderedTools?: Record<string, RenderedToolHtml>;\n}\nfunction generateHtml(sessionData: SessionData, themeName?: string): string {\n\tconst templateDir = getExportTemplateDir();\n\tconst template = readFileSync(join(templateDir, \"template.html\"), \"utf-8\");\n\tconst templateCss = readFileSync(join(templateDir, \"template.css\"), \"utf-8\");\n\tconst templateJs = readFileSync(join(templateDir, \"template.js\"), \"utf-8\");\n\tconst markedJs = readFileSync(join(templateDir, \"vendor\", \"marked.min.js\"), \"utf-8\");\n\tconst hljsJs = readFileSync(join(templateDir, \"vendor\", \"highlight.min.js\"), \"utf-8\");\n\tconst themeVars = generateThemeVars(themeName);\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst exportColors = deriveExportColors(colors.userMessageBg || \"#343541\");\n\tconst bodyBg = exportColors.pageBg;\n\tconst containerBg = exportColors.cardBg;\n\tconst infoBg = exportColors.infoBg;\n\tconst sessionDataBase64 = Buffer.from(JSON.stringify(sessionData)).toString(\"base64\");\n\tconst css = templateCss\n\t\t.replace(\"{{THEME_VARS}}\", themeVars)\n\t\t.replace(\"{{BODY_BG}}\", bodyBg)\n\t\t.replace(\"{{CONTAINER_BG}}\", containerBg)\n\t\t.replace(\"{{INFO_BG}}\", infoBg);\n\treturn template\n\t\t.replace(\"{{CSS}}\", css)\n\t\t.replace(\"{{JS}}\", templateJs)\n\t\t.replace(\"{{SESSION_DATA}}\", sessionDataBase64)\n\t\t.replace(\"{{MARKED_JS}}\", markedJs)\n\t\t.replace(\"{{HIGHLIGHT_JS}}\", hljsJs);\n}\nconst BUILTIN_TOOLS = new Set([\"bash\", \"read\", \"write\", \"edit\", \"ls\", \"find\", \"grep\"]);\nfunction preRenderCustomTools(\n\tentries: SessionEntry[],\n\ttoolRenderer: ToolHtmlRenderer,\n): Record<string, RenderedToolHtml> {\n\tconst renderedTools: Record<string, RenderedToolHtml> = {};\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\t\tconst msg = entry.message;\n\t\tif (msg.role === \"assistant\" && Array.isArray(msg.content)) {\n\t\t\tfor (const block of msg.content) {\n\t\t\t\tif (block.type === \"toolCall\" && !BUILTIN_TOOLS.has(block.name)) {\n\t\t\t\t\tconst callHtml = toolRenderer.renderCall(block.name, block.arguments);\n\t\t\t\t\tif (callHtml) {\n\t\t\t\t\t\trenderedTools[block.id] = { callHtml };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (msg.role === \"toolResult\" && msg.toolCallId) {\n\t\t\tconst toolName = msg.toolName || \"\";\n\t\t\tconst existing = renderedTools[msg.toolCallId];\n\t\t\tif (existing || !BUILTIN_TOOLS.has(toolName)) {\n\t\t\t\tconst rendered = toolRenderer.renderResult(toolName, msg.content, msg.details, msg.isError || false);\n\t\t\t\tif (rendered) {\n\t\t\t\t\trenderedTools[msg.toolCallId] = {\n\t\t\t\t\t\t...existing,\n\t\t\t\t\t\tresultHtmlCollapsed: rendered.collapsed,\n\t\t\t\t\t\tresultHtmlExpanded: rendered.expanded,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn renderedTools;\n}\nexport async function exportSessionToHtml(\n\tsm: SessionManager,\n\tstate?: AgentState,\n\toptions?: ExportOptions | string,\n): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\tconst sessionFile = sm.getSessionFile();\n\tif (!sessionFile) {\n\t\tthrow new Error(\"Cannot export in-memory session to HTML\");\n\t}\n\tif (!existsSync(sessionFile)) {\n\t\tthrow new Error(\"Nothing to export yet - start a conversation first\");\n\t}\n\tconst entries = sm.getEntries();\n\tlet renderedTools: Record<string, RenderedToolHtml> | undefined;\n\tif (opts.toolRenderer) {\n\t\trenderedTools = preRenderCustomTools(entries, opts.toolRenderer);\n\t\tif (Object.keys(renderedTools).length === 0) {\n\t\t\trenderedTools = undefined;\n\t\t}\n\t}\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries,\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: state?.systemPrompt,\n\t\ttools: state?.tools?.map((t) => ({ name: t.name, description: t.description, parameters: t.parameters })),\n\t\trenderedTools,\n\t};\n\tconst html = generateHtml(sessionData, opts.themeName);\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst sessionBasename = basename(sessionFile, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${sessionBasename}.html`;\n\t}\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\nexport async function exportFromFile(inputPath: string, options?: ExportOptions | string): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\tif (!existsSync(inputPath)) {\n\t\tthrow new Error(`File not found: ${inputPath}`);\n\t}\n\tconst sm = SessionManager.open(inputPath);\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries: sm.getEntries(),\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: undefined,\n\t\ttools: undefined,\n\t};\n\tconst html = generateHtml(sessionData, opts.themeName);\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst inputBasename = basename(inputPath, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${inputBasename}.html`;\n\t}\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/export-html/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentState } from \"@boxiaolanya2008/pi-agent-core\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { basename, join } from \"path\";\nimport { APP_NAME, getExportTemplateDir } from \"../../config.js\";\nimport { getResolvedThemeColors, getThemeExportColors } from \"../../modes/interactive/theme/theme.js\";\nimport type { ToolInfo } from \"../extensions/types.js\";\nimport type { SessionEntry } from \"../session-manager.js\";\nimport { SessionManager } from \"../session-manager.js\";\nexport interface ToolHtmlRenderer {\n\trenderCall(toolName: string, args: unknown): string | undefined;\n\trenderResult(\n\t\ttoolName: string,\n\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\tdetails: unknown,\n\t\tisError: boolean,\n\t): { collapsed?: string; expanded?: string } | undefined;\n}\ninterface RenderedToolHtml {\n\tcallHtml?: string;\n\tresultHtmlCollapsed?: string;\n\tresultHtmlExpanded?: string;\n}\nexport interface ExportOptions {\n\toutputPath?: string;\n\tthemeName?: string;\n\ttoolRenderer?: ToolHtmlRenderer;\n}\nfunction parseColor(color: string): { r: number; g: number; b: number } | undefined {\n\tconst hexMatch = color.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);\n\tif (hexMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(hexMatch[1], 16),\n\t\t\tg: Number.parseInt(hexMatch[2], 16),\n\t\t\tb: Number.parseInt(hexMatch[3], 16),\n\t\t};\n\t}\n\tconst rgbMatch = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/);\n\tif (rgbMatch) {\n\t\treturn {\n\t\t\tr: Number.parseInt(rgbMatch[1], 10),\n\t\t\tg: Number.parseInt(rgbMatch[2], 10),\n\t\t\tb: Number.parseInt(rgbMatch[3], 10),\n\t\t};\n\t}\n\treturn undefined;\n}\nfunction getLuminance(r: number, g: number, b: number): number {\n\tconst toLinear = (c: number) => {\n\t\tconst s = c / 255;\n\t\treturn s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n\t};\n\treturn 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\nfunction adjustBrightness(color: string, factor: number): string {\n\tconst parsed = parseColor(color);\n\tif (!parsed) return color;\n\tconst adjust = (c: number) => Math.min(255, Math.max(0, Math.round(c * factor)));\n\treturn `rgb(${adjust(parsed.r)}, ${adjust(parsed.g)}, ${adjust(parsed.b)})`;\n}\nfunction deriveExportColors(baseColor: string): { pageBg: string; cardBg: string; infoBg: string } {\n\tconst parsed = parseColor(baseColor);\n\tif (!parsed) {\n\t\treturn {\n\t\t\tpageBg: \"rgb(24, 24, 30)\",\n\t\t\tcardBg: \"rgb(30, 30, 36)\",\n\t\t\tinfoBg: \"rgb(60, 55, 40)\",\n\t\t};\n\t}\n\tconst luminance = getLuminance(parsed.r, parsed.g, parsed.b);\n\tconst isLight = luminance > 0.5;\n\tif (isLight) {\n\t\treturn {\n\t\t\tpageBg: adjustBrightness(baseColor, 0.96),\n\t\t\tcardBg: baseColor,\n\t\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 10)}, ${Math.min(255, parsed.g + 5)}, ${Math.max(0, parsed.b - 20)})`,\n\t\t};\n\t}\n\treturn {\n\t\tpageBg: adjustBrightness(baseColor, 0.7),\n\t\tcardBg: adjustBrightness(baseColor, 0.85),\n\t\tinfoBg: `rgb(${Math.min(255, parsed.r + 20)}, ${Math.min(255, parsed.g + 15)}, ${parsed.b})`,\n\t};\n}\nfunction generateThemeVars(themeName?: string): string {\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst lines: string[] = [];\n\tfor (const [key, value] of Object.entries(colors)) {\n\t\tlines.push(`--${key}: ${value};`);\n\t}\n\tconst themeExport = getThemeExportColors(themeName);\n\tconst userMessageBg = colors.userMessageBg || \"#343541\";\n\tconst derivedColors = deriveExportColors(userMessageBg);\n\tlines.push(`--exportPageBg: ${themeExport.pageBg ?? derivedColors.pageBg};`);\n\tlines.push(`--exportCardBg: ${themeExport.cardBg ?? derivedColors.cardBg};`);\n\tlines.push(`--exportInfoBg: ${themeExport.infoBg ?? derivedColors.infoBg};`);\n\treturn lines.join(\"\\n \");\n}\ninterface SessionData {\n\theader: ReturnType<SessionManager[\"getHeader\"]>;\n\tentries: ReturnType<SessionManager[\"getEntries\"]>;\n\tleafId: string | null;\n\tsystemPrompt?: string;\n\ttools?: ToolInfo[];\n\trenderedTools?: Record<string, RenderedToolHtml>;\n}\nfunction generateHtml(sessionData: SessionData, themeName?: string): string {\n\tconst templateDir = getExportTemplateDir();\n\tconst template = readFileSync(join(templateDir, \"template.html\"), \"utf-8\");\n\tconst templateCss = readFileSync(join(templateDir, \"template.css\"), \"utf-8\");\n\tconst templateJs = readFileSync(join(templateDir, \"template.js\"), \"utf-8\");\n\tconst markedJs = readFileSync(join(templateDir, \"vendor\", \"marked.min.js\"), \"utf-8\");\n\tconst hljsJs = readFileSync(join(templateDir, \"vendor\", \"highlight.min.js\"), \"utf-8\");\n\tconst themeVars = generateThemeVars(themeName);\n\tconst colors = getResolvedThemeColors(themeName);\n\tconst exportColors = deriveExportColors(colors.userMessageBg || \"#343541\");\n\tconst bodyBg = exportColors.pageBg;\n\tconst containerBg = exportColors.cardBg;\n\tconst infoBg = exportColors.infoBg;\n\tconst sessionDataBase64 = Buffer.from(JSON.stringify(sessionData)).toString(\"base64\");\n\tconst css = templateCss\n\t\t.replace(\"{{THEME_VARS}}\", themeVars)\n\t\t.replace(\"{{BODY_BG}}\", bodyBg)\n\t\t.replace(\"{{CONTAINER_BG}}\", containerBg)\n\t\t.replace(\"{{INFO_BG}}\", infoBg);\n\treturn template\n\t\t.replace(\"{{CSS}}\", css)\n\t\t.replace(\"{{JS}}\", templateJs)\n\t\t.replace(\"{{SESSION_DATA}}\", sessionDataBase64)\n\t\t.replace(\"{{MARKED_JS}}\", markedJs)\n\t\t.replace(\"{{HIGHLIGHT_JS}}\", hljsJs);\n}\nconst BUILTIN_TOOLS = new Set([\"bash\", \"read\", \"write\", \"edit\", \"ls\", \"find\", \"grep\"]);\nfunction preRenderCustomTools(\n\tentries: SessionEntry[],\n\ttoolRenderer: ToolHtmlRenderer,\n): Record<string, RenderedToolHtml> {\n\tconst renderedTools: Record<string, RenderedToolHtml> = {};\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\t\tconst msg = entry.message;\n\t\tif (msg.role === \"assistant\" && Array.isArray(msg.content)) {\n\t\t\tfor (const block of msg.content) {\n\t\t\t\tif (block.type === \"toolCall\" && !BUILTIN_TOOLS.has(block.name)) {\n\t\t\t\t\tconst callHtml = toolRenderer.renderCall(block.name, block.arguments);\n\t\t\t\t\tif (callHtml) {\n\t\t\t\t\t\trenderedTools[block.id] = { callHtml };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (msg.role === \"toolResult\" && msg.toolCallId) {\n\t\t\tconst toolName = msg.toolName || \"\";\n\t\t\tconst existing = renderedTools[msg.toolCallId];\n\t\t\tif (existing || !BUILTIN_TOOLS.has(toolName)) {\n\t\t\t\tconst rendered = toolRenderer.renderResult(toolName, msg.content, msg.details, msg.isError || false);\n\t\t\t\tif (rendered) {\n\t\t\t\t\trenderedTools[msg.toolCallId] = {\n\t\t\t\t\t\t...existing,\n\t\t\t\t\t\tresultHtmlCollapsed: rendered.collapsed,\n\t\t\t\t\t\tresultHtmlExpanded: rendered.expanded,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn renderedTools;\n}\nexport async function exportSessionToHtml(\n\tsm: SessionManager,\n\tstate?: AgentState,\n\toptions?: ExportOptions | string,\n): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\tconst sessionFile = sm.getSessionFile();\n\tif (!sessionFile) {\n\t\tthrow new Error(\"Cannot export in-memory session to HTML\");\n\t}\n\tif (!existsSync(sessionFile)) {\n\t\tthrow new Error(\"Nothing to export yet - start a conversation first\");\n\t}\n\tconst entries = sm.getEntries();\n\tlet renderedTools: Record<string, RenderedToolHtml> | undefined;\n\tif (opts.toolRenderer) {\n\t\trenderedTools = preRenderCustomTools(entries, opts.toolRenderer);\n\t\tif (Object.keys(renderedTools).length === 0) {\n\t\t\trenderedTools = undefined;\n\t\t}\n\t}\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries,\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: state?.systemPrompt,\n\t\ttools: state?.tools?.map((t) => ({ name: t.name, description: t.description, parameters: t.parameters })),\n\t\trenderedTools,\n\t};\n\tconst html = generateHtml(sessionData, opts.themeName);\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst sessionBasename = basename(sessionFile, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${sessionBasename}.html`;\n\t}\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\nexport async function exportFromFile(inputPath: string, options?: ExportOptions | string): Promise<string> {\n\tconst opts: ExportOptions = typeof options === \"string\" ? { outputPath: options } : options || {};\n\tif (!existsSync(inputPath)) {\n\t\tthrow new Error(`File not found: ${inputPath}`);\n\t}\n\tconst sm = SessionManager.open(inputPath);\n\tconst sessionData: SessionData = {\n\t\theader: sm.getHeader(),\n\t\tentries: sm.getEntries(),\n\t\tleafId: sm.getLeafId(),\n\t\tsystemPrompt: undefined,\n\t\ttools: undefined,\n\t};\n\tconst html = generateHtml(sessionData, opts.themeName);\n\tlet outputPath = opts.outputPath;\n\tif (!outputPath) {\n\t\tconst inputBasename = basename(inputPath, \".jsonl\");\n\t\toutputPath = `${APP_NAME}-session-${inputBasename}.html`;\n\t}\n\twriteFileSync(outputPath, html, \"utf8\");\n\treturn outputPath;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tool-renderer.d.ts","sourceRoot":"","sources":["../../../src/core/export-html/tool-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACpC,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,cAAc,GAAG,SAAS,CAAC;IAChE,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,gBAAgB;IAChC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAChE,YAAY,CACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAChF,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GACd;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACzD;AACD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,gBAAgB,CA2DnF","sourcesContent":["import type { ImageContent, TextContent } from \"@mariozechner/pi-ai\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.js\";\nimport type { ToolDefinition } from \"../extensions/types.js\";\nimport { ansiLinesToHtml } from \"./ansi-to-html.js\";\nexport interface ToolHtmlRendererDeps {\n\tgetToolDefinition: (name: string) => ToolDefinition | undefined;\n\ttheme: Theme;\n\twidth?: number;\n}\nexport interface ToolHtmlRenderer {\n\trenderCall(toolName: string, args: unknown): string | undefined;\n\trenderResult(\n\t\ttoolName: string,\n\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\tdetails: unknown,\n\t\tisError: boolean,\n\t): { collapsed?: string; expanded?: string } | undefined;\n}\nexport function createToolHtmlRenderer(deps: ToolHtmlRendererDeps): ToolHtmlRenderer {\n\tconst { getToolDefinition, theme, width = 100 } = deps;\n\treturn {\n\t\trenderCall(toolName: string, args: unknown): string | undefined {\n\t\t\ttry {\n\t\t\t\tconst toolDef = getToolDefinition(toolName);\n\t\t\t\tif (!toolDef?.renderCall) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst component = toolDef.renderCall(args, theme);\n\t\t\t\tif (!component) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst lines = component.render(width);\n\t\t\t\treturn ansiLinesToHtml(lines);\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t\trenderResult(\n\t\t\ttoolName: string,\n\t\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\t\tdetails: unknown,\n\t\t\tisError: boolean,\n\t\t): { collapsed?: string; expanded?: string } | undefined {\n\t\t\ttry {\n\t\t\t\tconst toolDef = getToolDefinition(toolName);\n\t\t\t\tif (!toolDef?.renderResult) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst agentToolResult = {\n\t\t\t\t\tcontent: result as (TextContent | ImageContent)[],\n\t\t\t\t\tdetails,\n\t\t\t\t\tisError,\n\t\t\t\t};\n\t\t\t\tconst collapsedComponent = toolDef.renderResult(\n\t\t\t\t\tagentToolResult,\n\t\t\t\t\t{ expanded: false, isPartial: false },\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t\tconst collapsed = collapsedComponent ? ansiLinesToHtml(collapsedComponent.render(width)) : undefined;\n\t\t\t\tconst expandedComponent = toolDef.renderResult(\n\t\t\t\t\tagentToolResult,\n\t\t\t\t\t{ expanded: true, isPartial: false },\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t\tconst expanded = expandedComponent ? ansiLinesToHtml(expandedComponent.render(width)) : undefined;\n\t\t\t\tif (!expanded) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...(collapsed && collapsed !== expanded ? { collapsed } : {}),\n\t\t\t\t\texpanded,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"tool-renderer.d.ts","sourceRoot":"","sources":["../../../src/core/export-html/tool-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACpC,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,cAAc,GAAG,SAAS,CAAC;IAChE,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,gBAAgB;IAChC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAChE,YAAY,CACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAChF,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GACd;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACzD;AACD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,gBAAgB,CA2DnF","sourcesContent":["import type { ImageContent, TextContent } from \"@boxiaolanya2008/pi-ai\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.js\";\nimport type { ToolDefinition } from \"../extensions/types.js\";\nimport { ansiLinesToHtml } from \"./ansi-to-html.js\";\nexport interface ToolHtmlRendererDeps {\n\tgetToolDefinition: (name: string) => ToolDefinition | undefined;\n\ttheme: Theme;\n\twidth?: number;\n}\nexport interface ToolHtmlRenderer {\n\trenderCall(toolName: string, args: unknown): string | undefined;\n\trenderResult(\n\t\ttoolName: string,\n\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\tdetails: unknown,\n\t\tisError: boolean,\n\t): { collapsed?: string; expanded?: string } | undefined;\n}\nexport function createToolHtmlRenderer(deps: ToolHtmlRendererDeps): ToolHtmlRenderer {\n\tconst { getToolDefinition, theme, width = 100 } = deps;\n\treturn {\n\t\trenderCall(toolName: string, args: unknown): string | undefined {\n\t\t\ttry {\n\t\t\t\tconst toolDef = getToolDefinition(toolName);\n\t\t\t\tif (!toolDef?.renderCall) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst component = toolDef.renderCall(args, theme);\n\t\t\t\tif (!component) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst lines = component.render(width);\n\t\t\t\treturn ansiLinesToHtml(lines);\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t\trenderResult(\n\t\t\ttoolName: string,\n\t\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\t\tdetails: unknown,\n\t\t\tisError: boolean,\n\t\t): { collapsed?: string; expanded?: string } | undefined {\n\t\t\ttry {\n\t\t\t\tconst toolDef = getToolDefinition(toolName);\n\t\t\t\tif (!toolDef?.renderResult) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst agentToolResult = {\n\t\t\t\t\tcontent: result as (TextContent | ImageContent)[],\n\t\t\t\t\tdetails,\n\t\t\t\t\tisError,\n\t\t\t\t};\n\t\t\t\tconst collapsedComponent = toolDef.renderResult(\n\t\t\t\t\tagentToolResult,\n\t\t\t\t\t{ expanded: false, isPartial: false },\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t\tconst collapsed = collapsedComponent ? ansiLinesToHtml(collapsedComponent.render(width)) : undefined;\n\t\t\t\tconst expandedComponent = toolDef.renderResult(\n\t\t\t\t\tagentToolResult,\n\t\t\t\t\t{ expanded: true, isPartial: false },\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t\tconst expanded = expandedComponent ? ansiLinesToHtml(expandedComponent.render(width)) : undefined;\n\t\t\t\tif (!expanded) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...(collapsed && collapsed !== expanded ? { collapsed } : {}),\n\t\t\t\t\texpanded,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tool-renderer.js","sourceRoot":"","sources":["../../../src/core/export-html/tool-renderer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAepD,MAAM,UAAU,sBAAsB,CAAC,IAA0B,EAAoB;IACpF,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;IACvD,OAAO;QACN,UAAU,CAAC,QAAgB,EAAE,IAAa,EAAsB;YAC/D,IAAI,CAAC;gBACJ,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;oBAC1B,OAAO,SAAS,CAAC;gBAClB,CAAC;gBACD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAClD,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,OAAO,SAAS,CAAC;gBAClB,CAAC;gBACD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,SAAS,CAAC;YAClB,CAAC;QAAA,CACD;QACD,YAAY,CACX,QAAgB,EAChB,MAAgF,EAChF,OAAgB,EAChB,OAAgB,EACwC;YACxD,IAAI,CAAC;gBACJ,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;oBAC5B,OAAO,SAAS,CAAC;gBAClB,CAAC;gBACD,MAAM,eAAe,GAAG;oBACvB,OAAO,EAAE,MAAwC;oBACjD,OAAO;oBACP,OAAO;iBACP,CAAC;gBACF,MAAM,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAC9C,eAAe,EACf,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EACrC,KAAK,CACL,CAAC;gBACF,MAAM,SAAS,GAAG,kBAAkB,CAAC,CAAC,CAAC,eAAe,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACrG,MAAM,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAC7C,eAAe,EACf,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EACpC,KAAK,CACL,CAAC;gBACF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAClG,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACf,OAAO,SAAS,CAAC;gBAClB,CAAC;gBACD,OAAO;oBACN,GAAG,CAAC,SAAS,IAAI,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7D,QAAQ;iBACR,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,SAAS,CAAC;YAClB,CAAC;QAAA,CACD;KACD,CAAC;AAAA,CACF","sourcesContent":["import type { ImageContent, TextContent } from \"@mariozechner/pi-ai\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.js\";\nimport type { ToolDefinition } from \"../extensions/types.js\";\nimport { ansiLinesToHtml } from \"./ansi-to-html.js\";\nexport interface ToolHtmlRendererDeps {\n\tgetToolDefinition: (name: string) => ToolDefinition | undefined;\n\ttheme: Theme;\n\twidth?: number;\n}\nexport interface ToolHtmlRenderer {\n\trenderCall(toolName: string, args: unknown): string | undefined;\n\trenderResult(\n\t\ttoolName: string,\n\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\tdetails: unknown,\n\t\tisError: boolean,\n\t): { collapsed?: string; expanded?: string } | undefined;\n}\nexport function createToolHtmlRenderer(deps: ToolHtmlRendererDeps): ToolHtmlRenderer {\n\tconst { getToolDefinition, theme, width = 100 } = deps;\n\treturn {\n\t\trenderCall(toolName: string, args: unknown): string | undefined {\n\t\t\ttry {\n\t\t\t\tconst toolDef = getToolDefinition(toolName);\n\t\t\t\tif (!toolDef?.renderCall) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst component = toolDef.renderCall(args, theme);\n\t\t\t\tif (!component) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst lines = component.render(width);\n\t\t\t\treturn ansiLinesToHtml(lines);\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t\trenderResult(\n\t\t\ttoolName: string,\n\t\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\t\tdetails: unknown,\n\t\t\tisError: boolean,\n\t\t): { collapsed?: string; expanded?: string } | undefined {\n\t\t\ttry {\n\t\t\t\tconst toolDef = getToolDefinition(toolName);\n\t\t\t\tif (!toolDef?.renderResult) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst agentToolResult = {\n\t\t\t\t\tcontent: result as (TextContent | ImageContent)[],\n\t\t\t\t\tdetails,\n\t\t\t\t\tisError,\n\t\t\t\t};\n\t\t\t\tconst collapsedComponent = toolDef.renderResult(\n\t\t\t\t\tagentToolResult,\n\t\t\t\t\t{ expanded: false, isPartial: false },\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t\tconst collapsed = collapsedComponent ? ansiLinesToHtml(collapsedComponent.render(width)) : undefined;\n\t\t\t\tconst expandedComponent = toolDef.renderResult(\n\t\t\t\t\tagentToolResult,\n\t\t\t\t\t{ expanded: true, isPartial: false },\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t\tconst expanded = expandedComponent ? ansiLinesToHtml(expandedComponent.render(width)) : undefined;\n\t\t\t\tif (!expanded) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...(collapsed && collapsed !== expanded ? { collapsed } : {}),\n\t\t\t\t\texpanded,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"tool-renderer.js","sourceRoot":"","sources":["../../../src/core/export-html/tool-renderer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAepD,MAAM,UAAU,sBAAsB,CAAC,IAA0B,EAAoB;IACpF,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;IACvD,OAAO;QACN,UAAU,CAAC,QAAgB,EAAE,IAAa,EAAsB;YAC/D,IAAI,CAAC;gBACJ,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;oBAC1B,OAAO,SAAS,CAAC;gBAClB,CAAC;gBACD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAClD,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,OAAO,SAAS,CAAC;gBAClB,CAAC;gBACD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,SAAS,CAAC;YAClB,CAAC;QAAA,CACD;QACD,YAAY,CACX,QAAgB,EAChB,MAAgF,EAChF,OAAgB,EAChB,OAAgB,EACwC;YACxD,IAAI,CAAC;gBACJ,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;oBAC5B,OAAO,SAAS,CAAC;gBAClB,CAAC;gBACD,MAAM,eAAe,GAAG;oBACvB,OAAO,EAAE,MAAwC;oBACjD,OAAO;oBACP,OAAO;iBACP,CAAC;gBACF,MAAM,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAC9C,eAAe,EACf,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EACrC,KAAK,CACL,CAAC;gBACF,MAAM,SAAS,GAAG,kBAAkB,CAAC,CAAC,CAAC,eAAe,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACrG,MAAM,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAC7C,eAAe,EACf,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EACpC,KAAK,CACL,CAAC;gBACF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAClG,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACf,OAAO,SAAS,CAAC;gBAClB,CAAC;gBACD,OAAO;oBACN,GAAG,CAAC,SAAS,IAAI,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7D,QAAQ;iBACR,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,SAAS,CAAC;YAClB,CAAC;QAAA,CACD;KACD,CAAC;AAAA,CACF","sourcesContent":["import type { ImageContent, TextContent } from \"@boxiaolanya2008/pi-ai\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.js\";\nimport type { ToolDefinition } from \"../extensions/types.js\";\nimport { ansiLinesToHtml } from \"./ansi-to-html.js\";\nexport interface ToolHtmlRendererDeps {\n\tgetToolDefinition: (name: string) => ToolDefinition | undefined;\n\ttheme: Theme;\n\twidth?: number;\n}\nexport interface ToolHtmlRenderer {\n\trenderCall(toolName: string, args: unknown): string | undefined;\n\trenderResult(\n\t\ttoolName: string,\n\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\tdetails: unknown,\n\t\tisError: boolean,\n\t): { collapsed?: string; expanded?: string } | undefined;\n}\nexport function createToolHtmlRenderer(deps: ToolHtmlRendererDeps): ToolHtmlRenderer {\n\tconst { getToolDefinition, theme, width = 100 } = deps;\n\treturn {\n\t\trenderCall(toolName: string, args: unknown): string | undefined {\n\t\t\ttry {\n\t\t\t\tconst toolDef = getToolDefinition(toolName);\n\t\t\t\tif (!toolDef?.renderCall) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst component = toolDef.renderCall(args, theme);\n\t\t\t\tif (!component) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst lines = component.render(width);\n\t\t\t\treturn ansiLinesToHtml(lines);\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t\trenderResult(\n\t\t\ttoolName: string,\n\t\t\tresult: Array<{ type: string; text?: string; data?: string; mimeType?: string }>,\n\t\t\tdetails: unknown,\n\t\t\tisError: boolean,\n\t\t): { collapsed?: string; expanded?: string } | undefined {\n\t\t\ttry {\n\t\t\t\tconst toolDef = getToolDefinition(toolName);\n\t\t\t\tif (!toolDef?.renderResult) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst agentToolResult = {\n\t\t\t\t\tcontent: result as (TextContent | ImageContent)[],\n\t\t\t\t\tdetails,\n\t\t\t\t\tisError,\n\t\t\t\t};\n\t\t\t\tconst collapsedComponent = toolDef.renderResult(\n\t\t\t\t\tagentToolResult,\n\t\t\t\t\t{ expanded: false, isPartial: false },\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t\tconst collapsed = collapsedComponent ? ansiLinesToHtml(collapsedComponent.render(width)) : undefined;\n\t\t\t\tconst expandedComponent = toolDef.renderResult(\n\t\t\t\t\tagentToolResult,\n\t\t\t\t\t{ expanded: true, isPartial: false },\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t\tconst expanded = expandedComponent ? ansiLinesToHtml(expandedComponent.render(width)) : undefined;\n\t\t\t\tif (!expanded) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...(collapsed && collapsed !== expanded ? { collapsed } : {}),\n\t\t\t\t\texpanded,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"AAcA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhE,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;AA0DpB,wBAAgB,sBAAsB,IAAI,gBAAgB,CA4BzD;AA2ID,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAKpB;AACD,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoBrH;AA0ED,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CA8B/B","sourcesContent":["import * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createJiti } from \"@mariozechner/jiti\";\nimport * as _bundledPiAgentCore from \"@mariozechner/pi-agent-core\";\nimport * as _bundledPiAi from \"@mariozechner/pi-ai\";\nimport * as _bundledPiAiOauth from \"@mariozechner/pi-ai/oauth\";\nimport type { KeyId } from \"@mariozechner/pi-tui\";\nimport * as _bundledPiTui from \"@mariozechner/pi-tui\";\nimport * as _bundledTypebox from \"@sinclair/typebox\";\nimport { getAgentDir, isBunBinary } from \"../../config.js\";\nimport * as _bundledPiCodingAgent from \"../../index.js\";\nimport { createEventBus, type EventBus } from \"../event-bus.js\";\nimport type { ExecOptions } from \"../exec.js\";\nimport { execCommand } from \"../exec.js\";\nimport type {\n\tExtension,\n\tExtensionAPI,\n\tExtensionFactory,\n\tExtensionRuntime,\n\tLoadExtensionsResult,\n\tMessageRenderer,\n\tProviderConfig,\n\tRegisteredCommand,\n\tToolDefinition,\n} from \"./types.js\";\n\nconst VIRTUAL_MODULES: Record<string, unknown> = {\n\t\"@sinclair/typebox\": _bundledTypebox,\n\t\"@mariozechner/pi-agent-core\": _bundledPiAgentCore,\n\t\"@mariozechner/pi-tui\": _bundledPiTui,\n\t\"@mariozechner/pi-ai\": _bundledPiAi,\n\t\"@mariozechner/pi-ai/oauth\": _bundledPiAiOauth,\n\t\"@mariozechner/pi-coding-agent\": _bundledPiCodingAgent,\n};\nconst require = createRequire(import.meta.url);\nlet _aliases: Record<string, string> | null = null;\nfunction getAliases(): Record<string, string> {\n\tif (_aliases) return _aliases;\n\tconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\tconst packageIndex = path.resolve(__dirname, \"../..\", \"index.js\");\n\tconst typeboxEntry = require.resolve(\"@sinclair/typebox\");\n\tconst typeboxRoot = typeboxEntry.replace(/[\\\\/]build[\\\\/]cjs[\\\\/]index\\.js$/, \"\");\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\t_aliases = {\n\t\t\"@mariozechner/pi-coding-agent\": packageIndex,\n\t\t\"@mariozechner/pi-agent-core\": resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@mariozechner/pi-agent-core\"),\n\t\t\"@mariozechner/pi-tui\": resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@mariozechner/pi-tui\"),\n\t\t\"@mariozechner/pi-ai\": resolveWorkspaceOrImport(\"ai/dist/index.js\", \"@mariozechner/pi-ai\"),\n\t\t\"@mariozechner/pi-ai/oauth\": resolveWorkspaceOrImport(\"ai/dist/oauth.js\", \"@mariozechner/pi-ai/oauth\"),\n\t\t\"@sinclair/typebox\": typeboxRoot,\n\t};\n\treturn _aliases;\n}\nconst UNICODE_SPACES = /[\\u00A0\\u2000-\\u200A\\u202F\\u205F\\u3000]/g;\nfunction normalizeUnicodeSpaces(str: string): string {\n\treturn str.replace(UNICODE_SPACES, \" \");\n}\nfunction expandPath(p: string): string {\n\tconst normalized = normalizeUnicodeSpaces(p);\n\tif (normalized.startsWith(\"~/\")) {\n\t\treturn path.join(os.homedir(), normalized.slice(2));\n\t}\n\tif (normalized.startsWith(\"~\")) {\n\t\treturn path.join(os.homedir(), normalized.slice(1));\n\t}\n\treturn normalized;\n}\nfunction resolvePath(extPath: string, cwd: string): string {\n\tconst expanded = expandPath(extPath);\n\tif (path.isAbsolute(expanded)) {\n\t\treturn expanded;\n\t}\n\treturn path.resolve(cwd, expanded);\n}\ntype HandlerFn = (...args: unknown[]) => Promise<unknown>;\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 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\trefreshTools: () => {},\n\t\tgetCommands: notInitialized,\n\t\tgetThinkingLevel: notInitialized,\n\t\tsetThinkingLevel: notInitialized,\n\t\tflagValues: new Map(),\n\t\tpendingProviderRegistrations: [],\n\t\tregisterProvider: (name, config) => {\n\t\t\truntime.pendingProviderRegistrations.push({ name, config });\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\treturn runtime;\n}\nfunction createExtensionAPI(\n\textension: Extension,\n\truntime: ExtensionRuntime,\n\tcwd: string,\n\teventBus: EventBus,\n): ExtensionAPI {\n\tconst api = {\n\t\ton(event: string, handler: HandlerFn): void {\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\t\tregisterTool(tool: ToolDefinition): void {\n\t\t\textension.tools.set(tool.name, {\n\t\t\t\tdefinition: tool,\n\t\t\t\textensionPath: extension.path,\n\t\t\t});\n\t\t\truntime.refreshTools();\n\t\t},\n\t\tregisterCommand(name: string, options: Omit<RegisteredCommand, \"name\">): void {\n\t\t\textension.commands.set(name, { name, ...options });\n\t\t},\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.js\").ExtensionContext) => Promise<void> | void;\n\t\t\t},\n\t\t): void {\n\t\t\textension.shortcuts.set(shortcut, { shortcut, extensionPath: extension.path, ...options });\n\t\t},\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\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\t\tregisterMessageRenderer<T>(customType: string, renderer: MessageRenderer<T>): void {\n\t\t\textension.messageRenderers.set(customType, renderer as MessageRenderer);\n\t\t},\n\t\tgetFlag(name: string): boolean | string | undefined {\n\t\t\tif (!extension.flags.has(name)) return undefined;\n\t\t\treturn runtime.flagValues.get(name);\n\t\t},\n\t\tsendMessage(message, options): void {\n\t\t\truntime.sendMessage(message, options);\n\t\t},\n\t\tsendUserMessage(content, options): void {\n\t\t\truntime.sendUserMessage(content, options);\n\t\t},\n\t\tappendEntry(customType: string, data?: unknown): void {\n\t\t\truntime.appendEntry(customType, data);\n\t\t},\n\t\tsetSessionName(name: string): void {\n\t\t\truntime.setSessionName(name);\n\t\t},\n\t\tgetSessionName(): string | undefined {\n\t\t\treturn runtime.getSessionName();\n\t\t},\n\t\tsetLabel(entryId: string, label: string | undefined): void {\n\t\t\truntime.setLabel(entryId, label);\n\t\t},\n\t\texec(command: string, args: string[], options?: ExecOptions) {\n\t\t\treturn execCommand(command, args, options?.cwd ?? cwd, options);\n\t\t},\n\t\tgetActiveTools(): string[] {\n\t\t\treturn runtime.getActiveTools();\n\t\t},\n\t\tgetAllTools() {\n\t\t\treturn runtime.getAllTools();\n\t\t},\n\t\tsetActiveTools(toolNames: string[]): void {\n\t\t\truntime.setActiveTools(toolNames);\n\t\t},\n\t\tgetCommands() {\n\t\t\treturn runtime.getCommands();\n\t\t},\n\t\tgetThinkingLevel() {\n\t\t\treturn runtime.getThinkingLevel();\n\t\t},\n\t\tsetThinkingLevel(level) {\n\t\t\truntime.setThinkingLevel(level);\n\t\t},\n\t\tregisterProvider(name: string, config: ProviderConfig) {\n\t\t\truntime.registerProvider(name, config);\n\t\t},\n\t\tunregisterProvider(name: string) {\n\t\t\truntime.unregisterProvider(name);\n\t\t},\n\t\tevents: eventBus,\n\t} as ExtensionAPI;\n\treturn api;\n}\nasync function loadExtensionModule(extensionPath: string) {\n\tconst jiti = createJiti(import.meta.url, {\n\t\tmoduleCache: false,\n\t\t...(isBunBinary ? { virtualModules: VIRTUAL_MODULES, tryNative: false } : { alias: getAliases() }),\n\t});\n\tconst module = await jiti.import(extensionPath, { default: true });\n\tconst factory = module as ExtensionFactory;\n\treturn typeof factory !== \"function\" ? undefined : factory;\n}\nfunction createExtension(extensionPath: string, resolvedPath: string): Extension {\n\treturn {\n\t\tpath: extensionPath,\n\t\tresolvedPath,\n\t\thandlers: new Map(),\n\t\ttools: new Map(),\n\t\tmessageRenderers: new Map(),\n\t\tcommands: new Map(),\n\t\tflags: new Map(),\n\t\tshortcuts: new Map(),\n\t};\n}\nasync function loadExtension(\n\textensionPath: string,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n): Promise<{ extension: Extension | null; error: string | null }> {\n\tconst resolvedPath = resolvePath(extensionPath, cwd);\n\ttry {\n\t\tconst factory = await loadExtensionModule(resolvedPath);\n\t\tif (!factory) {\n\t\t\treturn { extension: null, error: `Extension does not export a valid factory function: ${extensionPath}` };\n\t\t}\n\t\tconst extension = createExtension(extensionPath, resolvedPath);\n\t\tconst api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\t\tawait factory(api);\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}\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 api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\tawait factory(api);\n\treturn extension;\n}\nexport async function loadExtensions(paths: string[], cwd: string, eventBus?: EventBus): Promise<LoadExtensionsResult> {\n\tconst extensions: Extension[] = [];\n\tconst errors: Array<{ path: string; error: string }> = [];\n\tconst resolvedEventBus = eventBus ?? createEventBus();\n\tconst runtime = createExtensionRuntime();\n\tfor (const extPath of paths) {\n\t\tconst { extension, error } = await loadExtension(extPath, cwd, resolvedEventBus, runtime);\n\t\tif (error) {\n\t\t\terrors.push({ path: extPath, error });\n\t\t\tcontinue;\n\t\t}\n\t\tif (extension) {\n\t\t\textensions.push(extension);\n\t\t}\n\t}\n\treturn {\n\t\textensions,\n\t\terrors,\n\t\truntime,\n\t};\n}\ninterface PiManifest {\n\textensions?: string[];\n\tthemes?: string[];\n\tskills?: string[];\n\tprompts?: string[];\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}\nfunction isExtensionFile(name: string): boolean {\n\treturn name.endsWith(\".ts\") || name.endsWith(\".js\");\n}\nfunction resolveExtensionEntries(dir: string): string[] | null {\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\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\treturn null;\n}\nfunction discoverExtensionsInDir(dir: string): string[] {\n\tif (!fs.existsSync(dir)) {\n\t\treturn [];\n\t}\n\tconst discovered: string[] = [];\n\ttry {\n\t\tconst entries = fs.readdirSync(dir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tconst entryPath = path.join(dir, entry.name);\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\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\treturn discovered;\n}\nexport async function discoverAndLoadExtensions(\n\tconfiguredPaths: string[],\n\tcwd: string,\n\tagentDir: string = getAgentDir(),\n\teventBus?: EventBus,\n): Promise<LoadExtensionsResult> {\n\tconst allPaths: string[] = [];\n\tconst seen = new Set<string>();\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\tconst localExtDir = path.join(cwd, \".pi\", \"extensions\");\n\taddPaths(discoverExtensionsInDir(localExtDir));\n\tconst globalExtDir = path.join(agentDir, \"extensions\");\n\taddPaths(discoverExtensionsInDir(globalExtDir));\n\tfor (const p of configuredPaths) {\n\t\tconst resolved = resolvePath(p, cwd);\n\t\tif (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {\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\taddPaths(discoverExtensionsInDir(resolved));\n\t\t\tcontinue;\n\t\t}\n\t\taddPaths([resolved]);\n\t}\n\treturn loadExtensions(allPaths, cwd, eventBus);\n}\n"]}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"AAcA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhE,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;AA0DpB,wBAAgB,sBAAsB,IAAI,gBAAgB,CA4BzD;AA2ID,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAKpB;AACD,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoBrH;AA0ED,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CA8B/B","sourcesContent":["import * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createJiti } from \"@mariozechner/jiti\";\nimport * as _bundledPiAgentCore from \"@boxiaolanya2008/pi-agent-core\";\nimport * as _bundledPiAi from \"@boxiaolanya2008/pi-ai\";\nimport * as _bundledPiAiOauth from \"@boxiaolanya2008/pi-ai/oauth\";\nimport type { KeyId } from \"@boxiaolanya2008/pi-tui\";\nimport * as _bundledPiTui from \"@boxiaolanya2008/pi-tui\";\nimport * as _bundledTypebox from \"@sinclair/typebox\";\nimport { getAgentDir, isBunBinary } from \"../../config.js\";\nimport * as _bundledPiCodingAgent from \"../../index.js\";\nimport { createEventBus, type EventBus } from \"../event-bus.js\";\nimport type { ExecOptions } from \"../exec.js\";\nimport { execCommand } from \"../exec.js\";\nimport type {\n\tExtension,\n\tExtensionAPI,\n\tExtensionFactory,\n\tExtensionRuntime,\n\tLoadExtensionsResult,\n\tMessageRenderer,\n\tProviderConfig,\n\tRegisteredCommand,\n\tToolDefinition,\n} from \"./types.js\";\n\nconst VIRTUAL_MODULES: Record<string, unknown> = {\n\t\"@sinclair/typebox\": _bundledTypebox,\n\t\"@boxiaolanya2008/pi-agent-core\": _bundledPiAgentCore,\n\t\"@boxiaolanya2008/pi-tui\": _bundledPiTui,\n\t\"@boxiaolanya2008/pi-ai\": _bundledPiAi,\n\t\"@boxiaolanya2008/pi-ai/oauth\": _bundledPiAiOauth,\n\t\"@boxiaolanya2008/pi-coding-agent\": _bundledPiCodingAgent,\n};\nconst require = createRequire(import.meta.url);\nlet _aliases: Record<string, string> | null = null;\nfunction getAliases(): Record<string, string> {\n\tif (_aliases) return _aliases;\n\tconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\tconst packageIndex = path.resolve(__dirname, \"../..\", \"index.js\");\n\tconst typeboxEntry = require.resolve(\"@sinclair/typebox\");\n\tconst typeboxRoot = typeboxEntry.replace(/[\\\\/]build[\\\\/]cjs[\\\\/]index\\.js$/, \"\");\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\t_aliases = {\n\t\t\"@boxiaolanya2008/pi-coding-agent\": packageIndex,\n\t\t\"@boxiaolanya2008/pi-agent-core\": resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@boxiaolanya2008/pi-agent-core\"),\n\t\t\"@boxiaolanya2008/pi-tui\": resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@boxiaolanya2008/pi-tui\"),\n\t\t\"@boxiaolanya2008/pi-ai\": resolveWorkspaceOrImport(\"ai/dist/index.js\", \"@boxiaolanya2008/pi-ai\"),\n\t\t\"@boxiaolanya2008/pi-ai/oauth\": resolveWorkspaceOrImport(\"ai/dist/oauth.js\", \"@boxiaolanya2008/pi-ai/oauth\"),\n\t\t\"@sinclair/typebox\": typeboxRoot,\n\t};\n\treturn _aliases;\n}\nconst UNICODE_SPACES = /[\\u00A0\\u2000-\\u200A\\u202F\\u205F\\u3000]/g;\nfunction normalizeUnicodeSpaces(str: string): string {\n\treturn str.replace(UNICODE_SPACES, \" \");\n}\nfunction expandPath(p: string): string {\n\tconst normalized = normalizeUnicodeSpaces(p);\n\tif (normalized.startsWith(\"~/\")) {\n\t\treturn path.join(os.homedir(), normalized.slice(2));\n\t}\n\tif (normalized.startsWith(\"~\")) {\n\t\treturn path.join(os.homedir(), normalized.slice(1));\n\t}\n\treturn normalized;\n}\nfunction resolvePath(extPath: string, cwd: string): string {\n\tconst expanded = expandPath(extPath);\n\tif (path.isAbsolute(expanded)) {\n\t\treturn expanded;\n\t}\n\treturn path.resolve(cwd, expanded);\n}\ntype HandlerFn = (...args: unknown[]) => Promise<unknown>;\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 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\trefreshTools: () => {},\n\t\tgetCommands: notInitialized,\n\t\tgetThinkingLevel: notInitialized,\n\t\tsetThinkingLevel: notInitialized,\n\t\tflagValues: new Map(),\n\t\tpendingProviderRegistrations: [],\n\t\tregisterProvider: (name, config) => {\n\t\t\truntime.pendingProviderRegistrations.push({ name, config });\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\treturn runtime;\n}\nfunction createExtensionAPI(\n\textension: Extension,\n\truntime: ExtensionRuntime,\n\tcwd: string,\n\teventBus: EventBus,\n): ExtensionAPI {\n\tconst api = {\n\t\ton(event: string, handler: HandlerFn): void {\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\t\tregisterTool(tool: ToolDefinition): void {\n\t\t\textension.tools.set(tool.name, {\n\t\t\t\tdefinition: tool,\n\t\t\t\textensionPath: extension.path,\n\t\t\t});\n\t\t\truntime.refreshTools();\n\t\t},\n\t\tregisterCommand(name: string, options: Omit<RegisteredCommand, \"name\">): void {\n\t\t\textension.commands.set(name, { name, ...options });\n\t\t},\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.js\").ExtensionContext) => Promise<void> | void;\n\t\t\t},\n\t\t): void {\n\t\t\textension.shortcuts.set(shortcut, { shortcut, extensionPath: extension.path, ...options });\n\t\t},\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\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\t\tregisterMessageRenderer<T>(customType: string, renderer: MessageRenderer<T>): void {\n\t\t\textension.messageRenderers.set(customType, renderer as MessageRenderer);\n\t\t},\n\t\tgetFlag(name: string): boolean | string | undefined {\n\t\t\tif (!extension.flags.has(name)) return undefined;\n\t\t\treturn runtime.flagValues.get(name);\n\t\t},\n\t\tsendMessage(message, options): void {\n\t\t\truntime.sendMessage(message, options);\n\t\t},\n\t\tsendUserMessage(content, options): void {\n\t\t\truntime.sendUserMessage(content, options);\n\t\t},\n\t\tappendEntry(customType: string, data?: unknown): void {\n\t\t\truntime.appendEntry(customType, data);\n\t\t},\n\t\tsetSessionName(name: string): void {\n\t\t\truntime.setSessionName(name);\n\t\t},\n\t\tgetSessionName(): string | undefined {\n\t\t\treturn runtime.getSessionName();\n\t\t},\n\t\tsetLabel(entryId: string, label: string | undefined): void {\n\t\t\truntime.setLabel(entryId, label);\n\t\t},\n\t\texec(command: string, args: string[], options?: ExecOptions) {\n\t\t\treturn execCommand(command, args, options?.cwd ?? cwd, options);\n\t\t},\n\t\tgetActiveTools(): string[] {\n\t\t\treturn runtime.getActiveTools();\n\t\t},\n\t\tgetAllTools() {\n\t\t\treturn runtime.getAllTools();\n\t\t},\n\t\tsetActiveTools(toolNames: string[]): void {\n\t\t\truntime.setActiveTools(toolNames);\n\t\t},\n\t\tgetCommands() {\n\t\t\treturn runtime.getCommands();\n\t\t},\n\t\tgetThinkingLevel() {\n\t\t\treturn runtime.getThinkingLevel();\n\t\t},\n\t\tsetThinkingLevel(level) {\n\t\t\truntime.setThinkingLevel(level);\n\t\t},\n\t\tregisterProvider(name: string, config: ProviderConfig) {\n\t\t\truntime.registerProvider(name, config);\n\t\t},\n\t\tunregisterProvider(name: string) {\n\t\t\truntime.unregisterProvider(name);\n\t\t},\n\t\tevents: eventBus,\n\t} as ExtensionAPI;\n\treturn api;\n}\nasync function loadExtensionModule(extensionPath: string) {\n\tconst jiti = createJiti(import.meta.url, {\n\t\tmoduleCache: false,\n\t\t...(isBunBinary ? { virtualModules: VIRTUAL_MODULES, tryNative: false } : { alias: getAliases() }),\n\t});\n\tconst module = await jiti.import(extensionPath, { default: true });\n\tconst factory = module as ExtensionFactory;\n\treturn typeof factory !== \"function\" ? undefined : factory;\n}\nfunction createExtension(extensionPath: string, resolvedPath: string): Extension {\n\treturn {\n\t\tpath: extensionPath,\n\t\tresolvedPath,\n\t\thandlers: new Map(),\n\t\ttools: new Map(),\n\t\tmessageRenderers: new Map(),\n\t\tcommands: new Map(),\n\t\tflags: new Map(),\n\t\tshortcuts: new Map(),\n\t};\n}\nasync function loadExtension(\n\textensionPath: string,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n): Promise<{ extension: Extension | null; error: string | null }> {\n\tconst resolvedPath = resolvePath(extensionPath, cwd);\n\ttry {\n\t\tconst factory = await loadExtensionModule(resolvedPath);\n\t\tif (!factory) {\n\t\t\treturn { extension: null, error: `Extension does not export a valid factory function: ${extensionPath}` };\n\t\t}\n\t\tconst extension = createExtension(extensionPath, resolvedPath);\n\t\tconst api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\t\tawait factory(api);\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}\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 api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\tawait factory(api);\n\treturn extension;\n}\nexport async function loadExtensions(paths: string[], cwd: string, eventBus?: EventBus): Promise<LoadExtensionsResult> {\n\tconst extensions: Extension[] = [];\n\tconst errors: Array<{ path: string; error: string }> = [];\n\tconst resolvedEventBus = eventBus ?? createEventBus();\n\tconst runtime = createExtensionRuntime();\n\tfor (const extPath of paths) {\n\t\tconst { extension, error } = await loadExtension(extPath, cwd, resolvedEventBus, runtime);\n\t\tif (error) {\n\t\t\terrors.push({ path: extPath, error });\n\t\t\tcontinue;\n\t\t}\n\t\tif (extension) {\n\t\t\textensions.push(extension);\n\t\t}\n\t}\n\treturn {\n\t\textensions,\n\t\terrors,\n\t\truntime,\n\t};\n}\ninterface PiManifest {\n\textensions?: string[];\n\tthemes?: string[];\n\tskills?: string[];\n\tprompts?: string[];\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}\nfunction isExtensionFile(name: string): boolean {\n\treturn name.endsWith(\".ts\") || name.endsWith(\".js\");\n}\nfunction resolveExtensionEntries(dir: string): string[] | null {\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\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\treturn null;\n}\nfunction discoverExtensionsInDir(dir: string): string[] {\n\tif (!fs.existsSync(dir)) {\n\t\treturn [];\n\t}\n\tconst discovered: string[] = [];\n\ttry {\n\t\tconst entries = fs.readdirSync(dir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tconst entryPath = path.join(dir, entry.name);\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\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\treturn discovered;\n}\nexport async function discoverAndLoadExtensions(\n\tconfiguredPaths: string[],\n\tcwd: string,\n\tagentDir: string = getAgentDir(),\n\teventBus?: EventBus,\n): Promise<LoadExtensionsResult> {\n\tconst allPaths: string[] = [];\n\tconst seen = new Set<string>();\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\tconst localExtDir = path.join(cwd, \".pi\", \"extensions\");\n\taddPaths(discoverExtensionsInDir(localExtDir));\n\tconst globalExtDir = path.join(agentDir, \"extensions\");\n\taddPaths(discoverExtensionsInDir(globalExtDir));\n\tfor (const p of configuredPaths) {\n\t\tconst resolved = resolvePath(p, cwd);\n\t\tif (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {\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\taddPaths(discoverExtensionsInDir(resolved));\n\t\t\tcontinue;\n\t\t}\n\t\taddPaths([resolved]);\n\t}\n\treturn loadExtensions(allPaths, cwd, eventBus);\n}\n"]}