orynacode-ai 1.16.2

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 (938) hide show
  1. package/AGENTS.md +131 -0
  2. package/BUN_SHELL_MIGRATION_PLAN.md +136 -0
  3. package/Dockerfile +18 -0
  4. package/README.md +15 -0
  5. package/bin/orynacode +199 -0
  6. package/bunfig.toml +7 -0
  7. package/git +0 -0
  8. package/migration/20260511173437_session-metadata/migration.sql +1 -0
  9. package/migration/20260511173437_session-metadata/snapshot.json +1500 -0
  10. package/package.json +155 -0
  11. package/parsers-config.ts +386 -0
  12. package/script/bench-search.ts +115 -0
  13. package/script/bench-test-suite.ts +52 -0
  14. package/script/build.ts +244 -0
  15. package/script/generate.ts +14 -0
  16. package/script/httpapi-exercise.ts +1 -0
  17. package/script/postinstall.mjs +189 -0
  18. package/script/profile-test-files.ts +42 -0
  19. package/script/publish.ts +213 -0
  20. package/script/run-workspace-server +106 -0
  21. package/script/schema.ts +77 -0
  22. package/script/time.ts +6 -0
  23. package/script/trace-imports.ts +153 -0
  24. package/specs/effect/error-boundaries-plan.md +235 -0
  25. package/specs/effect/errors.md +207 -0
  26. package/specs/effect/facades.md +218 -0
  27. package/specs/effect/guide.md +247 -0
  28. package/specs/effect/instance-context.md +13 -0
  29. package/specs/effect/loose-ends.md +30 -0
  30. package/specs/effect/migration.md +62 -0
  31. package/specs/effect/routes.md +61 -0
  32. package/specs/effect/schema.md +88 -0
  33. package/specs/effect/server-package.md +58 -0
  34. package/specs/effect/todo.md +241 -0
  35. package/specs/effect/tools.md +88 -0
  36. package/specs/openapi-translation-cleanup.md +204 -0
  37. package/specs/tui-plugins.md +544 -0
  38. package/specs/v2/api.ts +67 -0
  39. package/specs/v2/message-shape.md +136 -0
  40. package/specs/v2/notifications.md +13 -0
  41. package/specs/v2/tui-command-shim.md +67 -0
  42. package/src/account/account.ts +459 -0
  43. package/src/account/repo.ts +170 -0
  44. package/src/account/schema.ts +99 -0
  45. package/src/account/url.ts +8 -0
  46. package/src/acp/agent.ts +95 -0
  47. package/src/acp/config-option.ts +203 -0
  48. package/src/acp/content.ts +250 -0
  49. package/src/acp/directory.ts +210 -0
  50. package/src/acp/error.ts +90 -0
  51. package/src/acp/event.ts +344 -0
  52. package/src/acp/permission.ts +145 -0
  53. package/src/acp/profile.ts +42 -0
  54. package/src/acp/service.ts +1062 -0
  55. package/src/acp/session.ts +231 -0
  56. package/src/acp/tool.ts +317 -0
  57. package/src/acp/usage.ts +239 -0
  58. package/src/agent/agent.ts +433 -0
  59. package/src/agent/generate.txt +75 -0
  60. package/src/agent/prompt/compaction.txt +9 -0
  61. package/src/agent/prompt/explore.txt +18 -0
  62. package/src/agent/prompt/summary.txt +11 -0
  63. package/src/agent/prompt/title.txt +44 -0
  64. package/src/agent/subagent-permissions.ts +35 -0
  65. package/src/audio.d.ts +14 -0
  66. package/src/auth/index.ts +96 -0
  67. package/src/background/job.ts +36 -0
  68. package/src/bus/global.ts +22 -0
  69. package/src/cli/bootstrap.ts +11 -0
  70. package/src/cli/cmd/account.ts +264 -0
  71. package/src/cli/cmd/acp.ts +76 -0
  72. package/src/cli/cmd/agent.ts +259 -0
  73. package/src/cli/cmd/cmd.ts +7 -0
  74. package/src/cli/cmd/db.ts +62 -0
  75. package/src/cli/cmd/debug/agent.handler.ts +193 -0
  76. package/src/cli/cmd/debug/agent.ts +27 -0
  77. package/src/cli/cmd/debug/config.ts +14 -0
  78. package/src/cli/cmd/debug/file.ts +87 -0
  79. package/src/cli/cmd/debug/index.ts +87 -0
  80. package/src/cli/cmd/debug/lsp.ts +51 -0
  81. package/src/cli/cmd/debug/ripgrep.ts +99 -0
  82. package/src/cli/cmd/debug/scrap.ts +18 -0
  83. package/src/cli/cmd/debug/skill.ts +15 -0
  84. package/src/cli/cmd/debug/snapshot.ts +50 -0
  85. package/src/cli/cmd/debug/startup.ts +11 -0
  86. package/src/cli/cmd/debug/v2.ts +46 -0
  87. package/src/cli/cmd/export.ts +292 -0
  88. package/src/cli/cmd/generate.ts +54 -0
  89. package/src/cli/cmd/github.handler.ts +1593 -0
  90. package/src/cli/cmd/github.shared.ts +30 -0
  91. package/src/cli/cmd/github.ts +42 -0
  92. package/src/cli/cmd/import.ts +224 -0
  93. package/src/cli/cmd/mcp.ts +846 -0
  94. package/src/cli/cmd/models.ts +66 -0
  95. package/src/cli/cmd/plug.ts +230 -0
  96. package/src/cli/cmd/pr.ts +115 -0
  97. package/src/cli/cmd/prompt-display.ts +48 -0
  98. package/src/cli/cmd/providers.ts +506 -0
  99. package/src/cli/cmd/run/demo.ts +1274 -0
  100. package/src/cli/cmd/run/entry.body.ts +194 -0
  101. package/src/cli/cmd/run/footer.command.tsx +899 -0
  102. package/src/cli/cmd/run/footer.menu.tsx +306 -0
  103. package/src/cli/cmd/run/footer.permission.tsx +475 -0
  104. package/src/cli/cmd/run/footer.prompt.tsx +1207 -0
  105. package/src/cli/cmd/run/footer.question.tsx +579 -0
  106. package/src/cli/cmd/run/footer.subagent.tsx +171 -0
  107. package/src/cli/cmd/run/footer.ts +1092 -0
  108. package/src/cli/cmd/run/footer.view.tsx +935 -0
  109. package/src/cli/cmd/run/otel.ts +117 -0
  110. package/src/cli/cmd/run/permission.shared.ts +256 -0
  111. package/src/cli/cmd/run/prompt.shared.ts +147 -0
  112. package/src/cli/cmd/run/question.shared.ts +340 -0
  113. package/src/cli/cmd/run/runtime.boot.ts +210 -0
  114. package/src/cli/cmd/run/runtime.lifecycle.ts +369 -0
  115. package/src/cli/cmd/run/runtime.queue.ts +347 -0
  116. package/src/cli/cmd/run/runtime.shared.ts +17 -0
  117. package/src/cli/cmd/run/runtime.stdin.ts +37 -0
  118. package/src/cli/cmd/run/runtime.ts +879 -0
  119. package/src/cli/cmd/run/scrollback.shared.ts +92 -0
  120. package/src/cli/cmd/run/scrollback.surface.ts +435 -0
  121. package/src/cli/cmd/run/scrollback.writer.tsx +335 -0
  122. package/src/cli/cmd/run/session-data.ts +1113 -0
  123. package/src/cli/cmd/run/session-replay.ts +301 -0
  124. package/src/cli/cmd/run/session.shared.ts +196 -0
  125. package/src/cli/cmd/run/splash.ts +310 -0
  126. package/src/cli/cmd/run/stream.transport.ts +1465 -0
  127. package/src/cli/cmd/run/stream.ts +175 -0
  128. package/src/cli/cmd/run/subagent-data.ts +844 -0
  129. package/src/cli/cmd/run/theme.ts +603 -0
  130. package/src/cli/cmd/run/tool.ts +1489 -0
  131. package/src/cli/cmd/run/trace.ts +94 -0
  132. package/src/cli/cmd/run/types.ts +342 -0
  133. package/src/cli/cmd/run/variant.shared.ts +215 -0
  134. package/src/cli/cmd/run.ts +879 -0
  135. package/src/cli/cmd/serve.ts +24 -0
  136. package/src/cli/cmd/session.ts +147 -0
  137. package/src/cli/cmd/stats.ts +393 -0
  138. package/src/cli/cmd/tui/app.tsx +1113 -0
  139. package/src/cli/cmd/tui/attach.ts +103 -0
  140. package/src/cli/cmd/tui/attention.ts +262 -0
  141. package/src/cli/cmd/tui/component/bg-pulse-render.ts +436 -0
  142. package/src/cli/cmd/tui/component/bg-pulse.tsx +99 -0
  143. package/src/cli/cmd/tui/component/border.tsx +21 -0
  144. package/src/cli/cmd/tui/component/command-palette.tsx +79 -0
  145. package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
  146. package/src/cli/cmd/tui/component/dialog-console-org.tsx +103 -0
  147. package/src/cli/cmd/tui/component/dialog-mcp.tsx +85 -0
  148. package/src/cli/cmd/tui/component/dialog-model.tsx +185 -0
  149. package/src/cli/cmd/tui/component/dialog-move-session.tsx +240 -0
  150. package/src/cli/cmd/tui/component/dialog-provider.tsx +687 -0
  151. package/src/cli/cmd/tui/component/dialog-retry-action.tsx +160 -0
  152. package/src/cli/cmd/tui/component/dialog-session-delete-failed.tsx +99 -0
  153. package/src/cli/cmd/tui/component/dialog-session-list.tsx +318 -0
  154. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
  155. package/src/cli/cmd/tui/component/dialog-skill.tsx +36 -0
  156. package/src/cli/cmd/tui/component/dialog-stash.tsx +87 -0
  157. package/src/cli/cmd/tui/component/dialog-status.tsx +168 -0
  158. package/src/cli/cmd/tui/component/dialog-tag.tsx +47 -0
  159. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
  160. package/src/cli/cmd/tui/component/dialog-variant.tsx +39 -0
  161. package/src/cli/cmd/tui/component/dialog-workspace-create.tsx +313 -0
  162. package/src/cli/cmd/tui/component/dialog-workspace-file-changes.tsx +144 -0
  163. package/src/cli/cmd/tui/component/dialog-workspace-list.tsx +112 -0
  164. package/src/cli/cmd/tui/component/dialog-workspace-unavailable.tsx +69 -0
  165. package/src/cli/cmd/tui/component/error-component.tsx +81 -0
  166. package/src/cli/cmd/tui/component/logo.tsx +885 -0
  167. package/src/cli/cmd/tui/component/plugin-route-missing.tsx +14 -0
  168. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +799 -0
  169. package/src/cli/cmd/tui/component/prompt/cwd.ts +0 -0
  170. package/src/cli/cmd/tui/component/prompt/frecency.tsx +90 -0
  171. package/src/cli/cmd/tui/component/prompt/history.tsx +117 -0
  172. package/src/cli/cmd/tui/component/prompt/index.tsx +1725 -0
  173. package/src/cli/cmd/tui/component/prompt/move.tsx +192 -0
  174. package/src/cli/cmd/tui/component/prompt/part.ts +31 -0
  175. package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
  176. package/src/cli/cmd/tui/component/prompt/traits.ts +35 -0
  177. package/src/cli/cmd/tui/component/prompt/workspace.tsx +137 -0
  178. package/src/cli/cmd/tui/component/spinner.tsx +24 -0
  179. package/src/cli/cmd/tui/component/startup-loading.tsx +63 -0
  180. package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
  181. package/src/cli/cmd/tui/component/use-connected.tsx +9 -0
  182. package/src/cli/cmd/tui/component/workspace-label.tsx +19 -0
  183. package/src/cli/cmd/tui/config/cwd.ts +5 -0
  184. package/src/cli/cmd/tui/config/keybind.ts +467 -0
  185. package/src/cli/cmd/tui/config/tui-migrate.ts +154 -0
  186. package/src/cli/cmd/tui/config/tui-schema.ts +88 -0
  187. package/src/cli/cmd/tui/config/tui.ts +308 -0
  188. package/src/cli/cmd/tui/context/agent.tsx +11 -0
  189. package/src/cli/cmd/tui/context/aggregate-failures.ts +51 -0
  190. package/src/cli/cmd/tui/context/args.tsx +15 -0
  191. package/src/cli/cmd/tui/context/directory.ts +15 -0
  192. package/src/cli/cmd/tui/context/editor-zed.ts +287 -0
  193. package/src/cli/cmd/tui/context/editor.ts +469 -0
  194. package/src/cli/cmd/tui/context/event.ts +38 -0
  195. package/src/cli/cmd/tui/context/exit.tsx +42 -0
  196. package/src/cli/cmd/tui/context/helper.tsx +25 -0
  197. package/src/cli/cmd/tui/context/kv.tsx +76 -0
  198. package/src/cli/cmd/tui/context/local.tsx +510 -0
  199. package/src/cli/cmd/tui/context/path-format.tsx +39 -0
  200. package/src/cli/cmd/tui/context/project.tsx +111 -0
  201. package/src/cli/cmd/tui/context/prompt.tsx +18 -0
  202. package/src/cli/cmd/tui/context/route.tsx +52 -0
  203. package/src/cli/cmd/tui/context/sdk.tsx +142 -0
  204. package/src/cli/cmd/tui/context/sync-v2.tsx +447 -0
  205. package/src/cli/cmd/tui/context/sync.tsx +628 -0
  206. package/src/cli/cmd/tui/context/theme/aura.json +69 -0
  207. package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
  208. package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
  209. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +230 -0
  210. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +230 -0
  211. package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
  212. package/src/cli/cmd/tui/context/theme/cobalt2.json +225 -0
  213. package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
  214. package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
  215. package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
  216. package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
  217. package/src/cli/cmd/tui/context/theme/github.json +233 -0
  218. package/src/cli/cmd/tui/context/theme/gruvbox.json +242 -0
  219. package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
  220. package/src/cli/cmd/tui/context/theme/lucent-orng.json +234 -0
  221. package/src/cli/cmd/tui/context/theme/material.json +235 -0
  222. package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
  223. package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
  224. package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
  225. package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
  226. package/src/cli/cmd/tui/context/theme/nord.json +223 -0
  227. package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
  228. package/src/cli/cmd/tui/context/theme/opencode.json +245 -0
  229. package/src/cli/cmd/tui/context/theme/orng.json +249 -0
  230. package/src/cli/cmd/tui/context/theme/oryna.json +95 -0
  231. package/src/cli/cmd/tui/context/theme/osaka-jade.json +93 -0
  232. package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
  233. package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
  234. package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
  235. package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
  236. package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
  237. package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
  238. package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
  239. package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
  240. package/src/cli/cmd/tui/context/theme.tsx +1341 -0
  241. package/src/cli/cmd/tui/context/thinking.ts +67 -0
  242. package/src/cli/cmd/tui/context/tui-config.tsx +9 -0
  243. package/src/cli/cmd/tui/event.ts +53 -0
  244. package/src/cli/cmd/tui/feature-plugins/home/footer.tsx +98 -0
  245. package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +288 -0
  246. package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +59 -0
  247. package/src/cli/cmd/tui/feature-plugins/session/dialog.tsx +356 -0
  248. package/src/cli/cmd/tui/feature-plugins/session/index.tsx +32 -0
  249. package/src/cli/cmd/tui/feature-plugins/session/preview-pane.tsx +288 -0
  250. package/src/cli/cmd/tui/feature-plugins/session/util.tsx +54 -0
  251. package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +65 -0
  252. package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +70 -0
  253. package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +96 -0
  254. package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +65 -0
  255. package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +97 -0
  256. package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +49 -0
  257. package/src/cli/cmd/tui/feature-plugins/system/diff-viewer-file-tree-utils.ts +232 -0
  258. package/src/cli/cmd/tui/feature-plugins/system/diff-viewer-file-tree.tsx +162 -0
  259. package/src/cli/cmd/tui/feature-plugins/system/diff-viewer-ui.tsx +103 -0
  260. package/src/cli/cmd/tui/feature-plugins/system/diff-viewer.tsx +1058 -0
  261. package/src/cli/cmd/tui/feature-plugins/system/notifications.ts +94 -0
  262. package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +269 -0
  263. package/src/cli/cmd/tui/feature-plugins/system/session-v2.tsx +1184 -0
  264. package/src/cli/cmd/tui/feature-plugins/system/which-key.tsx +608 -0
  265. package/src/cli/cmd/tui/keymap.tsx +283 -0
  266. package/src/cli/cmd/tui/layer.ts +6 -0
  267. package/src/cli/cmd/tui/plugin/api.tsx +390 -0
  268. package/src/cli/cmd/tui/plugin/command-shim.ts +109 -0
  269. package/src/cli/cmd/tui/plugin/internal.ts +42 -0
  270. package/src/cli/cmd/tui/plugin/runtime.ts +1131 -0
  271. package/src/cli/cmd/tui/plugin/slots.tsx +60 -0
  272. package/src/cli/cmd/tui/routes/home/session-destination.tsx +39 -0
  273. package/src/cli/cmd/tui/routes/home.tsx +149 -0
  274. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +76 -0
  275. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +108 -0
  276. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +26 -0
  277. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
  278. package/src/cli/cmd/tui/routes/session/footer.tsx +91 -0
  279. package/src/cli/cmd/tui/routes/session/index.tsx +2629 -0
  280. package/src/cli/cmd/tui/routes/session/permission.tsx +729 -0
  281. package/src/cli/cmd/tui/routes/session/question.tsx +514 -0
  282. package/src/cli/cmd/tui/routes/session/sidebar.tsx +102 -0
  283. package/src/cli/cmd/tui/routes/session/subagent-footer.tsx +132 -0
  284. package/src/cli/cmd/tui/thread.ts +264 -0
  285. package/src/cli/cmd/tui/ui/dialog-alert.tsx +66 -0
  286. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +108 -0
  287. package/src/cli/cmd/tui/ui/dialog-export-options.tsx +217 -0
  288. package/src/cli/cmd/tui/ui/dialog-help.tsx +40 -0
  289. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +126 -0
  290. package/src/cli/cmd/tui/ui/dialog-select.tsx +712 -0
  291. package/src/cli/cmd/tui/ui/dialog.tsx +218 -0
  292. package/src/cli/cmd/tui/ui/link.tsx +34 -0
  293. package/src/cli/cmd/tui/ui/spinner.ts +368 -0
  294. package/src/cli/cmd/tui/ui/toast.tsx +102 -0
  295. package/src/cli/cmd/tui/util/audio.ts +58 -0
  296. package/src/cli/cmd/tui/util/clipboard.ts +181 -0
  297. package/src/cli/cmd/tui/util/collapse-tool-output.ts +19 -0
  298. package/src/cli/cmd/tui/util/editor.ts +43 -0
  299. package/src/cli/cmd/tui/util/layout.ts +25 -0
  300. package/src/cli/cmd/tui/util/model.ts +23 -0
  301. package/src/cli/cmd/tui/util/provider-origin.ts +7 -0
  302. package/src/cli/cmd/tui/util/revert-diff.ts +18 -0
  303. package/src/cli/cmd/tui/util/scroll.ts +25 -0
  304. package/src/cli/cmd/tui/util/selection.ts +73 -0
  305. package/src/cli/cmd/tui/util/signal.ts +41 -0
  306. package/src/cli/cmd/tui/util/transcript.ts +112 -0
  307. package/src/cli/cmd/tui/validate-session.ts +29 -0
  308. package/src/cli/cmd/tui/win32.ts +130 -0
  309. package/src/cli/cmd/tui/worker.ts +99 -0
  310. package/src/cli/cmd/uninstall.ts +353 -0
  311. package/src/cli/cmd/upgrade.ts +74 -0
  312. package/src/cli/cmd/web.ts +84 -0
  313. package/src/cli/effect/prompt.ts +37 -0
  314. package/src/cli/effect-cmd.ts +96 -0
  315. package/src/cli/error.ts +118 -0
  316. package/src/cli/heap.ts +59 -0
  317. package/src/cli/logo.ts +21 -0
  318. package/src/cli/network.ts +64 -0
  319. package/src/cli/ui.ts +132 -0
  320. package/src/cli/upgrade.ts +53 -0
  321. package/src/command/index.ts +181 -0
  322. package/src/command/template/initialize.txt +66 -0
  323. package/src/command/template/review.txt +101 -0
  324. package/src/config/agent.ts +68 -0
  325. package/src/config/command.ts +45 -0
  326. package/src/config/config.ts +679 -0
  327. package/src/config/entry-name.ts +19 -0
  328. package/src/config/managed.ts +77 -0
  329. package/src/config/markdown.ts +36 -0
  330. package/src/config/parse.ts +79 -0
  331. package/src/config/paths.ts +45 -0
  332. package/src/config/plugin.ts +79 -0
  333. package/src/config/reference.ts +48 -0
  334. package/src/config/variable.ts +91 -0
  335. package/src/control-plane/adapters/index.ts +41 -0
  336. package/src/control-plane/adapters/worktree.ts +96 -0
  337. package/src/control-plane/dev/README.md +19 -0
  338. package/src/control-plane/dev/debug-workspace-plugin.ts +73 -0
  339. package/src/control-plane/types.ts +59 -0
  340. package/src/control-plane/util.ts +39 -0
  341. package/src/control-plane/workspace-adapter-runtime.ts +51 -0
  342. package/src/control-plane/workspace-context.ts +26 -0
  343. package/src/control-plane/workspace.ts +1075 -0
  344. package/src/effect/app-runtime.ts +133 -0
  345. package/src/effect/bootstrap-runtime.ts +23 -0
  346. package/src/effect/bridge.ts +84 -0
  347. package/src/effect/config-service.ts +67 -0
  348. package/src/effect/instance-ref.ts +11 -0
  349. package/src/effect/instance-registry.ts +12 -0
  350. package/src/effect/instance-state.ts +72 -0
  351. package/src/effect/promise.ts +17 -0
  352. package/src/effect/run-service.ts +47 -0
  353. package/src/effect/runner.ts +217 -0
  354. package/src/effect/runtime-flags.ts +76 -0
  355. package/src/env/index.ts +40 -0
  356. package/src/event-v2-bridge.ts +76 -0
  357. package/src/format/formatter.ts +404 -0
  358. package/src/format/index.ts +212 -0
  359. package/src/git/index.ts +347 -0
  360. package/src/id/id.ts +80 -0
  361. package/src/ide/index.ts +70 -0
  362. package/src/image/image.ts +177 -0
  363. package/src/index.ts +208 -0
  364. package/src/installation/index.ts +349 -0
  365. package/src/lsp/client.ts +686 -0
  366. package/src/lsp/diagnostic.ts +29 -0
  367. package/src/lsp/language.ts +121 -0
  368. package/src/lsp/launch.ts +21 -0
  369. package/src/lsp/lsp.ts +517 -0
  370. package/src/lsp/server.ts +2064 -0
  371. package/src/markdown.d.ts +4 -0
  372. package/src/mcp/auth.ts +171 -0
  373. package/src/mcp/index.ts +982 -0
  374. package/src/mcp/oauth-callback.ts +232 -0
  375. package/src/mcp/oauth-provider.ts +217 -0
  376. package/src/node.ts +5 -0
  377. package/src/oryna/agent.ts +112 -0
  378. package/src/oryna/reply-service.ts +8 -0
  379. package/src/patch/index.ts +689 -0
  380. package/src/permission/arity.ts +163 -0
  381. package/src/permission/evaluate.ts +1 -0
  382. package/src/permission/index.ts +230 -0
  383. package/src/plugin/azure.ts +26 -0
  384. package/src/plugin/cloudflare.ts +76 -0
  385. package/src/plugin/digitalocean.ts +391 -0
  386. package/src/plugin/github-copilot/copilot.ts +417 -0
  387. package/src/plugin/github-copilot/models.ts +246 -0
  388. package/src/plugin/index.ts +323 -0
  389. package/src/plugin/install.ts +439 -0
  390. package/src/plugin/loader.ts +237 -0
  391. package/src/plugin/meta.ts +188 -0
  392. package/src/plugin/openai/README.md +31 -0
  393. package/src/plugin/openai/codex.ts +647 -0
  394. package/src/plugin/openai/ws-pool.ts +290 -0
  395. package/src/plugin/openai/ws.ts +381 -0
  396. package/src/plugin/oryna.ts +349 -0
  397. package/src/plugin/shared.ts +323 -0
  398. package/src/plugin/xai.ts +742 -0
  399. package/src/project/bootstrap-service.ts +9 -0
  400. package/src/project/bootstrap.ts +80 -0
  401. package/src/project/instance-context.ts +24 -0
  402. package/src/project/instance-layer.ts +11 -0
  403. package/src/project/instance-runtime.ts +16 -0
  404. package/src/project/instance-store.ts +207 -0
  405. package/src/project/project.ts +520 -0
  406. package/src/project/vcs.ts +435 -0
  407. package/src/provider/auth.ts +230 -0
  408. package/src/provider/error.ts +188 -0
  409. package/src/provider/model-status.ts +8 -0
  410. package/src/provider/provider.ts +2009 -0
  411. package/src/provider/transform.ts +1363 -0
  412. package/src/pty-preparation.ts +30 -0
  413. package/src/question/index.ts +229 -0
  414. package/src/question/schema.ts +10 -0
  415. package/src/reference/reference.ts +239 -0
  416. package/src/reference/repository-cache.ts +320 -0
  417. package/src/server/auth.ts +48 -0
  418. package/src/server/cors.ts +34 -0
  419. package/src/server/event.ts +13 -0
  420. package/src/server/global-lifecycle.ts +37 -0
  421. package/src/server/init-projectors.ts +3 -0
  422. package/src/server/mdns.ts +60 -0
  423. package/src/server/projectors.ts +1 -0
  424. package/src/server/proxy-util.ts +48 -0
  425. package/src/server/routes/instance/httpapi/AGENTS.md +39 -0
  426. package/src/server/routes/instance/httpapi/api.ts +78 -0
  427. package/src/server/routes/instance/httpapi/errors.ts +193 -0
  428. package/src/server/routes/instance/httpapi/groups/config.ts +65 -0
  429. package/src/server/routes/instance/httpapi/groups/control-plane.ts +35 -0
  430. package/src/server/routes/instance/httpapi/groups/control.ts +76 -0
  431. package/src/server/routes/instance/httpapi/groups/event.ts +29 -0
  432. package/src/server/routes/instance/httpapi/groups/experimental.ts +260 -0
  433. package/src/server/routes/instance/httpapi/groups/file.ts +172 -0
  434. package/src/server/routes/instance/httpapi/groups/global.ts +138 -0
  435. package/src/server/routes/instance/httpapi/groups/instance.ts +206 -0
  436. package/src/server/routes/instance/httpapi/groups/mcp.ts +156 -0
  437. package/src/server/routes/instance/httpapi/groups/metadata.ts +18 -0
  438. package/src/server/routes/instance/httpapi/groups/permission.ts +61 -0
  439. package/src/server/routes/instance/httpapi/groups/project-copy.ts +88 -0
  440. package/src/server/routes/instance/httpapi/groups/project.ts +93 -0
  441. package/src/server/routes/instance/httpapi/groups/provider.ts +101 -0
  442. package/src/server/routes/instance/httpapi/groups/pty.ts +172 -0
  443. package/src/server/routes/instance/httpapi/groups/query.ts +12 -0
  444. package/src/server/routes/instance/httpapi/groups/question.ts +74 -0
  445. package/src/server/routes/instance/httpapi/groups/session.ts +462 -0
  446. package/src/server/routes/instance/httpapi/groups/sync.ts +113 -0
  447. package/src/server/routes/instance/httpapi/groups/tui.ts +208 -0
  448. package/src/server/routes/instance/httpapi/groups/workspace.ts +141 -0
  449. package/src/server/routes/instance/httpapi/handlers/config.ts +151 -0
  450. package/src/server/routes/instance/httpapi/handlers/control-plane.ts +37 -0
  451. package/src/server/routes/instance/httpapi/handlers/control.ts +40 -0
  452. package/src/server/routes/instance/httpapi/handlers/event.ts +102 -0
  453. package/src/server/routes/instance/httpapi/handlers/experimental.ts +187 -0
  454. package/src/server/routes/instance/httpapi/handlers/file.ts +103 -0
  455. package/src/server/routes/instance/httpapi/handlers/global.ts +157 -0
  456. package/src/server/routes/instance/httpapi/handlers/instance.ts +110 -0
  457. package/src/server/routes/instance/httpapi/handlers/mcp.ts +111 -0
  458. package/src/server/routes/instance/httpapi/handlers/permission.ts +41 -0
  459. package/src/server/routes/instance/httpapi/handlers/project-copy.ts +157 -0
  460. package/src/server/routes/instance/httpapi/handlers/project.ts +63 -0
  461. package/src/server/routes/instance/httpapi/handlers/provider.ts +160 -0
  462. package/src/server/routes/instance/httpapi/handlers/pty.ts +258 -0
  463. package/src/server/routes/instance/httpapi/handlers/question.ts +54 -0
  464. package/src/server/routes/instance/httpapi/handlers/session-errors.ts +21 -0
  465. package/src/server/routes/instance/httpapi/handlers/session.ts +442 -0
  466. package/src/server/routes/instance/httpapi/handlers/sync.ts +95 -0
  467. package/src/server/routes/instance/httpapi/handlers/tui.ts +131 -0
  468. package/src/server/routes/instance/httpapi/handlers/workspace.ts +102 -0
  469. package/src/server/routes/instance/httpapi/lifecycle.ts +57 -0
  470. package/src/server/routes/instance/httpapi/middleware/authorization.ts +147 -0
  471. package/src/server/routes/instance/httpapi/middleware/compression.ts +64 -0
  472. package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +29 -0
  473. package/src/server/routes/instance/httpapi/middleware/error.ts +36 -0
  474. package/src/server/routes/instance/httpapi/middleware/fence.ts +25 -0
  475. package/src/server/routes/instance/httpapi/middleware/instance-context.ts +43 -0
  476. package/src/server/routes/instance/httpapi/middleware/proxy.ts +108 -0
  477. package/src/server/routes/instance/httpapi/middleware/schema-error.ts +42 -0
  478. package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +250 -0
  479. package/src/server/routes/instance/httpapi/public.ts +535 -0
  480. package/src/server/routes/instance/httpapi/server.ts +277 -0
  481. package/src/server/routes/instance/httpapi/websocket-tracker.ts +57 -0
  482. package/src/server/server.ts +218 -0
  483. package/src/server/shared/fence.ts +68 -0
  484. package/src/server/shared/pty-ticket.ts +15 -0
  485. package/src/server/shared/public-ui.ts +12 -0
  486. package/src/server/shared/tui-control.ts +28 -0
  487. package/src/server/shared/ui.ts +108 -0
  488. package/src/server/shared/workspace-routing.ts +38 -0
  489. package/src/session/compaction.ts +609 -0
  490. package/src/session/instruction.ts +237 -0
  491. package/src/session/llm/AGENTS.md +90 -0
  492. package/src/session/llm/ai-sdk.ts +288 -0
  493. package/src/session/llm/native-request.ts +196 -0
  494. package/src/session/llm/native-runtime.ts +195 -0
  495. package/src/session/llm/request.ts +215 -0
  496. package/src/session/llm.ts +402 -0
  497. package/src/session/message-error.ts +14 -0
  498. package/src/session/message-v2.ts +745 -0
  499. package/src/session/message.ts +148 -0
  500. package/src/session/overflow.ts +34 -0
  501. package/src/session/processor.ts +1063 -0
  502. package/src/session/prompt/anthropic.txt +105 -0
  503. package/src/session/prompt/beast.txt +147 -0
  504. package/src/session/prompt/build-switch.txt +5 -0
  505. package/src/session/prompt/codex.txt +79 -0
  506. package/src/session/prompt/copilot-gpt-5.txt +143 -0
  507. package/src/session/prompt/default.txt +95 -0
  508. package/src/session/prompt/gemini.txt +155 -0
  509. package/src/session/prompt/gpt.txt +107 -0
  510. package/src/session/prompt/kimi.txt +95 -0
  511. package/src/session/prompt/max-steps.txt +16 -0
  512. package/src/session/prompt/plan-mode.txt +70 -0
  513. package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
  514. package/src/session/prompt/plan.txt +26 -0
  515. package/src/session/prompt/reference.ts +72 -0
  516. package/src/session/prompt/trinity.txt +97 -0
  517. package/src/session/prompt.ts +1755 -0
  518. package/src/session/reminders.ts +92 -0
  519. package/src/session/retry.ts +201 -0
  520. package/src/session/revert.ts +153 -0
  521. package/src/session/run-state.ts +153 -0
  522. package/src/session/schema.ts +26 -0
  523. package/src/session/session.ts +1116 -0
  524. package/src/session/status.ts +94 -0
  525. package/src/session/summary.ts +162 -0
  526. package/src/session/system.ts +84 -0
  527. package/src/session/todo.ts +87 -0
  528. package/src/session/tools.ts +211 -0
  529. package/src/share/session.ts +58 -0
  530. package/src/share/share-next.ts +379 -0
  531. package/src/shell/shell.ts +215 -0
  532. package/src/skill/discovery.ts +115 -0
  533. package/src/skill/index.ts +357 -0
  534. package/src/snapshot/index.ts +759 -0
  535. package/src/sql.d.ts +4 -0
  536. package/src/storage/schema.ts +5 -0
  537. package/src/storage/storage.ts +329 -0
  538. package/src/sync/README.md +179 -0
  539. package/src/sync/schema.ts +11 -0
  540. package/src/temporary.ts +33 -0
  541. package/src/tool/apply_patch.ts +313 -0
  542. package/src/tool/apply_patch.txt +33 -0
  543. package/src/tool/edit.ts +737 -0
  544. package/src/tool/edit.txt +10 -0
  545. package/src/tool/external-directory.ts +49 -0
  546. package/src/tool/glob.ts +84 -0
  547. package/src/tool/glob.txt +6 -0
  548. package/src/tool/grep.ts +140 -0
  549. package/src/tool/grep.txt +8 -0
  550. package/src/tool/invalid.ts +21 -0
  551. package/src/tool/json-schema.ts +164 -0
  552. package/src/tool/lsp.ts +113 -0
  553. package/src/tool/lsp.txt +24 -0
  554. package/src/tool/mcp-websearch.ts +96 -0
  555. package/src/tool/plan-enter.txt +14 -0
  556. package/src/tool/plan-exit.txt +13 -0
  557. package/src/tool/plan.ts +79 -0
  558. package/src/tool/question.ts +44 -0
  559. package/src/tool/question.txt +10 -0
  560. package/src/tool/read.ts +392 -0
  561. package/src/tool/read.txt +14 -0
  562. package/src/tool/registry.ts +475 -0
  563. package/src/tool/reply.ts +29 -0
  564. package/src/tool/schema.ts +14 -0
  565. package/src/tool/shell/id.ts +19 -0
  566. package/src/tool/shell/prompt.ts +307 -0
  567. package/src/tool/shell/shell.txt +21 -0
  568. package/src/tool/shell.ts +660 -0
  569. package/src/tool/skill.ts +72 -0
  570. package/src/tool/skill.txt +5 -0
  571. package/src/tool/task.ts +338 -0
  572. package/src/tool/task.txt +19 -0
  573. package/src/tool/todo.ts +57 -0
  574. package/src/tool/todowrite.txt +44 -0
  575. package/src/tool/tool.ts +183 -0
  576. package/src/tool/truncate.ts +160 -0
  577. package/src/tool/truncation-dir.ts +4 -0
  578. package/src/tool/webfetch.ts +192 -0
  579. package/src/tool/webfetch.txt +13 -0
  580. package/src/tool/websearch.ts +143 -0
  581. package/src/tool/websearch.txt +14 -0
  582. package/src/tool/write.ts +104 -0
  583. package/src/tool/write.txt +8 -0
  584. package/src/util/archive.ts +17 -0
  585. package/src/util/bom.ts +27 -0
  586. package/src/util/data-url.ts +9 -0
  587. package/src/util/defer.ts +10 -0
  588. package/src/util/effect-http-client.ts +11 -0
  589. package/src/util/error.ts +88 -0
  590. package/src/util/filesystem.ts +251 -0
  591. package/src/util/format.ts +20 -0
  592. package/src/util/iife.ts +3 -0
  593. package/src/util/lan-scan.ts +90 -0
  594. package/src/util/lazy.ts +20 -0
  595. package/src/util/local-context.ts +25 -0
  596. package/src/util/locale.ts +86 -0
  597. package/src/util/media.ts +26 -0
  598. package/src/util/process.ts +176 -0
  599. package/src/util/proxy-env.ts +72 -0
  600. package/src/util/queue.ts +32 -0
  601. package/src/util/record.ts +3 -0
  602. package/src/util/repository.ts +232 -0
  603. package/src/util/rpc.ts +66 -0
  604. package/src/util/signal.ts +12 -0
  605. package/src/util/timeout.ts +13 -0
  606. package/src/util/token.ts +1 -0
  607. package/src/util/wildcard.ts +59 -0
  608. package/src/worktree/index.ts +645 -0
  609. package/sst-env.d.ts +10 -0
  610. package/test/AGENTS.md +204 -0
  611. package/test/EFFECT_TEST_MIGRATION.md +169 -0
  612. package/test/account/repo.test.ts +353 -0
  613. package/test/account/service.test.ts +453 -0
  614. package/test/acp/config-option.test.ts +229 -0
  615. package/test/acp/content.test.ts +201 -0
  616. package/test/acp/directory.test.ts +186 -0
  617. package/test/acp/error.test.ts +67 -0
  618. package/test/acp/event.test.ts +711 -0
  619. package/test/acp/permission.test.ts +273 -0
  620. package/test/acp/service-session.test.ts +1174 -0
  621. package/test/acp/session.test.ts +200 -0
  622. package/test/acp/tool.test.ts +210 -0
  623. package/test/acp/usage.test.ts +315 -0
  624. package/test/agent/agent.test.ts +710 -0
  625. package/test/agent/plan-mode-subagent-bypass.test.ts +213 -0
  626. package/test/agent/plugin-agent-regression.test.ts +62 -0
  627. package/test/auth/auth.test.ts +77 -0
  628. package/test/background/job.test.ts +243 -0
  629. package/test/cli/account.test.ts +30 -0
  630. package/test/cli/acp/acp-test-client.ts +97 -0
  631. package/test/cli/acp/config-options.test.ts +103 -0
  632. package/test/cli/acp/helpers.ts +96 -0
  633. package/test/cli/acp/initialize-auth.test.ts +61 -0
  634. package/test/cli/acp/lifecycle.test.ts +118 -0
  635. package/test/cli/acp/prompt-content.test.ts +97 -0
  636. package/test/cli/acp/skills.test.ts +38 -0
  637. package/test/cli/cmd/tui/aggregate-failures.test.ts +93 -0
  638. package/test/cli/cmd/tui/attention.test.ts +484 -0
  639. package/test/cli/cmd/tui/dialog-workspace-create.test.ts +28 -0
  640. package/test/cli/cmd/tui/model-options.test.ts +30 -0
  641. package/test/cli/cmd/tui/notifications.test.ts +267 -0
  642. package/test/cli/cmd/tui/prompt-history.test.ts +44 -0
  643. package/test/cli/cmd/tui/prompt-part.test.ts +77 -0
  644. package/test/cli/cmd/tui/prompt-traits.test.ts +29 -0
  645. package/test/cli/cmd/tui/provider-options.test.ts +29 -0
  646. package/test/cli/cmd/tui/sync-fixture.tsx +64 -0
  647. package/test/cli/cmd/tui/sync-live-hydration.test.tsx +278 -0
  648. package/test/cli/cmd/tui/sync-undefined-messages.test.tsx +47 -0
  649. package/test/cli/cmd/tui/sync.test.tsx +70 -0
  650. package/test/cli/effect-cmd-instance-als.test.ts +39 -0
  651. package/test/cli/error.test.ts +95 -0
  652. package/test/cli/github-action.test.ts +199 -0
  653. package/test/cli/github-remote.test.ts +90 -0
  654. package/test/cli/help/__snapshots__/help-snapshots.test.ts.snap +631 -0
  655. package/test/cli/help/help-snapshots.test.ts +137 -0
  656. package/test/cli/import.test.ts +54 -0
  657. package/test/cli/mcp-add.test.ts +74 -0
  658. package/test/cli/plugin-auth-picker.test.ts +120 -0
  659. package/test/cli/run/entry.body.test.ts +536 -0
  660. package/test/cli/run/footer.menu.test.ts +43 -0
  661. package/test/cli/run/footer.view.test.tsx +927 -0
  662. package/test/cli/run/permission.shared.test.ts +144 -0
  663. package/test/cli/run/prompt.shared.test.ts +133 -0
  664. package/test/cli/run/question.shared.test.ts +115 -0
  665. package/test/cli/run/run-process.test.ts +84 -0
  666. package/test/cli/run/runtime.boot.test.ts +282 -0
  667. package/test/cli/run/runtime.queue.test.ts +465 -0
  668. package/test/cli/run/runtime.stdin.test.ts +71 -0
  669. package/test/cli/run/scrollback.surface.test.ts +1048 -0
  670. package/test/cli/run/session-data.test.ts +595 -0
  671. package/test/cli/run/session-replay.test.ts +456 -0
  672. package/test/cli/run/session.shared.test.ts +247 -0
  673. package/test/cli/run/stream.test.ts +56 -0
  674. package/test/cli/run/stream.transport.test.ts +2363 -0
  675. package/test/cli/run/subagent-data.test.ts +456 -0
  676. package/test/cli/run/theme.test.ts +152 -0
  677. package/test/cli/run/variant.shared.test.ts +217 -0
  678. package/test/cli/serve/serve-process.test.ts +61 -0
  679. package/test/cli/smokes/read-only.test.ts +115 -0
  680. package/test/cli/tui/__snapshots__/inline-tool-wrap-snapshot.test.tsx.snap +72 -0
  681. package/test/cli/tui/app-lifecycle.test.ts +261 -0
  682. package/test/cli/tui/dialog-prompt.test.tsx +146 -0
  683. package/test/cli/tui/diff-viewer-file-tree-utils.test.ts +323 -0
  684. package/test/cli/tui/diff-viewer-file-tree.test.tsx +197 -0
  685. package/test/cli/tui/diff-viewer.test.tsx +230 -0
  686. package/test/cli/tui/editor-context-zed.test.ts +384 -0
  687. package/test/cli/tui/editor-context.test.tsx +288 -0
  688. package/test/cli/tui/inline-tool-wrap-snapshot.test.tsx +232 -0
  689. package/test/cli/tui/keymap.test.tsx +136 -0
  690. package/test/cli/tui/plugin-add.test.ts +110 -0
  691. package/test/cli/tui/plugin-install.test.ts +87 -0
  692. package/test/cli/tui/plugin-lifecycle.test.ts +224 -0
  693. package/test/cli/tui/plugin-loader-entrypoint.test.ts +485 -0
  694. package/test/cli/tui/plugin-loader-pure.test.ts +72 -0
  695. package/test/cli/tui/plugin-loader.test.ts +1332 -0
  696. package/test/cli/tui/plugin-toggle.test.ts +264 -0
  697. package/test/cli/tui/prompt-submit-race.test.ts +98 -0
  698. package/test/cli/tui/revert-diff.test.ts +35 -0
  699. package/test/cli/tui/slot-replace.test.tsx +50 -0
  700. package/test/cli/tui/sync-v2.test.tsx +558 -0
  701. package/test/cli/tui/theme-store.test.ts +76 -0
  702. package/test/cli/tui/thinking.test.ts +36 -0
  703. package/test/cli/tui/thread.test.ts +28 -0
  704. package/test/cli/tui/transcript.test.ts +426 -0
  705. package/test/cli/tui/use-event.test.tsx +145 -0
  706. package/test/config/agent-color.test.ts +47 -0
  707. package/test/config/config.test.ts +1991 -0
  708. package/test/config/entry-name.test.ts +57 -0
  709. package/test/config/fixtures/empty-frontmatter.md +4 -0
  710. package/test/config/fixtures/frontmatter.md +28 -0
  711. package/test/config/fixtures/markdown-header.md +11 -0
  712. package/test/config/fixtures/no-frontmatter.md +1 -0
  713. package/test/config/fixtures/weird-model-id.md +13 -0
  714. package/test/config/lsp.test.ts +69 -0
  715. package/test/config/markdown.test.ts +228 -0
  716. package/test/config/plugin.test.ts +0 -0
  717. package/test/config/tui.test.ts +878 -0
  718. package/test/control-plane/adapters.test.ts +71 -0
  719. package/test/control-plane/workspace.test.ts +1704 -0
  720. package/test/effect/app-runtime-logger.test.ts +105 -0
  721. package/test/effect/config-service.test.ts +65 -0
  722. package/test/effect/instance-state.test.ts +391 -0
  723. package/test/effect/run-service.test.ts +89 -0
  724. package/test/effect/runner.test.ts +514 -0
  725. package/test/effect/runtime-flags.test.ts +373 -0
  726. package/test/fake/account.ts +9 -0
  727. package/test/fake/auth.ts +8 -0
  728. package/test/fake/npm.ts +8 -0
  729. package/test/fake/provider.ts +82 -0
  730. package/test/fake/skill.ts +8 -0
  731. package/test/filesystem/filesystem.test.ts +319 -0
  732. package/test/fixture/agent-plugin.constants.ts +6 -0
  733. package/test/fixture/agent-plugin.ts +12 -0
  734. package/test/fixture/config.ts +23 -0
  735. package/test/fixture/db.ts +11 -0
  736. package/test/fixture/fixture.test.ts +26 -0
  737. package/test/fixture/fixture.ts +224 -0
  738. package/test/fixture/flag.ts +20 -0
  739. package/test/fixture/flock-worker.ts +72 -0
  740. package/test/fixture/lsp/fake-lsp-server.js +249 -0
  741. package/test/fixture/plug-worker.ts +93 -0
  742. package/test/fixture/plugin-meta-worker.ts +19 -0
  743. package/test/fixture/plugin.ts +10 -0
  744. package/test/fixture/skills/agents-sdk/SKILL.md +152 -0
  745. package/test/fixture/skills/agents-sdk/references/callable.md +92 -0
  746. package/test/fixture/skills/cloudflare/SKILL.md +211 -0
  747. package/test/fixture/skills/index.json +6 -0
  748. package/test/fixture/tui-plugin.ts +355 -0
  749. package/test/fixture/tui-runtime.ts +64 -0
  750. package/test/fixture/tui-sdk.ts +82 -0
  751. package/test/fixture/workspace.ts +30 -0
  752. package/test/fixtures/recordings/session/native-anthropic-tool-loop.json +49 -0
  753. package/test/fixtures/recordings/session/native-openai-oauth-tool-loop.json +45 -0
  754. package/test/fixtures/recordings/session/native-zen-tool-loop.json +49 -0
  755. package/test/format/format.test.ts +228 -0
  756. package/test/git/git.test.ts +178 -0
  757. package/test/ide/ide.test.ts +82 -0
  758. package/test/image/fixtures/picture-5mb-base64.png +0 -0
  759. package/test/image/image.test.ts +123 -0
  760. package/test/installation/installation.test.ts +230 -0
  761. package/test/lib/cli-process.ts +459 -0
  762. package/test/lib/effect.ts +177 -0
  763. package/test/lib/filesystem.ts +10 -0
  764. package/test/lib/llm-server.ts +771 -0
  765. package/test/lib/snapshot.ts +73 -0
  766. package/test/lib/test-provider.ts +37 -0
  767. package/test/lib/websocket.ts +46 -0
  768. package/test/lsp/client.test.ts +493 -0
  769. package/test/lsp/index.test.ts +232 -0
  770. package/test/lsp/launch.test.ts +22 -0
  771. package/test/lsp/lifecycle.test.ts +160 -0
  772. package/test/mcp/auth.test.ts +78 -0
  773. package/test/mcp/headers.test.ts +126 -0
  774. package/test/mcp/lifecycle.test.ts +888 -0
  775. package/test/mcp/oauth-auto-connect.test.ts +236 -0
  776. package/test/mcp/oauth-browser.test.ts +228 -0
  777. package/test/mcp/oauth-callback.test.ts +34 -0
  778. package/test/mcp/oauth-provider.test.ts +61 -0
  779. package/test/patch/patch.test.ts +383 -0
  780. package/test/permission/arity.test.ts +33 -0
  781. package/test/permission/next.test.ts +1176 -0
  782. package/test/permission-task.test.ts +318 -0
  783. package/test/plugin/auth-override.test.ts +105 -0
  784. package/test/plugin/cloudflare.test.ts +68 -0
  785. package/test/plugin/codex.test.ts +247 -0
  786. package/test/plugin/github-copilot-models.test.ts +332 -0
  787. package/test/plugin/install-concurrency.test.ts +140 -0
  788. package/test/plugin/install.test.ts +570 -0
  789. package/test/plugin/loader-shared.test.ts +1303 -0
  790. package/test/plugin/meta.test.ts +137 -0
  791. package/test/plugin/openai-rollout.test.ts +17 -0
  792. package/test/plugin/openai-ws.test.ts +877 -0
  793. package/test/plugin/shared.test.ts +88 -0
  794. package/test/plugin/trigger.test.ts +120 -0
  795. package/test/plugin/workspace-adapter.test.ts +137 -0
  796. package/test/plugin/xai.test.ts +634 -0
  797. package/test/preload.ts +95 -0
  798. package/test/project/instance-bootstrap.test.ts +110 -0
  799. package/test/project/instance.test.ts +245 -0
  800. package/test/project/migrate-global.test.ts +170 -0
  801. package/test/project/project-directory.test.ts +169 -0
  802. package/test/project/project.test.ts +818 -0
  803. package/test/project/vcs.test.ts +336 -0
  804. package/test/project/worktree-remove.test.ts +126 -0
  805. package/test/project/worktree.test.ts +320 -0
  806. package/test/provider/amazon-bedrock.test.ts +360 -0
  807. package/test/provider/cf-ai-gateway-e2e.test.ts +132 -0
  808. package/test/provider/digitalocean.test.ts +123 -0
  809. package/test/provider/gitlab-duo.test.ts +412 -0
  810. package/test/provider/header-timeout.test.ts +233 -0
  811. package/test/provider/model-status.test.ts +61 -0
  812. package/test/provider/provider.test.ts +1793 -0
  813. package/test/provider/transform.test.ts +3937 -0
  814. package/test/pty/pty-shell.test.ts +102 -0
  815. package/test/question/question.test.ts +465 -0
  816. package/test/reference/reference.test.ts +310 -0
  817. package/test/server/AGENTS.md +15 -0
  818. package/test/server/auth.test.ts +59 -0
  819. package/test/server/global-bus.ts +31 -0
  820. package/test/server/global-session-list.test.ts +107 -0
  821. package/test/server/httpapi-authorization.test.ts +174 -0
  822. package/test/server/httpapi-compression.test.ts +154 -0
  823. package/test/server/httpapi-config.test.ts +113 -0
  824. package/test/server/httpapi-control-plane.test.ts +63 -0
  825. package/test/server/httpapi-cors-vary.test.ts +66 -0
  826. package/test/server/httpapi-cors.test.ts +122 -0
  827. package/test/server/httpapi-error-middleware.test.ts +96 -0
  828. package/test/server/httpapi-event.test.ts +97 -0
  829. package/test/server/httpapi-exercise/assertions.ts +64 -0
  830. package/test/server/httpapi-exercise/backend.ts +144 -0
  831. package/test/server/httpapi-exercise/dsl.ts +210 -0
  832. package/test/server/httpapi-exercise/environment.ts +40 -0
  833. package/test/server/httpapi-exercise/index.ts +1535 -0
  834. package/test/server/httpapi-exercise/report.ts +66 -0
  835. package/test/server/httpapi-exercise/routing.ts +96 -0
  836. package/test/server/httpapi-exercise/runner.ts +267 -0
  837. package/test/server/httpapi-exercise/runtime.ts +52 -0
  838. package/test/server/httpapi-exercise/types.ts +123 -0
  839. package/test/server/httpapi-experimental.test.ts +300 -0
  840. package/test/server/httpapi-file.test.ts +76 -0
  841. package/test/server/httpapi-global.test.ts +66 -0
  842. package/test/server/httpapi-instance-context.test.ts +347 -0
  843. package/test/server/httpapi-instance-route-auth.test.ts +84 -0
  844. package/test/server/httpapi-instance.test.ts +265 -0
  845. package/test/server/httpapi-layer.ts +33 -0
  846. package/test/server/httpapi-listen.test.ts +415 -0
  847. package/test/server/httpapi-mcp-oauth.test.ts +73 -0
  848. package/test/server/httpapi-mcp.test.ts +226 -0
  849. package/test/server/httpapi-mdns.test.ts +82 -0
  850. package/test/server/httpapi-promptasync-context.test.ts +222 -0
  851. package/test/server/httpapi-provider.test.ts +403 -0
  852. package/test/server/httpapi-pty.test.ts +275 -0
  853. package/test/server/httpapi-public-openapi.test.ts +297 -0
  854. package/test/server/httpapi-query-schema-drift.test.ts +330 -0
  855. package/test/server/httpapi-schema-error-body.test.ts +165 -0
  856. package/test/server/httpapi-sdk.test.ts +909 -0
  857. package/test/server/httpapi-session.test.ts +1013 -0
  858. package/test/server/httpapi-sync.test.ts +154 -0
  859. package/test/server/httpapi-ui.test.ts +456 -0
  860. package/test/server/httpapi-v2-location.test.ts +85 -0
  861. package/test/server/httpapi-workspace-routing.test.ts +554 -0
  862. package/test/server/httpapi-workspace.test.ts +515 -0
  863. package/test/server/negative-tokens-regression.test.ts +83 -0
  864. package/test/server/project-copy.test.ts +101 -0
  865. package/test/server/project-init-git.test.ts +117 -0
  866. package/test/server/proxy-util.test.ts +113 -0
  867. package/test/server/sdk-error-shape.test.ts +84 -0
  868. package/test/server/sdk-v1-smoke.test.ts +60 -0
  869. package/test/server/session-actions.test.ts +112 -0
  870. package/test/server/session-diff-missing-patch.test.ts +99 -0
  871. package/test/server/session-list.test.ts +314 -0
  872. package/test/server/session-messages.test.ts +182 -0
  873. package/test/server/session-select.test.ts +69 -0
  874. package/test/server/workspace-proxy.test.ts +181 -0
  875. package/test/server/workspace-routing.test.ts +94 -0
  876. package/test/server/worktree-endpoint-repro.test.ts +307 -0
  877. package/test/session/compaction.test.ts +1835 -0
  878. package/test/session/instruction.test.ts +256 -0
  879. package/test/session/llm-native-recorded.test.ts +433 -0
  880. package/test/session/llm-native.test.ts +760 -0
  881. package/test/session/llm.test.ts +1932 -0
  882. package/test/session/message-v2.test.ts +1661 -0
  883. package/test/session/messages-pagination.test.ts +1059 -0
  884. package/test/session/processor-effect.test.ts +1101 -0
  885. package/test/session/prompt.test.ts +2318 -0
  886. package/test/session/retry.test.ts +439 -0
  887. package/test/session/revert-compact.test.ts +642 -0
  888. package/test/session/schema-decoding.test.ts +313 -0
  889. package/test/session/session-schema.test.ts +78 -0
  890. package/test/session/session.test.ts +251 -0
  891. package/test/session/snapshot-tool-race.test.ts +280 -0
  892. package/test/session/structured-output-integration.test.ts +235 -0
  893. package/test/session/structured-output.test.ts +387 -0
  894. package/test/session/system.test.ts +84 -0
  895. package/test/share/share-next.test.ts +344 -0
  896. package/test/shell/shell.test.ts +99 -0
  897. package/test/skill/discovery.test.ts +139 -0
  898. package/test/skill/skill.test.ts +571 -0
  899. package/test/snapshot/snapshot.test.ts +1121 -0
  900. package/test/storage/storage.test.ts +296 -0
  901. package/test/storage/workspace-time-migration.test.ts +50 -0
  902. package/test/tool/__snapshots__/parameters.test.ts.snap +484 -0
  903. package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
  904. package/test/tool/apply_patch.test.ts +533 -0
  905. package/test/tool/edit.test.ts +578 -0
  906. package/test/tool/external-directory.test.ts +155 -0
  907. package/test/tool/fixtures/large-image.png +0 -0
  908. package/test/tool/fixtures/models-api.json +117299 -0
  909. package/test/tool/glob.test.ts +188 -0
  910. package/test/tool/grep.test.ts +266 -0
  911. package/test/tool/lsp.test.ts +181 -0
  912. package/test/tool/parameters.test.ts +293 -0
  913. package/test/tool/question.test.ts +138 -0
  914. package/test/tool/read.test.ts +654 -0
  915. package/test/tool/registry.test.ts +539 -0
  916. package/test/tool/shell.test.ts +1238 -0
  917. package/test/tool/skill.test.ts +132 -0
  918. package/test/tool/task.test.ts +901 -0
  919. package/test/tool/tool-define.test.ts +153 -0
  920. package/test/tool/truncation.test.ts +266 -0
  921. package/test/tool/webfetch.test.ts +113 -0
  922. package/test/tool/websearch.test.ts +99 -0
  923. package/test/tool/write.test.ts +276 -0
  924. package/test/util/data-url.test.ts +14 -0
  925. package/test/util/error.test.ts +64 -0
  926. package/test/util/filesystem.test.ts +656 -0
  927. package/test/util/format.test.ts +59 -0
  928. package/test/util/glob.test.ts +164 -0
  929. package/test/util/iife.test.ts +36 -0
  930. package/test/util/lazy.test.ts +50 -0
  931. package/test/util/log.test.ts +77 -0
  932. package/test/util/module.test.ts +59 -0
  933. package/test/util/process.test.ts +128 -0
  934. package/test/util/repository.test.ts +93 -0
  935. package/test/util/timeout.test.ts +21 -0
  936. package/test/util/wildcard.test.ts +90 -0
  937. package/test/v2/session-message-updater.test.ts +270 -0
  938. package/tsconfig.json +17 -0
