saeeol 1.2.5 → 1.2.8

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 (482) hide show
  1. package/package.json +17 -12
  2. package/src/ltm/config.ts +15 -15
  3. package/src/ltm/events.ts +1 -1
  4. package/src/ltm/index.ts +1 -1
  5. package/src/ltm/pipeline.ts +22 -22
  6. package/src/ltm/scheduler.ts +20 -20
  7. package/src/ltm/store.ts +9 -7
  8. package/src/ltm/types.ts +16 -16
  9. package/src/provider/local/embedder.ts +21 -21
  10. package/src/provider/models-snapshot.d.ts +2 -0
  11. package/src/provider/models-snapshot.js +3 -0
  12. package/src/session/core/session.ts +1 -39
  13. package/src/session/message/message-errors.ts +1 -1
  14. package/src/session/message/message-parts.ts +1 -1
  15. package/src/session/message/message-transform.ts +1 -1
  16. package/src/session/message/message-types.ts +1 -1
  17. package/src/tool/core/tool.ts +1 -1
  18. package/AGENTS.md +0 -72
  19. package/BUN_SHELL_MIGRATION_PLAN.md +0 -136
  20. package/Dockerfile +0 -18
  21. package/assets/saeeol.ico +0 -0
  22. package/bunfig.toml +0 -7
  23. package/database.db +0 -0
  24. package/drizzle.config.ts +0 -10
  25. package/git +0 -0
  26. package/migration/20260127222353_familiar_lady_ursula/migration.sql +0 -90
  27. package/migration/20260127222353_familiar_lady_ursula/snapshot.json +0 -796
  28. package/migration/20260211171708_add_project_commands/migration.sql +0 -1
  29. package/migration/20260211171708_add_project_commands/snapshot.json +0 -806
  30. package/migration/20260213144116_wakeful_the_professor/migration.sql +0 -11
  31. package/migration/20260213144116_wakeful_the_professor/snapshot.json +0 -897
  32. package/migration/20260225215848_workspace/migration.sql +0 -7
  33. package/migration/20260225215848_workspace/snapshot.json +0 -959
  34. package/migration/20260227213759_add_session_workspace_id/migration.sql +0 -2
  35. package/migration/20260227213759_add_session_workspace_id/snapshot.json +0 -983
  36. package/migration/20260228203230_blue_harpoon/migration.sql +0 -17
  37. package/migration/20260228203230_blue_harpoon/snapshot.json +0 -1102
  38. package/migration/20260303231226_add_workspace_fields/migration.sql +0 -5
  39. package/migration/20260303231226_add_workspace_fields/snapshot.json +0 -1013
  40. package/migration/20260309230000_move_org_to_state/migration.sql +0 -3
  41. package/migration/20260309230000_move_org_to_state/snapshot.json +0 -1156
  42. package/migration/20260312043431_session_message_cursor/migration.sql +0 -4
  43. package/migration/20260312043431_session_message_cursor/snapshot.json +0 -1168
  44. package/migration/20260323234822_events/migration.sql +0 -13
  45. package/migration/20260323234822_events/snapshot.json +0 -1271
  46. package/migration/20260410174513_workspace-name/migration.sql +0 -16
  47. package/migration/20260410174513_workspace-name/snapshot.json +0 -1271
  48. package/migration/20260413175956_chief_energizer/migration.sql +0 -13
  49. package/migration/20260413175956_chief_energizer/snapshot.json +0 -1399
  50. package/migration/20260423070820_add_icon_url_override/migration.sql +0 -2
  51. package/migration/20260423070820_add_icon_url_override/snapshot.json +0 -1409
  52. package/migration/20260428004200_add_session_path/migration.sql +0 -1
  53. package/migration/20260428004200_add_session_path/snapshot.json +0 -1419
  54. package/npm/bin/saeeol +0 -42
  55. package/npm/package.json +0 -39
  56. package/npm/postinstall.js +0 -162
  57. package/parsers-config.ts +0 -289
  58. package/script/build.ts +0 -393
  59. package/script/check-migrations.ts +0 -16
  60. package/script/fix-node-pty.ts +0 -34
  61. package/script/generate.ts +0 -23
  62. package/script/postinstall.mjs +0 -189
  63. package/script/publish.ts +0 -200
  64. package/script/run-workspace-server +0 -106
  65. package/script/schema.ts +0 -63
  66. package/script/test-runner.ts +0 -420
  67. package/script/time.ts +0 -6
  68. package/script/trace-imports.ts +0 -153
  69. package/script/upgrade-opentui.ts +0 -64
  70. package/scripts/diff-sdk-types.sh +0 -52
  71. package/specs/effect/facades.md +0 -221
  72. package/specs/effect/http-api.md +0 -401
  73. package/specs/effect/instance-context.md +0 -309
  74. package/specs/effect/loose-ends.md +0 -34
  75. package/specs/effect/migration.md +0 -299
  76. package/specs/effect/routes.md +0 -64
  77. package/specs/effect/schema.md +0 -399
  78. package/specs/effect/server-package.md +0 -668
  79. package/specs/effect/tools.md +0 -90
  80. package/specs/tui-plugins.md +0 -433
  81. package/specs/v2/api.ts +0 -67
  82. package/specs/v2/keymappings.md +0 -10
  83. package/specs/v2/message-shape.md +0 -136
  84. package/src/tool/apply_patch.txt +0 -33
  85. package/src/tool/bash.txt +0 -119
  86. package/src/tool/edit.txt +0 -10
  87. package/src/tool/glob.txt +0 -6
  88. package/src/tool/grep.txt +0 -8
  89. package/src/tool/lsp.txt +0 -24
  90. package/src/tool/plan-enter.txt +0 -14
  91. package/src/tool/plan-exit.txt +0 -13
  92. package/src/tool/question.txt +0 -11
  93. package/src/tool/read.txt +0 -14
  94. package/src/tool/recall.txt +0 -12
  95. package/src/tool/skill.txt +0 -5
  96. package/src/tool/task.txt +0 -57
  97. package/src/tool/todowrite.txt +0 -167
  98. package/src/tool/warpgrep.txt +0 -10
  99. package/src/tool/webfetch.txt +0 -13
  100. package/src/tool/websearch.txt +0 -14
  101. package/src/tool/write.txt +0 -8
  102. package/sst-env.d.ts +0 -10
  103. package/test/AGENTS.md +0 -133
  104. package/test/account/repo.test.ts +0 -352
  105. package/test/account/service.test.ts +0 -456
  106. package/test/acp/agent-interface.test.ts +0 -51
  107. package/test/acp/event-subscription.test.ts +0 -725
  108. package/test/agent/agent.test.ts +0 -890
  109. package/test/auth/auth.test.ts +0 -86
  110. package/test/bun/registry.test.ts +0 -75
  111. package/test/bus/bus-effect.test.ts +0 -161
  112. package/test/bus/bus-integration.test.ts +0 -87
  113. package/test/bus/bus.test.ts +0 -219
  114. package/test/cli/account.test.ts +0 -26
  115. package/test/cli/auto-mode.test.ts +0 -75
  116. package/test/cli/bin-saeeol.test.ts +0 -8
  117. package/test/cli/cmd/tui/prompt-part.test.ts +0 -47
  118. package/test/cli/cmd/tui/prompt-traits.test.ts +0 -38
  119. package/test/cli/cmd/tui/sync.test.tsx +0 -159
  120. package/test/cli/error.test.ts +0 -18
  121. package/test/cli/github-action.test.ts +0 -198
  122. package/test/cli/github-remote.test.ts +0 -85
  123. package/test/cli/import.test.ts +0 -97
  124. package/test/cli/install-artifact.test.ts +0 -72
  125. package/test/cli/plugin-auth-picker.test.ts +0 -120
  126. package/test/cli/pr.test.ts +0 -59
  127. package/test/cli/tui/editor-context-zed.test.ts +0 -356
  128. package/test/cli/tui/editor-context.test.tsx +0 -228
  129. package/test/cli/tui/keybind-plugin.test.ts +0 -90
  130. package/test/cli/tui/markdown.test.ts +0 -161
  131. package/test/cli/tui/plugin-add.test.ts +0 -111
  132. package/test/cli/tui/plugin-install.test.ts +0 -87
  133. package/test/cli/tui/plugin-lifecycle.test.ts +0 -224
  134. package/test/cli/tui/plugin-loader-entrypoint.test.ts +0 -484
  135. package/test/cli/tui/plugin-loader-pure.test.ts +0 -71
  136. package/test/cli/tui/plugin-loader.test.ts +0 -816
  137. package/test/cli/tui/plugin-toggle.test.ts +0 -157
  138. package/test/cli/tui/revert-diff.test.ts +0 -35
  139. package/test/cli/tui/slot-replace.test.tsx +0 -47
  140. package/test/cli/tui/theme-store.test.ts +0 -54
  141. package/test/cli/tui/thread.test.ts +0 -28
  142. package/test/cli/tui/transcript.test.ts +0 -426
  143. package/test/cli/tui/usage.test.ts +0 -60
  144. package/test/cli/tui/use-event.test.tsx +0 -175
  145. package/test/config/agent-color.test.ts +0 -67
  146. package/test/config/config.test.ts +0 -2544
  147. package/test/config/fixtures/empty-frontmatter.md +0 -4
  148. package/test/config/fixtures/frontmatter.md +0 -28
  149. package/test/config/fixtures/markdown-header.md +0 -11
  150. package/test/config/fixtures/no-frontmatter.md +0 -1
  151. package/test/config/fixtures/weird-model-id.md +0 -13
  152. package/test/config/lsp.test.ts +0 -87
  153. package/test/config/markdown.test.ts +0 -228
  154. package/test/config/plugin.test.ts +0 -0
  155. package/test/config/tui.test.ts +0 -624
  156. package/test/control-plane/adapters.test.ts +0 -71
  157. package/test/control-plane/workspace.test.ts +0 -1526
  158. package/test/effect/app-runtime-logger.test.ts +0 -98
  159. package/test/effect/config-service.test.ts +0 -65
  160. package/test/effect/instance-state.test.ts +0 -394
  161. package/test/effect/run-service.test.ts +0 -89
  162. package/test/effect/runner.test.ts +0 -523
  163. package/test/fake/provider.ts +0 -82
  164. package/test/file/fsmonitor.test.ts +0 -68
  165. package/test/file/ignore.test.ts +0 -10
  166. package/test/file/index.test.ts +0 -954
  167. package/test/file/path-traversal.test.ts +0 -205
  168. package/test/file/ripgrep.test.ts +0 -226
  169. package/test/file/watcher.test.ts +0 -249
  170. package/test/filesystem/filesystem.test.ts +0 -319
  171. package/test/fixture/db.ts +0 -11
  172. package/test/fixture/fixture.test.ts +0 -26
  173. package/test/fixture/fixture.ts +0 -175
  174. package/test/fixture/flock-worker.ts +0 -72
  175. package/test/fixture/log-init-worker.ts +0 -62
  176. package/test/fixture/lsp/fake-lsp-server.js +0 -249
  177. package/test/fixture/plug-worker.ts +0 -93
  178. package/test/fixture/plugin-meta-worker.ts +0 -19
  179. package/test/fixture/skills/agents-sdk/SKILL.md +0 -152
  180. package/test/fixture/skills/cloudflare/SKILL.md +0 -211
  181. package/test/fixture/skills/index.json +0 -6
  182. package/test/fixture/tui-plugin.ts +0 -323
  183. package/test/fixture/tui-runtime.ts +0 -31
  184. package/test/format/format.test.ts +0 -272
  185. package/test/git/git.test.ts +0 -128
  186. package/test/ide/ide.test.ts +0 -82
  187. package/test/installation/installation.test.ts +0 -168
  188. package/test/keybind.test.ts +0 -421
  189. package/test/lib/effect.ts +0 -53
  190. package/test/lib/filesystem.ts +0 -10
  191. package/test/lib/llm-server.ts +0 -778
  192. package/test/lib/websocket.ts +0 -46
  193. package/test/lsp/client.test.ts +0 -482
  194. package/test/lsp/index.test.ts +0 -160
  195. package/test/lsp/launch.test.ts +0 -22
  196. package/test/lsp/lifecycle.test.ts +0 -184
  197. package/test/ltm/ltm.test.ts +0 -230
  198. package/test/mcp/headers.test.ts +0 -178
  199. package/test/mcp/lifecycle.test.ts +0 -787
  200. package/test/mcp/oauth-auto-connect.test.ts +0 -311
  201. package/test/mcp/oauth-browser.test.ts +0 -276
  202. package/test/mcp/oauth-callback.test.ts +0 -34
  203. package/test/memory/abort-leak-webfetch.ts +0 -49
  204. package/test/memory/abort-leak.test.ts +0 -128
  205. package/test/patch/patch.test.ts +0 -348
  206. package/test/permission/arity.test.ts +0 -33
  207. package/test/permission/next.test.ts +0 -1227
  208. package/test/permission/next.toConfig.test.ts +0 -110
  209. package/test/permission-task.test.ts +0 -326
  210. package/test/plugin/auth-override.test.ts +0 -79
  211. package/test/plugin/cloudflare.test.ts +0 -68
  212. package/test/plugin/codex.test.ts +0 -123
  213. package/test/plugin/github-copilot-models.test.ts +0 -261
  214. package/test/plugin/install-concurrency.test.ts +0 -140
  215. package/test/plugin/install.test.ts +0 -570
  216. package/test/plugin/loader-shared.test.ts +0 -1169
  217. package/test/plugin/meta.test.ts +0 -137
  218. package/test/plugin/shared.test.ts +0 -88
  219. package/test/plugin/trigger.test.ts +0 -102
  220. package/test/plugin/workspace-adapter.test.ts +0 -109
  221. package/test/preload.ts +0 -77
  222. package/test/project/instance.test.ts +0 -276
  223. package/test/project/migrate-global.test.ts +0 -152
  224. package/test/project/project.test.ts +0 -600
  225. package/test/project/vcs.test.ts +0 -286
  226. package/test/project/worktree-remove.test.ts +0 -126
  227. package/test/project/worktree.test.ts +0 -223
  228. package/test/provider/amazon-bedrock.test.ts +0 -462
  229. package/test/provider/copilot/convert-to-copilot-messages.test.ts +0 -523
  230. package/test/provider/copilot/copilot-chat-model.test.ts +0 -592
  231. package/test/provider/gitlab-duo.test.ts +0 -413
  232. package/test/provider/local.test.ts +0 -208
  233. package/test/provider/models.test.ts +0 -261
  234. package/test/provider/provider-category.test.ts +0 -190
  235. package/test/provider/provider.test.ts +0 -2758
  236. package/test/provider/transform.test.ts +0 -3681
  237. package/test/pty/pty-output-isolation.test.ts +0 -147
  238. package/test/pty/pty-session.test.ts +0 -102
  239. package/test/pty/pty-shell.test.ts +0 -104
  240. package/test/question/question.test.ts +0 -490
  241. package/test/saeeol/agent-global-config-dirs.test.ts +0 -24
  242. package/test/saeeol/agent-manager-tool.test.ts +0 -71
  243. package/test/saeeol/agent-permission-overrides.test.ts +0 -75
  244. package/test/saeeol/agent-skill-permissions.test.ts +0 -37
  245. package/test/saeeol/ask-agent-permissions.test.ts +0 -303
  246. package/test/saeeol/bash-hierarchy.test.ts +0 -64
  247. package/test/saeeol/bash-permission-metadata.test.ts +0 -66
  248. package/test/saeeol/bash-security-extended.test.ts +0 -243
  249. package/test/saeeol/bedrock-claude-empty-content.test.ts +0 -138
  250. package/test/saeeol/boxes-integration.test.ts +0 -415
  251. package/test/saeeol/builtin-skills.test.ts +0 -75
  252. package/test/saeeol/cleanup.ts +0 -28
  253. package/test/saeeol/cli/dev-setup.test.ts +0 -74
  254. package/test/saeeol/cli/roll-call.test.ts +0 -161
  255. package/test/saeeol/cli-run-auto-helper.test.ts +0 -58
  256. package/test/saeeol/codex-auth-refresh.test.ts +0 -124
  257. package/test/saeeol/commit-message/generate.test.ts +0 -188
  258. package/test/saeeol/commit-message/git-context.test.ts +0 -303
  259. package/test/saeeol/commit-message-windows.test.ts +0 -38
  260. package/test/saeeol/compaction-payload-recovery.test.ts +0 -406
  261. package/test/saeeol/compaction-preservation-audit.test.ts +0 -122
  262. package/test/saeeol/compaction-skip-guard.test.ts +0 -224
  263. package/test/saeeol/compaction-smart-select.test.ts +0 -100
  264. package/test/saeeol/config/config.test.ts +0 -166
  265. package/test/saeeol/config/indexing-default-plugin.test.ts +0 -82
  266. package/test/saeeol/config/opentelemetry-default.test.ts +0 -29
  267. package/test/saeeol/config-gitignore.test.ts +0 -70
  268. package/test/saeeol/config-injector.test.ts +0 -305
  269. package/test/saeeol/config-resilience.test.ts +0 -234
  270. package/test/saeeol/config-validation.test.ts +0 -183
  271. package/test/saeeol/cost-propagation.test.ts +0 -94
  272. package/test/saeeol/cost-tracker-extended.test.ts +0 -141
  273. package/test/saeeol/cost-tracker.test.ts +0 -64
  274. package/test/saeeol/custom-provider-delete.test.ts +0 -149
  275. package/test/saeeol/diff-full.test.ts +0 -226
  276. package/test/saeeol/edit-permission-filediff.test.ts +0 -223
  277. package/test/saeeol/encoding.test.ts +0 -364
  278. package/test/saeeol/enhance-prompt.test.ts +0 -61
  279. package/test/saeeol/ensure-plan-dir.test.ts +0 -32
  280. package/test/saeeol/errors.test.ts +0 -144
  281. package/test/saeeol/external-directory-boundary.test.ts +0 -96
  282. package/test/saeeol/gateway-headers.test.ts +0 -88
  283. package/test/saeeol/help.test.ts +0 -191
  284. package/test/saeeol/ignore-migrator.test.ts +0 -308
  285. package/test/saeeol/indexing-auth.test.ts +0 -45
  286. package/test/saeeol/indexing-feature.test.ts +0 -44
  287. package/test/saeeol/indexing-label.test.ts +0 -70
  288. package/test/saeeol/indexing-startup.test.ts +0 -381
  289. package/test/saeeol/indexing-worktree.test.ts +0 -73
  290. package/test/saeeol/instruction.test.ts +0 -136
  291. package/test/saeeol/lancedb-runtime.test.ts +0 -116
  292. package/test/saeeol/loader-auth.test.ts +0 -168
  293. package/test/saeeol/local-model.test.ts +0 -621
  294. package/test/saeeol/logo.test.ts +0 -31
  295. package/test/saeeol/lsp-typescript-lightweight.test.ts +0 -89
  296. package/test/saeeol/mcp-branding.test.ts +0 -33
  297. package/test/saeeol/mcp-docker-rm.test.ts +0 -32
  298. package/test/saeeol/mcp-migrator.test.ts +0 -736
  299. package/test/saeeol/mcp-oauth-callback.test.ts +0 -33
  300. package/test/saeeol/memory-io.test.ts +0 -198
  301. package/test/saeeol/memory-paths.test.ts +0 -87
  302. package/test/saeeol/memory-security.test.ts +0 -166
  303. package/test/saeeol/model-cache-org.test.ts +0 -164
  304. package/test/saeeol/model-info-panel-utils.test.ts +0 -52
  305. package/test/saeeol/model-info-panel.types.test.ts +0 -7
  306. package/test/saeeol/models-401-fallback.test.ts +0 -52
  307. package/test/saeeol/modes-migrator.test.ts +0 -320
  308. package/test/saeeol/nvidia-headers.test.ts +0 -74
  309. package/test/saeeol/patch-jsonc.test.ts +0 -73
  310. package/test/saeeol/patch.test.ts +0 -172
  311. package/test/saeeol/paths.test.ts +0 -265
  312. package/test/saeeol/permission/config-paths.test.ts +0 -174
  313. package/test/saeeol/permission/env-read.test.ts +0 -149
  314. package/test/saeeol/permission/external-directory-allow.test.ts +0 -327
  315. package/test/saeeol/permission/next.always-rules.test.ts +0 -882
  316. package/test/saeeol/permission/next.reply-http.test.ts +0 -205
  317. package/test/saeeol/permission/next.reply-routing.test.ts +0 -184
  318. package/test/saeeol/plan-exit-detection.test.ts +0 -494
  319. package/test/saeeol/plan-followup.test.ts +0 -1376
  320. package/test/saeeol/project-config-update.test.ts +0 -120
  321. package/test/saeeol/project-id.test.ts +0 -455
  322. package/test/saeeol/provider-cost.test.ts +0 -171
  323. package/test/saeeol/provider-list-failed-state.test.ts +0 -100
  324. package/test/saeeol/question-dismiss-all.test.ts +0 -174
  325. package/test/saeeol/read-directory.test.ts +0 -116
  326. package/test/saeeol/rules-migrator.test.ts +0 -257
  327. package/test/saeeol/run-auto.test.ts +0 -176
  328. package/test/saeeol/run-network.test.ts +0 -224
  329. package/test/saeeol/semantic-search.test.ts +0 -186
  330. package/test/saeeol/server/permission-allow-everything.test.ts +0 -125
  331. package/test/saeeol/session/instruction-substitution.test.ts +0 -72
  332. package/test/saeeol/session/platform-attribution.test.ts +0 -118
  333. package/test/saeeol/session/session.test.ts +0 -105
  334. package/test/saeeol/session-compaction-cap.test.ts +0 -399
  335. package/test/saeeol/session-compaction-chunks.test.ts +0 -501
  336. package/test/saeeol/session-compaction-safety.test.ts +0 -481
  337. package/test/saeeol/session-fork-remap.test.ts +0 -251
  338. package/test/saeeol/session-import-service.test.ts +0 -114
  339. package/test/saeeol/session-list.test.ts +0 -47
  340. package/test/saeeol/session-message-metadata.test.ts +0 -128
  341. package/test/saeeol/session-overflow.test.ts +0 -78
  342. package/test/saeeol/session-processor-empty-tool-calls.test.ts +0 -571
  343. package/test/saeeol/session-processor-network-offline.test.ts +0 -204
  344. package/test/saeeol/session-processor-retry-limit.test.ts +0 -238
  345. package/test/saeeol/session-processor-review-telemetry.test.ts +0 -82
  346. package/test/saeeol/session-prompt-compaction-safety.test.ts +0 -517
  347. package/test/saeeol/session-prompt-queue.test.ts +0 -815
  348. package/test/saeeol/sessions/inflight-cache.test.ts +0 -157
  349. package/test/saeeol/sessions/ingest-queue.test.ts +0 -402
  350. package/test/saeeol/sessions/remote-protocol.test.ts +0 -258
  351. package/test/saeeol/sessions/remote-sender.test.ts +0 -1036
  352. package/test/saeeol/sessions/remote-ws.test.ts +0 -367
  353. package/test/saeeol/sessions/sessions-enable-remote.test.disable +0 -181
  354. package/test/saeeol/slot-prop-reactivity.test.ts +0 -142
  355. package/test/saeeol/snapshot-cache.test.ts +0 -84
  356. package/test/saeeol/snapshot-freeze-repro.test.ts +0 -100
  357. package/test/saeeol/snapshot-track-timeout.test.ts +0 -519
  358. package/test/saeeol/stats-subagent-cost.test.ts +0 -123
  359. package/test/saeeol/suggestion/auto-dismiss.test.ts +0 -65
  360. package/test/saeeol/suggestion/suggestion.test.ts +0 -145
  361. package/test/saeeol/suggestion/tool.test.ts +0 -298
  362. package/test/saeeol/summary-file-diff.test.ts +0 -28
  363. package/test/saeeol/system-prompt.test.ts +0 -142
  364. package/test/saeeol/task-nesting.test.ts +0 -193
  365. package/test/saeeol/telemetry/feedback.test.ts +0 -8
  366. package/test/saeeol/todo-view.test.ts +0 -57
  367. package/test/saeeol/tool-encoding.test.ts +0 -455
  368. package/test/saeeol/tool-registry-indexing-import-failure.test.ts +0 -49
  369. package/test/saeeol/tool-registry-indexing.test.ts +0 -236
  370. package/test/saeeol/tool-registry-semantic-import-failure.test.ts +0 -55
  371. package/test/saeeol/tool-task-model.test.ts +0 -352
  372. package/test/saeeol/transform-opus-4.7.test.ts +0 -89
  373. package/test/saeeol/tui-diff.test.ts +0 -91
  374. package/test/saeeol/tui-sync.test.ts +0 -80
  375. package/test/saeeol/util/url.test.ts +0 -141
  376. package/test/saeeol/workflows-migrator.test.ts +0 -261
  377. package/test/saeeol/worktree-diff-summary.test.ts +0 -64
  378. package/test/saeeol/worktree-diff.test.ts +0 -223
  379. package/test/saeeol/worktree-remove-lock.test.ts +0 -82
  380. package/test/server/AGENTS.md +0 -15
  381. package/test/server/contract.test.ts +0 -231
  382. package/test/server/experimental-session-list.test.ts +0 -157
  383. package/test/server/global-session-list.test.ts +0 -155
  384. package/test/server/httpapi-authorization.test.ts +0 -103
  385. package/test/server/httpapi-bridge.test.ts +0 -440
  386. package/test/server/httpapi-config.test.ts +0 -67
  387. package/test/server/httpapi-cors.test.ts +0 -89
  388. package/test/server/httpapi-event.test.ts +0 -57
  389. package/test/server/httpapi-experimental.test.ts +0 -219
  390. package/test/server/httpapi-file.test.ts +0 -79
  391. package/test/server/httpapi-instance-context.test.ts +0 -237
  392. package/test/server/httpapi-instance.legacy.test.ts +0 -140
  393. package/test/server/httpapi-instance.test.ts +0 -83
  394. package/test/server/httpapi-json-parity.test.ts +0 -263
  395. package/test/server/httpapi-mcp-oauth.test.ts +0 -76
  396. package/test/server/httpapi-mcp.test.ts +0 -189
  397. package/test/server/httpapi-provider.test.ts +0 -153
  398. package/test/server/httpapi-pty-websocket.test.ts +0 -16
  399. package/test/server/httpapi-pty.test.ts +0 -175
  400. package/test/server/httpapi-raw-route-auth.test.ts +0 -89
  401. package/test/server/httpapi-sdk.test.ts +0 -679
  402. package/test/server/httpapi-session.test.ts +0 -464
  403. package/test/server/httpapi-sync.test.ts +0 -130
  404. package/test/server/httpapi-tui.test.ts +0 -121
  405. package/test/server/httpapi-workspace-routing.test.ts +0 -471
  406. package/test/server/httpapi-workspace.test.ts +0 -427
  407. package/test/server/project-init-git.test.ts +0 -113
  408. package/test/server/proxy-util.test.ts +0 -113
  409. package/test/server/session-actions.test.ts +0 -49
  410. package/test/server/session-list.test.ts +0 -238
  411. package/test/server/session-messages.test.ts +0 -167
  412. package/test/server/session-select.test.ts +0 -100
  413. package/test/server/trace-attributes.test.ts +0 -76
  414. package/test/server/workspace-proxy.test.ts +0 -165
  415. package/test/server/workspace-routing.test.ts +0 -85
  416. package/test/session/compaction.test.ts +0 -2420
  417. package/test/session/instruction.test.ts +0 -247
  418. package/test/session/llm.test.ts +0 -1273
  419. package/test/session/message-v2.test.ts +0 -1291
  420. package/test/session/messages-pagination.test.ts +0 -1173
  421. package/test/session/network.test.ts +0 -249
  422. package/test/session/processor-effect.test.ts +0 -847
  423. package/test/session/prompt.test.ts +0 -2131
  424. package/test/session/retry.test.ts +0 -340
  425. package/test/session/revert-compact.test.ts +0 -639
  426. package/test/session/schema-decoding.test.ts +0 -311
  427. package/test/session/session-entry-stepper.test.ts +0 -917
  428. package/test/session/session-schema.test.ts +0 -76
  429. package/test/session/snapshot-tool-race.test.ts +0 -257
  430. package/test/session/structured-output-integration.test.ts +0 -265
  431. package/test/session/structured-output.test.ts +0 -381
  432. package/test/session/system.test.ts +0 -73
  433. package/test/share/share-next.test.ts +0 -333
  434. package/test/shell/shell.test.ts +0 -99
  435. package/test/skill/discovery.test.ts +0 -116
  436. package/test/skill/skill.test.ts +0 -393
  437. package/test/snapshot/snapshot.test.ts +0 -1531
  438. package/test/storage/db.test.ts +0 -23
  439. package/test/storage/json-migration.test.ts +0 -832
  440. package/test/storage/storage.test.ts +0 -293
  441. package/test/suggestion/suggestion.test.ts +0 -1
  442. package/test/sync/index.test.ts +0 -256
  443. package/test/tool/__snapshots__/parameters.test.ts.snap +0 -500
  444. package/test/tool/__snapshots__/tool.test.ts.snap +0 -9
  445. package/test/tool/apply_patch.test.ts +0 -614
  446. package/test/tool/bash.test.ts +0 -1225
  447. package/test/tool/diagnostics-filter.test.ts +0 -55
  448. package/test/tool/edit.test.ts +0 -754
  449. package/test/tool/external-directory.test.ts +0 -169
  450. package/test/tool/fixtures/large-image.png +0 -0
  451. package/test/tool/fixtures/models-api.json +0 -65179
  452. package/test/tool/glob.test.ts +0 -107
  453. package/test/tool/grep.test.ts +0 -114
  454. package/test/tool/lsp.test.ts +0 -187
  455. package/test/tool/parameters.test.ts +0 -243
  456. package/test/tool/question.test.ts +0 -129
  457. package/test/tool/read.test.ts +0 -500
  458. package/test/tool/recall.test.ts +0 -151
  459. package/test/tool/registry.test.ts +0 -203
  460. package/test/tool/skill.test.ts +0 -135
  461. package/test/tool/suggest.test.ts +0 -1
  462. package/test/tool/task.test.ts +0 -612
  463. package/test/tool/tool-define.test.ts +0 -99
  464. package/test/tool/truncation.test.ts +0 -260
  465. package/test/tool/webfetch.test.ts +0 -103
  466. package/test/tool/write.test.ts +0 -291
  467. package/test/util/data-url.test.ts +0 -14
  468. package/test/util/effect-zod.test.ts +0 -754
  469. package/test/util/error.test.ts +0 -38
  470. package/test/util/filesystem.test.ts +0 -656
  471. package/test/util/format.test.ts +0 -59
  472. package/test/util/glob.test.ts +0 -164
  473. package/test/util/iife.test.ts +0 -36
  474. package/test/util/lazy.test.ts +0 -50
  475. package/test/util/lock.test.ts +0 -72
  476. package/test/util/log.test.ts +0 -86
  477. package/test/util/module.test.ts +0 -59
  478. package/test/util/process.test.ts +0 -128
  479. package/test/util/timeout.test.ts +0 -21
  480. package/test/util/which.test.ts +0 -100
  481. package/test/util/wildcard.test.ts +0 -90
  482. package/test/workspace/workspace-restore.test.ts +0 -296
