jonsoc 1.1.50 → 1.1.51

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 (420) hide show
  1. package/AGENTS.md +27 -0
  2. package/Dockerfile +18 -0
  3. package/PUBLISHING_GUIDE.md +151 -0
  4. package/README.md +58 -0
  5. package/bin/jonsoc +256 -256
  6. package/bunfig.toml +7 -0
  7. package/package.json +142 -8
  8. package/package.json.placeholder +11 -0
  9. package/parsers-config.ts +253 -0
  10. package/script/build.ts +115 -0
  11. package/script/publish-registries.ts +197 -0
  12. package/script/publish.ts +149 -0
  13. package/script/schema.ts +47 -0
  14. package/script/seed-e2e.ts +50 -0
  15. package/src/acp/README.md +164 -0
  16. package/src/acp/agent.ts +1437 -0
  17. package/src/acp/session.ts +105 -0
  18. package/src/acp/types.ts +22 -0
  19. package/src/agent/agent.ts +345 -0
  20. package/src/agent/generate.txt +75 -0
  21. package/src/agent/prompt/compaction.txt +12 -0
  22. package/src/agent/prompt/explore.txt +18 -0
  23. package/src/agent/prompt/summary.txt +11 -0
  24. package/src/agent/prompt/title.txt +44 -0
  25. package/src/auth/index.ts +73 -0
  26. package/src/brand/index.ts +89 -0
  27. package/src/bun/index.ts +139 -0
  28. package/src/bus/bus-event.ts +43 -0
  29. package/src/bus/global.ts +10 -0
  30. package/src/bus/index.ts +105 -0
  31. package/src/cli/bootstrap.ts +17 -0
  32. package/src/cli/cmd/acp.ts +69 -0
  33. package/src/cli/cmd/agent.ts +257 -0
  34. package/src/cli/cmd/auth.ts +405 -0
  35. package/src/cli/cmd/cmd.ts +7 -0
  36. package/src/cli/cmd/debug/agent.ts +166 -0
  37. package/src/cli/cmd/debug/config.ts +16 -0
  38. package/src/cli/cmd/debug/file.ts +97 -0
  39. package/src/cli/cmd/debug/index.ts +48 -0
  40. package/src/cli/cmd/debug/lsp.ts +52 -0
  41. package/src/cli/cmd/debug/ripgrep.ts +87 -0
  42. package/src/cli/cmd/debug/scrap.ts +16 -0
  43. package/src/cli/cmd/debug/skill.ts +16 -0
  44. package/src/cli/cmd/debug/snapshot.ts +52 -0
  45. package/src/cli/cmd/export.ts +88 -0
  46. package/src/cli/cmd/generate.ts +38 -0
  47. package/src/cli/cmd/github.ts +1547 -0
  48. package/src/cli/cmd/import.ts +99 -0
  49. package/src/cli/cmd/mcp.ts +765 -0
  50. package/src/cli/cmd/models.ts +77 -0
  51. package/src/cli/cmd/pr.ts +112 -0
  52. package/src/cli/cmd/run.ts +395 -0
  53. package/src/cli/cmd/serve.ts +20 -0
  54. package/src/cli/cmd/session.ts +135 -0
  55. package/src/cli/cmd/stats.ts +402 -0
  56. package/src/cli/cmd/tui/app.tsx +923 -0
  57. package/src/cli/cmd/tui/attach.ts +39 -0
  58. package/src/cli/cmd/tui/component/border.tsx +21 -0
  59. package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
  60. package/src/cli/cmd/tui/component/dialog-command.tsx +162 -0
  61. package/src/cli/cmd/tui/component/dialog-error-log.tsx +155 -0
  62. package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
  63. package/src/cli/cmd/tui/component/dialog-model.tsx +234 -0
  64. package/src/cli/cmd/tui/component/dialog-provider.tsx +256 -0
  65. package/src/cli/cmd/tui/component/dialog-session-list.tsx +114 -0
  66. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
  67. package/src/cli/cmd/tui/component/dialog-stash.tsx +87 -0
  68. package/src/cli/cmd/tui/component/dialog-status.tsx +164 -0
  69. package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
  70. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
  71. package/src/cli/cmd/tui/component/dynamic-layout.tsx +86 -0
  72. package/src/cli/cmd/tui/component/inspector-overlay.tsx +247 -0
  73. package/src/cli/cmd/tui/component/logo.tsx +88 -0
  74. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +653 -0
  75. package/src/cli/cmd/tui/component/prompt/frecency.tsx +89 -0
  76. package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
  77. package/src/cli/cmd/tui/component/prompt/index.tsx +1347 -0
  78. package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
  79. package/src/cli/cmd/tui/component/textarea-keybindings.ts +73 -0
  80. package/src/cli/cmd/tui/component/tips.tsx +153 -0
  81. package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
  82. package/src/cli/cmd/tui/context/args.tsx +14 -0
  83. package/src/cli/cmd/tui/context/directory.ts +13 -0
  84. package/src/cli/cmd/tui/context/error-log.tsx +56 -0
  85. package/src/cli/cmd/tui/context/exit.tsx +26 -0
  86. package/src/cli/cmd/tui/context/helper.tsx +25 -0
  87. package/src/cli/cmd/tui/context/inspector.tsx +57 -0
  88. package/src/cli/cmd/tui/context/keybind.tsx +108 -0
  89. package/src/cli/cmd/tui/context/kv.tsx +53 -0
  90. package/src/cli/cmd/tui/context/layout.tsx +240 -0
  91. package/src/cli/cmd/tui/context/local.tsx +402 -0
  92. package/src/cli/cmd/tui/context/prompt.tsx +18 -0
  93. package/src/cli/cmd/tui/context/route.tsx +51 -0
  94. package/src/cli/cmd/tui/context/sdk.tsx +94 -0
  95. package/src/cli/cmd/tui/context/sync.tsx +449 -0
  96. package/src/cli/cmd/tui/context/theme/aura.json +69 -0
  97. package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
  98. package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
  99. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
  100. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
  101. package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
  102. package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
  103. package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
  104. package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
  105. package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
  106. package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
  107. package/src/cli/cmd/tui/context/theme/github.json +233 -0
  108. package/src/cli/cmd/tui/context/theme/gruvbox.json +242 -0
  109. package/src/cli/cmd/tui/context/theme/jonsoc.json +245 -0
  110. package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
  111. package/src/cli/cmd/tui/context/theme/lucent-orng.json +237 -0
  112. package/src/cli/cmd/tui/context/theme/material.json +235 -0
  113. package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
  114. package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
  115. package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
  116. package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
  117. package/src/cli/cmd/tui/context/theme/nord.json +223 -0
  118. package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
  119. package/src/cli/cmd/tui/context/theme/orng.json +249 -0
  120. package/src/cli/cmd/tui/context/theme/osaka-jade.json +93 -0
  121. package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
  122. package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
  123. package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
  124. package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
  125. package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
  126. package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
  127. package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
  128. package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
  129. package/src/cli/cmd/tui/context/theme.tsx +1152 -0
  130. package/src/cli/cmd/tui/event.ts +48 -0
  131. package/src/cli/cmd/tui/hooks/use-command-registry.tsx +184 -0
  132. package/src/cli/cmd/tui/routes/home.tsx +198 -0
  133. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +64 -0
  134. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +109 -0
  135. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +26 -0
  136. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
  137. package/src/cli/cmd/tui/routes/session/footer.tsx +91 -0
  138. package/src/cli/cmd/tui/routes/session/git-commit.tsx +59 -0
  139. package/src/cli/cmd/tui/routes/session/git-history.tsx +122 -0
  140. package/src/cli/cmd/tui/routes/session/header.tsx +185 -0
  141. package/src/cli/cmd/tui/routes/session/index.tsx +2363 -0
  142. package/src/cli/cmd/tui/routes/session/navigator-ui.tsx +214 -0
  143. package/src/cli/cmd/tui/routes/session/navigator.tsx +1124 -0
  144. package/src/cli/cmd/tui/routes/session/panel-explorer.tsx +553 -0
  145. package/src/cli/cmd/tui/routes/session/panel-viewer.tsx +386 -0
  146. package/src/cli/cmd/tui/routes/session/permission.tsx +501 -0
  147. package/src/cli/cmd/tui/routes/session/question.tsx +507 -0
  148. package/src/cli/cmd/tui/routes/session/sidebar.tsx +365 -0
  149. package/src/cli/cmd/tui/routes/session/vcs-diff-viewer.tsx +37 -0
  150. package/src/cli/cmd/tui/routes/ui-settings.tsx +449 -0
  151. package/src/cli/cmd/tui/thread.ts +172 -0
  152. package/src/cli/cmd/tui/ui/dialog-alert.tsx +90 -0
  153. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +83 -0
  154. package/src/cli/cmd/tui/ui/dialog-export-options.tsx +204 -0
  155. package/src/cli/cmd/tui/ui/dialog-help.tsx +38 -0
  156. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +77 -0
  157. package/src/cli/cmd/tui/ui/dialog-select.tsx +384 -0
  158. package/src/cli/cmd/tui/ui/dialog.tsx +170 -0
  159. package/src/cli/cmd/tui/ui/link.tsx +28 -0
  160. package/src/cli/cmd/tui/ui/spinner.ts +375 -0
  161. package/src/cli/cmd/tui/ui/toast.tsx +100 -0
  162. package/src/cli/cmd/tui/util/clipboard.ts +255 -0
  163. package/src/cli/cmd/tui/util/editor.ts +32 -0
  164. package/src/cli/cmd/tui/util/signal.ts +7 -0
  165. package/src/cli/cmd/tui/util/terminal.ts +114 -0
  166. package/src/cli/cmd/tui/util/transcript.ts +98 -0
  167. package/src/cli/cmd/tui/worker.ts +152 -0
  168. package/src/cli/cmd/uninstall.ts +362 -0
  169. package/src/cli/cmd/upgrade.ts +73 -0
  170. package/src/cli/cmd/web.ts +81 -0
  171. package/src/cli/error.ts +57 -0
  172. package/src/cli/network.ts +53 -0
  173. package/src/cli/ui.ts +119 -0
  174. package/src/cli/upgrade.ts +25 -0
  175. package/src/command/index.ts +131 -0
  176. package/src/command/template/initialize.txt +10 -0
  177. package/src/command/template/review.txt +99 -0
  178. package/src/config/config.ts +1404 -0
  179. package/src/config/markdown.ts +93 -0
  180. package/src/env/index.ts +26 -0
  181. package/src/file/ignore.ts +83 -0
  182. package/src/file/index.ts +432 -0
  183. package/src/file/ripgrep.ts +407 -0
  184. package/src/file/time.ts +69 -0
  185. package/src/file/watcher.ts +127 -0
  186. package/src/flag/flag.ts +80 -0
  187. package/src/format/formatter.ts +357 -0
  188. package/src/format/index.ts +137 -0
  189. package/src/global/index.ts +58 -0
  190. package/src/id/id.ts +83 -0
  191. package/src/ide/index.ts +76 -0
  192. package/src/index.ts +208 -0
  193. package/src/installation/index.ts +258 -0
  194. package/src/lsp/client.ts +252 -0
  195. package/src/lsp/index.ts +485 -0
  196. package/src/lsp/language.ts +119 -0
  197. package/src/lsp/server.ts +2046 -0
  198. package/src/mcp/auth.ts +135 -0
  199. package/src/mcp/index.ts +934 -0
  200. package/src/mcp/oauth-callback.ts +200 -0
  201. package/src/mcp/oauth-provider.ts +155 -0
  202. package/src/patch/index.ts +680 -0
  203. package/src/permission/arity.ts +163 -0
  204. package/src/permission/index.ts +210 -0
  205. package/src/permission/next.ts +280 -0
  206. package/src/plugin/codex.ts +500 -0
  207. package/src/plugin/copilot.ts +283 -0
  208. package/src/plugin/index.ts +135 -0
  209. package/src/project/bootstrap.ts +35 -0
  210. package/src/project/instance.ts +91 -0
  211. package/src/project/project.ts +371 -0
  212. package/src/project/state.ts +66 -0
  213. package/src/project/vcs.ts +151 -0
  214. package/src/provider/auth.ts +147 -0
  215. package/src/provider/models-macro.ts +14 -0
  216. package/src/provider/models.ts +114 -0
  217. package/src/provider/provider.ts +1220 -0
  218. package/src/provider/sdk/openai-compatible/src/README.md +5 -0
  219. package/src/provider/sdk/openai-compatible/src/index.ts +2 -0
  220. package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +100 -0
  221. package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +303 -0
  222. package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +22 -0
  223. package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +18 -0
  224. package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +22 -0
  225. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +207 -0
  226. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +1732 -0
  227. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +177 -0
  228. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +1 -0
  229. package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +88 -0
  230. package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +128 -0
  231. package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +115 -0
  232. package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +65 -0
  233. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +104 -0
  234. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +103 -0
  235. package/src/provider/transform.ts +742 -0
  236. package/src/pty/index.ts +241 -0
  237. package/src/question/index.ts +176 -0
  238. package/src/scheduler/index.ts +61 -0
  239. package/src/server/error.ts +36 -0
  240. package/src/server/event.ts +7 -0
  241. package/src/server/mdns.ts +59 -0
  242. package/src/server/routes/config.ts +92 -0
  243. package/src/server/routes/experimental.ts +208 -0
  244. package/src/server/routes/file.ts +227 -0
  245. package/src/server/routes/global.ts +135 -0
  246. package/src/server/routes/mcp.ts +225 -0
  247. package/src/server/routes/permission.ts +68 -0
  248. package/src/server/routes/project.ts +82 -0
  249. package/src/server/routes/provider.ts +165 -0
  250. package/src/server/routes/pty.ts +169 -0
  251. package/src/server/routes/question.ts +98 -0
  252. package/src/server/routes/session.ts +939 -0
  253. package/src/server/routes/tui.ts +379 -0
  254. package/src/server/server.ts +663 -0
  255. package/src/session/compaction.ts +225 -0
  256. package/src/session/index.ts +498 -0
  257. package/src/session/llm.ts +288 -0
  258. package/src/session/message-v2.ts +740 -0
  259. package/src/session/message.ts +189 -0
  260. package/src/session/processor.ts +406 -0
  261. package/src/session/prompt/anthropic-20250930.txt +168 -0
  262. package/src/session/prompt/anthropic.txt +172 -0
  263. package/src/session/prompt/anthropic_spoof.txt +1 -0
  264. package/src/session/prompt/beast.txt +149 -0
  265. package/src/session/prompt/build-switch.txt +5 -0
  266. package/src/session/prompt/codex_header.txt +81 -0
  267. package/src/session/prompt/copilot-gpt-5.txt +145 -0
  268. package/src/session/prompt/gemini.txt +157 -0
  269. package/src/session/prompt/max-steps.txt +16 -0
  270. package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
  271. package/src/session/prompt/plan.txt +26 -0
  272. package/src/session/prompt/qwen.txt +111 -0
  273. package/src/session/prompt.ts +1815 -0
  274. package/src/session/retry.ts +90 -0
  275. package/src/session/revert.ts +121 -0
  276. package/src/session/status.ts +76 -0
  277. package/src/session/summary.ts +150 -0
  278. package/src/session/system.ts +156 -0
  279. package/src/session/todo.ts +37 -0
  280. package/src/share/share-next.ts +205 -0
  281. package/src/share/share.ts +95 -0
  282. package/src/shell/shell.ts +67 -0
  283. package/src/skill/index.ts +1 -0
  284. package/src/skill/skill.ts +135 -0
  285. package/src/snapshot/index.ts +236 -0
  286. package/src/storage/storage.ts +227 -0
  287. package/src/tool/apply_patch.ts +279 -0
  288. package/src/tool/apply_patch.txt +33 -0
  289. package/src/tool/bash.ts +258 -0
  290. package/src/tool/bash.txt +115 -0
  291. package/src/tool/batch.ts +175 -0
  292. package/src/tool/batch.txt +24 -0
  293. package/src/tool/codesearch.ts +132 -0
  294. package/src/tool/codesearch.txt +12 -0
  295. package/src/tool/edit.ts +645 -0
  296. package/src/tool/edit.txt +10 -0
  297. package/src/tool/external-directory.ts +32 -0
  298. package/src/tool/glob.ts +77 -0
  299. package/src/tool/glob.txt +6 -0
  300. package/src/tool/grep.ts +154 -0
  301. package/src/tool/grep.txt +8 -0
  302. package/src/tool/invalid.ts +17 -0
  303. package/src/tool/ls.ts +121 -0
  304. package/src/tool/ls.txt +1 -0
  305. package/src/tool/lsp.ts +96 -0
  306. package/src/tool/lsp.txt +19 -0
  307. package/src/tool/multiedit.ts +46 -0
  308. package/src/tool/multiedit.txt +41 -0
  309. package/src/tool/plan-enter.txt +14 -0
  310. package/src/tool/plan-exit.txt +13 -0
  311. package/src/tool/plan.ts +130 -0
  312. package/src/tool/question.ts +33 -0
  313. package/src/tool/question.txt +10 -0
  314. package/src/tool/read.ts +202 -0
  315. package/src/tool/read.txt +12 -0
  316. package/src/tool/registry.ts +162 -0
  317. package/src/tool/skill.ts +82 -0
  318. package/src/tool/task.ts +188 -0
  319. package/src/tool/task.txt +60 -0
  320. package/src/tool/todo.ts +53 -0
  321. package/src/tool/todoread.txt +14 -0
  322. package/src/tool/todowrite.txt +167 -0
  323. package/src/tool/tool.ts +88 -0
  324. package/src/tool/truncation.ts +106 -0
  325. package/src/tool/webfetch.ts +182 -0
  326. package/src/tool/webfetch.txt +13 -0
  327. package/src/tool/websearch.ts +150 -0
  328. package/src/tool/websearch.txt +14 -0
  329. package/src/tool/write.ts +80 -0
  330. package/src/tool/write.txt +8 -0
  331. package/src/util/archive.ts +16 -0
  332. package/src/util/color.ts +19 -0
  333. package/src/util/context.ts +25 -0
  334. package/src/util/defer.ts +12 -0
  335. package/src/util/eventloop.ts +20 -0
  336. package/src/util/filesystem.ts +93 -0
  337. package/src/util/fn.ts +11 -0
  338. package/src/util/format.ts +20 -0
  339. package/src/util/iife.ts +3 -0
  340. package/src/util/keybind.ts +103 -0
  341. package/src/util/lazy.ts +18 -0
  342. package/src/util/locale.ts +81 -0
  343. package/src/util/lock.ts +98 -0
  344. package/src/util/log.ts +180 -0
  345. package/src/util/queue.ts +32 -0
  346. package/src/util/rpc.ts +66 -0
  347. package/src/util/scrap.ts +10 -0
  348. package/src/util/signal.ts +12 -0
  349. package/src/util/timeout.ts +14 -0
  350. package/src/util/token.ts +7 -0
  351. package/src/util/wildcard.ts +56 -0
  352. package/src/worktree/index.ts +524 -0
  353. package/sst-env.d.ts +9 -0
  354. package/test/acp/agent-interface.test.ts +51 -0
  355. package/test/acp/event-subscription.test.ts +436 -0
  356. package/test/agent/agent.test.ts +638 -0
  357. package/test/bun.test.ts +53 -0
  358. package/test/cli/cmd/tui/fileref.test.ts +30 -0
  359. package/test/cli/github-action.test.ts +129 -0
  360. package/test/cli/github-remote.test.ts +80 -0
  361. package/test/cli/tui/navigator_logic.test.ts +99 -0
  362. package/test/cli/tui/transcript.test.ts +297 -0
  363. package/test/cli/ui.test.ts +80 -0
  364. package/test/config/agent-color.test.ts +66 -0
  365. package/test/config/config.test.ts +1613 -0
  366. package/test/config/fixtures/empty-frontmatter.md +4 -0
  367. package/test/config/fixtures/frontmatter.md +28 -0
  368. package/test/config/fixtures/no-frontmatter.md +1 -0
  369. package/test/config/markdown.test.ts +192 -0
  370. package/test/file/ignore.test.ts +10 -0
  371. package/test/file/path-traversal.test.ts +198 -0
  372. package/test/fixture/fixture.ts +45 -0
  373. package/test/fixture/lsp/fake-lsp-server.js +77 -0
  374. package/test/ide/ide.test.ts +82 -0
  375. package/test/keybind.test.ts +421 -0
  376. package/test/lsp/client.test.ts +95 -0
  377. package/test/mcp/headers.test.ts +153 -0
  378. package/test/mcp/oauth-browser.test.ts +261 -0
  379. package/test/patch/patch.test.ts +348 -0
  380. package/test/permission/arity.test.ts +33 -0
  381. package/test/permission/next.test.ts +690 -0
  382. package/test/permission-task.test.ts +319 -0
  383. package/test/plugin/codex.test.ts +123 -0
  384. package/test/preload.ts +67 -0
  385. package/test/project/project.test.ts +120 -0
  386. package/test/provider/amazon-bedrock.test.ts +268 -0
  387. package/test/provider/gitlab-duo.test.ts +286 -0
  388. package/test/provider/provider.test.ts +2149 -0
  389. package/test/provider/transform.test.ts +1631 -0
  390. package/test/question/question.test.ts +300 -0
  391. package/test/scheduler.test.ts +73 -0
  392. package/test/server/session-list.test.ts +39 -0
  393. package/test/server/session-select.test.ts +78 -0
  394. package/test/session/compaction.test.ts +293 -0
  395. package/test/session/llm.test.ts +90 -0
  396. package/test/session/message-v2.test.ts +786 -0
  397. package/test/session/retry.test.ts +131 -0
  398. package/test/session/revert-compact.test.ts +285 -0
  399. package/test/session/session.test.ts +71 -0
  400. package/test/skill/skill.test.ts +185 -0
  401. package/test/snapshot/snapshot.test.ts +939 -0
  402. package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
  403. package/test/tool/apply_patch.test.ts +499 -0
  404. package/test/tool/bash.test.ts +320 -0
  405. package/test/tool/external-directory.test.ts +126 -0
  406. package/test/tool/fixtures/large-image.png +0 -0
  407. package/test/tool/fixtures/models-api.json +33453 -0
  408. package/test/tool/grep.test.ts +109 -0
  409. package/test/tool/question.test.ts +105 -0
  410. package/test/tool/read.test.ts +332 -0
  411. package/test/tool/registry.test.ts +76 -0
  412. package/test/tool/truncation.test.ts +159 -0
  413. package/test/util/filesystem.test.ts +39 -0
  414. package/test/util/format.test.ts +59 -0
  415. package/test/util/iife.test.ts +36 -0
  416. package/test/util/lazy.test.ts +50 -0
  417. package/test/util/lock.test.ts +72 -0
  418. package/test/util/timeout.test.ts +21 -0
  419. package/test/util/wildcard.test.ts +75 -0
  420. package/tsconfig.json +16 -0