@@ -0,0 +1,67 @@
1
+ import { createMemo, type Setter } from "solid-js"
2
+ import { useKV } from "./kv"
3
+
4
+ export type ThinkingMode = "show" | "hide"
5
+
6
+ const MODES: readonly ThinkingMode[] = ["show", "hide"] as const
7
+
8
+ // OpenAI's Responses API surfaces reasoning summaries that start with a bolded
9
+ // title block: "**Inspecting PR workflow**\n\n<body>". Treat that first block,
10
+ // or a complete title still awaiting its body while streaming, as disclosure
11
+ // metadata so the TUI can style its header independently from the markdown body.
12
+ export function reasoningSummary(text: string) {
13
+ const content = text.trim()
14
+ const match = content.match(/^\*\*([^*\n]+)\*\*(?:\r?\n\r?\n|$)/)
15
+ if (!match) return { title: null, body: content }
16
+ return { title: match[1].trim(), body: content.slice(match[0].length).trimEnd() }
17
+ }
18
+
19
+ export function isThinkingMode(value: unknown): value is ThinkingMode {
20
+ return typeof value === "string" && (MODES as readonly string[]).includes(value)
21
+ }
22
+
23
+ // Cycle order matches the slash command: show → hide → show.
24
+ export function nextThinkingMode(current: ThinkingMode): ThinkingMode {
25
+ const idx = MODES.indexOf(current)
26
+ return MODES[(idx + 1) % MODES.length] ?? "show"
27
+ }
28
+
29
+ export function useThinkingMode() {
30
+ const kv = useKV()
31
+ // Capture pre-state before `kv.signal` seeds a default, so we can detect
32
+ // first-time users with a legacy `thinking_visibility` boolean and migrate.
33
+ // The KVProvider only renders children once kv.ready, so reads here are safe.
34
+ const hadStored = kv.get("thinking_mode") !== undefined
35
+ const legacy = kv.get("thinking_visibility")
36
+ const [stored, setStored] = kv.signal<ThinkingMode>("thinking_mode", "hide")
37
+
38
+ // The kv signal exposes its setter typed as `Setter<T>` which carries Solid's
39
+ // overload set; passing an updater fn through a property access loses the
40
+ // bivariance trick the existing `setX((prev) => ...)` callsites rely on.
41
+ // Wrap it in a sane shape so consumers can just call `set(next)` or pass
42
+ // an updater.
43
+ const set = (next: ThinkingMode | ((prev: ThinkingMode) => ThinkingMode)) => {
44
+ if (typeof next === "function") setStored(next as Setter<ThinkingMode>)
45
+ else setStored(() => next)
46
+ }
47
+
48
+ // Preserve previous experience for users who had explicitly toggled the
49
+ // legacy `thinking_visibility` boolean. First-time users (no legacy key)
50
+ // get the new "hide" default (collapsed thinking).
51
+ if (!hadStored) {
52
+ if (legacy === true) set("show")
53
+ else if (legacy === false) set("hide")
54
+ }
55
+
56
+ if ((stored() as string) === "minimal") set("hide")
57
+
58
+ const mode = createMemo<ThinkingMode>(() => {
59
+ const value = stored()
60
+ return isThinkingMode(value) ? value : "hide"
61
+ })
62
+
63
+ return {
64
+ mode,
65
+ set,
66
+ }
67
+ }
@@ -0,0 +1,9 @@
1
+ import { TuiConfig } from "@/cli/cmd/tui/config/tui"
2
+ import { createSimpleContext } from "./helper"
3
+
4
+ export const { use: useTuiConfig, provider: TuiConfigProvider } = createSimpleContext({
5
+ name: "TuiConfig",
6
+ init: (props: { config: TuiConfig.Resolved }) => {
7
+ return props.config
8
+ },
9
+ })
@@ -0,0 +1,53 @@
1
+ import { SessionID } from "@/session/schema"
2
+ import { PositiveInt } from "@opencode-ai/core/schema"
3
+ import { EventV2 } from "@opencode-ai/core/event"
4
+ import { Effect, Schema } from "effect"
5
+
6
+ const DEFAULT_TOAST_DURATION = 5000
7
+
8
+ export const TuiEvent = {
9
+ PromptAppend: EventV2.define({ type: "tui.prompt.append", schema: { text: Schema.String } }),
10
+ CommandExecute: EventV2.define({
11
+ type: "tui.command.execute",
12
+ schema: {
13
+ command: Schema.Union([
14
+ Schema.Literals([
15
+ "session.list",
16
+ "session.new",
17
+ "session.share",
18
+ "session.interrupt",
19
+ "session.compact",
20
+ "session.page.up",
21
+ "session.page.down",
22
+ "session.line.up",
23
+ "session.line.down",
24
+ "session.half.page.up",
25
+ "session.half.page.down",
26
+ "session.first",
27
+ "session.last",
28
+ "prompt.clear",
29
+ "prompt.submit",
30
+ "agent.cycle",
31
+ ]),
32
+ Schema.String,
33
+ ]),
34
+ },
35
+ }),
36
+ ToastShow: EventV2.define({
37
+ type: "tui.toast.show",
38
+ schema: {
39
+ title: Schema.optional(Schema.String),
40
+ message: Schema.String,
41
+ variant: Schema.Literals(["info", "success", "warning", "error"]),
42
+ duration: PositiveInt.pipe(Schema.withDecodingDefault(Effect.succeed(DEFAULT_TOAST_DURATION))).annotate({
43
+ description: "Duration in milliseconds",
44
+ }),
45
+ },
46
+ }),
47
+ SessionSelect: EventV2.define({
48
+ type: "tui.session.select",
49
+ schema: {
50
+ sessionID: SessionID.annotate({ description: "Session ID to navigate to" }),
51
+ },
52
+ }),
53
+ }
@@ -0,0 +1,98 @@
1
+ import type { TuiPlugin, TuiPluginApi } from "@opencode-ai/plugin/tui"
2
+ import type { InternalTuiPlugin } from "../../plugin/internal"
3
+ import { createMemo, Match, Show, Switch } from "solid-js"
4
+ import { Global } from "@opencode-ai/core/global"
5
+ import { useHomeSessionDestination } from "../../routes/home/session-destination"
6
+
7
+ const id = "internal:home-footer"
8
+
9
+ function Directory(props: { api: TuiPluginApi }) {
10
+ const theme = () => props.api.theme.current
11
+ const destination = useHomeSessionDestination()
12
+ const dir = createMemo(() => {
13
+ const selected = destination?.destination()
14
+ if (!selected || selected.type === "new") return
15
+ const out = selected.directory.replace(Global.Path.home, "~")
16
+ const branch =
17
+ selected.directory === (props.api.state.path.directory || process.cwd()) ? props.api.state.vcs?.branch : undefined
18
+ if (branch) return out + ":" + branch
19
+ return out
20
+ })
21
+
22
+ return <Show when={dir()}>{(value) => <text fg={theme().textMuted}>{value()}</text>}</Show>
23
+ }
24
+
25
+ function Mcp(props: { api: TuiPluginApi }) {
26
+ const theme = () => props.api.theme.current
27
+ const list = createMemo(() => props.api.state.mcp())
28
+ const has = createMemo(() => list().length > 0)
29
+ const err = createMemo(() => list().some((item) => item.status === "failed"))
30
+ const count = createMemo(() => list().filter((item) => item.status === "connected").length)
31
+
32
+ return (
33
+ <Show when={has()}>
34
+ <box gap={1} flexDirection="row" flexShrink={0}>
35
+ <text fg={theme().text}>
36
+ <Switch>
37
+ <Match when={err()}>
38
+ <span style={{ fg: theme().error }}>⊙ </span>
39
+ </Match>
40
+ <Match when={true}>
41
+ <span style={{ fg: count() > 0 ? theme().success : theme().textMuted }}>⊙ </span>
42
+ </Match>
43
+ </Switch>
44
+ {count()} MCP
45
+ </text>
46
+ <text fg={theme().textMuted}>/status</text>
47
+ </box>
48
+ </Show>
49
+ )
50
+ }
51
+
52
+ function Version(props: { api: TuiPluginApi }) {
53
+ const theme = () => props.api.theme.current
54
+
55
+ return (
56
+ <box flexShrink={0}>
57
+ <text fg={theme().textMuted}>{props.api.app.version}</text>
58
+ </box>
59
+ )
60
+ }
61
+
62
+ function View(props: { api: TuiPluginApi }) {
63
+ return (
64
+ <box
65
+ width="100%"
66
+ paddingTop={1}
67
+ paddingBottom={1}
68
+ paddingLeft={2}
69
+ paddingRight={2}
70
+ flexDirection="row"
71
+ flexShrink={0}
72
+ gap={2}
73
+ >
74
+ <Directory api={props.api} />
75
+ <Mcp api={props.api} />
76
+ <box flexGrow={1} />
77
+ <Version api={props.api} />
78
+ </box>
79
+ )
80
+ }
81
+
82
+ const tui: TuiPlugin = async (api) => {
83
+ api.slots.register({
84
+ order: 100,
85
+ slots: {
86
+ home_footer() {
87
+ return <View api={api} />
88
+ },
89
+ },
90
+ })
91
+ }
92
+
93
+ const plugin: InternalTuiPlugin = {
94
+ id,
95
+ tui,
96
+ }
97
+
98
+ export default plugin
@@ -0,0 +1,288 @@
1
+ import type { TuiPluginApi } from "@opencode-ai/plugin/tui"
2
+ import { createMemo, For, type Accessor } from "solid-js"
3
+ import { DEFAULT_THEMES, useTheme } from "@tui/context/theme"
4
+ import { useCommandShortcut } from "../../keymap"
5
+
6
+ const themeCount = Object.keys(DEFAULT_THEMES).length
7
+
8
+ type TipPart = { text: string; highlight: boolean }
9
+ type TipShortcut = Accessor<string>
10
+ type Shortcuts = {
11
+ agentCycle: TipShortcut
12
+ childFirst: TipShortcut
13
+ childNext: TipShortcut
14
+ childPrevious: TipShortcut
15
+ commandList: TipShortcut
16
+ editorOpen: TipShortcut
17
+ helpShow: TipShortcut
18
+ inputClear: TipShortcut
19
+ inputNewline: TipShortcut
20
+ inputPaste: TipShortcut
21
+ inputUndo: TipShortcut
22
+ leader: TipShortcut
23
+ messagesCopy: TipShortcut
24
+ messagesFirst: TipShortcut
25
+ messagesLast: TipShortcut
26
+ messagesPageDown: TipShortcut
27
+ messagesPageUp: TipShortcut
28
+ messagesToggleConceal: TipShortcut
29
+ modelCycleRecent: TipShortcut
30
+ modelList: TipShortcut
31
+ sessionExport: TipShortcut
32
+ sessionInterrupt: TipShortcut
33
+ sessionList: TipShortcut
34
+ sessionNew: TipShortcut
35
+ sessionParent: TipShortcut
36
+ sessionPinToggle: TipShortcut
37
+ sessionQuickSwitch1: TipShortcut
38
+ sessionQuickSwitch9: TipShortcut
39
+ sessionSidebarToggle: TipShortcut
40
+ sessionTimeline: TipShortcut
41
+ statusView: TipShortcut
42
+ terminalSuspend: TipShortcut
43
+ themeList: TipShortcut
44
+ }
45
+ type Tip = string | ((shortcuts: Shortcuts) => string | undefined)
46
+
47
+ function parse(tip: string): TipPart[] {
48
+ const parts: TipPart[] = []
49
+ const regex = /\{highlight\}(.*?)\{\/highlight\}/g
50
+ const found = Array.from(tip.matchAll(regex))
51
+ const state = found.reduce(
52
+ (acc, match) => {
53
+ const start = match.index ?? 0
54
+ if (start > acc.index) {
55
+ acc.parts.push({ text: tip.slice(acc.index, start), highlight: false })
56
+ }
57
+ acc.parts.push({ text: match[1], highlight: true })
58
+ acc.index = start + match[0].length
59
+ return acc
60
+ },
61
+ { parts, index: 0 },
62
+ )
63
+
64
+ if (state.index < tip.length) {
65
+ parts.push({ text: tip.slice(state.index), highlight: false })
66
+ }
67
+
68
+ return parts
69
+ }
70
+
71
+ const NO_MODELS_TIP = "Run {highlight}/connect{/highlight} to add an AI provider and start coding"
72
+ const NO_MODELS_PARTS = parse(NO_MODELS_TIP)
73
+
74
+ function shortcutText(value: string) {
75
+ return `{highlight}${value}{/highlight}`
76
+ }
77
+
78
+ function commandText(command: string, shortcut: string) {
79
+ if (!shortcut) return shortcutText(command)
80
+ return `${shortcutText(command)} or ${shortcutText(shortcut)}`
81
+ }
82
+
83
+ function press(shortcut: string, text: string) {
84
+ if (!shortcut) return undefined
85
+ return `Press ${shortcutText(shortcut)} ${text}`
86
+ }
87
+
88
+ function configShortcut(api: TuiPluginApi, command: string): TipShortcut {
89
+ return () =>
90
+ api.tuiConfig.keybinds
91
+ .get(command)
92
+ .map((binding) => api.keys.formatSequence(Array.from(api.keymap.parseKeySequence(binding.key))))
93
+ .filter(Boolean)
94
+ .join(", ")
95
+ }
96
+
97
+ export function Tips(props: { api: TuiPluginApi; connected?: boolean }) {
98
+ const theme = useTheme().theme
99
+ const tipOffset = Math.random()
100
+ const shortcuts: Shortcuts = {
101
+ agentCycle: useCommandShortcut("agent.cycle"),
102
+ childFirst: configShortcut(props.api, "session.child.first"),
103
+ childNext: configShortcut(props.api, "session.child.next"),
104
+ childPrevious: configShortcut(props.api, "session.child.previous"),
105
+ commandList: useCommandShortcut("command.palette.show"),
106
+ editorOpen: useCommandShortcut("prompt.editor"),
107
+ helpShow: useCommandShortcut("help.show"),
108
+ inputClear: useCommandShortcut("prompt.clear"),
109
+ inputNewline: useCommandShortcut("input.newline"),
110
+ inputPaste: useCommandShortcut("prompt.paste"),
111
+ inputUndo: useCommandShortcut("input.undo"),
112
+ leader: configShortcut(props.api, "leader"),
113
+ messagesCopy: configShortcut(props.api, "messages.copy"),
114
+ messagesFirst: configShortcut(props.api, "session.first"),
115
+ messagesLast: configShortcut(props.api, "session.last"),
116
+ messagesPageDown: configShortcut(props.api, "session.page.down"),
117
+ messagesPageUp: configShortcut(props.api, "session.page.up"),
118
+ messagesToggleConceal: configShortcut(props.api, "session.toggle.conceal"),
119
+ modelCycleRecent: useCommandShortcut("model.cycle_recent"),
120
+ modelList: useCommandShortcut("model.list"),
121
+ sessionExport: configShortcut(props.api, "session.export"),
122
+ sessionInterrupt: configShortcut(props.api, "session.interrupt"),
123
+ sessionList: useCommandShortcut("session.list"),
124
+ sessionNew: useCommandShortcut("session.new"),
125
+ sessionParent: configShortcut(props.api, "session.parent"),
126
+ sessionPinToggle: configShortcut(props.api, "session.pin.toggle"),
127
+ sessionQuickSwitch1: useCommandShortcut("session.quick_switch.1"),
128
+ sessionQuickSwitch9: useCommandShortcut("session.quick_switch.9"),
129
+ sessionSidebarToggle: configShortcut(props.api, "session.sidebar.toggle"),
130
+ sessionTimeline: configShortcut(props.api, "session.timeline"),
131
+ statusView: useCommandShortcut("orynacode.status"),
132
+ terminalSuspend: useCommandShortcut("terminal.suspend"),
133
+ themeList: useCommandShortcut("theme.switch"),
134
+ }
135
+ const tip = createMemo(() => {
136
+ if (props.connected === false) return NO_MODELS_TIP
137
+ const tips = TIPS.flatMap((item) => {
138
+ const value = typeof item === "string" ? item : item(shortcuts)
139
+ return value ? [value] : []
140
+ })
141
+ return tips[Math.floor(tipOffset * tips.length)] ?? NO_MODELS_TIP
142
+ }, NO_MODELS_TIP)
143
+ // Solid can expose a memo's initial value while a pure computation is pending.
144
+ const parts = createMemo(() => {
145
+ const value = tip()
146
+ if (typeof value === "string") return parse(value)
147
+ return NO_MODELS_PARTS
148
+ }, NO_MODELS_PARTS)
149
+
150
+ return (
151
+ <box flexDirection="row" maxWidth="100%">
152
+ <text flexShrink={0} style={{ fg: theme.warning }}>
153
+ ● Tip{" "}
154
+ </text>
155
+ <text flexShrink={1} wrapMode="word">
156
+ <For each={parts()}>
157
+ {(part) => <span style={{ fg: part.highlight ? theme.text : theme.textMuted }}>{part.text}</span>}
158
+ </For>
159
+ </text>
160
+ </box>
161
+ )
162
+ }
163
+
164
+ const TIPS: Tip[] = [
165
+ "Type {highlight}@{/highlight} followed by a filename to fuzzy search and attach files",
166
+ "Start a message with {highlight}!{/highlight} to run shell commands directly (e.g., {highlight}!ls -la{/highlight})",
167
+ (shortcuts) => press(shortcuts.agentCycle(), "to cycle between Build and Plan agents"),
168
+ "Use {highlight}/undo{/highlight} to revert the last message and file changes",
169
+ "Use {highlight}/redo{/highlight} to restore previously undone messages and file changes",
170
+ "Run {highlight}/share{/highlight} to create a public link to your conversation at oryna.ai",
171
+ "Drag and drop images or PDFs into the terminal to add them as context",
172
+ (shortcuts) => press(shortcuts.inputPaste(), "to paste images from your clipboard into the prompt"),
173
+ (shortcuts) => `Use ${commandText("/editor", shortcuts.editorOpen())} to compose messages in your external editor`,
174
+ "Run {highlight}/init{/highlight} to auto-generate project rules based on your codebase",
175
+ (shortcuts) => `Use ${commandText("/models", shortcuts.modelList())} to see and switch between available AI models`,
176
+ (shortcuts) => `Use ${commandText("/themes", shortcuts.themeList())} to switch between ${themeCount} built-in themes`,
177
+ (shortcuts) => `Use ${commandText("/new", shortcuts.sessionNew())} to start a fresh conversation session`,
178
+ (shortcuts) => `Use ${commandText("/sessions", shortcuts.sessionList())} to list, pin, and continue sessions`,
179
+ (shortcuts) => press(shortcuts.sessionPinToggle(), "in the session list to pin a session so it stays at the top"),
180
+ (shortcuts) =>
181
+ shortcuts.sessionQuickSwitch1() && shortcuts.sessionQuickSwitch9()
182
+ ? `Pinned sessions are assigned quick slots; use ${shortcutText(shortcuts.sessionQuickSwitch1())} through ${shortcutText(shortcuts.sessionQuickSwitch9())} to switch`
183
+ : undefined,
184
+ "Run {highlight}/compact{/highlight} to summarize long sessions near context limits",
185
+ (shortcuts) => `Use ${commandText("/export", shortcuts.sessionExport())} to save the conversation as Markdown`,
186
+ (shortcuts) => press(shortcuts.messagesCopy(), "to copy the assistant's last message to clipboard"),
187
+ (shortcuts) => press(shortcuts.commandList(), "to see all available actions and commands"),
188
+ "Run {highlight}/connect{/highlight} to add API keys for 75+ supported LLM providers",
189
+ (shortcuts) => `The leader key is ${shortcutText(shortcuts.leader())}; combine with other keys for quick actions`,
190
+ (shortcuts) => press(shortcuts.modelCycleRecent(), "to quickly switch between recently used models"),
191
+ (shortcuts) => press(shortcuts.sessionSidebarToggle(), "in a session to show or hide the sidebar panel"),
192
+ (shortcuts) =>
193
+ shortcuts.messagesPageUp() && shortcuts.messagesPageDown()
194
+ ? `Use ${shortcutText(shortcuts.messagesPageUp())}/${shortcutText(shortcuts.messagesPageDown())} to navigate through conversation history`
195
+ : undefined,
196
+ (shortcuts) => press(shortcuts.messagesFirst(), "to jump to the beginning of the conversation"),
197
+ (shortcuts) => press(shortcuts.messagesLast(), "to jump to the most recent message"),
198
+ (shortcuts) => press(shortcuts.inputNewline(), "to add newlines in your prompt"),
199
+ (shortcuts) => press(shortcuts.inputClear(), "when typing to clear the input field"),
200
+ (shortcuts) => press(shortcuts.sessionInterrupt(), "to stop the AI mid-response"),
201
+ "Switch to {highlight}Plan{/highlight} agent to get suggestions without making actual changes",
202
+ "Use {highlight}@agent-name{/highlight} in prompts to invoke specialized subagents",
203
+ (shortcuts) => {
204
+ const items = [
205
+ shortcuts.sessionParent(),
206
+ shortcuts.childFirst(),
207
+ shortcuts.childPrevious(),
208
+ shortcuts.childNext(),
209
+ ].filter(Boolean)
210
+ if (!items.length) return undefined
211
+ return `Use ${items.map(shortcutText).join(" / ")} to move between parent and child sessions`
212
+ },
213
+ "Create {highlight}orynacode.json{/highlight} for server settings and {highlight}tui.json{/highlight} for TUI settings",
214
+ "Place TUI settings in {highlight}~/.config/orynacode/tui.json{/highlight} for global config",
215
+ "Add {highlight}$schema{/highlight} to your config for autocomplete in your editor",
216
+ "Configure {highlight}model{/highlight} in config to set your default model",
217
+ "Override any keybind in {highlight}tui.json{/highlight} via the {highlight}keybinds{/highlight} section",
218
+ "Set any keybind to {highlight}none{/highlight} to disable it completely",
219
+ "Configure local or remote MCP servers in the {highlight}mcp{/highlight} config section",
220
+ "Add {highlight}.md{/highlight} files to {highlight}.orynacode/commands/{/highlight} to define reusable custom prompts",
221
+ "Use {highlight}$ARGUMENTS{/highlight}, {highlight}$1{/highlight}, {highlight}$2{/highlight} in custom commands for dynamic input",
222
+ "Use backticks in commands to inject shell output (e.g., {highlight}`git status`{/highlight})",
223
+ "Add {highlight}.md{/highlight} files to {highlight}.orynacode/agents/{/highlight} for specialized AI personas",
224
+ "Configure per-agent permissions for {highlight}edit{/highlight}, {highlight}bash{/highlight}, and {highlight}webfetch{/highlight} tools",
225
+ 'Use patterns like {highlight}"git *": "allow"{/highlight} for granular bash permissions',
226
+ 'Set {highlight}"rm -rf *": "deny"{/highlight} to block destructive commands',
227
+ 'Configure {highlight}"git push": "ask"{/highlight} to require approval before pushing',
228
+ 'Set {highlight}"formatter": true{/highlight} in config to enable built-in formatters like prettier, gofmt, and ruff',
229
+ 'Set {highlight}"formatter": false{/highlight} in config to disable formatters enabled by another config layer',
230
+ "Define custom formatter commands with file extensions in config",
231
+ 'Set {highlight}"lsp": true{/highlight} in config to enable built-in LSP servers for code analysis',
232
+ "Create {highlight}.ts{/highlight} files in {highlight}.orynacode/tools/{/highlight} to define new LLM tools",
233
+ "Tool definitions can invoke scripts written in Python, Go, etc",
234
+ "Add {highlight}.ts{/highlight} files to {highlight}.orynacode/plugins/{/highlight} for event hooks",
235
+ "Use plugins to send OS notifications when sessions complete",
236
+ "Create a plugin to prevent OrynaCode from reading sensitive files",
237
+ "Use {highlight}orynacode run{/highlight} for non-interactive scripting",
238
+ "Use {highlight}orynacode --continue{/highlight} to resume the last session",
239
+ "Use {highlight}orynacode run -f file.ts{/highlight} to attach files via CLI",
240
+ "Use {highlight}--format json{/highlight} for machine-readable output in scripts",
241
+ "Run {highlight}orynacode serve{/highlight} for headless API access to OrynaCode",
242
+ "Use {highlight}orynacode run --attach{/highlight} to connect to a running server",
243
+ "Run {highlight}opencode upgrade{/highlight} to update to the latest version",
244
+ "Run {highlight}orynacode auth list{/highlight} to see all configured providers",
245
+ "Run {highlight}orynacode agent create{/highlight} for guided agent creation",
246
+ "Use {highlight}/opencode{/highlight} in GitHub issues/PRs to trigger AI actions",
247
+ "Run {highlight}opencode github install{/highlight} to set up the GitHub workflow",
248
+ "Comment {highlight}/opencode fix this{/highlight} on issues to auto-create PRs",
249
+ "Comment {highlight}/oc{/highlight} on PR code lines for targeted code reviews",
250
+ 'Use {highlight}"theme": "system"{/highlight} to match your terminal\'s colors',
251
+ "Create JSON theme files in {highlight}.orynacode/themes/{/highlight} directory",
252
+ "Themes support dark/light variants for both modes",
253
+ "Use numeric xterm color codes 0-255 in custom theme JSON",
254
+ "Use {highlight}{env:VAR_NAME}{/highlight} syntax to reference environment variables in config",
255
+ "Use {highlight}{file:path}{/highlight} to include file contents in config values",
256
+ "Use {highlight}instructions{/highlight} in config to load additional rules files",
257
+ "Set agent {highlight}temperature{/highlight} from 0.0 (focused) to 1.0 (creative)",
258
+ "Configure {highlight}steps{/highlight} to limit agentic iterations per request",
259
+ 'Set {highlight}"tools": {"bash": false}{/highlight} to disable specific tools',
260
+ 'Set {highlight}"mcp_*": false{/highlight} to disable all tools from an MCP server',
261
+ "Override global tool settings per agent configuration",
262
+ 'Set {highlight}"share": "auto"{/highlight} to automatically share all sessions',
263
+ 'Set {highlight}"share": "disabled"{/highlight} to prevent any session sharing',
264
+ "Run {highlight}/unshare{/highlight} to remove a session from public access",
265
+ "Permission {highlight}doom_loop{/highlight} prevents infinite tool call loops",
266
+ "Permission {highlight}external_directory{/highlight} protects files outside project",
267
+ "Run {highlight}orynacode debug config{/highlight} to troubleshoot configuration",
268
+ "Use {highlight}--print-logs{/highlight} flag to see detailed logs in stderr",
269
+ (shortcuts) => `Use ${commandText("/timeline", shortcuts.sessionTimeline())} to jump to specific messages`,
270
+ (shortcuts) => press(shortcuts.messagesToggleConceal(), "to toggle code block visibility in messages"),
271
+ (shortcuts) => `Use ${commandText("/status", shortcuts.statusView())} to see system status info`,
272
+ "Enable {highlight}scroll_acceleration{/highlight} in {highlight}tui.json{/highlight} for smooth macOS-style scrolling",
273
+ (shortcuts) =>
274
+ shortcuts.commandList()
275
+ ? `Toggle username display in chat via the command palette (${shortcutText(shortcuts.commandList())})`
276
+ : "Toggle username display in chat via the command palette",
277
+ "Run {highlight}docker run -it --rm ghcr.io/anomalyco/opencode{/highlight} for containerized use",
278
+ "Use {highlight}/connect{/highlight} with OrynaCode Zen for curated, tested models",
279
+ "Commit your project's {highlight}AGENTS.md{/highlight} file to Git for team sharing",
280
+ "Use {highlight}/review{/highlight} to review uncommitted changes, branches, or PRs",
281
+ (shortcuts) => `Use ${commandText("/help", shortcuts.helpShow())} to show the help dialog`,
282
+ "Use {highlight}/rename{/highlight} to rename the current session",
283
+ ...(process.platform === "win32"
284
+ ? ([(shortcuts) => press(shortcuts.inputUndo(), "to undo changes in your prompt")] satisfies Tip[])
285
+ : ([
286
+ (shortcuts) => press(shortcuts.terminalSuspend(), "to suspend the terminal and return to your shell"),
287
+ ] satisfies Tip[])),
288
+ ]
@@ -0,0 +1,59 @@
1
+ import type { TuiPlugin, TuiPluginApi } from "@opencode-ai/plugin/tui"
2
+ import type { InternalTuiPlugin } from "../../plugin/internal"
3
+ import { createMemo, Show } from "solid-js"
4
+ import { Tips } from "./tips-view"
5
+ import { useBindings } from "../../keymap"
6
+
7
+ const id = "internal:home-tips"
8
+
9
+ function View(props: { api: TuiPluginApi; hidden: boolean; show: boolean; connected: boolean }) {
10
+ useBindings(() => ({
11
+ commands: [
12
+ {
13
+ name: "tips.toggle",
14
+ title: props.hidden ? "Show tips" : "Hide tips",
15
+ category: "System",
16
+ namespace: "palette",
17
+ run() {
18
+ props.api.kv.set("tips_hidden", !props.api.kv.get("tips_hidden", false))
19
+ props.api.ui.dialog.clear()
20
+ },
21
+ },
22
+ ],
23
+ bindings: props.api.tuiConfig.keybinds.get("tips.toggle"),
24
+ }))
25
+
26
+ return (
27
+ <box width="100%" maxWidth={75} alignItems="center" paddingTop={3} flexShrink={1}>
28
+ <Show when={props.show}>
29
+ <Tips api={props.api} connected={props.connected} />
30
+ </Show>
31
+ </box>
32
+ )
33
+ }
34
+
35
+ const tui: TuiPlugin = async (api) => {
36
+ api.slots.register({
37
+ order: 100,
38
+ slots: {
39
+ home_bottom() {
40
+ const hidden = createMemo(() => api.kv.get("tips_hidden", false))
41
+ const first = createMemo(() => api.state.session.count() === 0)
42
+ const connected = createMemo(() =>
43
+ api.state.provider.some(
44
+ (item) => item.id !== "opencode" || Object.values(item.models).some((model) => model.cost?.input !== 0),
45
+ ),
46
+ )
47
+ const show = createMemo(() => (!first() || !connected()) && !hidden())
48
+ return <View api={api} hidden={hidden()} show={show()} connected={connected()} />
49
+ },
50
+ },
51
+ })
52
+ }
53
+
54
+ const plugin: InternalTuiPlugin = {
55
+ id,
56
+ tui,
57
+ }
58
+
59
+ export default plugin