@openadapter/koda 1.0.0-beta.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 (357) hide show
  1. package/CHANGELOG.md +4448 -0
  2. package/README.md +665 -0
  3. package/dist/bun/cli.d.ts +2 -0
  4. package/dist/bun/cli.js +2 -0
  5. package/dist/bun/register-bedrock.d.ts +1 -0
  6. package/dist/bun/register-bedrock.js +1 -0
  7. package/dist/bun/restore-sandbox-env.d.ts +12 -0
  8. package/dist/bun/restore-sandbox-env.js +1 -0
  9. package/dist/cli/args.d.ts +55 -0
  10. package/dist/cli/args.js +167 -0
  11. package/dist/cli/config-selector.d.ts +13 -0
  12. package/dist/cli/config-selector.js +1 -0
  13. package/dist/cli/file-processor.d.ts +14 -0
  14. package/dist/cli/file-processor.js +7 -0
  15. package/dist/cli/import-sessions.d.ts +34 -0
  16. package/dist/cli/import-sessions.js +6 -0
  17. package/dist/cli/initial-message.d.ts +17 -0
  18. package/dist/cli/initial-message.js +1 -0
  19. package/dist/cli/list-models.d.ts +8 -0
  20. package/dist/cli/list-models.js +2 -0
  21. package/dist/cli/openadapter-setup.d.ts +29 -0
  22. package/dist/cli/openadapter-setup.js +3 -0
  23. package/dist/cli/session-picker.d.ts +8 -0
  24. package/dist/cli/session-picker.js +1 -0
  25. package/dist/cli.d.ts +2 -0
  26. package/dist/cli.js +2 -0
  27. package/dist/config.d.ts +92 -0
  28. package/dist/config.js +1 -0
  29. package/dist/core/agent-session-runtime.d.ts +116 -0
  30. package/dist/core/agent-session-runtime.js +1 -0
  31. package/dist/core/agent-session-services.d.ts +86 -0
  32. package/dist/core/agent-session-services.js +1 -0
  33. package/dist/core/agent-session.d.ts +747 -0
  34. package/dist/core/agent-session.js +32 -0
  35. package/dist/core/auth-guidance.d.ts +4 -0
  36. package/dist/core/auth-guidance.js +8 -0
  37. package/dist/core/auth-storage.d.ts +140 -0
  38. package/dist/core/auth-storage.js +1 -0
  39. package/dist/core/bash-executor.d.ts +31 -0
  40. package/dist/core/bash-executor.js +1 -0
  41. package/dist/core/compaction/branch-summarization.d.ts +89 -0
  42. package/dist/core/compaction/branch-summarization.js +38 -0
  43. package/dist/core/compaction/compaction.d.ts +120 -0
  44. package/dist/core/compaction/compaction.js +104 -0
  45. package/dist/core/compaction/index.d.ts +6 -0
  46. package/dist/core/compaction/index.js +1 -0
  47. package/dist/core/compaction/utils.d.ts +37 -0
  48. package/dist/core/compaction/utils.js +19 -0
  49. package/dist/core/defaults.d.ts +2 -0
  50. package/dist/core/defaults.js +1 -0
  51. package/dist/core/diagnostics.d.ts +14 -0
  52. package/dist/core/diagnostics.js +0 -0
  53. package/dist/core/event-bus.d.ts +8 -0
  54. package/dist/core/event-bus.js +1 -0
  55. package/dist/core/exec.d.ts +28 -0
  56. package/dist/core/exec.js +1 -0
  57. package/dist/core/export-html/ansi-to-html.d.ts +21 -0
  58. package/dist/core/export-html/ansi-to-html.js +1 -0
  59. package/dist/core/export-html/index.d.ts +36 -0
  60. package/dist/core/export-html/index.js +2 -0
  61. package/dist/core/export-html/template.css +1066 -0
  62. package/dist/core/export-html/template.html +55 -0
  63. package/dist/core/export-html/template.js +72 -0
  64. package/dist/core/export-html/tool-renderer.d.ts +33 -0
  65. package/dist/core/export-html/tool-renderer.js +1 -0
  66. package/dist/core/export-html/vendor/highlight.min.js +8 -0
  67. package/dist/core/export-html/vendor/marked.min.js +56 -0
  68. package/dist/core/extensions/index.d.ts +11 -0
  69. package/dist/core/extensions/index.js +1 -0
  70. package/dist/core/extensions/loader.d.ts +23 -0
  71. package/dist/core/extensions/loader.js +1 -0
  72. package/dist/core/extensions/runner.d.ts +160 -0
  73. package/dist/core/extensions/runner.js +1 -0
  74. package/dist/core/extensions/types.d.ts +1180 -0
  75. package/dist/core/extensions/types.js +1 -0
  76. package/dist/core/extensions/wrapper.d.ts +19 -0
  77. package/dist/core/extensions/wrapper.js +1 -0
  78. package/dist/core/footer-data-provider.d.ts +53 -0
  79. package/dist/core/footer-data-provider.js +1 -0
  80. package/dist/core/http-dispatcher.d.ts +20 -0
  81. package/dist/core/http-dispatcher.js +1 -0
  82. package/dist/core/index.d.ts +11 -0
  83. package/dist/core/index.js +1 -0
  84. package/dist/core/keybindings.d.ts +352 -0
  85. package/dist/core/keybindings.js +1 -0
  86. package/dist/core/messages.d.ts +76 -0
  87. package/dist/core/messages.js +17 -0
  88. package/dist/core/model-registry.d.ts +149 -0
  89. package/dist/core/model-registry.js +9 -0
  90. package/dist/core/model-resolver.d.ts +109 -0
  91. package/dist/core/model-resolver.js +1 -0
  92. package/dist/core/output-guard.d.ts +6 -0
  93. package/dist/core/output-guard.js +1 -0
  94. package/dist/core/package-manager.d.ts +203 -0
  95. package/dist/core/package-manager.js +3 -0
  96. package/dist/core/prompt-templates.d.ts +51 -0
  97. package/dist/core/prompt-templates.js +2 -0
  98. package/dist/core/provider-attribution.d.ts +3 -0
  99. package/dist/core/provider-attribution.js +1 -0
  100. package/dist/core/provider-display-names.d.ts +1 -0
  101. package/dist/core/provider-display-names.js +1 -0
  102. package/dist/core/resolve-config-value.d.ts +30 -0
  103. package/dist/core/resolve-config-value.js +1 -0
  104. package/dist/core/resource-loader.d.ts +193 -0
  105. package/dist/core/resource-loader.js +1 -0
  106. package/dist/core/sdk.d.ts +108 -0
  107. package/dist/core/sdk.js +1 -0
  108. package/dist/core/session-cwd.d.ts +18 -0
  109. package/dist/core/session-cwd.js +7 -0
  110. package/dist/core/session-manager.d.ts +331 -0
  111. package/dist/core/session-manager.js +11 -0
  112. package/dist/core/settings-manager.d.ts +265 -0
  113. package/dist/core/settings-manager.js +1 -0
  114. package/dist/core/skills.d.ts +59 -0
  115. package/dist/core/skills.js +4 -0
  116. package/dist/core/slash-commands.d.ts +13 -0
  117. package/dist/core/slash-commands.js +1 -0
  118. package/dist/core/source-info.d.ts +17 -0
  119. package/dist/core/source-info.js +1 -0
  120. package/dist/core/system-prompt.d.ts +27 -0
  121. package/dist/core/system-prompt.js +52 -0
  122. package/dist/core/telemetry.d.ts +2 -0
  123. package/dist/core/telemetry.js +1 -0
  124. package/dist/core/timings.d.ts +7 -0
  125. package/dist/core/timings.js +3 -0
  126. package/dist/core/tools/bash.d.ts +67 -0
  127. package/dist/core/tools/bash.js +18 -0
  128. package/dist/core/tools/edit-diff.d.ts +86 -0
  129. package/dist/core/tools/edit-diff.js +16 -0
  130. package/dist/core/tools/edit.d.ts +50 -0
  131. package/dist/core/tools/edit.js +2 -0
  132. package/dist/core/tools/file-mutation-queue.d.ts +5 -0
  133. package/dist/core/tools/file-mutation-queue.js +1 -0
  134. package/dist/core/tools/find.d.ts +34 -0
  135. package/dist/core/tools/find.js +13 -0
  136. package/dist/core/tools/grep.d.ts +36 -0
  137. package/dist/core/tools/grep.js +13 -0
  138. package/dist/core/tools/index.d.ts +39 -0
  139. package/dist/core/tools/index.js +1 -0
  140. package/dist/core/tools/ls.d.ts +36 -0
  141. package/dist/core/tools/ls.js +9 -0
  142. package/dist/core/tools/output-accumulator.d.ts +51 -0
  143. package/dist/core/tools/output-accumulator.js +4 -0
  144. package/dist/core/tools/path-utils.d.ts +9 -0
  145. package/dist/core/tools/path-utils.js +1 -0
  146. package/dist/core/tools/read.d.ts +34 -0
  147. package/dist/core/tools/read.js +22 -0
  148. package/dist/core/tools/render-utils.d.ts +23 -0
  149. package/dist/core/tools/render-utils.js +4 -0
  150. package/dist/core/tools/tool-definition-wrapper.d.ts +13 -0
  151. package/dist/core/tools/tool-definition-wrapper.js +1 -0
  152. package/dist/core/tools/truncate.d.ts +69 -0
  153. package/dist/core/tools/truncate.js +5 -0
  154. package/dist/core/tools/write.d.ts +25 -0
  155. package/dist/core/tools/write.js +13 -0
  156. package/dist/index.d.ts +30 -0
  157. package/dist/index.js +1 -0
  158. package/dist/main.d.ts +11 -0
  159. package/dist/main.js +1 -0
  160. package/dist/migrations.d.ts +32 -0
  161. package/dist/migrations.js +8 -0
  162. package/dist/modes/index.d.ts +8 -0
  163. package/dist/modes/index.js +1 -0
  164. package/dist/modes/interactive/assets/clankolas.png +0 -0
  165. package/dist/modes/interactive/components/armin.d.ts +33 -0
  166. package/dist/modes/interactive/components/armin.js +1 -0
  167. package/dist/modes/interactive/components/assistant-message.d.ts +19 -0
  168. package/dist/modes/interactive/components/assistant-message.js +1 -0
  169. package/dist/modes/interactive/components/bash-execution.d.ts +33 -0
  170. package/dist/modes/interactive/components/bash-execution.js +13 -0
  171. package/dist/modes/interactive/components/bordered-loader.d.ts +15 -0
  172. package/dist/modes/interactive/components/bordered-loader.js +1 -0
  173. package/dist/modes/interactive/components/branch-summary-message.d.ts +15 -0
  174. package/dist/modes/interactive/components/branch-summary-message.js +3 -0
  175. package/dist/modes/interactive/components/compaction-summary-message.d.ts +15 -0
  176. package/dist/modes/interactive/components/compaction-summary-message.js +3 -0
  177. package/dist/modes/interactive/components/config-selector.d.ts +70 -0
  178. package/dist/modes/interactive/components/config-selector.js +1 -0
  179. package/dist/modes/interactive/components/countdown-timer.d.ts +13 -0
  180. package/dist/modes/interactive/components/countdown-timer.js +1 -0
  181. package/dist/modes/interactive/components/custom-editor.d.ts +20 -0
  182. package/dist/modes/interactive/components/custom-editor.js +1 -0
  183. package/dist/modes/interactive/components/custom-message.d.ts +19 -0
  184. package/dist/modes/interactive/components/custom-message.js +2 -0
  185. package/dist/modes/interactive/components/daxnuts.d.ts +22 -0
  186. package/dist/modes/interactive/components/daxnuts.js +1 -0
  187. package/dist/modes/interactive/components/diff.d.ts +11 -0
  188. package/dist/modes/interactive/components/diff.js +3 -0
  189. package/dist/modes/interactive/components/dynamic-border.d.ts +14 -0
  190. package/dist/modes/interactive/components/dynamic-border.js +1 -0
  191. package/dist/modes/interactive/components/earendil-announcement.d.ts +4 -0
  192. package/dist/modes/interactive/components/earendil-announcement.js +1 -0
  193. package/dist/modes/interactive/components/extension-editor.d.ts +19 -0
  194. package/dist/modes/interactive/components/extension-editor.js +3 -0
  195. package/dist/modes/interactive/components/extension-input.d.ts +22 -0
  196. package/dist/modes/interactive/components/extension-input.js +2 -0
  197. package/dist/modes/interactive/components/extension-selector.d.ts +25 -0
  198. package/dist/modes/interactive/components/extension-selector.js +2 -0
  199. package/dist/modes/interactive/components/footer.d.ts +27 -0
  200. package/dist/modes/interactive/components/footer.js +1 -0
  201. package/dist/modes/interactive/components/index.d.ts +31 -0
  202. package/dist/modes/interactive/components/index.js +1 -0
  203. package/dist/modes/interactive/components/keybinding-hints.d.ts +12 -0
  204. package/dist/modes/interactive/components/keybinding-hints.js +1 -0
  205. package/dist/modes/interactive/components/login-dialog.d.ts +51 -0
  206. package/dist/modes/interactive/components/login-dialog.js +1 -0
  207. package/dist/modes/interactive/components/model-selector.d.ts +46 -0
  208. package/dist/modes/interactive/components/model-selector.js +2 -0
  209. package/dist/modes/interactive/components/oauth-selector.d.ts +30 -0
  210. package/dist/modes/interactive/components/oauth-selector.js +1 -0
  211. package/dist/modes/interactive/components/scoped-models-selector.d.ts +41 -0
  212. package/dist/modes/interactive/components/scoped-models-selector.js +1 -0
  213. package/dist/modes/interactive/components/session-selector-search.d.ts +22 -0
  214. package/dist/modes/interactive/components/session-selector-search.js +1 -0
  215. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  216. package/dist/modes/interactive/components/session-selector.js +2 -0
  217. package/dist/modes/interactive/components/settings-selector.d.ts +68 -0
  218. package/dist/modes/interactive/components/settings-selector.js +1 -0
  219. package/dist/modes/interactive/components/show-images-selector.d.ts +9 -0
  220. package/dist/modes/interactive/components/show-images-selector.js +1 -0
  221. package/dist/modes/interactive/components/skill-invocation-message.d.ts +16 -0
  222. package/dist/modes/interactive/components/skill-invocation-message.js +3 -0
  223. package/dist/modes/interactive/components/theme-selector.d.ts +10 -0
  224. package/dist/modes/interactive/components/theme-selector.js +1 -0
  225. package/dist/modes/interactive/components/thinking-selector.d.ts +10 -0
  226. package/dist/modes/interactive/components/thinking-selector.js +1 -0
  227. package/dist/modes/interactive/components/tool-execution.d.ts +62 -0
  228. package/dist/modes/interactive/components/tool-execution.js +4 -0
  229. package/dist/modes/interactive/components/tree-selector.d.ts +88 -0
  230. package/dist/modes/interactive/components/tree-selector.js +1 -0
  231. package/dist/modes/interactive/components/user-message-selector.d.ts +29 -0
  232. package/dist/modes/interactive/components/user-message-selector.js +1 -0
  233. package/dist/modes/interactive/components/user-message.d.ts +9 -0
  234. package/dist/modes/interactive/components/user-message.js +1 -0
  235. package/dist/modes/interactive/components/visual-truncate.d.ts +23 -0
  236. package/dist/modes/interactive/components/visual-truncate.js +1 -0
  237. package/dist/modes/interactive/interactive-mode.d.ts +417 -0
  238. package/dist/modes/interactive/interactive-mode.js +116 -0
  239. package/dist/modes/interactive/theme/dark.json +86 -0
  240. package/dist/modes/interactive/theme/light.json +85 -0
  241. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  242. package/dist/modes/interactive/theme/theme.d.ts +101 -0
  243. package/dist/modes/interactive/theme/theme.js +18 -0
  244. package/dist/modes/print-mode.d.ts +27 -0
  245. package/dist/modes/print-mode.js +4 -0
  246. package/dist/modes/rpc/jsonl.d.ts +16 -0
  247. package/dist/modes/rpc/jsonl.js +3 -0
  248. package/dist/modes/rpc/rpc-client.d.ts +226 -0
  249. package/dist/modes/rpc/rpc-client.js +1 -0
  250. package/dist/modes/rpc/rpc-mode.d.ts +19 -0
  251. package/dist/modes/rpc/rpc-mode.js +1 -0
  252. package/dist/modes/rpc/rpc-types.d.ts +419 -0
  253. package/dist/modes/rpc/rpc-types.js +0 -0
  254. package/dist/package-manager-cli.d.ts +3 -0
  255. package/dist/package-manager-cli.js +49 -0
  256. package/dist/utils/ansi.d.ts +1 -0
  257. package/dist/utils/ansi.js +1 -0
  258. package/dist/utils/auto-update.d.ts +13 -0
  259. package/dist/utils/auto-update.js +1 -0
  260. package/dist/utils/changelog.d.ts +20 -0
  261. package/dist/utils/changelog.js +4 -0
  262. package/dist/utils/child-process.d.ts +14 -0
  263. package/dist/utils/child-process.js +1 -0
  264. package/dist/utils/clipboard-image.d.ts +10 -0
  265. package/dist/utils/clipboard-image.js +1 -0
  266. package/dist/utils/clipboard-native.d.ts +9 -0
  267. package/dist/utils/clipboard-native.js +1 -0
  268. package/dist/utils/clipboard.d.ts +1 -0
  269. package/dist/utils/clipboard.js +1 -0
  270. package/dist/utils/deprecation.d.ts +3 -0
  271. package/dist/utils/deprecation.js +1 -0
  272. package/dist/utils/exif-orientation.d.ts +4 -0
  273. package/dist/utils/exif-orientation.js +1 -0
  274. package/dist/utils/frontmatter.d.ts +7 -0
  275. package/dist/utils/frontmatter.js +4 -0
  276. package/dist/utils/fs-watch.d.ts +4 -0
  277. package/dist/utils/fs-watch.js +1 -0
  278. package/dist/utils/git.d.ts +25 -0
  279. package/dist/utils/git.js +1 -0
  280. package/dist/utils/html.d.ts +6 -0
  281. package/dist/utils/html.js +1 -0
  282. package/dist/utils/image-convert.d.ts +8 -0
  283. package/dist/utils/image-convert.js +1 -0
  284. package/dist/utils/image-resize-core.d.ts +29 -0
  285. package/dist/utils/image-resize-core.js +1 -0
  286. package/dist/utils/image-resize-worker.d.ts +1 -0
  287. package/dist/utils/image-resize-worker.js +1 -0
  288. package/dist/utils/image-resize.d.ts +15 -0
  289. package/dist/utils/image-resize.js +1 -0
  290. package/dist/utils/json.d.ts +2 -0
  291. package/dist/utils/json.js +1 -0
  292. package/dist/utils/koda-user-agent.d.ts +1 -0
  293. package/dist/utils/koda-user-agent.js +1 -0
  294. package/dist/utils/mime.d.ts +2 -0
  295. package/dist/utils/mime.js +1 -0
  296. package/dist/utils/paths.d.ts +30 -0
  297. package/dist/utils/paths.js +1 -0
  298. package/dist/utils/photon.d.ts +20 -0
  299. package/dist/utils/photon.js +1 -0
  300. package/dist/utils/shell.d.ts +29 -0
  301. package/dist/utils/shell.js +8 -0
  302. package/dist/utils/sleep.d.ts +4 -0
  303. package/dist/utils/sleep.js +1 -0
  304. package/dist/utils/syntax-highlight.d.ts +11 -0
  305. package/dist/utils/syntax-highlight.js +2 -0
  306. package/dist/utils/tools-manager.d.ts +2 -0
  307. package/dist/utils/tools-manager.js +1 -0
  308. package/dist/utils/version-check.d.ts +14 -0
  309. package/dist/utils/version-check.js +1 -0
  310. package/dist/utils/windows-self-update.d.ts +2 -0
  311. package/dist/utils/windows-self-update.js +1 -0
  312. package/docs/compaction.md +394 -0
  313. package/docs/custom-provider.md +736 -0
  314. package/docs/development.md +71 -0
  315. package/docs/docs.json +148 -0
  316. package/docs/extensions.md +2626 -0
  317. package/docs/images/doom-extension.png +0 -0
  318. package/docs/images/exy.png +0 -0
  319. package/docs/images/interactive-mode.png +0 -0
  320. package/docs/images/tree-view.png +0 -0
  321. package/docs/index.md +80 -0
  322. package/docs/json.md +82 -0
  323. package/docs/keybindings.md +197 -0
  324. package/docs/models.md +493 -0
  325. package/docs/packages.md +226 -0
  326. package/docs/prompt-templates.md +88 -0
  327. package/docs/providers.md +253 -0
  328. package/docs/quickstart.md +165 -0
  329. package/docs/rpc.md +1408 -0
  330. package/docs/sdk.md +1137 -0
  331. package/docs/session-format.md +412 -0
  332. package/docs/sessions.md +145 -0
  333. package/docs/settings.md +281 -0
  334. package/docs/shell-aliases.md +13 -0
  335. package/docs/skills.md +231 -0
  336. package/docs/terminal-setup.md +114 -0
  337. package/docs/termux.md +127 -0
  338. package/docs/themes.md +295 -0
  339. package/docs/tmux.md +61 -0
  340. package/docs/tui.md +927 -0
  341. package/docs/usage.md +288 -0
  342. package/docs/windows.md +17 -0
  343. package/npm-shrinkwrap.json +1792 -0
  344. package/openadapter/extensions/koda-ask.js +12 -0
  345. package/openadapter/extensions/koda-bg.js +14 -0
  346. package/openadapter/extensions/koda-commands.mjs +15 -0
  347. package/openadapter/extensions/koda-help.js +8 -0
  348. package/openadapter/extensions/koda-memory.js +16 -0
  349. package/openadapter/extensions/koda-status.js +1 -0
  350. package/openadapter/extensions/koda-todo.js +4 -0
  351. package/openadapter/extensions/koda-vision.js +4 -0
  352. package/openadapter/extensions/koda-web.js +7 -0
  353. package/openadapter/setup.mjs +173 -0
  354. package/openadapter/skills/code-review/SKILL.md +22 -0
  355. package/openadapter/skills/debugging/SKILL.md +28 -0
  356. package/openadapter/skills/frontend/SKILL.md +38 -0
  357. package/package.json +108 -0
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Extension loader - loads TypeScript extension modules using jiti.
3
+ *
4
+ */
5
+ import { type EventBus } from "../event-bus.ts";
6
+ import type { Extension, ExtensionFactory, ExtensionRuntime, LoadExtensionsResult } from "./types.ts";
7
+ /**
8
+ * Create a runtime with throwing stubs for action methods.
9
+ * Runner.bindCore() replaces these with real implementations.
10
+ */
11
+ export declare function createExtensionRuntime(): ExtensionRuntime;
12
+ /**
13
+ * Create an Extension from an inline factory function.
14
+ */
15
+ export declare function loadExtensionFromFactory(factory: ExtensionFactory, cwd: string, eventBus: EventBus, runtime: ExtensionRuntime, extensionPath?: string): Promise<Extension>;
16
+ /**
17
+ * Load extensions from paths.
18
+ */
19
+ export declare function loadExtensions(paths: string[], cwd: string, eventBus?: EventBus): Promise<LoadExtensionsResult>;
20
+ /**
21
+ * Discover and load extensions from standard locations.
22
+ */
23
+ export declare function discoverAndLoadExtensions(configuredPaths: string[], cwd: string, agentDir?: string, eventBus?: EventBus): Promise<LoadExtensionsResult>;
@@ -0,0 +1 @@
1
+ var _=Object.defineProperty;var a=(s,e)=>_(s,"name",{value:e,configurable:!0});import*as u from"node:fs";import{createRequire as R}from"node:module";import*as l from"node:path";import{fileURLToPath as E}from"node:url";import*as k from"@openadapter/koda-agent-core";import*as S from"@openadapter/koda-ai";import*as w from"@openadapter/koda-ai/oauth";import*as T from"@openadapter/koda-tui";import{createJiti as F}from"jiti/static";import*as M from"typebox";import*as P from"typebox/compile";import*as j from"typebox/value";import{CONFIG_DIR_NAME as D,getAgentDir as N,isBunBinary as U}from"../../config.js";import*as C from"../../index.js";import{resolvePath as m}from"../../utils/paths.js";import{createEventBus as V}from"../event-bus.js";import{execCommand as O}from"../exec.js";import{createSyntheticSourceInfo as W}from"../source-info.js";const B={typebox:M,"typebox/compile":P,"typebox/value":j,"@sinclair/typebox":M,"@sinclair/typebox/compile":P,"@sinclair/typebox/value":j,"@openadapter/koda-agent-core":k,"@openadapter/koda-tui":T,"@openadapter/koda-ai":S,"@openadapter/koda-ai/oauth":w,"@openadapter/koda":C,"@mariozechner/pi-agent-core":k,"@mariozechner/pi-tui":T,"@mariozechner/pi-ai":S,"@mariozechner/pi-ai/oauth":w,"@mariozechner/pi-coding-agent":C},x=R(import.meta.url);let y=null;function J(){if(y)return y;const s=l.dirname(E(import.meta.url)),e=l.resolve(s,"../..","index.js"),i=x.resolve("typebox"),n=x.resolve("typebox/compile"),r=x.resolve("typebox/value"),t=l.resolve(s,"../../../../"),o=a((p,v)=>{const b=l.join(t,p);return u.existsSync(b)?b:E(import.meta.resolve(v))},"resolveWorkspaceOrImport"),c=e,d=o("agent/dist/index.js","@openadapter/koda-agent-core"),f=o("tui/dist/index.js","@openadapter/koda-tui"),g=o("ai/dist/index.js","@openadapter/koda-ai"),h=o("ai/dist/oauth.js","@openadapter/koda-ai/oauth");return y={"@openadapter/koda":c,"@openadapter/koda-agent-core":d,"@openadapter/koda-tui":f,"@openadapter/koda-ai":g,"@openadapter/koda-ai/oauth":h,"@mariozechner/pi-coding-agent":c,"@mariozechner/pi-agent-core":d,"@mariozechner/pi-tui":f,"@mariozechner/pi-ai":g,"@mariozechner/pi-ai/oauth":h,typebox:i,"typebox/compile":n,"typebox/value":r,"@sinclair/typebox":i,"@sinclair/typebox/compile":n,"@sinclair/typebox/value":r},y}a(J,"getAliases");function q(){const s=a(()=>{throw new Error("Extension runtime not initialized. Action methods cannot be called during extension loading.")},"notInitialized"),e={},n={sendMessage:s,sendUserMessage:s,appendEntry:s,setSessionName:s,getSessionName:s,setLabel:s,getActiveTools:s,getAllTools:s,setActiveTools:s,refreshTools:a(()=>{},"refreshTools"),getCommands:s,setModel:a(()=>Promise.reject(new Error("Extension runtime not initialized")),"setModel"),getThinkingLevel:s,setThinkingLevel:s,flagValues:new Map,pendingProviderRegistrations:[],assertActive:a(()=>{if(e.staleMessage)throw new Error(e.staleMessage)},"assertActive"),invalidate:a(r=>{e.staleMessage??=r??"This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."},"invalidate"),registerProvider:a((r,t,o="<unknown>")=>{n.pendingProviderRegistrations.push({name:r,config:t,extensionPath:o})},"registerProvider"),unregisterProvider:a(r=>{n.pendingProviderRegistrations=n.pendingProviderRegistrations.filter(t=>t.name!==r)},"unregisterProvider")};return n}a(q,"createExtensionRuntime");function z(s,e,i,n){return{on(t,o){e.assertActive();const c=s.handlers.get(t)??[];c.push(o),s.handlers.set(t,c)},registerTool(t){e.assertActive(),s.tools.set(t.name,{definition:t,sourceInfo:s.sourceInfo}),e.refreshTools()},registerCommand(t,o){e.assertActive(),s.commands.set(t,{name:t,sourceInfo:s.sourceInfo,...o})},registerShortcut(t,o){e.assertActive(),s.shortcuts.set(t,{shortcut:t,extensionPath:s.path,...o})},registerFlag(t,o){e.assertActive(),s.flags.set(t,{name:t,extensionPath:s.path,...o}),o.default!==void 0&&!e.flagValues.has(t)&&e.flagValues.set(t,o.default)},registerMessageRenderer(t,o){e.assertActive(),s.messageRenderers.set(t,o)},getFlag(t){if(e.assertActive(),!!s.flags.has(t))return e.flagValues.get(t)},sendMessage(t,o){e.assertActive(),e.sendMessage(t,o)},sendUserMessage(t,o){e.assertActive(),e.sendUserMessage(t,o)},appendEntry(t,o){e.assertActive(),e.appendEntry(t,o)},setSessionName(t){e.assertActive(),e.setSessionName(t)},getSessionName(){return e.assertActive(),e.getSessionName()},setLabel(t,o){e.assertActive(),e.setLabel(t,o)},exec(t,o,c){return e.assertActive(),O(t,o,c?.cwd??i,c)},getActiveTools(){return e.assertActive(),e.getActiveTools()},getAllTools(){return e.assertActive(),e.getAllTools()},setActiveTools(t){e.assertActive(),e.setActiveTools(t)},getCommands(){return e.assertActive(),e.getCommands()},setModel(t){return e.assertActive(),e.setModel(t)},getThinkingLevel(){return e.assertActive(),e.getThinkingLevel()},setThinkingLevel(t){e.assertActive(),e.setThinkingLevel(t)},registerProvider(t,o){e.assertActive(),e.registerProvider(t,o,s.path)},unregisterProvider(t){e.assertActive(),e.unregisterProvider(t,s.path)},events:n}}a(z,"createExtensionAPI");async function $(s){const n=await F(import.meta.url,{moduleCache:!1,...U?{virtualModules:B,tryNative:!1}:{alias:J()}}).import(s,{default:!0});return typeof n!="function"?void 0:n}a($,"loadExtensionModule");function L(s,e){const i=s.startsWith("<")&&s.endsWith(">")?s.slice(1,-1).split(":")[0]||"temporary":"local",n=s.startsWith("<")?void 0:l.dirname(e);return{path:s,resolvedPath:e,sourceInfo:W(s,{source:i,baseDir:n}),handlers:new Map,tools:new Map,messageRenderers:new Map,commands:new Map,flags:new Map,shortcuts:new Map}}a(L,"createExtension");async function G(s,e,i,n){const r=m(s,e,{normalizeUnicodeSpaces:!0});try{const t=await $(r);if(!t)return{extension:null,error:`Extension does not export a valid factory function: ${s}`};const o=L(s,r),c=z(o,n,e,i);return await t(c),{extension:o,error:null}}catch(t){return{extension:null,error:`Failed to load extension: ${t instanceof Error?t.message:String(t)}`}}}a(G,"loadExtension");async function ie(s,e,i,n,r="<inline>"){const t=L(r,r),o=m(e),c=z(t,n,o,i);return await s(c),t}a(ie,"loadExtensionFromFactory");async function H(s,e,i){const n=[],r=[],t=m(e),o=i??V(),c=q();for(const d of s){const{extension:f,error:g}=await G(d,t,o,c);if(g){r.push({path:d,error:g});continue}f&&n.push(f)}return{extensions:n,errors:r,runtime:c}}a(H,"loadExtensions");function K(s){try{const e=u.readFileSync(s,"utf-8"),i=JSON.parse(e);return i.pi&&typeof i.pi=="object"?i.pi:null}catch{return null}}a(K,"readPiManifest");function Q(s){return s.endsWith(".ts")||s.endsWith(".js")}a(Q,"isExtensionFile");function I(s){const e=l.join(s,"package.json");if(u.existsSync(e)){const r=K(e);if(r?.extensions?.length){const t=[];for(const o of r.extensions){const c=l.resolve(s,o);u.existsSync(c)&&t.push(c)}if(t.length>0)return t}}const i=l.join(s,"index.ts"),n=l.join(s,"index.js");return u.existsSync(i)?[i]:u.existsSync(n)?[n]:null}a(I,"resolveExtensionEntries");function A(s){if(!u.existsSync(s))return[];const e=[];try{const i=u.readdirSync(s,{withFileTypes:!0});for(const n of i){const r=l.join(s,n.name);if((n.isFile()||n.isSymbolicLink())&&Q(n.name)){e.push(r);continue}if(n.isDirectory()||n.isSymbolicLink()){const t=I(r);t&&e.push(...t)}}}catch{return[]}return e}a(A,"discoverExtensionsInDir");async function ae(s,e,i=N(),n){const r=m(e),t=m(i),o=[],c=new Set,d=a(h=>{for(const p of h){const v=l.resolve(p);c.has(v)||(c.add(v),o.push(p))}},"addPaths"),f=l.join(r,D,"extensions");d(A(f));const g=l.join(t,"extensions");d(A(g));for(const h of s){const p=m(h,r,{normalizeUnicodeSpaces:!0});if(u.existsSync(p)&&u.statSync(p).isDirectory()){const v=I(p);if(v){d(v);continue}d(A(p));continue}d([p])}return H(o,r,n)}a(ae,"discoverAndLoadExtensions");export{q as createExtensionRuntime,ae as discoverAndLoadExtensions,ie as loadExtensionFromFactory,H as loadExtensions};
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Extension runner - executes extensions and manages their lifecycle.
3
+ */
4
+ import type { AgentMessage } from "@openadapter/koda-agent-core";
5
+ import type { ImageContent } from "@openadapter/koda-ai";
6
+ import type { KeyId } from "@openadapter/koda-tui";
7
+ import type { ResourceDiagnostic } from "../diagnostics.ts";
8
+ import type { KeybindingsConfig } from "../keybindings.ts";
9
+ import type { ModelRegistry } from "../model-registry.ts";
10
+ import type { SessionManager } from "../session-manager.ts";
11
+ import type { BuildSystemPromptOptions } from "../system-prompt.ts";
12
+ import type { BeforeAgentStartEvent, BeforeAgentStartEventResult, BeforeProviderRequestEvent, ContextEvent, Extension, ExtensionActions, ExtensionCommandContext, ExtensionCommandContextActions, ExtensionContext, ExtensionContextActions, ExtensionError, ExtensionEvent, ExtensionFlag, ExtensionMode, ExtensionRuntime, ExtensionShortcut, ExtensionUIContext, InputEvent, InputEventResult, InputSource, MessageEndEvent, MessageRenderer, ProviderConfig, RegisteredTool, ReplacedSessionContext, ResolvedCommand, ResourcesDiscoverEvent, SessionBeforeCompactResult, SessionBeforeForkResult, SessionBeforeSwitchResult, SessionBeforeTreeResult, SessionShutdownEvent, ToolCallEvent, ToolCallEventResult, ToolResultEvent, ToolResultEventResult, UserBashEvent, UserBashEventResult } from "./types.ts";
13
+ /** Combined result from all before_agent_start handlers */
14
+ interface BeforeAgentStartCombinedResult {
15
+ messages?: NonNullable<BeforeAgentStartEventResult["message"]>[];
16
+ systemPrompt?: string;
17
+ }
18
+ /**
19
+ * Events handled by the generic emit() method.
20
+ * Events with dedicated emitXxx() methods are excluded for stronger type safety.
21
+ */
22
+ type RunnerEmitEvent = Exclude<ExtensionEvent, ToolCallEvent | ToolResultEvent | UserBashEvent | ContextEvent | BeforeProviderRequestEvent | BeforeAgentStartEvent | MessageEndEvent | ResourcesDiscoverEvent | InputEvent>;
23
+ type RunnerEmitResult<TEvent extends RunnerEmitEvent> = TEvent extends {
24
+ type: "session_before_switch";
25
+ } ? SessionBeforeSwitchResult | undefined : TEvent extends {
26
+ type: "session_before_fork";
27
+ } ? SessionBeforeForkResult | undefined : TEvent extends {
28
+ type: "session_before_compact";
29
+ } ? SessionBeforeCompactResult | undefined : TEvent extends {
30
+ type: "session_before_tree";
31
+ } ? SessionBeforeTreeResult | undefined : undefined;
32
+ export type ExtensionErrorListener = (error: ExtensionError) => void;
33
+ export type NewSessionHandler = (options?: {
34
+ parentSession?: string;
35
+ setup?: (sessionManager: SessionManager) => Promise<void>;
36
+ withSession?: (ctx: ReplacedSessionContext) => Promise<void>;
37
+ }) => Promise<{
38
+ cancelled: boolean;
39
+ }>;
40
+ export type ForkHandler = (entryId: string, options?: {
41
+ position?: "before" | "at";
42
+ withSession?: (ctx: ReplacedSessionContext) => Promise<void>;
43
+ }) => Promise<{
44
+ cancelled: boolean;
45
+ }>;
46
+ export type NavigateTreeHandler = (targetId: string, options?: {
47
+ summarize?: boolean;
48
+ customInstructions?: string;
49
+ replaceInstructions?: boolean;
50
+ label?: string;
51
+ }) => Promise<{
52
+ cancelled: boolean;
53
+ }>;
54
+ export type SwitchSessionHandler = (sessionPath: string, options?: {
55
+ withSession?: (ctx: ReplacedSessionContext) => Promise<void>;
56
+ }) => Promise<{
57
+ cancelled: boolean;
58
+ }>;
59
+ export type ReloadHandler = () => Promise<void>;
60
+ export type ShutdownHandler = () => void;
61
+ /**
62
+ * Helper function to emit session_shutdown event to extensions.
63
+ * Returns true if the event was emitted, false if there were no handlers.
64
+ */
65
+ export declare function emitSessionShutdownEvent(extensionRunner: ExtensionRunner, event: SessionShutdownEvent): Promise<boolean>;
66
+ export declare class ExtensionRunner {
67
+ private extensions;
68
+ private runtime;
69
+ private uiContext;
70
+ private mode;
71
+ private cwd;
72
+ private sessionManager;
73
+ private modelRegistry;
74
+ private errorListeners;
75
+ private getModel;
76
+ private isIdleFn;
77
+ private getSignalFn;
78
+ private waitForIdleFn;
79
+ private abortFn;
80
+ private hasPendingMessagesFn;
81
+ private getContextUsageFn;
82
+ private compactFn;
83
+ private getSystemPromptFn;
84
+ private getSystemPromptOptionsFn;
85
+ private newSessionHandler;
86
+ private forkHandler;
87
+ private navigateTreeHandler;
88
+ private switchSessionHandler;
89
+ private reloadHandler;
90
+ private shutdownHandler;
91
+ private shortcutDiagnostics;
92
+ private commandDiagnostics;
93
+ private staleMessage;
94
+ constructor(extensions: Extension[], runtime: ExtensionRuntime, cwd: string, sessionManager: SessionManager, modelRegistry: ModelRegistry);
95
+ bindCore(actions: ExtensionActions, contextActions: ExtensionContextActions, providerActions?: {
96
+ registerProvider?: (name: string, config: ProviderConfig) => void;
97
+ unregisterProvider?: (name: string) => void;
98
+ }): void;
99
+ bindCommandContext(actions?: ExtensionCommandContextActions): void;
100
+ setUIContext(uiContext?: ExtensionUIContext, mode?: ExtensionMode): void;
101
+ getUIContext(): ExtensionUIContext;
102
+ hasUI(): boolean;
103
+ getExtensionPaths(): string[];
104
+ /** Get all registered tools from all extensions (first registration per name wins). */
105
+ getAllRegisteredTools(): RegisteredTool[];
106
+ /** Get a tool definition by name. Returns undefined if not found. */
107
+ getToolDefinition(toolName: string): RegisteredTool["definition"] | undefined;
108
+ getFlags(): Map<string, ExtensionFlag>;
109
+ setFlagValue(name: string, value: boolean | string): void;
110
+ getFlagValues(): Map<string, boolean | string>;
111
+ getShortcuts(resolvedKeybindings: KeybindingsConfig): Map<KeyId, ExtensionShortcut>;
112
+ getShortcutDiagnostics(): ResourceDiagnostic[];
113
+ invalidate(message?: string): void;
114
+ private assertActive;
115
+ onError(listener: ExtensionErrorListener): () => void;
116
+ emitError(error: ExtensionError): void;
117
+ hasHandlers(eventType: string): boolean;
118
+ getMessageRenderer(customType: string): MessageRenderer | undefined;
119
+ private resolveRegisteredCommands;
120
+ getRegisteredCommands(): ResolvedCommand[];
121
+ getCommandDiagnostics(): ResourceDiagnostic[];
122
+ getCommand(name: string): ResolvedCommand | undefined;
123
+ /**
124
+ * Request a graceful shutdown. Called by extension tools and event handlers.
125
+ * The actual shutdown behavior is provided by the mode via bindExtensions().
126
+ */
127
+ shutdown(): void;
128
+ /**
129
+ * Create an ExtensionContext for use in event handlers and tool execution.
130
+ * Context values are resolved at call time, so changes via bindCore/bindUI are reflected.
131
+ */
132
+ createContext(): ExtensionContext;
133
+ createCommandContext(): ExtensionCommandContext;
134
+ private isSessionBeforeEvent;
135
+ emit<TEvent extends RunnerEmitEvent>(event: TEvent): Promise<RunnerEmitResult<TEvent>>;
136
+ emitMessageEnd(event: MessageEndEvent): Promise<AgentMessage | undefined>;
137
+ emitToolResult(event: ToolResultEvent): Promise<ToolResultEventResult | undefined>;
138
+ emitToolCall(event: ToolCallEvent): Promise<ToolCallEventResult | undefined>;
139
+ emitUserBash(event: UserBashEvent): Promise<UserBashEventResult | undefined>;
140
+ emitContext(messages: AgentMessage[]): Promise<AgentMessage[]>;
141
+ emitBeforeProviderRequest(payload: unknown): Promise<unknown>;
142
+ emitBeforeAgentStart(prompt: string, images: ImageContent[] | undefined, systemPrompt: string, systemPromptOptions: BuildSystemPromptOptions): Promise<BeforeAgentStartCombinedResult | undefined>;
143
+ emitResourcesDiscover(cwd: string, reason: ResourcesDiscoverEvent["reason"]): Promise<{
144
+ skillPaths: Array<{
145
+ path: string;
146
+ extensionPath: string;
147
+ }>;
148
+ promptPaths: Array<{
149
+ path: string;
150
+ extensionPath: string;
151
+ }>;
152
+ themePaths: Array<{
153
+ path: string;
154
+ extensionPath: string;
155
+ }>;
156
+ }>;
157
+ /** Emit input event. Transforms chain, "handled" short-circuits. */
158
+ emitInput(text: string, images: ImageContent[] | undefined, source: InputSource, streamingBehavior?: "steer" | "followUp"): Promise<InputEventResult>;
159
+ }
160
+ export {};
@@ -0,0 +1 @@
1
+ var x=Object.defineProperty;var o=(f,e)=>x(f,"name",{value:e,configurable:!0});import{theme as y}from"../../modes/interactive/theme/theme.js";const v=["app.interrupt","app.clear","app.exit","app.suspend","app.thinking.cycle","app.model.cycleForward","app.model.cycleBackward","app.model.select","app.tools.expand","app.thinking.toggle","app.editor.external","app.message.followUp","tui.input.submit","tui.select.confirm","tui.select.cancel","tui.input.copy","tui.editor.deleteToLineEnd"],w=o(f=>{const e={};for(const[n,t]of Object.entries(f)){if(t===void 0)continue;const c=Array.isArray(t)?t:[t],r=v.includes(n);for(const a of c){const s=a.toLowerCase();e[s]?.restrictOverride&&!r||(e[s]={keybinding:n,restrictOverride:r})}}return e},"buildBuiltinKeybindings");async function S(f,e){return f.hasHandlers("session_shutdown")?(await f.emit(e),!0):!1}o(S,"emitSessionShutdownEvent");const p={select:o(async()=>{},"select"),confirm:o(async()=>!1,"confirm"),input:o(async()=>{},"input"),notify:o(()=>{},"notify"),onTerminalInput:o(()=>()=>{},"onTerminalInput"),setStatus:o(()=>{},"setStatus"),setWorkingMessage:o(()=>{},"setWorkingMessage"),setWorkingVisible:o(()=>{},"setWorkingVisible"),setWorkingIndicator:o(()=>{},"setWorkingIndicator"),setHiddenThinkingLabel:o(()=>{},"setHiddenThinkingLabel"),setWidget:o(()=>{},"setWidget"),setFooter:o(()=>{},"setFooter"),setHeader:o(()=>{},"setHeader"),setTitle:o(()=>{},"setTitle"),custom:o(async()=>{},"custom"),pasteToEditor:o(()=>{},"pasteToEditor"),setEditorText:o(()=>{},"setEditorText"),getEditorText:o(()=>"","getEditorText"),editor:o(async()=>{},"editor"),addAutocompleteProvider:o(()=>{},"addAutocompleteProvider"),setEditorComponent:o(()=>{},"setEditorComponent"),getEditorComponent:o(()=>{},"getEditorComponent"),get theme(){return y},getAllThemes:o(()=>[],"getAllThemes"),getTheme:o(()=>{},"getTheme"),setTheme:o(f=>({success:!1,error:"UI not available"}),"setTheme"),getToolsExpanded:o(()=>!1,"getToolsExpanded"),setToolsExpanded:o(()=>{},"setToolsExpanded")};class k{static{o(this,"ExtensionRunner")}extensions;runtime;uiContext;mode="print";cwd;sessionManager;modelRegistry;errorListeners=new Set;getModel=o(()=>{},"getModel");isIdleFn=o(()=>!0,"isIdleFn");getSignalFn=o(()=>{},"getSignalFn");waitForIdleFn=o(async()=>{},"waitForIdleFn");abortFn=o(()=>{},"abortFn");hasPendingMessagesFn=o(()=>!1,"hasPendingMessagesFn");getContextUsageFn=o(()=>{},"getContextUsageFn");compactFn=o(()=>{},"compactFn");getSystemPromptFn=o(()=>"","getSystemPromptFn");getSystemPromptOptionsFn=o(()=>({cwd:this.cwd}),"getSystemPromptOptionsFn");newSessionHandler=o(async()=>({cancelled:!1}),"newSessionHandler");forkHandler=o(async()=>({cancelled:!1}),"forkHandler");navigateTreeHandler=o(async()=>({cancelled:!1}),"navigateTreeHandler");switchSessionHandler=o(async()=>({cancelled:!1}),"switchSessionHandler");reloadHandler=o(async()=>{},"reloadHandler");shutdownHandler=o(()=>{},"shutdownHandler");shortcutDiagnostics=[];commandDiagnostics=[];staleMessage;constructor(e,n,t,c,r){this.extensions=e,this.runtime=n,this.uiContext=p,this.cwd=t,this.sessionManager=c,this.modelRegistry=r}bindCore(e,n,t){this.runtime.sendMessage=e.sendMessage,this.runtime.sendUserMessage=e.sendUserMessage,this.runtime.appendEntry=e.appendEntry,this.runtime.setSessionName=e.setSessionName,this.runtime.getSessionName=e.getSessionName,this.runtime.setLabel=e.setLabel,this.runtime.getActiveTools=e.getActiveTools,this.runtime.getAllTools=e.getAllTools,this.runtime.setActiveTools=e.setActiveTools,this.runtime.refreshTools=e.refreshTools,this.runtime.getCommands=e.getCommands,this.runtime.setModel=e.setModel,this.runtime.getThinkingLevel=e.getThinkingLevel,this.runtime.setThinkingLevel=e.setThinkingLevel,this.getModel=n.getModel,this.isIdleFn=n.isIdle,this.getSignalFn=n.getSignal,this.abortFn=n.abort,this.hasPendingMessagesFn=n.hasPendingMessages,this.shutdownHandler=n.shutdown,this.getContextUsageFn=n.getContextUsage,this.compactFn=n.compact,this.getSystemPromptFn=n.getSystemPrompt,this.getSystemPromptOptionsFn=n.getSystemPromptOptions??(()=>({cwd:this.cwd}));for(const{name:c,config:r,extensionPath:a}of this.runtime.pendingProviderRegistrations)try{t?.registerProvider?t.registerProvider(c,r):this.modelRegistry.registerProvider(c,r)}catch(s){this.emitError({extensionPath:a,event:"register_provider",error:s instanceof Error?s.message:String(s),stack:s instanceof Error?s.stack:void 0})}this.runtime.pendingProviderRegistrations=[],this.runtime.registerProvider=(c,r)=>{if(t?.registerProvider){t.registerProvider(c,r);return}this.modelRegistry.registerProvider(c,r)},this.runtime.unregisterProvider=c=>{if(t?.unregisterProvider){t.unregisterProvider(c);return}this.modelRegistry.unregisterProvider(c)}}bindCommandContext(e){if(e){this.waitForIdleFn=e.waitForIdle,this.newSessionHandler=e.newSession,this.forkHandler=e.fork,this.navigateTreeHandler=e.navigateTree,this.switchSessionHandler=e.switchSession,this.reloadHandler=e.reload;return}this.waitForIdleFn=async()=>{},this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.reloadHandler=async()=>{}}setUIContext(e,n="print"){this.uiContext=e??p,this.mode=n}getUIContext(){return this.uiContext}hasUI(){return this.uiContext!==p}getExtensionPaths(){return this.extensions.map(e=>e.path)}getAllRegisteredTools(){const e=new Map;for(const n of this.extensions)for(const t of n.tools.values())e.has(t.definition.name)||e.set(t.definition.name,t);return Array.from(e.values())}getToolDefinition(e){for(const n of this.extensions){const t=n.tools.get(e);if(t)return t.definition}}getFlags(){const e=new Map;for(const n of this.extensions)for(const[t,c]of n.flags)e.has(t)||e.set(t,c);return e}setFlagValue(e,n){this.runtime.flagValues.set(e,n)}getFlagValues(){return new Map(this.runtime.flagValues)}getShortcuts(e){this.shortcutDiagnostics=[];const n=w(e),t=new Map,c=o((r,a)=>{this.shortcutDiagnostics.push({type:"warning",message:r,path:a}),this.hasUI()||console.warn(r)},"addDiagnostic");for(const r of this.extensions)for(const[a,s]of r.shortcuts){const i=a.toLowerCase(),d=n[i];if(d?.restrictOverride===!0){c(`Extension shortcut '${a}' from ${s.extensionPath} conflicts with built-in shortcut. Skipping.`,s.extensionPath);continue}d?.restrictOverride===!1&&c(`Extension shortcut conflict: '${a}' is built-in shortcut for ${d.keybinding} and ${s.extensionPath}. Using ${s.extensionPath}.`,s.extensionPath);const h=t.get(i);h&&c(`Extension shortcut conflict: '${a}' registered by both ${h.extensionPath} and ${s.extensionPath}. Using ${s.extensionPath}.`,s.extensionPath),t.set(i,s)}return t}getShortcutDiagnostics(){return this.shortcutDiagnostics}invalidate(e="This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."){this.staleMessage||(this.staleMessage=e,this.runtime.invalidate(e))}assertActive(){if(this.staleMessage)throw new Error(this.staleMessage)}onError(e){return this.errorListeners.add(e),()=>this.errorListeners.delete(e)}emitError(e){for(const n of this.errorListeners)n(e)}hasHandlers(e){for(const n of this.extensions){const t=n.handlers.get(e);if(t&&t.length>0)return!0}return!1}getMessageRenderer(e){for(const n of this.extensions){const t=n.messageRenderers.get(e);if(t)return t}}resolveRegisteredCommands(){const e=[],n=new Map;for(const r of this.extensions)for(const a of r.commands.values())e.push(a),n.set(a.name,(n.get(a.name)??0)+1);const t=new Map,c=new Set;return e.map(r=>{const a=(t.get(r.name)??0)+1;t.set(r.name,a);let s=(n.get(r.name)??0)>1?`${r.name}:${a}`:r.name;if(c.has(s)){let i=a;do i++,s=`${r.name}:${i}`;while(c.has(s))}return c.add(s),{...r,invocationName:s}})}getRegisteredCommands(){return this.commandDiagnostics=[],this.resolveRegisteredCommands()}getCommandDiagnostics(){return this.commandDiagnostics}getCommand(e){return this.resolveRegisteredCommands().find(n=>n.invocationName===e)}shutdown(){this.shutdownHandler()}createContext(){const e=this,n=this.getModel;return{get ui(){return e.assertActive(),e.uiContext},get mode(){return e.assertActive(),e.mode},get hasUI(){return e.assertActive(),e.hasUI()},get cwd(){return e.assertActive(),e.cwd},get sessionManager(){return e.assertActive(),e.sessionManager},get modelRegistry(){return e.assertActive(),e.modelRegistry},get model(){return e.assertActive(),n()},isIdle:o(()=>(e.assertActive(),e.isIdleFn()),"isIdle"),get signal(){return e.assertActive(),e.getSignalFn()},abort:o(()=>{e.assertActive(),e.abortFn()},"abort"),hasPendingMessages:o(()=>(e.assertActive(),e.hasPendingMessagesFn()),"hasPendingMessages"),shutdown:o(()=>{e.assertActive(),e.shutdownHandler()},"shutdown"),getContextUsage:o(()=>(e.assertActive(),e.getContextUsageFn()),"getContextUsage"),compact:o(t=>{e.assertActive(),e.compactFn(t)},"compact"),getSystemPrompt:o(()=>(e.assertActive(),e.getSystemPromptFn()),"getSystemPrompt")}}createCommandContext(){const e=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext()));return e.getSystemPromptOptions=()=>(this.assertActive(),this.getSystemPromptOptionsFn()),e.waitForIdle=()=>(this.assertActive(),this.waitForIdleFn()),e.newSession=n=>(this.assertActive(),this.newSessionHandler(n)),e.fork=(n,t)=>(this.assertActive(),this.forkHandler(n,t)),e.navigateTree=(n,t)=>(this.assertActive(),this.navigateTreeHandler(n,t)),e.switchSession=(n,t)=>(this.assertActive(),this.switchSessionHandler(n,t)),e.reload=()=>(this.assertActive(),this.reloadHandler()),e}isSessionBeforeEvent(e){return e.type==="session_before_switch"||e.type==="session_before_fork"||e.type==="session_before_compact"||e.type==="session_before_tree"}async emit(e){const n=this.createContext();let t;for(const c of this.extensions){const r=c.handlers.get(e.type);if(!(!r||r.length===0))for(const a of r)try{const s=await a(e,n);if(this.isSessionBeforeEvent(e)&&s&&(t=s,t.cancel))return t}catch(s){const i=s instanceof Error?s.message:String(s),d=s instanceof Error?s.stack:void 0;this.emitError({extensionPath:c.path,event:e.type,error:i,stack:d})}}return t}async emitMessageEnd(e){const n=this.createContext();let t=e.message,c=!1;for(const r of this.extensions){const a=r.handlers.get("message_end");if(!(!a||a.length===0))for(const s of a)try{const i={...e,message:t},d=await s(i,n);if(!d?.message)continue;if(d.message.role!==t.role){this.emitError({extensionPath:r.path,event:"message_end",error:"message_end handlers must return a message with the same role"});continue}t=d.message,c=!0}catch(i){const d=i instanceof Error?i.message:String(i),h=i instanceof Error?i.stack:void 0;this.emitError({extensionPath:r.path,event:"message_end",error:d,stack:h})}}return c?t:void 0}async emitToolResult(e){const n=this.createContext(),t={...e};let c=!1;for(const r of this.extensions){const a=r.handlers.get("tool_result");if(!(!a||a.length===0))for(const s of a)try{const i=await s(t,n);if(!i)continue;i.content!==void 0&&(t.content=i.content,c=!0),i.details!==void 0&&(t.details=i.details,c=!0),i.isError!==void 0&&(t.isError=i.isError,c=!0)}catch(i){const d=i instanceof Error?i.message:String(i),h=i instanceof Error?i.stack:void 0;this.emitError({extensionPath:r.path,event:"tool_result",error:d,stack:h})}}if(c)return{content:t.content,details:t.details,isError:t.isError}}async emitToolCall(e){const n=this.createContext();let t;for(const c of this.extensions){const r=c.handlers.get("tool_call");if(!(!r||r.length===0))for(const a of r){const s=await a(e,n);if(s&&(t=s,t.block))return t}}return t}async emitUserBash(e){const n=this.createContext();for(const t of this.extensions){const c=t.handlers.get("user_bash");if(!(!c||c.length===0))for(const r of c)try{const a=await r(e,n);if(a)return a}catch(a){const s=a instanceof Error?a.message:String(a),i=a instanceof Error?a.stack:void 0;this.emitError({extensionPath:t.path,event:"user_bash",error:s,stack:i})}}}async emitContext(e){const n=this.createContext();let t=structuredClone(e);for(const c of this.extensions){const r=c.handlers.get("context");if(!(!r||r.length===0))for(const a of r)try{const i=await a({type:"context",messages:t},n);i&&i.messages&&(t=i.messages)}catch(s){const i=s instanceof Error?s.message:String(s),d=s instanceof Error?s.stack:void 0;this.emitError({extensionPath:c.path,event:"context",error:i,stack:d})}}return t}async emitBeforeProviderRequest(e){const n=this.createContext();let t=e;for(const c of this.extensions){const r=c.handlers.get("before_provider_request");if(!(!r||r.length===0))for(const a of r)try{const i=await a({type:"before_provider_request",payload:t},n);i!==void 0&&(t=i)}catch(s){const i=s instanceof Error?s.message:String(s),d=s instanceof Error?s.stack:void 0;this.emitError({extensionPath:c.path,event:"before_provider_request",error:i,stack:d})}}return t}async emitBeforeAgentStart(e,n,t,c){let r=t;const a=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext()));a.getSystemPrompt=()=>(this.assertActive(),r);const s=[];let i=!1;for(const d of this.extensions){const h=d.handlers.get("before_agent_start");if(!(!h||h.length===0))for(const u of h)try{const g=await u({type:"before_agent_start",prompt:e,images:n,systemPrompt:r,systemPromptOptions:c},a);if(g){const m=g;m.message&&s.push(m.message),m.systemPrompt!==void 0&&(r=m.systemPrompt,i=!0)}}catch(l){const g=l instanceof Error?l.message:String(l),m=l instanceof Error?l.stack:void 0;this.emitError({extensionPath:d.path,event:"before_agent_start",error:g,stack:m})}}if(s.length>0||i)return{messages:s.length>0?s:void 0,systemPrompt:i?r:void 0}}async emitResourcesDiscover(e,n){const t=this.createContext(),c=[],r=[],a=[];for(const s of this.extensions){const i=s.handlers.get("resources_discover");if(!(!i||i.length===0))for(const d of i)try{const l=await d({type:"resources_discover",cwd:e,reason:n},t);l?.skillPaths?.length&&c.push(...l.skillPaths.map(g=>({path:g,extensionPath:s.path}))),l?.promptPaths?.length&&r.push(...l.promptPaths.map(g=>({path:g,extensionPath:s.path}))),l?.themePaths?.length&&a.push(...l.themePaths.map(g=>({path:g,extensionPath:s.path})))}catch(h){const u=h instanceof Error?h.message:String(h),l=h instanceof Error?h.stack:void 0;this.emitError({extensionPath:s.path,event:"resources_discover",error:u,stack:l})}}return{skillPaths:c,promptPaths:r,themePaths:a}}async emitInput(e,n,t,c){const r=this.createContext();let a=e,s=n;for(const i of this.extensions)for(const d of i.handlers.get("input")??[])try{const u=await d({type:"input",text:a,images:s,source:t,streamingBehavior:c},r);if(u?.action==="handled")return u;u?.action==="transform"&&(a=u.text,s=u.images??s)}catch(h){this.emitError({extensionPath:i.path,event:"input",error:h instanceof Error?h.message:String(h),stack:h instanceof Error?h.stack:void 0})}return a!==e||s!==n?{action:"transform",text:a,images:s}:{action:"continue"}}}export{k as ExtensionRunner,S as emitSessionShutdownEvent};