package/bin/jonsoc CHANGED
@@ -1,156 +1,156 @@
1
- #!/usr/bin/env node
2
-
3
- import { spawnSync } from "child_process"
4
- import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "fs"
5
- import { dirname, join } from "path"
6
- import { platform as osPlatform, arch as osArch, homedir } from "os"
7
- import { fileURLToPath } from "url"
8
- import { xdgData, xdgState } from "xdg-basedir"
9
-
10
- /** Exit code 75 signals a restart request from the TUI */
11
- const EXIT_CODE_RESTART = 75
12
-
13
- const __filename = fileURLToPath(import.meta.url)
14
- const __dirname = dirname(__filename)
15
- const cwd = process.cwd()
16
- const env = {
17
- ...process.env,
18
- JONSOC_WORKDIR: process.env.JONSOC_WORKDIR ?? process.env.JOC_WORKDIR ?? cwd,
19
- JONSOC_CLI: "1",
20
- }
21
-
22
- function run(target, args, options = {}) {
23
- const result = spawnSync(target, args || process.argv.slice(2), {
24
- stdio: "inherit",
25
- shell: osPlatform() === "win32",
26
- cwd: options.cwd,
27
- env: options.env,
28
- })
29
- if (result.error) {
30
- console.error(result.error.message)
31
- process.exit(1)
32
- }
33
- return typeof result.status === "number" ? result.status : 0
34
- }
35
-
36
- const rawArgs = process.argv.slice(2)
37
- const hasFlag = (value) => rawArgs.includes(value)
38
- const safe = hasFlag("-safe") || hasFlag("--safe")
39
- const restart = hasFlag("-restart") || hasFlag("--restart") || hasFlag("-return") || hasFlag("--return")
40
- const autoReturn = hasFlag("-auto-return") || hasFlag("--auto-return")
41
- const check = hasFlag("-check") || hasFlag("--check")
42
- const safeIsolated =
43
- hasFlag("-safe-isolated") ||
44
- hasFlag("--safe-isolated") ||
45
- process.env.JONSOC_SAFE_ISOLATE === "1" ||
46
- process.env.OPENCODE_SAFE_ISOLATE === "1"
47
- const flagSet = new Set([
48
- "-safe",
49
- "--safe",
50
- "-restart",
51
- "--restart",
52
- "-return",
53
- "--return",
54
- "-auto-return",
55
- "--auto-return",
56
- "-check",
57
- "--check",
58
- "-safe-isolated",
59
- "--safe-isolated",
60
- ])
61
- const baseArgs = rawArgs.filter((arg) => !flagSet.has(arg))
62
- const appName = process.env.JONSOC_APP_NAME ?? process.env.OPENCODE_APP_NAME ?? "jonsoc"
63
- const stateAppName = safe && safeIsolated ? `${appName}-safe` : appName
64
-
65
- const stateDir = () => {
66
- const root = xdgState ?? join(homedir(), ".local", "state")
67
- return join(root, stateAppName)
68
- }
69
-
70
- const lastSession = () => {
71
- const filePath = join(stateDir(), "kv.json")
72
- if (!existsSync(filePath)) return
73
- const raw = readFileSync(filePath, "utf8")
74
- if (!raw) return
75
- try {
76
- const data = JSON.parse(raw)
77
- const session = data?.session_last
78
- if (typeof session !== "string") return
79
- return session
80
- } catch {
81
- return
82
- }
83
- }
84
-
85
- const restartArgs = (() => {
86
- if (!restart) return baseArgs
87
- if (baseArgs.includes("--session") || baseArgs.includes("-s")) return baseArgs
88
- const sessionID = lastSession()
89
- if (!sessionID) {
90
- console.error("No recent session found to restart.")
91
- process.exit(1)
92
- }
93
- return ["--session", sessionID, ...baseArgs]
94
- })()
95
-
96
- if (check) {
97
- console.log("running")
98
- process.exit(0)
99
- }
100
-
101
- /** Build args for restart - add --session if we have a last session */
102
- function buildRestartArgs() {
103
- if (baseArgs.includes("--session") || baseArgs.includes("-s")) return baseArgs
104
- const sessionID = lastSession()
105
- if (!sessionID) return baseArgs
106
- return ["--session", sessionID, ...baseArgs]
107
- }
108
-
109
- /** Run the CLI and handle restart exit code */
110
- function runWithRestart(target, prefix, trailingArgs, options = {}) {
111
- let args = [...prefix, ...trailingArgs]
112
- for (;;) {
113
- const code = run(target, args, options)
114
-
115
- // Clean exit (user typed /exit, /quit, or Ctrl+C handled cleanly)
116
- if (code === 0) {
117
- process.exit(0)
118
- }
119
-
120
- // Requested restart (code 75) or Crash/Error (code != 0)
121
- // We always attempt to return to the session on any failure.
122
- if (code !== 0) {
123
- if (code !== EXIT_CODE_RESTART) {
124
- console.error(`\n[jonsoc] unexpected exit (${code}). recovering session...`)
125
- // 1s throttle only on actual crashes to prevent cpu pinning if there's a persistent boot error
126
- spawnSync("node", ["-e", "setTimeout(() => {}, 1000)"], { stdio: "inherit" })
127
- }
128
- args = [...prefix, ...buildRestartArgs()]
129
- continue
130
- }
131
-
132
- process.exit(code)
133
- }
134
- }
135
-
136
- if (safe) {
137
- const safeEnv = {
138
- ...env,
139
- ...(safeIsolated ? { JONSOC_APP_NAME: `${appName}-safe` } : {}),
140
- JONSOC_SAFE_MODE: "1",
141
- }
142
- runWithRestart("npx", ["--yes", "jonsoc@latest"], restartArgs, { env: safeEnv })
143
- }
144
-
145
- const envPath = process.env.JONSOC_BIN_PATH || process.env.JOC_BIN_PATH || process.env.OPENCODE_BIN_PATH
146
- if (envPath) {
147
- runWithRestart(envPath, [], restartArgs, { env })
148
- }
149
-
150
- const scriptPath = realpathSync(__filename)
151
- const scriptDir = dirname(scriptPath)
152
- const pkgDir = dirname(scriptDir)
153
-
1
+ #!/usr/bin/env node
2
+
3
+ import { spawnSync } from "child_process"
4
+ import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "fs"
5
+ import { dirname, join } from "path"
6
+ import { platform as osPlatform, arch as osArch, homedir } from "os"
7
+ import { fileURLToPath } from "url"
8
+ import { xdgData, xdgState } from "xdg-basedir"
9
+
10
+ /** Exit code 75 signals a restart request from the TUI */
11
+ const EXIT_CODE_RESTART = 75
12
+
13
+ const __filename = fileURLToPath(import.meta.url)
14
+ const __dirname = dirname(__filename)
15
+ const cwd = process.cwd()
16
+ const env = {
17
+ ...process.env,
18
+ JONSOC_WORKDIR: process.env.JONSOC_WORKDIR ?? process.env.JOC_WORKDIR ?? cwd,
19
+ JONSOC_CLI: "1",
20
+ }
21
+
22
+ function run(target, args, options = {}) {
23
+ const result = spawnSync(target, args || process.argv.slice(2), {
24
+ stdio: "inherit",
25
+ shell: osPlatform() === "win32",
26
+ cwd: options.cwd,
27
+ env: options.env,
28
+ })
29
+ if (result.error) {
30
+ console.error(result.error.message)
31
+ process.exit(1)
32
+ }
33
+ return typeof result.status === "number" ? result.status : 0
34
+ }
35
+
36
+ const rawArgs = process.argv.slice(2)
37
+ const hasFlag = (value) => rawArgs.includes(value)
38
+ const safe = hasFlag("-safe") || hasFlag("--safe")
39
+ const restart = hasFlag("-restart") || hasFlag("--restart") || hasFlag("-return") || hasFlag("--return")
40
+ const autoReturn = hasFlag("-auto-return") || hasFlag("--auto-return")
41
+ const check = hasFlag("-check") || hasFlag("--check")
42
+ const safeIsolated =
43
+ hasFlag("-safe-isolated") ||
44
+ hasFlag("--safe-isolated") ||
45
+ process.env.JONSOC_SAFE_ISOLATE === "1" ||
46
+ process.env.OPENCODE_SAFE_ISOLATE === "1"
47
+ const flagSet = new Set([
48
+ "-safe",
49
+ "--safe",
50
+ "-restart",
51
+ "--restart",
52
+ "-return",
53
+ "--return",
54
+ "-auto-return",
55
+ "--auto-return",
56
+ "-check",
57
+ "--check",
58
+ "-safe-isolated",
59
+ "--safe-isolated",
60
+ ])
61
+ const baseArgs = rawArgs.filter((arg) => !flagSet.has(arg))
62
+ const appName = process.env.JONSOC_APP_NAME ?? process.env.OPENCODE_APP_NAME ?? "jonsoc"
63
+ const stateAppName = safe && safeIsolated ? `${appName}-safe` : appName
64
+
65
+ const stateDir = () => {
66
+ const root = xdgState ?? join(homedir(), ".local", "state")
67
+ return join(root, stateAppName)
68
+ }
69
+
70
+ const lastSession = () => {
71
+ const filePath = join(stateDir(), "kv.json")
72
+ if (!existsSync(filePath)) return
73
+ const raw = readFileSync(filePath, "utf8")
74
+ if (!raw) return
75
+ try {
76
+ const data = JSON.parse(raw)
77
+ const session = data?.session_last
78
+ if (typeof session !== "string") return
79
+ return session
80
+ } catch {
81
+ return
82
+ }
83
+ }
84
+
85
+ const restartArgs = (() => {
86
+ if (!restart) return baseArgs
87
+ if (baseArgs.includes("--session") || baseArgs.includes("-s")) return baseArgs
88
+ const sessionID = lastSession()
89
+ if (!sessionID) {
90
+ console.error("No recent session found to restart.")
91
+ process.exit(1)
92
+ }
93
+ return ["--session", sessionID, ...baseArgs]
94
+ })()
95
+
96
+ if (check) {
97
+ console.log("running")
98
+ process.exit(0)
99
+ }
100
+
101
+ /** Build args for restart - add --session if we have a last session */
102
+ function buildRestartArgs() {
103
+ if (baseArgs.includes("--session") || baseArgs.includes("-s")) return baseArgs
104
+ const sessionID = lastSession()
105
+ if (!sessionID) return baseArgs
106
+ return ["--session", sessionID, ...baseArgs]
107
+ }
108
+
109
+ /** Run the CLI and handle restart exit code */
110
+ function runWithRestart(target, prefix, trailingArgs, options = {}) {
111
+ let args = [...prefix, ...trailingArgs]
112
+ for (;;) {
113
+ const code = run(target, args, options)
114
+
115
+ // Clean exit (user typed /exit, /quit, or Ctrl+C handled cleanly)
116
+ if (code === 0) {
117
+ process.exit(0)
118
+ }
119
+
120
+ // Requested restart (code 75) or Crash/Error (code != 0)
121
+ // We always attempt to return to the session on any failure.
122
+ if (code !== 0) {
123
+ if (code !== EXIT_CODE_RESTART) {
124
+ console.error(`\n[jonsoc] unexpected exit (${code}). recovering session...`)
125
+ // 1s throttle only on actual crashes to prevent cpu pinning if there's a persistent boot error
126
+ spawnSync("node", ["-e", "setTimeout(() => {}, 1000)"], { stdio: "inherit" })
127
+ }
128
+ args = [...prefix, ...buildRestartArgs()]
129
+ continue
130
+ }
131
+
132
+ process.exit(code)
133
+ }
134
+ }
135
+
136
+ if (safe) {
137
+ const safeEnv = {
138
+ ...env,
139
+ ...(safeIsolated ? { JONSOC_APP_NAME: `${appName}-safe` } : {}),
140
+ JONSOC_SAFE_MODE: "1",
141
+ }
142
+ runWithRestart("npx", ["--yes", "jonsoc@latest"], restartArgs, { env: safeEnv })
143
+ }
144
+
145
+ const envPath = process.env.JONSOC_BIN_PATH || process.env.JOC_BIN_PATH || process.env.OPENCODE_BIN_PATH
146
+ if (envPath) {
147
+ runWithRestart(envPath, [], restartArgs, { env })
148
+ }
149
+
150
+ const scriptPath = realpathSync(__filename)
151
+ const scriptDir = dirname(scriptPath)
152
+ const pkgDir = dirname(scriptDir)
153
+
154
154
  // Development mode: run TypeScript source directly with bun when inside repo