@@ -1,90 +0,0 @@
1
- # Tool migration
2
-
3
- Practical reference for the current tool-migration state in `packages/saeeol`.
4
-
5
- ## Status
6
-
7
- `Tool.Def.execute` and `Tool.Info.init` already return `Effect` on this branch, and the built-in tool surface is now largely on the target shape.
8
-
9
- The current exported tools in `src/tool` all use `Tool.define(...)` with Effect-based initialization, and nearly all of them already build their tool body with `Effect.gen(...)` and `Effect.fn(...)`.
10
-
11
- So the remaining work is no longer "convert tools to Effect at all". The remaining work is mostly:
12
-
13
- 1. remove Promise and raw platform bridges inside individual tool bodies
14
- 2. swap tool internals to Effect-native services like `AppFileSystem`, `HttpClient`, and `ChildProcessSpawner`
15
- 3. keep tests and callers aligned with `yield* info.init()` and real service graphs
16
-
17
- ## Current shape
18
-
19
- `Tool.define(...)` is already the Effect-native helper here.
20
-
21
- - `init` is an `Effect`
22
- - `info.init()` returns an `Effect`
23
- - `execute(...)` returns an `Effect`
24
-
25
- That means a tool does not need a separate `Tool.defineEffect(...)` helper to count as migrated. A tool is effectively migrated when its init and execute path stay Effect-native, even if some internals still bridge to Promise-based or raw APIs.
26
-
27
- ## Tests
28
-
29
- Tool tests should use the existing Effect helpers in `packages/saeeol/test/lib/effect.ts`:
30
-
31
- - Use `testEffect(...)` / `it.live(...)` instead of creating fake local wrappers around effectful tools.
32
- - Yield the real tool export, then initialize it: `const info = yield* ReadTool`, `const tool = yield* info.init()`.
33
- - Run tests inside a real instance with `provideTmpdirInstance(...)` or `provideInstance(tmpdirScoped(...))` so instance-scoped services resolve exactly as they do in production.
34
-
35
- This keeps tool tests aligned with the production service graph and makes follow-up cleanup mostly mechanical.
36
-
37
- ## Exported tools
38
-
39
- These exported tool definitions currently use `Tool.define(...)` in `src/tool`:
40
-
41
- - [x] `apply_patch.ts`
42
- - [x] `bash.ts`
43
- - [x] `edit.ts`
44
- - [x] `glob.ts`
45
- - [x] `grep.ts`
46
- - [x] `invalid.ts`
47
- - [x] `lsp.ts`
48
- - [x] `plan.ts`
49
- - [x] `question.ts`
50
- - [x] `read.ts`
51
- - [x] `skill.ts`
52
- - [x] `task.ts`
53
- - [x] `todo.ts`
54
- - [x] `webfetch.ts`
55
- - [x] `websearch.ts`
56
- - [x] `write.ts`
57
-
58
- Notes:
59
-
60
- - There is no current `ls.ts` tool file on this branch.
61
- - `truncate.ts` is an Effect service used by tools, not a tool definition itself.
62
- - `mcp-exa.ts`, `external-directory.ts`, and `schema.ts` are support modules, not standalone tool definitions.
63
-
64
- ## Follow-up cleanup
65
-
66
- Most exported tools are already on the intended Effect-native shape. The remaining cleanup is narrower than the old checklist implied.
67
-
68
- Current spot cleanups worth tracking:
69
-
70
- - [ ] `read.ts` — still bridges to Node stream / `readline` helpers and Promise-based binary detection
71
- - [ ] `bash.ts` — already uses Effect child-process primitives; only keep tracking shell-specific platform bridges and parser/loading details as they come up
72
- - [ ] `webfetch.ts` — already uses `HttpClient`; remaining work is limited to smaller boundary helpers like HTML text extraction
73
- - [ ] `file/ripgrep.ts` — adjacent to tool migration; still has raw fs/process usage that affects `grep.ts` and file-search routes
74
- - [ ] `patch/index.ts` — adjacent to tool migration; still has raw fs usage behind patch application
75
-
76
- Notable items that are already effectively on the target path and do not need separate migration bullets right now:
77
-
78
- - `apply_patch.ts`
79
- - `grep.ts`
80
- - `write.ts`
81
- - `websearch.ts`
82
- - `edit.ts`
83
-
84
- ## Filesystem notes
85
-
86
- Current raw fs users that still appear relevant here:
87
-
88
- - `tool/read.ts` — `fs.createReadStream`, `readline`
89
- - `file/ripgrep.ts` — `fs/promises`
90
- - `patch/index.ts` — `fs`, `fs/promises`
@@ -1,433 +0,0 @@
1
- # TUI plugins
2
-
3
- Technical reference for the current TUI plugin system.
4
-
5
- ## Overview
6
-
7
- - TUI plugin config lives in `tui.json`.
8
- - Author package entrypoint is `@saeeol/plugin/tui`.
9
- - Internal plugins load inside the CLI app the same way external TUI plugins do.
10
- - Package plugins can be installed from CLI or TUI.
11
- - v1 plugin modules are target-exclusive: a module can export `server` or `tui`, never both.
12
- - Server runtime keeps v0 legacy fallback (function exports / enumerated exports) after v1 parsing.
13
- - npm packages can be TUI theme-only via `package.json["oc-themes"]` without a `./tui` entrypoint.
14
-
15
- ## TUI config
16
-
17
- Example:
18
-
19
- ```json
20
- {
21
- "$schema": "https://saeeol.ai/tui.json",
22
- "theme": "smoke-theme",
23
- "plugin": ["@acme/saeeol-plugin@1.2.3", ["./plugins/demo.tsx", { "label": "demo" }]],
24
- "plugin_enabled": {
25
- "acme.demo": false
26
- }
27
- }
28
- ```
29
-
30
- - `plugin` entries can be either a string spec or `[spec, options]`.
31
- - Plugin specs can be npm specs, `file://` URLs, relative paths, or absolute paths.
32
- - Relative path specs are resolved relative to the config file that declared them.
33
- - A file module listed in `tui.json` must be a TUI module (`default export { id?, tui }`) and must not export `server`.
34
- - Duplicate npm plugins are deduped by package name; higher-precedence config wins.
35
- - Duplicate file plugins are deduped by exact resolved file spec. This happens while merging config, before plugin modules are loaded.
36
- - `plugin_enabled` is keyed by plugin id, not by plugin spec.
37
- - For file plugins, that id must come from the plugin module's exported `id`. For npm plugins, it is the exported `id` or the package name if `id` is omitted.
38
- - Plugins are enabled by default. `plugin_enabled` is only for explicit overrides, usually to disable a plugin with `false`.
39
- - `plugin_enabled` is merged across config layers.
40
- - Runtime enable/disable state is also stored in KV under `plugin_enabled`; that KV state overrides config on startup.
41
-
42
- ## Author package shape
43
-
44
- Package entrypoint:
45
-
46
- - Import types from `@saeeol/plugin/tui`.
47
- - `@saeeol/plugin` exports `./tui` and declares optional peer deps on `@opentui/core` and `@opentui/solid`.
48
-
49
- Minimal module shape:
50
-
51
- ```tsx
52
- /** @jsxImportSource @opentui/solid */
53
- import type { TuiPlugin, TuiPluginModule } from "@saeeol/plugin/tui"
54
-
55
- const tui: TuiPlugin = async (api, options, meta) => {
56
- api.command.register(() => [
57
- {
58
- title: "Demo",
59
- value: "demo.open",
60
- onSelect: () => api.route.navigate("demo"),
61
- },
62
- ])
63
-
64
- api.route.register([
65
- {
66
- name: "demo",
67
- render: () => (
68
- <box>
69
- <text>demo</text>
70
- </box>
71
- ),
72
- },
73
- ])
74
- }
75
-
76
- const plugin: TuiPluginModule & { id: string } = {
77
- id: "acme.demo",
78
- tui,
79
- }
80
-
81
- export default plugin
82
- ```
83
-
84
- - Loader only reads the module default export object. Named exports are ignored.
85
- - TUI shape is `default export { id?, tui }`; including `server` is rejected.
86
- - A single module cannot export both `server` and `tui`.
87
- - `tui` signature is `(api, options, meta) => Promise<void>`.
88
- - If package `exports` contains `./tui`, the loader resolves that entrypoint.
89
- - If package `exports` exists, loader only resolves `./tui` or `./server`; it never falls back to `exports["."]`.
90
- - For npm package specs, TUI does not use `package.json` `main` as a fallback entry.
91
- - `package.json` `main` is only used for server plugin entrypoint resolution.
92
- - If a configured TUI package has no `./tui` entrypoint and no valid `oc-themes`, it is skipped with a warning (not a load failure).
93
- - If a configured TUI package has no `./tui` entrypoint but has valid `oc-themes`, runtime creates a no-op module record and still loads it for theme sync and plugin state.
94
- - If a package supports both server and TUI, use separate files and package `exports` (`./server` and `./tui`) so each target resolves to a target-only module.
95
- - File/path plugins must export a non-empty `id`.
96
- - npm plugins may omit `id`; package `name` is used.
97
- - Runtime identity is the resolved plugin id. Later plugins with the same id are rejected, including collisions with internal plugin ids.
98
- - If a path spec points at a directory, server loading can use `package.json` `main`.
99
- - TUI path loading never uses `package.json` `main`.
100
- - Legacy compatibility: path specs like `./plugin` can resolve to `./plugin/index.ts` (or `index.js`) when `package.json` is missing.
101
- - The `./plugin -> ./plugin/index.*` fallback applies to both server and TUI v1 loading.
102
- - There is no directory auto-discovery for TUI plugins; they must be listed in `tui.json`.
103
-
104
- ## Package manifest and install
105
-
106
- Install target detection is inferred from `package.json` entrypoints and theme metadata:
107
-
108
- - `server` target when `exports["./server"]` exists or `main` is set.
109
- - `tui` target when `exports["./tui"]` exists.
110
- - `tui` target when `oc-themes` exists and resolves to a non-empty set of valid package-relative theme paths.
111
-
112
- `oc-themes` rules:
113
-
114
- - `oc-themes` is an array of relative paths.
115
- - Absolute paths and `file://` paths are rejected.
116
- - Resolved theme paths must stay inside the package directory.
117
- - Invalid `oc-themes` causes manifest read failure for install.
118
-
119
- Example:
120
-
121
- ```json
122
- {
123
- "name": "@acme/saeeol-plugin",
124
- "type": "module",
125
- "main": "./dist/server.js",
126
- "exports": {
127
- "./server": {
128
- "import": "./dist/server.js",
129
- "config": { "custom": true }
130
- },
131
- "./tui": {
132
- "import": "./dist/tui.js",
133
- "config": { "compact": true }
134
- }
135
- },
136
- "engines": {
137
- "saeeol": "^1.0.0"
138
- }
139
- }
140
- ```
141
-
142
- ### Version compatibility
143
-
144
- npm plugins can declare a version compatibility range in `package.json` using the standard `engines` field:
145
-
146
- ```json
147
- {
148
- "engines": {
149
- "saeeol": "^1.0.0"
150
- }
151
- }
152
- ```
153
-
154
- - The value is a semver range checked against the running Saeeol version.
155
- - If the range is not satisfied, the plugin is skipped with a warning and a session error.
156
- - If `engines.saeeol` is absent, no check is performed (backward compatible).
157
- - File plugins are never checked; only npm package plugins are validated.
158
-
159
- - Install flow is shared by CLI and TUI in `src/plugin/install.ts`.
160
- - Shared helpers are `installPlugin`, `readPluginManifest`, and `patchPluginConfig`.
161
- - `saeeol plugin <module>` and TUI install both run install → manifest read → config patch.
162
- - Alias: `saeeol plug <module>`.
163
- - `-g` / `--global` writes into the global config dir.
164
- - Local installs resolve target dir inside `patchPluginConfig`.
165
- - For local scope, path is `<worktree>/.saeeol` only when VCS is git and `worktree !== "/"`; otherwise `<directory>/.saeeol`.
166
- - Root-worktree fallback (`worktree === "/"` uses `<directory>/.saeeol`) is covered by regression tests.
167
- - `patchPluginConfig` applies all detected targets (`server` and/or `tui`) in one call.
168
- - `patchPluginConfig` returns structured result unions (`ok`, `code`, fields by error kind) instead of custom thrown errors.
169
- - `patchPluginConfig` serializes per-target config writes with `Flock.acquire(...)`.
170
- - `patchPluginConfig` uses targeted `jsonc-parser` edits, so existing JSONC comments are preserved when plugin entries are added or replaced.
171
- - npm plugin package installs are executed with `--ignore-scripts`, so package `install` / `postinstall` lifecycle scripts are not run.
172
- - `exports["./server"].config` and `exports["./tui"].config` can provide default plugin options written on first install.
173
- - Without `--force`, an already-configured npm package name is a no-op.
174
- - With `--force`, replacement matches by package name. If the existing row is `[spec, options]`, those tuple options are kept.
175
- - Explicit npm specs with a version suffix (for example `pkg@1.2.3`) are pinned. Runtime install requests that exact version and does not run stale/latest checks for newer registry versions.
176
- - Bare npm specs (`pkg`) are treated as `latest` and can refresh when the cached version is stale.
177
- - Tuple targets in `oc-plugin` provide default options written into config.
178
- - A package can target `server`, `tui`, or both.
179
- - If a package targets both, each target must still resolve to a separate target-only module. Do not export `{ server, tui }` from one module.
180
- - There is no uninstall, list, or update CLI command for external plugins.
181
- - Local file plugins are configured directly in `tui.json`.
182
-
183
- When `plugin` entries exist in a writable `.saeeol` dir or `SAEEOL_CONFIG_DIR`, Saeeol installs `@saeeol/plugin` into that dir and writes:
184
-
185
- - `package.json`
186
- - `bun.lock`
187
- - `node_modules/`
188
- - `.gitignore`
189
-
190
- That is what makes local config-scoped plugins able to import `@saeeol/plugin/tui`.
191
-
192
- ## TUI plugin API
193
-
194
- Top-level API groups exposed to `tui(api, options, meta)`:
195
-
196
- - `api.app.version`
197
- - `api.command.register(cb)` / `api.command.trigger(value)` / `api.command.show()`
198
- - `api.route.register(routes)` / `api.route.navigate(name, params?)` / `api.route.current`
199
- - `api.ui.Dialog`, `DialogAlert`, `DialogConfirm`, `DialogPrompt`, `DialogSelect`, `Slot`, `Prompt`, `ui.toast`, `ui.dialog`
200
- - `api.keybind.match`, `print`, `create`
201
- - `api.tuiConfig`
202
- - `api.kv.get`, `set`, `ready`
203
- - `api.state`
204
- - `api.theme.current`, `selected`, `has`, `set`, `install`, `mode`, `ready`
205
- - `api.client`
206
- - `api.event.on(type, handler)`
207
- - `api.renderer`
208
- - `api.slots.register(plugin)`
209
- - `api.plugins.list()`, `activate(id)`, `deactivate(id)`, `add(spec)`, `install(spec, options?)`
210
- - `api.lifecycle.signal`, `api.lifecycle.onDispose(fn)`
211
-
212
- ### Commands
213
-
214
- `api.command.register` returns an unregister function. Command rows support:
215
-
216
- - `title`, `value`
217
- - `description`, `category`
218
- - `keybind`
219
- - `suggested`, `hidden`, `enabled`
220
- - `slash: { name, aliases? }`
221
- - `onSelect`
222
-
223
- Command behavior:
224
-
225
- - Registrations are reactive.
226
- - Later registrations win for duplicate `value` and for keybind handling.
227
- - Hidden commands are removed from the command dialog and slash list, but still respond to keybinds and `command.trigger(value)` if `enabled !== false`.
228
- - `api.command.show()` opens the host command dialog directly.
229
-
230
- ### Routes
231
-
232
- - Reserved route names: `home` and `session`.
233
- - Any other name is treated as a plugin route.
234
- - `api.route.current` returns one of:
235
- - `{ name: "home" }`
236
- - `{ name: "session", params: { sessionID, initialPrompt? } }`
237
- - `{ name: string, params?: Record<string, unknown> }`
238
- - `api.route.navigate("session", params)` only uses `params.sessionID`. It cannot set `initialPrompt`.
239
- - If multiple plugins register the same route name, the last registered route wins.
240
- - Unknown plugin routes render a fallback screen with a `go home` action.
241
-
242
- ### Dialogs and toast
243
-
244
- - `ui.Dialog` is the base dialog wrapper.
245
- - `ui.DialogAlert`, `ui.DialogConfirm`, `ui.DialogPrompt`, `ui.DialogSelect` are built-in dialog components.
246
- - `ui.Slot` renders host or plugin-defined slots by name from plugin JSX.
247
- - `ui.Prompt` renders the same prompt component used by the host app and accepts `sessionID`, `workspaceID`, `ref`, and `right` for the prompt meta row's right side.
248
- - `ui.toast(...)` shows a toast.
249
- - `ui.dialog` exposes the host dialog stack:
250
- - `replace(render, onClose?)`
251
- - `clear()`
252
- - `setSize("medium" | "large" | "xlarge")`
253
- - readonly `size`, `depth`, `open`
254
-
255
- ### Keybinds
256
-
257
- - `api.keybind.match(key, evt)` and `print(key)` use the host keybind parser/printer.
258
- - `api.keybind.create(defaults, overrides?)` builds a plugin-local keybind set.
259
- - Only missing, blank, or non-string overrides are ignored. Key syntax is not validated.
260
- - Returned keybind set exposes `all`, `get(name)`, `match(name, evt)`, `print(name)`.
261
-
262
- ### KV, state, client, events
263
-
264
- - `api.kv` is the shared app KV store backed by `state/kv.json`. It is not plugin-namespaced.
265
- - `api.kv` exposes `ready`.
266
- - `api.tuiConfig` and `api.state` are live host objects/getters, not frozen snapshots.
267
- - `api.state` exposes synced TUI state:
268
- - `ready`
269
- - `config`
270
- - `provider`
271
- - `path.{state,config,worktree,directory}`
272
- - `vcs?.branch`
273
- - `session.count()`
274
- - `session.diff(sessionID)`
275
- - `session.todo(sessionID)`
276
- - `session.messages(sessionID)`
277
- - `session.status(sessionID)`
278
- - `session.permission(sessionID)`
279
- - `session.question(sessionID)`
280
- - `part(messageID)`
281
- - `lsp()`
282
- - `mcp()`
283
- - `api.client` always reflects the current runtime client.
284
- - `api.event.on(type, handler)` subscribes to the TUI event stream and returns an unsubscribe function.
285
- - `api.renderer` exposes the raw `CliRenderer`.
286
-
287
- ### Theme
288
-
289
- - `api.theme.current` exposes the resolved current theme tokens.
290
- - `api.theme.selected` is the selected theme name.
291
- - `api.theme.has(name)` checks for an installed theme.
292
- - `api.theme.set(name)` switches theme and returns `boolean`.
293
- - `api.theme.mode()` returns `"dark" | "light"`.
294
- - `api.theme.install(jsonPath)` installs a theme JSON file.
295
- - `api.theme.ready` reports theme readiness.
296
-
297
- Theme install behavior:
298
-
299
- - Relative theme paths are resolved from the plugin root.
300
- - Theme name is the JSON basename.
301
- - `api.theme.install(...)` and `oc-themes` auto-sync share the same installer path.
302
- - Theme copy/write runs under cross-process lock key `tui-theme:<dest>`.
303
- - First install writes only when the destination file is missing.
304
- - If the theme name already exists, install is skipped unless plugin metadata state is `updated`.
305
- - On `updated`, host skips rewrite when tracked `mtime`/`size` is unchanged.
306
- - When a theme already exists and state is not `updated`, host can still persist theme metadata when destination already exists.
307
- - Local plugins persist installed themes under the local `.saeeol/themes` area near the plugin config source.
308
- - Global plugins persist installed themes under the global `themes` dir.
309
- - Invalid or unreadable theme files are ignored.
310
-
311
- ### Slots
312
-
313
- Current host slot names:
314
-
315
- - `app`
316
- - `home_logo`
317
- - `home_prompt` with props `{ workspace_id?, ref? }`
318
- - `home_prompt_right` with props `{ workspace_id? }`
319
- - `session_prompt` with props `{ session_id, visible?, disabled?, on_submit?, ref? }`
320
- - `session_prompt_right` with props `{ session_id }`
321
- - `home_bottom`
322
- - `home_footer`
323
- - `sidebar_title` with props `{ session_id, title, share_url? }`
324
- - `sidebar_content` with props `{ session_id }`
325
- - `sidebar_footer` with props `{ session_id }`
326
-
327
- Slot notes:
328
-
329
- - Slot context currently exposes only `theme`.
330
- - `api.slots.register(plugin)` returns the host-assigned slot plugin id.
331
- - `api.slots.register(plugin)` does not return an unregister function.
332
- - Returned ids are `pluginId`, `pluginId:1`, `pluginId:2`, and so on.
333
- - Plugin-provided `id` is not allowed.
334
- - The current host renders `home_logo`, `home_prompt`, and `session_prompt` with `replace`, `home_footer`, `sidebar_title`, and `sidebar_footer` with `single_winner`, and `app`, `home_prompt_right`, `session_prompt_right`, `home_bottom`, and `sidebar_content` with the slot library default mode.
335
- - Plugins can define custom slot names in `api.slots.register(...)` and render them from plugin UI with `ui.Slot`.
336
-
337
- ### Plugin control and lifecycle
338
-
339
- - `api.plugins.list()` returns `{ id, source, spec, target, enabled, active }[]`.
340
- - `enabled` is the persisted desired state. `active` means the plugin is currently initialized.
341
- - `api.plugins.activate(id)` sets `enabled=true`, persists it into KV, and initializes the plugin.
342
- - `api.plugins.deactivate(id)` sets `enabled=false`, persists it into KV, and disposes the plugin scope.
343
- - `api.plugins.add(spec)` trims the input and returns `false` for an empty string.
344
- - `api.plugins.add(spec)` treats the input as the runtime plugin spec and loads it without re-reading `tui.json`.
345
- - `api.plugins.add(spec)` no-ops when that resolved spec (or resolved plugin id) is already loaded.
346
- - `api.plugins.add(spec)` assumes enabled and always attempts initialization (it does not consult config/KV enable state).
347
- - `api.plugins.add(spec)` can load theme-only packages (`oc-themes` with no `./tui`) as runtime entries.
348
- - `api.plugins.install(spec, { global? })` runs install -> manifest read -> config patch using the same helper flow as CLI install.
349
- - `api.plugins.install(...)` returns either `{ ok: false, message, missing? }` or `{ ok: true, dir, tui }`.
350
- - `api.plugins.install(...)` does not load plugins into the current session. Call `api.plugins.add(spec)` to load after install.
351
- - If activation fails, the plugin can remain `enabled=true` and `active=false`.
352
- - `api.lifecycle.signal` is aborted before cleanup runs.
353
- - `api.lifecycle.onDispose(fn)` registers cleanup and returns an unregister function.
354
-
355
- ## Plugin metadata
356
-
357
- `meta` passed to `tui(api, options, meta)` contains:
358
-
359
- - `state`: `first | updated | same`
360
- - `id`, `source`, `spec`, `target`
361
- - npm-only fields when available: `requested`, `version`
362
- - file-only field when available: `modified`
363
- - `first_time`, `last_time`, `time_changed`, `load_count`, `fingerprint`
364
-
365
- Metadata is persisted by plugin id.
366
-
367
- - File plugin fingerprint is `target|modified`.
368
- - npm plugin fingerprint is `target|requested|version`.
369
- - Internal plugins get synthetic metadata with `state: "same"`.
370
-
371
- ## Runtime behavior
372
-
373
- - Internal TUI plugins load first.
374
- - External TUI plugins load from `tuiConfig.plugin`.
375
- - `--pure` / `KILO_PURE` skips external TUI plugins only.
376
- - External plugin resolution and import are parallel.
377
- - Packages with no `./tui` entrypoint and valid `oc-themes` are loaded as synthetic no-op TUI plugin modules.
378
- - Theme-only packages loaded this way appear in `api.plugins.list()` and plugin manager rows like other external plugins.
379
- - Packages with no `./tui` entrypoint and no valid `oc-themes` are skipped with warning.
380
- - External plugin activation is sequential to keep command, route, and side-effect order deterministic.
381
- - Theme auto-sync from `oc-themes` runs before plugin `tui(...)` execution and only on metadata state `first` or `updated`.
382
- - File plugins that fail initially are retried once after waiting for config dependency installation.
383
- - Runtime add uses the same external loader path, including the file-plugin retry after dependency wait.
384
- - Runtime add skips duplicates by resolved spec and returns `true` when the spec is already loaded.
385
- - Runtime install and runtime add are separate operations.
386
- - Plugin init failure rolls back that plugin's tracked registrations and loading continues.
387
- - TUI runtime tracks and disposes:
388
- - command registrations
389
- - route registrations
390
- - event subscriptions
391
- - slot registrations
392
- - explicit `lifecycle.onDispose(...)` handlers
393
- - Cleanup runs in reverse order.
394
- - Cleanup is awaited.
395
- - Total cleanup budget per plugin is 5 seconds; timeout/error is logged and shutdown continues.
396
-
397
- ## Built-in plugins
398
-
399
- - `internal:home-tips`
400
- - `internal:sidebar-context`
401
- - `internal:sidebar-mcp`
402
- - `internal:sidebar-lsp`
403
- - `internal:sidebar-todo`
404
- - `internal:sidebar-files`
405
- - `internal:sidebar-footer`
406
- - `internal:plugin-manager`
407
-
408
- Sidebar content order is currently: context `100`, mcp `200`, lsp `300`, todo `400`, files `500`.
409
-
410
- The plugin manager is exposed as a command with title `Plugins` and value `plugins.list`.
411
-
412
- - Keybind name is `plugin_manager`.
413
- - Default keybind is `none`.
414
- - It lists both internal and external plugins.
415
- - It toggles based on `active`.
416
- - Its own row is disabled only inside the manager dialog.
417
- - It also exposes command `plugins.install` with title `Install plugin`.
418
- - Inside the Plugins dialog, key `shift+i` opens the install prompt.
419
- - Install prompt asks for npm package name.
420
- - Scope defaults to local, and `tab` toggles local/global.
421
- - Install is blocked until `api.state.path.directory` is available; current guard message is `Paths are still syncing. Try again in a moment.`.
422
- - Manager install uses `api.plugins.install(spec, { global })`.
423
- - If the installed package has no `tui` target (`tui=false`), manager reports that and does not expect a runtime load.
424
- - `tui` target detection includes `exports["./tui"]` and valid `oc-themes`.
425
- - If install reports `tui=true`, manager then calls `api.plugins.add(spec)`.
426
- - If runtime add fails, TUI shows a warning and restart remains the fallback.
427
-
428
- ## Current in-repo examples
429
-
430
- - Local smoke plugin: `.saeeol/plugins/tui-smoke.tsx`
431
- - Local vim plugin: `.saeeol/plugins/tui-vim.tsx`
432
- - Local smoke config: `.saeeol/tui.json`
433
- - Local smoke theme: `.saeeol/plugins/smoke-theme.json`
package/specs/v2/api.ts DELETED
@@ -1,67 +0,0 @@
1
- // @ts-nocheck
2
-
3
- import { Saeeol } from "@saeeol/core"
4
- import { ReadTool } from "@saeeol/core/tools"
5
-
6
- const saeeol = Saeeol.make({})
7
-
8
- saeeol.tool.add(ReadTool)
9
-
10
- saeeol.tool.add({
11
- name: "bash",
12
- schema: {
13
- type: "object",
14
- properties: {
15
- command: {
16
- type: "string",
17
- description: "The command to run.",
18
- },
19
- },
20
- required: ["command"],
21
- },
22
- execute(input, ctx) {},
23
- })
24
-
25
- saeeol.auth.add({
26
- provider: "openai",
27
- type: "api",
28
- value: process.env.OPENAI_API_KEY,
29
- })
30
-
31
- saeeol.agent.add({
32
- name: "build",
33
- permissions: [],
34
- model: {
35
- id: "gpt-5-5",
36
- provider: "openai",
37
- variant: "xhigh",
38
- },
39
- })
40
-
41
- const sessionID = await saeeol.session.create({
42
- agent: "build",
43
- })
44
-
45
- saeeol.subscribe((event) => {
46
- console.log(event)
47
- })
48
-
49
- await saeeol.session.prompt({
50
- sessionID,
51
- text: "hey what is up",
52
- })
53
-
54
- await saeeol.session.prompt({
55
- sessionID,
56
- text: "what is up with this",
57
- files: [
58
- {
59
- mime: "image/png",
60
- uri: "data:image/png;base64,xxxx",
61
- },
62
- ],
63
- })
64
-
65
- await saeeol.session.wait()
66
-
67
- console.log(await saeeol.session.messages(sessionID))
@@ -1,10 +0,0 @@
1
- # Keybindings vs. Keymappings
2
-
3
- Make it `keymappings`, closer to neovim. Can be layered like `<leader>abc`. Commands don't define their binding, but have an id that a key can be mapped to like
4
-
5
- ```ts
6
- { key: "ctrl+w", cmd: string | function, description }
7
- ```
8
-
9
- _Why_
10
- Currently its keybindings that have an `id` like `message_redo` and then a command can use that or define it's own binding. While some keybindings are just used with `.match` in arbitrary key handlers and there is no info what the key is used for, except the binding id maybe. It also is unknown in which context/scope what binding is active, so a plugin like `which-key` is nearly impossible to get right.