155
155
  function repoRoot(dir) {
156
156
  const entry = join(dir, "packages", "jonsoc", "src", "index.ts")
@@ -165,92 +165,92 @@ if (root) {
165
165
  const workdir = join(root, "packages", "jonsoc")
166
166
  runWithRestart("bun", ["run", "--conditions=browser", "src/index.ts"], restartArgs, { cwd: workdir, env })
167
167
  }
168
-
169
-
170
- // Production mode: fetch compiled binary into XDG data dir
171
- const platformMap = {
172
- darwin: "darwin",
173
- linux: "linux",
174
- win32: "windows",
175
- }
176
- const archMap = {
177
- x64: "x64",
178
- arm64: "arm64",
179
- arm: "arm",
180
- }
181
-
182
- let platform = platformMap[osPlatform()]
183
- if (!platform) {
184
- platform = osPlatform()
185
- }
186
- let arch = archMap[osArch()]
187
- if (!arch) {
188
- arch = osArch()
189
- }
168
+
169
+
170
+ // Production mode: fetch compiled binary into XDG data dir
171
+ const platformMap = {
172
+ darwin: "darwin",
173
+ linux: "linux",
174
+ win32: "windows",
175
+ }
176
+ const archMap = {
177
+ x64: "x64",
178
+ arm64: "arm64",
179
+ arm: "arm",
180
+ }
181
+
182
+ let platform = platformMap[osPlatform()]
183
+ if (!platform) {
184
+ platform = osPlatform()
185
+ }
186
+ let arch = archMap[osArch()]
187
+ if (!arch) {
188
+ arch = osArch()
189
+ }
190
190
  const base = "jonsoc-" + platform + "-" + arch
191
191
  const binary = platform === "windows" ? "jonsoc.exe" : "jonsoc"
192
-
193
- const supported = new Set(["darwin-arm64", "linux-x64", "windows-x64"])
194
- if (!supported.has(`${platform}-${arch}`)) {
195
- console.error(`[jonsoc] Unsupported platform: ${platform}-${arch}. Supported: ${Array.from(supported).join(", ")}`)
196
- process.exit(1)
197
- }
198
-
199
- const pkgJsonPath = join(pkgDir, "package.json")
200
- const version = (() => {
201
- if (!existsSync(pkgJsonPath)) return "latest"
202
- const raw = readFileSync(pkgJsonPath, "utf8")
203
- const data = JSON.parse(raw)
204
- return typeof data.version === "string" ? data.version : "latest"
205
- })()
206
-
192
+
193
+ const supported = new Set(["darwin-arm64", "linux-x64", "windows-x64"])
194
+ if (!supported.has(`${platform}-${arch}`)) {
195
+ console.error(`[jonsoc] Unsupported platform: ${platform}-${arch}. Supported: ${Array.from(supported).join(", ")}`)
196
+ process.exit(1)
197
+ }
198
+
199
+ const pkgJsonPath = join(pkgDir, "package.json")
200
+ const version = (() => {
201
+ if (!existsSync(pkgJsonPath)) return "latest"
202
+ const raw = readFileSync(pkgJsonPath, "utf8")
203
+ const data = JSON.parse(raw)
204
+ return typeof data.version === "string" ? data.version : "latest"
205
+ })()
206
+
207
207
  const repo = (process.env.JONSOC_REPO ?? process.env.OPENCODE_REPO ?? "Noisemaker111/Jonsoc").replace(
208
- /^https?:\/\/github\.com\//,
209
- "",
210
- )
211
- const dataRoot = xdgData ?? join(homedir(), ".local", "share")
212
- const dataDir = join(dataRoot, appName)
213
- const binDir = join(dataDir, "bin")
214
- const versionFile = join(binDir, "version")
215
- const binaryPath = join(binDir, binary)
216
-
217
- function ensureDir(dir) {
218
- if (existsSync(dir)) return
219
- mkdirSync(dir, { recursive: true })
220
- }
221
-
222
- function versionMatch() {
223
- if (!existsSync(binaryPath)) return false
224
- if (!existsSync(versionFile)) return false
225
- const stored = readFileSync(versionFile, "utf8").trim()
226
- return stored === version
227
- }
228
-
229
- function releaseUrl() {
230
- const asset = platform === "linux" ? `${base}.tar.gz` : `${base}.zip`
231
- const releasePath = version === "latest" ? "latest/download" : `download/v${version}`
232
- return {
233
- asset,
234
- url: `https://github.com/${repo}/releases/${releasePath}/${asset}`,
235
- }
236
- }
237
-
208
+ /^https?:\/\/github\.com\//,
209
+ "",
210
+ )
211
+ const dataRoot = xdgData ?? join(homedir(), ".local", "share")
212
+ const dataDir = join(dataRoot, appName)
213
+ const binDir = join(dataDir, "bin")
214
+ const versionFile = join(binDir, "version")
215
+ const binaryPath = join(binDir, binary)
216
+
217
+ function ensureDir(dir) {
218
+ if (existsSync(dir)) return
219
+ mkdirSync(dir, { recursive: true })
220
+ }
221
+
222
+ function versionMatch() {
223
+ if (!existsSync(binaryPath)) return false
224
+ if (!existsSync(versionFile)) return false
225
+ const stored = readFileSync(versionFile, "utf8").trim()
226
+ return stored === version
227
+ }
228
+
229
+ function releaseUrl() {
230
+ const asset = platform === "linux" ? `${base}.tar.gz` : `${base}.zip`
231
+ const releasePath = version === "latest" ? "latest/download" : `download/v${version}`
232
+ return {
233
+ asset,
234
+ url: `https://github.com/${repo}/releases/${releasePath}/${asset}`,
235
+ }
236
+ }
237
+
238
238
  function extractArchive(archivePath) {
239
- if (platform === "linux") {
240
- const code = run("tar", ["-xzf", archivePath, "-C", binDir], { env })
241
- if (code !== 0) process.exit(code)
242
- return
243
- }
244
-
245
- if (platform === "windows") {
246
- const cmd = `Expand-Archive -Path "${archivePath}" -DestinationPath "${binDir}" -Force`
247
- const code = run("powershell", ["-NoProfile", "-Command", cmd], { env })
248
- if (code !== 0) process.exit(code)
249
- return
250
- }
251
-
252
- const code = run("unzip", ["-o", archivePath, "-d", binDir], { env })
253
- if (code !== 0) process.exit(code)
239
+ if (platform === "linux") {
240
+ const code = run("tar", ["-xzf", archivePath, "-C", binDir], { env })
241
+ if (code !== 0) process.exit(code)
242
+ return
243
+ }
244
+
245
+ if (platform === "windows") {
246
+ const cmd = `Expand-Archive -Path "${archivePath}" -DestinationPath "${binDir}" -Force`
247
+ const code = run("powershell", ["-NoProfile", "-Command", cmd], { env })
248
+ if (code !== 0) process.exit(code)
249
+ return
250
+ }
251
+
252
+ const code = run("unzip", ["-o", archivePath, "-d", binDir], { env })
253
+ if (code !== 0) process.exit(code)
254
254
  }
255
255
 
256
256
  function bundledBinary() {
@@ -264,24 +264,24 @@ function ensureBinary() {
264
264
  if (bundle) return bundle
265
265
  if (versionMatch()) return binaryPath
266
266
  ensureDir(binDir)
267
- const { asset, url } = releaseUrl()
268
- const archivePath = join(dataDir, asset)
269
- const code = run("curl", ["-fL", "-o", archivePath, url], { env })
270
- if (code !== 0) {
271
- console.error(`[jonsoc] Failed to download ${url}`)
272
- process.exit(code)
273
- }
274
- extractArchive(archivePath)
275
- if (platform !== "windows") {
276
- run("chmod", ["+x", binaryPath], { env })
277
- }
278
- if (!existsSync(binaryPath)) {
279
- console.error(`[jonsoc] Expected binary not found at ${binaryPath}`)
280
- process.exit(1)
281
- }
282
- writeFileSync(versionFile, version)
283
- return binaryPath
284
- }
285
-
286
- const resolved = ensureBinary()
287
- runWithRestart(resolved, [], restartArgs, { env })
267
+ const { asset, url } = releaseUrl()
268
+ const archivePath = join(dataDir, asset)
269
+ const code = run("curl", ["-fL", "-o", archivePath, url], { env })
270
+ if (code !== 0) {
271
+ console.error(`[jonsoc] Failed to download ${url}`)
272
+ process.exit(code)
273
+ }
274
+ extractArchive(archivePath)
275
+ if (platform !== "windows") {
276
+ run("chmod", ["+x", binaryPath], { env })
277
+ }
278
+ if (!existsSync(binaryPath)) {
279
+ console.error(`[jonsoc] Expected binary not found at ${binaryPath}`)
280
+ process.exit(1)
281
+ }
282
+ writeFileSync(versionFile, version)
283
+ return binaryPath
284
+ }
285
+
286
+ const resolved = ensureBinary()
287
+ runWithRestart(resolved, [], restartArgs, { env })
package/bunfig.toml ADDED
@@ -0,0 +1,7 @@
1
+ preload = ["@opentui/solid/preload"]
2
+
3
+ [test]
4
+ preload = ["./test/preload.ts"]
5
+ timeout = 10000 # 10 seconds (default is 5000ms)
6
+ # Enable code coverage
7
+ coverage = true