@otto-assistant/bridge 0.4.92

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 (483) hide show
  1. package/bin.js +2 -0
  2. package/dist/agent-model.e2e.test.js +755 -0
  3. package/dist/ai-tool-to-genai.js +233 -0
  4. package/dist/ai-tool-to-genai.test.js +267 -0
  5. package/dist/ai-tool.js +6 -0
  6. package/dist/anthropic-auth-plugin.js +728 -0
  7. package/dist/anthropic-auth-plugin.test.js +125 -0
  8. package/dist/anthropic-auth-state.js +231 -0
  9. package/dist/bin.js +90 -0
  10. package/dist/channel-management.js +227 -0
  11. package/dist/cli-parsing.test.js +137 -0
  12. package/dist/cli-send-thread.e2e.test.js +356 -0
  13. package/dist/cli.js +3276 -0
  14. package/dist/commands/abort.js +65 -0
  15. package/dist/commands/action-buttons.js +245 -0
  16. package/dist/commands/add-project.js +113 -0
  17. package/dist/commands/agent.js +335 -0
  18. package/dist/commands/ask-question.js +274 -0
  19. package/dist/commands/btw.js +116 -0
  20. package/dist/commands/compact.js +120 -0
  21. package/dist/commands/context-usage.js +140 -0
  22. package/dist/commands/create-new-project.js +130 -0
  23. package/dist/commands/diff.js +63 -0
  24. package/dist/commands/file-upload.js +275 -0
  25. package/dist/commands/fork.js +220 -0
  26. package/dist/commands/gemini-apikey.js +70 -0
  27. package/dist/commands/login.js +885 -0
  28. package/dist/commands/mcp.js +239 -0
  29. package/dist/commands/memory-snapshot.js +24 -0
  30. package/dist/commands/mention-mode.js +44 -0
  31. package/dist/commands/merge-worktree.js +159 -0
  32. package/dist/commands/model-variant.js +364 -0
  33. package/dist/commands/model.js +776 -0
  34. package/dist/commands/new-worktree.js +366 -0
  35. package/dist/commands/paginated-select.js +57 -0
  36. package/dist/commands/permissions.js +274 -0
  37. package/dist/commands/queue.js +206 -0
  38. package/dist/commands/remove-project.js +115 -0
  39. package/dist/commands/restart-opencode-server.js +127 -0
  40. package/dist/commands/resume.js +149 -0
  41. package/dist/commands/run-command.js +79 -0
  42. package/dist/commands/screenshare.js +303 -0
  43. package/dist/commands/screenshare.test.js +20 -0
  44. package/dist/commands/session-id.js +78 -0
  45. package/dist/commands/session.js +176 -0
  46. package/dist/commands/share.js +80 -0
  47. package/dist/commands/tasks.js +205 -0
  48. package/dist/commands/types.js +2 -0
  49. package/dist/commands/undo-redo.js +305 -0
  50. package/dist/commands/unset-model.js +138 -0
  51. package/dist/commands/upgrade.js +42 -0
  52. package/dist/commands/user-command.js +155 -0
  53. package/dist/commands/verbosity.js +125 -0
  54. package/dist/commands/worktree-settings.js +43 -0
  55. package/dist/commands/worktrees.js +410 -0
  56. package/dist/condense-memory.js +33 -0
  57. package/dist/config.js +94 -0
  58. package/dist/context-awareness-plugin.js +363 -0
  59. package/dist/context-awareness-plugin.test.js +124 -0
  60. package/dist/critique-utils.js +95 -0
  61. package/dist/database.js +1310 -0
  62. package/dist/db.js +251 -0
  63. package/dist/db.test.js +138 -0
  64. package/dist/debounce-timeout.js +28 -0
  65. package/dist/debounced-process-flush.js +77 -0
  66. package/dist/discord-bot.js +1008 -0
  67. package/dist/discord-command-registration.js +524 -0
  68. package/dist/discord-urls.js +81 -0
  69. package/dist/discord-utils.js +591 -0
  70. package/dist/discord-utils.test.js +134 -0
  71. package/dist/errors.js +157 -0
  72. package/dist/escape-backticks.test.js +429 -0
  73. package/dist/event-stream-real-capture.e2e.test.js +533 -0
  74. package/dist/eventsource-parser.test.js +327 -0
  75. package/dist/exec-async.js +26 -0
  76. package/dist/external-opencode-sync.js +480 -0
  77. package/dist/format-tables.js +302 -0
  78. package/dist/format-tables.test.js +308 -0
  79. package/dist/forum-sync/config.js +79 -0
  80. package/dist/forum-sync/discord-operations.js +154 -0
  81. package/dist/forum-sync/index.js +5 -0
  82. package/dist/forum-sync/markdown.js +113 -0
  83. package/dist/forum-sync/sync-to-discord.js +417 -0
  84. package/dist/forum-sync/sync-to-files.js +190 -0
  85. package/dist/forum-sync/types.js +53 -0
  86. package/dist/forum-sync/watchers.js +307 -0
  87. package/dist/gateway-proxy-reconnect.e2e.test.js +394 -0
  88. package/dist/gateway-proxy.e2e.test.js +483 -0
  89. package/dist/genai-worker-wrapper.js +111 -0
  90. package/dist/genai-worker.js +311 -0
  91. package/dist/genai.js +232 -0
  92. package/dist/generated/browser.js +17 -0
  93. package/dist/generated/client.js +37 -0
  94. package/dist/generated/commonInputTypes.js +10 -0
  95. package/dist/generated/enums.js +52 -0
  96. package/dist/generated/internal/class.js +49 -0
  97. package/dist/generated/internal/prismaNamespace.js +253 -0
  98. package/dist/generated/internal/prismaNamespaceBrowser.js +223 -0
  99. package/dist/generated/models/bot_api_keys.js +1 -0
  100. package/dist/generated/models/bot_tokens.js +1 -0
  101. package/dist/generated/models/channel_agents.js +1 -0
  102. package/dist/generated/models/channel_directories.js +1 -0
  103. package/dist/generated/models/channel_mention_mode.js +1 -0
  104. package/dist/generated/models/channel_models.js +1 -0
  105. package/dist/generated/models/channel_verbosity.js +1 -0
  106. package/dist/generated/models/channel_worktrees.js +1 -0
  107. package/dist/generated/models/forum_sync_configs.js +1 -0
  108. package/dist/generated/models/global_models.js +1 -0
  109. package/dist/generated/models/ipc_requests.js +1 -0
  110. package/dist/generated/models/part_messages.js +1 -0
  111. package/dist/generated/models/scheduled_tasks.js +1 -0
  112. package/dist/generated/models/session_agents.js +1 -0
  113. package/dist/generated/models/session_events.js +1 -0
  114. package/dist/generated/models/session_models.js +1 -0
  115. package/dist/generated/models/session_start_sources.js +1 -0
  116. package/dist/generated/models/thread_sessions.js +1 -0
  117. package/dist/generated/models/thread_worktrees.js +1 -0
  118. package/dist/generated/models.js +1 -0
  119. package/dist/heap-monitor.js +122 -0
  120. package/dist/hrana-server.js +263 -0
  121. package/dist/hrana-server.test.js +370 -0
  122. package/dist/html-actions.js +123 -0
  123. package/dist/html-actions.test.js +70 -0
  124. package/dist/html-components.js +117 -0
  125. package/dist/html-components.test.js +34 -0
  126. package/dist/image-optimizer-plugin.js +153 -0
  127. package/dist/image-utils.js +112 -0
  128. package/dist/interaction-handler.js +397 -0
  129. package/dist/ipc-polling.js +252 -0
  130. package/dist/ipc-tools-plugin.js +193 -0
  131. package/dist/kimaki-digital-twin.e2e.test.js +161 -0
  132. package/dist/kimaki-opencode-plugin-loading.e2e.test.js +87 -0
  133. package/dist/kimaki-opencode-plugin.js +17 -0
  134. package/dist/kimaki-opencode-plugin.test.js +98 -0
  135. package/dist/limit-heading-depth.js +25 -0
  136. package/dist/limit-heading-depth.test.js +105 -0
  137. package/dist/logger.js +165 -0
  138. package/dist/markdown.js +342 -0
  139. package/dist/markdown.test.js +257 -0
  140. package/dist/message-finish-field.e2e.test.js +165 -0
  141. package/dist/message-formatting.js +413 -0
  142. package/dist/message-formatting.test.js +73 -0
  143. package/dist/message-preprocessing.js +330 -0
  144. package/dist/onboarding-tutorial.js +172 -0
  145. package/dist/onboarding-welcome.js +37 -0
  146. package/dist/openai-realtime.js +224 -0
  147. package/dist/opencode-command-detection.js +65 -0
  148. package/dist/opencode-command-detection.test.js +240 -0
  149. package/dist/opencode-command.js +129 -0
  150. package/dist/opencode-command.test.js +48 -0
  151. package/dist/opencode-interrupt-plugin.js +361 -0
  152. package/dist/opencode-interrupt-plugin.test.js +458 -0
  153. package/dist/opencode.js +861 -0
  154. package/dist/otto/branding.js +22 -0
  155. package/dist/otto/index.js +21 -0
  156. package/dist/parse-permission-rules.test.js +117 -0
  157. package/dist/patch-text-parser.js +97 -0
  158. package/dist/plugin-logger.js +59 -0
  159. package/dist/privacy-sanitizer.js +105 -0
  160. package/dist/queue-advanced-abort.e2e.test.js +293 -0
  161. package/dist/queue-advanced-action-buttons.e2e.test.js +206 -0
  162. package/dist/queue-advanced-e2e-setup.js +786 -0
  163. package/dist/queue-advanced-footer.e2e.test.js +472 -0
  164. package/dist/queue-advanced-model-switch.e2e.test.js +299 -0
  165. package/dist/queue-advanced-permissions-typing.e2e.test.js +180 -0
  166. package/dist/queue-advanced-question.e2e.test.js +261 -0
  167. package/dist/queue-advanced-typing-interrupt.e2e.test.js +114 -0
  168. package/dist/queue-advanced-typing.e2e.test.js +153 -0
  169. package/dist/queue-drain-after-interactive-ui.e2e.test.js +119 -0
  170. package/dist/queue-interrupt-drain.e2e.test.js +135 -0
  171. package/dist/queue-question-select-drain.e2e.test.js +120 -0
  172. package/dist/runtime-idle-sweeper.js +52 -0
  173. package/dist/runtime-lifecycle.e2e.test.js +508 -0
  174. package/dist/sentry.js +23 -0
  175. package/dist/session-handler/agent-utils.js +67 -0
  176. package/dist/session-handler/event-stream-state.js +420 -0
  177. package/dist/session-handler/event-stream-state.test.js +563 -0
  178. package/dist/session-handler/model-utils.js +124 -0
  179. package/dist/session-handler/opencode-session-event-log.js +94 -0
  180. package/dist/session-handler/thread-runtime-state.js +104 -0
  181. package/dist/session-handler/thread-session-runtime.js +3258 -0
  182. package/dist/session-handler.js +9 -0
  183. package/dist/session-search.js +100 -0
  184. package/dist/session-search.test.js +40 -0
  185. package/dist/session-title-rename.test.js +80 -0
  186. package/dist/startup-service.js +153 -0
  187. package/dist/startup-time.e2e.test.js +296 -0
  188. package/dist/store.js +17 -0
  189. package/dist/system-message.js +613 -0
  190. package/dist/system-message.test.js +602 -0
  191. package/dist/task-runner.js +295 -0
  192. package/dist/task-schedule.js +209 -0
  193. package/dist/task-schedule.test.js +71 -0
  194. package/dist/test-utils.js +299 -0
  195. package/dist/thinking-utils.js +35 -0
  196. package/dist/thread-message-queue.e2e.test.js +999 -0
  197. package/dist/tools.js +357 -0
  198. package/dist/undo-redo.e2e.test.js +161 -0
  199. package/dist/unnest-code-blocks.js +146 -0
  200. package/dist/unnest-code-blocks.test.js +673 -0
  201. package/dist/upgrade.js +114 -0
  202. package/dist/utils.js +144 -0
  203. package/dist/voice-attachment.js +34 -0
  204. package/dist/voice-handler.js +646 -0
  205. package/dist/voice-message.e2e.test.js +1021 -0
  206. package/dist/voice.js +447 -0
  207. package/dist/voice.test.js +235 -0
  208. package/dist/wait-session.js +94 -0
  209. package/dist/websockify.js +69 -0
  210. package/dist/worker-types.js +4 -0
  211. package/dist/worktree-lifecycle.e2e.test.js +308 -0
  212. package/dist/worktree-utils.js +3 -0
  213. package/dist/worktrees.js +929 -0
  214. package/dist/worktrees.test.js +189 -0
  215. package/dist/xml.js +92 -0
  216. package/dist/xml.test.js +32 -0
  217. package/package.json +98 -0
  218. package/schema.prisma +295 -0
  219. package/skills/batch/SKILL.md +87 -0
  220. package/skills/critique/SKILL.md +112 -0
  221. package/skills/egaki/SKILL.md +100 -0
  222. package/skills/errore/SKILL.md +647 -0
  223. package/skills/event-sourcing-state/SKILL.md +252 -0
  224. package/skills/gitchamber/SKILL.md +93 -0
  225. package/skills/goke/SKILL.md +644 -0
  226. package/skills/jitter/EDITOR.md +219 -0
  227. package/skills/jitter/EXPORT-INTERNALS.md +309 -0
  228. package/skills/jitter/SKILL.md +158 -0
  229. package/skills/jitter/jitter-clipboard.json +1042 -0
  230. package/skills/jitter/package.json +14 -0
  231. package/skills/jitter/tsconfig.json +15 -0
  232. package/skills/jitter/utils/actions.ts +212 -0
  233. package/skills/jitter/utils/export.ts +114 -0
  234. package/skills/jitter/utils/index.ts +141 -0
  235. package/skills/jitter/utils/snapshot.ts +154 -0
  236. package/skills/jitter/utils/traverse.ts +246 -0
  237. package/skills/jitter/utils/types.ts +279 -0
  238. package/skills/jitter/utils/wait.ts +133 -0
  239. package/skills/lintcn/SKILL.md +873 -0
  240. package/skills/new-skill/SKILL.md +211 -0
  241. package/skills/npm-package/SKILL.md +239 -0
  242. package/skills/playwriter/SKILL.md +35 -0
  243. package/skills/proxyman/SKILL.md +215 -0
  244. package/skills/security-review/SKILL.md +208 -0
  245. package/skills/simplify/SKILL.md +58 -0
  246. package/skills/spiceflow/SKILL.md +14 -0
  247. package/skills/termcast/SKILL.md +945 -0
  248. package/skills/tuistory/SKILL.md +250 -0
  249. package/skills/usecomputer/SKILL.md +264 -0
  250. package/skills/x-articles/SKILL.md +554 -0
  251. package/skills/zele/SKILL.md +112 -0
  252. package/skills/zustand-centralized-state/SKILL.md +1004 -0
  253. package/src/agent-model.e2e.test.ts +976 -0
  254. package/src/ai-tool-to-genai.test.ts +296 -0
  255. package/src/ai-tool-to-genai.ts +283 -0
  256. package/src/ai-tool.ts +39 -0
  257. package/src/anthropic-auth-plugin.test.ts +159 -0
  258. package/src/anthropic-auth-plugin.ts +861 -0
  259. package/src/anthropic-auth-state.ts +282 -0
  260. package/src/bin.ts +111 -0
  261. package/src/channel-management.ts +334 -0
  262. package/src/cli-parsing.test.ts +195 -0
  263. package/src/cli-send-thread.e2e.test.ts +464 -0
  264. package/src/cli.ts +4581 -0
  265. package/src/commands/abort.ts +89 -0
  266. package/src/commands/action-buttons.ts +364 -0
  267. package/src/commands/add-project.ts +149 -0
  268. package/src/commands/agent.ts +473 -0
  269. package/src/commands/ask-question.ts +390 -0
  270. package/src/commands/btw.ts +164 -0
  271. package/src/commands/compact.ts +157 -0
  272. package/src/commands/context-usage.ts +199 -0
  273. package/src/commands/create-new-project.ts +190 -0
  274. package/src/commands/diff.ts +91 -0
  275. package/src/commands/file-upload.ts +389 -0
  276. package/src/commands/fork.ts +321 -0
  277. package/src/commands/gemini-apikey.ts +104 -0
  278. package/src/commands/login.ts +1173 -0
  279. package/src/commands/mcp.ts +307 -0
  280. package/src/commands/memory-snapshot.ts +30 -0
  281. package/src/commands/mention-mode.ts +68 -0
  282. package/src/commands/merge-worktree.ts +223 -0
  283. package/src/commands/model-variant.ts +483 -0
  284. package/src/commands/model.ts +1053 -0
  285. package/src/commands/new-worktree.ts +510 -0
  286. package/src/commands/paginated-select.ts +81 -0
  287. package/src/commands/permissions.ts +397 -0
  288. package/src/commands/queue.ts +271 -0
  289. package/src/commands/remove-project.ts +155 -0
  290. package/src/commands/restart-opencode-server.ts +162 -0
  291. package/src/commands/resume.ts +230 -0
  292. package/src/commands/run-command.ts +123 -0
  293. package/src/commands/screenshare.test.ts +30 -0
  294. package/src/commands/screenshare.ts +366 -0
  295. package/src/commands/session-id.ts +109 -0
  296. package/src/commands/session.ts +227 -0
  297. package/src/commands/share.ts +106 -0
  298. package/src/commands/tasks.ts +293 -0
  299. package/src/commands/types.ts +25 -0
  300. package/src/commands/undo-redo.ts +386 -0
  301. package/src/commands/unset-model.ts +173 -0
  302. package/src/commands/upgrade.ts +52 -0
  303. package/src/commands/user-command.ts +198 -0
  304. package/src/commands/verbosity.ts +173 -0
  305. package/src/commands/worktree-settings.ts +70 -0
  306. package/src/commands/worktrees.ts +552 -0
  307. package/src/condense-memory.ts +36 -0
  308. package/src/config.ts +111 -0
  309. package/src/context-awareness-plugin.test.ts +142 -0
  310. package/src/context-awareness-plugin.ts +510 -0
  311. package/src/critique-utils.ts +139 -0
  312. package/src/database.ts +1876 -0
  313. package/src/db.test.ts +162 -0
  314. package/src/db.ts +286 -0
  315. package/src/debounce-timeout.ts +43 -0
  316. package/src/debounced-process-flush.ts +104 -0
  317. package/src/discord-bot.ts +1330 -0
  318. package/src/discord-command-registration.ts +693 -0
  319. package/src/discord-urls.ts +88 -0
  320. package/src/discord-utils.test.ts +153 -0
  321. package/src/discord-utils.ts +800 -0
  322. package/src/errors.ts +201 -0
  323. package/src/escape-backticks.test.ts +469 -0
  324. package/src/event-stream-real-capture.e2e.test.ts +692 -0
  325. package/src/eventsource-parser.test.ts +351 -0
  326. package/src/exec-async.ts +35 -0
  327. package/src/external-opencode-sync.ts +685 -0
  328. package/src/format-tables.test.ts +335 -0
  329. package/src/format-tables.ts +445 -0
  330. package/src/forum-sync/config.ts +92 -0
  331. package/src/forum-sync/discord-operations.ts +241 -0
  332. package/src/forum-sync/index.ts +9 -0
  333. package/src/forum-sync/markdown.ts +172 -0
  334. package/src/forum-sync/sync-to-discord.ts +595 -0
  335. package/src/forum-sync/sync-to-files.ts +294 -0
  336. package/src/forum-sync/types.ts +175 -0
  337. package/src/forum-sync/watchers.ts +454 -0
  338. package/src/gateway-proxy-reconnect.e2e.test.ts +523 -0
  339. package/src/gateway-proxy.e2e.test.ts +640 -0
  340. package/src/genai-worker-wrapper.ts +164 -0
  341. package/src/genai-worker.ts +386 -0
  342. package/src/genai.ts +321 -0
  343. package/src/generated/browser.ts +114 -0
  344. package/src/generated/client.ts +138 -0
  345. package/src/generated/commonInputTypes.ts +736 -0
  346. package/src/generated/enums.ts +88 -0
  347. package/src/generated/internal/class.ts +384 -0
  348. package/src/generated/internal/prismaNamespace.ts +2386 -0
  349. package/src/generated/internal/prismaNamespaceBrowser.ts +326 -0
  350. package/src/generated/models/bot_api_keys.ts +1288 -0
  351. package/src/generated/models/bot_tokens.ts +1656 -0
  352. package/src/generated/models/channel_agents.ts +1256 -0
  353. package/src/generated/models/channel_directories.ts +1859 -0
  354. package/src/generated/models/channel_mention_mode.ts +1300 -0
  355. package/src/generated/models/channel_models.ts +1288 -0
  356. package/src/generated/models/channel_verbosity.ts +1228 -0
  357. package/src/generated/models/channel_worktrees.ts +1300 -0
  358. package/src/generated/models/forum_sync_configs.ts +1452 -0
  359. package/src/generated/models/global_models.ts +1288 -0
  360. package/src/generated/models/ipc_requests.ts +1485 -0
  361. package/src/generated/models/part_messages.ts +1302 -0
  362. package/src/generated/models/scheduled_tasks.ts +2320 -0
  363. package/src/generated/models/session_agents.ts +1086 -0
  364. package/src/generated/models/session_events.ts +1439 -0
  365. package/src/generated/models/session_models.ts +1114 -0
  366. package/src/generated/models/session_start_sources.ts +1408 -0
  367. package/src/generated/models/thread_sessions.ts +1781 -0
  368. package/src/generated/models/thread_worktrees.ts +1356 -0
  369. package/src/generated/models.ts +30 -0
  370. package/src/heap-monitor.ts +152 -0
  371. package/src/hrana-server.test.ts +434 -0
  372. package/src/hrana-server.ts +314 -0
  373. package/src/html-actions.test.ts +87 -0
  374. package/src/html-actions.ts +174 -0
  375. package/src/html-components.test.ts +38 -0
  376. package/src/html-components.ts +181 -0
  377. package/src/image-optimizer-plugin.ts +194 -0
  378. package/src/image-utils.ts +149 -0
  379. package/src/interaction-handler.ts +576 -0
  380. package/src/ipc-polling.ts +326 -0
  381. package/src/ipc-tools-plugin.ts +236 -0
  382. package/src/kimaki-digital-twin.e2e.test.ts +199 -0
  383. package/src/kimaki-opencode-plugin-loading.e2e.test.ts +109 -0
  384. package/src/kimaki-opencode-plugin.test.ts +108 -0
  385. package/src/kimaki-opencode-plugin.ts +18 -0
  386. package/src/limit-heading-depth.test.ts +116 -0
  387. package/src/limit-heading-depth.ts +26 -0
  388. package/src/logger.ts +208 -0
  389. package/src/markdown.test.ts +308 -0
  390. package/src/markdown.ts +410 -0
  391. package/src/message-finish-field.e2e.test.ts +192 -0
  392. package/src/message-formatting.test.ts +81 -0
  393. package/src/message-formatting.ts +533 -0
  394. package/src/message-preprocessing.ts +455 -0
  395. package/src/onboarding-tutorial.ts +176 -0
  396. package/src/onboarding-welcome.ts +49 -0
  397. package/src/openai-realtime.ts +358 -0
  398. package/src/opencode-command-detection.test.ts +307 -0
  399. package/src/opencode-command-detection.ts +76 -0
  400. package/src/opencode-command.test.ts +70 -0
  401. package/src/opencode-command.ts +188 -0
  402. package/src/opencode-interrupt-plugin.test.ts +677 -0
  403. package/src/opencode-interrupt-plugin.ts +477 -0
  404. package/src/opencode.ts +1110 -0
  405. package/src/otto/branding.ts +23 -0
  406. package/src/otto/index.ts +22 -0
  407. package/src/parse-permission-rules.test.ts +127 -0
  408. package/src/patch-text-parser.ts +107 -0
  409. package/src/plugin-logger.ts +68 -0
  410. package/src/privacy-sanitizer.ts +142 -0
  411. package/src/queue-advanced-abort.e2e.test.ts +382 -0
  412. package/src/queue-advanced-action-buttons.e2e.test.ts +268 -0
  413. package/src/queue-advanced-e2e-setup.ts +873 -0
  414. package/src/queue-advanced-footer.e2e.test.ts +576 -0
  415. package/src/queue-advanced-model-switch.e2e.test.ts +383 -0
  416. package/src/queue-advanced-permissions-typing.e2e.test.ts +245 -0
  417. package/src/queue-advanced-question.e2e.test.ts +316 -0
  418. package/src/queue-advanced-typing-interrupt.e2e.test.ts +146 -0
  419. package/src/queue-advanced-typing.e2e.test.ts +199 -0
  420. package/src/queue-drain-after-interactive-ui.e2e.test.ts +151 -0
  421. package/src/queue-interrupt-drain.e2e.test.ts +166 -0
  422. package/src/queue-question-select-drain.e2e.test.ts +152 -0
  423. package/src/runtime-idle-sweeper.ts +76 -0
  424. package/src/runtime-lifecycle.e2e.test.ts +641 -0
  425. package/src/schema.sql +173 -0
  426. package/src/sentry.ts +26 -0
  427. package/src/session-handler/agent-utils.ts +97 -0
  428. package/src/session-handler/event-stream-fixtures/real-session-action-buttons.jsonl +45 -0
  429. package/src/session-handler/event-stream-fixtures/real-session-footer-suppressed-on-pre-idle-interrupt.jsonl +40 -0
  430. package/src/session-handler/event-stream-fixtures/real-session-permission-external-file.jsonl +23 -0
  431. package/src/session-handler/event-stream-fixtures/real-session-task-normal.jsonl +22 -0
  432. package/src/session-handler/event-stream-fixtures/real-session-task-three-parallel-sleeps.jsonl +277 -0
  433. package/src/session-handler/event-stream-fixtures/real-session-task-user-interruption.jsonl +46 -0
  434. package/src/session-handler/event-stream-fixtures/session-abort-after-idle-race.jsonl +21 -0
  435. package/src/session-handler/event-stream-fixtures/session-concurrent-messages-serialized.jsonl +56 -0
  436. package/src/session-handler/event-stream-fixtures/session-explicit-abort.jsonl +44 -0
  437. package/src/session-handler/event-stream-fixtures/session-normal-completion.jsonl +29 -0
  438. package/src/session-handler/event-stream-fixtures/session-tool-call-noisy-stream.jsonl +29 -0
  439. package/src/session-handler/event-stream-fixtures/session-two-completions-same-session.jsonl +50 -0
  440. package/src/session-handler/event-stream-fixtures/session-user-interruption.jsonl +59 -0
  441. package/src/session-handler/event-stream-fixtures/session-voice-queued-followup.jsonl +52 -0
  442. package/src/session-handler/event-stream-state.test.ts +645 -0
  443. package/src/session-handler/event-stream-state.ts +608 -0
  444. package/src/session-handler/model-utils.ts +183 -0
  445. package/src/session-handler/opencode-session-event-log.ts +130 -0
  446. package/src/session-handler/thread-runtime-state.ts +212 -0
  447. package/src/session-handler/thread-session-runtime.ts +4281 -0
  448. package/src/session-handler.ts +15 -0
  449. package/src/session-search.test.ts +50 -0
  450. package/src/session-search.ts +148 -0
  451. package/src/session-title-rename.test.ts +112 -0
  452. package/src/startup-service.ts +200 -0
  453. package/src/startup-time.e2e.test.ts +373 -0
  454. package/src/store.ts +122 -0
  455. package/src/system-message.test.ts +612 -0
  456. package/src/system-message.ts +723 -0
  457. package/src/task-runner.ts +421 -0
  458. package/src/task-schedule.test.ts +84 -0
  459. package/src/task-schedule.ts +311 -0
  460. package/src/test-utils.ts +435 -0
  461. package/src/thinking-utils.ts +61 -0
  462. package/src/thread-message-queue.e2e.test.ts +1219 -0
  463. package/src/tools.ts +430 -0
  464. package/src/undici.d.ts +12 -0
  465. package/src/undo-redo.e2e.test.ts +209 -0
  466. package/src/unnest-code-blocks.test.ts +713 -0
  467. package/src/unnest-code-blocks.ts +185 -0
  468. package/src/upgrade.ts +127 -0
  469. package/src/utils.ts +212 -0
  470. package/src/voice-attachment.ts +51 -0
  471. package/src/voice-handler.ts +908 -0
  472. package/src/voice-message.e2e.test.ts +1255 -0
  473. package/src/voice.test.ts +281 -0
  474. package/src/voice.ts +627 -0
  475. package/src/wait-session.ts +147 -0
  476. package/src/websockify.ts +101 -0
  477. package/src/worker-types.ts +64 -0
  478. package/src/worktree-lifecycle.e2e.test.ts +391 -0
  479. package/src/worktree-utils.ts +4 -0
  480. package/src/worktrees.test.ts +223 -0
  481. package/src/worktrees.ts +1294 -0
  482. package/src/xml.test.ts +38 -0
  483. package/src/xml.ts +121 -0
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "jitter-utils",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "build": "esbuild utils/index.ts --bundle --format=iife --global-name=jitterUtils --outfile=dist/jitter-utils.js",
8
+ "typecheck": "tsc --noEmit"
9
+ },
10
+ "devDependencies": {
11
+ "esbuild": "^0.24.2",
12
+ "typescript": "^5.9.2"
13
+ }
14
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "strict": true,
7
+ "esModuleInterop": true,
8
+ "skipLibCheck": true,
9
+ "forceConsistentCasingInFileNames": true,
10
+ "noEmit": true,
11
+ "lib": ["ES2022", "DOM"],
12
+ "types": []
13
+ },
14
+ "include": ["utils/**/*.ts"]
15
+ }
@@ -0,0 +1,212 @@
1
+ // Action helpers for modifying Jitter projects
2
+
3
+ import type { LayerProperties } from './types'
4
+
5
+ function dispatch(action: Record<string, unknown>): void {
6
+ window.app.dispatchAction(action)
7
+ }
8
+
9
+ /**
10
+ * Replace the URL of an asset node (image, SVG, video)
11
+ */
12
+ export function replaceAssetUrl(nodeId: string, newUrl: string): void {
13
+ dispatch({
14
+ type: 'updateObjWithUndo',
15
+ objId: nodeId,
16
+ data: { url: newUrl },
17
+ })
18
+ }
19
+
20
+ /**
21
+ * Replace text content of a text node
22
+ */
23
+ export function replaceText(nodeId: string, newText: string): void {
24
+ dispatch({
25
+ type: 'updateObjWithUndo',
26
+ objId: nodeId,
27
+ data: { text: newText },
28
+ })
29
+ }
30
+
31
+ /**
32
+ * Update multiple properties on a node
33
+ */
34
+ export function updateNode(
35
+ nodeId: string,
36
+ properties: Partial<LayerProperties> & { url?: string; text?: string },
37
+ ): void {
38
+ dispatch({
39
+ type: 'updateObjWithUndo',
40
+ objId: nodeId,
41
+ data: properties,
42
+ })
43
+ }
44
+
45
+ export interface ReplacementItem {
46
+ nodeId: string
47
+ data: Partial<LayerProperties> & { url?: string; text?: string }
48
+ }
49
+
50
+ /**
51
+ * Batch update multiple nodes at once
52
+ */
53
+ export function batchReplace(replacements: ReplacementItem[]): void {
54
+ for (const { nodeId, data } of replacements) {
55
+ dispatch({
56
+ type: 'updateObjWithUndo',
57
+ objId: nodeId,
58
+ data: data,
59
+ })
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Select specific nodes by their IDs
65
+ */
66
+ export function selectNodes(nodeIds: string[]): void {
67
+ dispatch({
68
+ type: 'setSelection',
69
+ selection: { nodesIds: nodeIds },
70
+ saveInCmdHistory: true,
71
+ })
72
+ }
73
+
74
+ /**
75
+ * Clear the current selection
76
+ */
77
+ export function clearSelection(): void {
78
+ dispatch({ type: 'emptySelection' })
79
+ }
80
+
81
+ /**
82
+ * Delete the currently selected nodes
83
+ */
84
+ export function deleteSelection(): void {
85
+ dispatch({ type: 'deleteCurrentSelection' })
86
+ }
87
+
88
+ /**
89
+ * Remove specific nodes by their IDs
90
+ */
91
+ export function removeNodes(nodeIds: string[]): void {
92
+ dispatch({
93
+ type: 'removeObjWithUndo',
94
+ objIds: nodeIds,
95
+ })
96
+ }
97
+
98
+ /**
99
+ * Undo the last action
100
+ */
101
+ export function undo(): void {
102
+ dispatch({ type: 'undo' })
103
+ }
104
+
105
+ /**
106
+ * Redo the last undone action
107
+ */
108
+ export function redo(): void {
109
+ dispatch({ type: 'redo' })
110
+ }
111
+
112
+ /**
113
+ * Rename a node
114
+ */
115
+ export function renameNode(nodeId: string, newName: string): void {
116
+ selectNodes([nodeId])
117
+ dispatch({
118
+ type: 'renameSelection',
119
+ name: newName,
120
+ })
121
+ }
122
+
123
+ /**
124
+ * Update node position
125
+ */
126
+ export function moveNode(nodeId: string, x: number, y: number): void {
127
+ dispatch({
128
+ type: 'updateObjWithUndo',
129
+ objId: nodeId,
130
+ data: { x, y },
131
+ })
132
+ }
133
+
134
+ /**
135
+ * Update node size
136
+ */
137
+ export function resizeNode(
138
+ nodeId: string,
139
+ width: number,
140
+ height: number,
141
+ ): void {
142
+ dispatch({
143
+ type: 'updateObjWithUndo',
144
+ objId: nodeId,
145
+ data: { width, height },
146
+ })
147
+ }
148
+
149
+ /**
150
+ * Update node opacity (0-100)
151
+ */
152
+ export function setOpacity(nodeId: string, opacity: number): void {
153
+ dispatch({
154
+ type: 'updateObjWithUndo',
155
+ objId: nodeId,
156
+ data: { opacity },
157
+ })
158
+ }
159
+
160
+ /**
161
+ * Update node rotation angle in degrees
162
+ */
163
+ export function setRotation(nodeId: string, angle: number): void {
164
+ dispatch({
165
+ type: 'updateObjWithUndo',
166
+ objId: nodeId,
167
+ data: { angle },
168
+ })
169
+ }
170
+
171
+ /**
172
+ * Set the current playhead time for an artboard
173
+ */
174
+ export function setCurrentTime(artboardId: string, timeMs: number): void {
175
+ dispatch({
176
+ type: 'setArtboardsTime',
177
+ times: { [artboardId]: timeMs },
178
+ })
179
+ }
180
+
181
+ /**
182
+ * Jump playhead to start
183
+ */
184
+ export function jumpToStart(): void {
185
+ dispatch({ type: 'jumpToStartTime' })
186
+ }
187
+
188
+ /**
189
+ * Jump playhead to end
190
+ */
191
+ export function jumpToEnd(): void {
192
+ dispatch({ type: 'jumpToEndTime' })
193
+ }
194
+
195
+ /**
196
+ * Add a new object to the project
197
+ */
198
+ export function addObject(
199
+ parentId: string,
200
+ id: string,
201
+ item: LayerProperties,
202
+ index?: string,
203
+ ): void {
204
+ dispatch({ type: 'saveSelectionForUndo' })
205
+ dispatch({
206
+ type: 'addObjWithUndo',
207
+ parentId,
208
+ objData: { id, item },
209
+ index,
210
+ })
211
+ selectNodes([id])
212
+ }
@@ -0,0 +1,114 @@
1
+ // Export URL generation utilities
2
+
3
+ import type { ExportProfile } from './types'
4
+ import { getArtboards } from './traverse'
5
+
6
+ export interface ExportUrlOptions {
7
+ fileId: string
8
+ artboardId: string
9
+ width: number
10
+ height: number
11
+ profile?: ExportProfile
12
+ }
13
+
14
+ /**
15
+ * Generate a Jitter export URL for downloading Lottie/video/etc
16
+ */
17
+ export function generateExportUrl(options: ExportUrlOptions): string {
18
+ const { fileId, artboardId, width, height, profile = 'lottie' } = options
19
+ const params = new URLSearchParams({
20
+ file: fileId,
21
+ artboardId: artboardId,
22
+ profile: profile,
23
+ width: width.toString(),
24
+ height: height.toString(),
25
+ })
26
+ return `https://jitter.video/export/?${params.toString()}`
27
+ }
28
+
29
+ export interface CurrentProjectExportOptions {
30
+ artboardName?: string
31
+ profile?: ExportProfile
32
+ }
33
+
34
+ /**
35
+ * Generate export URL from the currently open project
36
+ */
37
+ export function generateExportUrlFromCurrentProject(
38
+ options: CurrentProjectExportOptions = {},
39
+ ): string {
40
+ const { artboardName, profile = 'lottie' } = options
41
+ const fileId = window.app.props.fileMeta.id
42
+ const artboards = getArtboards()
43
+
44
+ const artboard = artboardName
45
+ ? artboards.find((a) => a.name === artboardName)
46
+ : artboards[0]
47
+
48
+ if (!artboard) {
49
+ throw new Error(
50
+ artboardName
51
+ ? `Artboard "${artboardName}" not found`
52
+ : 'No artboard found in project',
53
+ )
54
+ }
55
+
56
+ return generateExportUrl({
57
+ fileId,
58
+ artboardId: artboard.id,
59
+ width: artboard.width,
60
+ height: artboard.height,
61
+ profile,
62
+ })
63
+ }
64
+
65
+ export interface ParsedJitterUrl {
66
+ fileId: string | null
67
+ nodeId: string | null
68
+ }
69
+
70
+ /**
71
+ * Parse a Jitter project URL to extract file and node IDs
72
+ */
73
+ export function parseJitterUrl(url: string): ParsedJitterUrl {
74
+ const parsed = new URL(url)
75
+ return {
76
+ fileId: parsed.searchParams.get('id'),
77
+ nodeId: parsed.searchParams.get('nodeId'),
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Get the current project's file metadata
83
+ */
84
+ export function getFileMeta(): {
85
+ id: string
86
+ name: string
87
+ bucket: string
88
+ teamId?: string
89
+ } {
90
+ return window.app.props.fileMeta
91
+ }
92
+
93
+ /**
94
+ * Generate a URL to open a specific node in the editor
95
+ */
96
+ export function generateNodeUrl(fileId: string, nodeId: string): string {
97
+ const params = new URLSearchParams({
98
+ id: fileId,
99
+ nodeId: nodeId,
100
+ })
101
+ return `https://jitter.video/file/?${params.toString()}`
102
+ }
103
+
104
+ /**
105
+ * Get URL for the currently open project
106
+ */
107
+ export function getCurrentProjectUrl(nodeId?: string): string {
108
+ const fileId = window.app.props.fileMeta.id
109
+ const params = new URLSearchParams({ id: fileId })
110
+ if (nodeId) {
111
+ params.set('nodeId', nodeId)
112
+ }
113
+ return `https://jitter.video/file/?${params.toString()}`
114
+ }
@@ -0,0 +1,141 @@
1
+ // Jitter Utils - Bundle entry point
2
+ // Exports all utilities and attaches to globalThis.jitterUtils
3
+
4
+ export * from './types'
5
+ export * from './traverse'
6
+ export * from './actions'
7
+ export * from './export'
8
+ export * from './snapshot'
9
+ export * from './wait'
10
+
11
+ // Re-export specific functions for easier access
12
+ import {
13
+ findNodeById,
14
+ findAllMediaNodes,
15
+ findAllTextNodes,
16
+ getArtboards,
17
+ findNodesByType,
18
+ findNodesByName,
19
+ getParentNode,
20
+ getAncestors,
21
+ flattenTree,
22
+ } from './traverse'
23
+
24
+ import {
25
+ replaceAssetUrl,
26
+ replaceText,
27
+ updateNode,
28
+ batchReplace,
29
+ selectNodes,
30
+ clearSelection,
31
+ deleteSelection,
32
+ removeNodes,
33
+ undo,
34
+ redo,
35
+ renameNode,
36
+ moveNode,
37
+ resizeNode,
38
+ setOpacity,
39
+ setRotation,
40
+ setCurrentTime,
41
+ jumpToStart,
42
+ jumpToEnd,
43
+ addObject,
44
+ } from './actions'
45
+
46
+ import {
47
+ generateExportUrl,
48
+ generateExportUrlFromCurrentProject,
49
+ parseJitterUrl,
50
+ getFileMeta,
51
+ generateNodeUrl,
52
+ getCurrentProjectUrl,
53
+ } from './export'
54
+
55
+ import {
56
+ createSnapshot,
57
+ restoreFromSnapshot,
58
+ duplicateProject,
59
+ deleteProject,
60
+ createMediaSnapshot,
61
+ createTextSnapshot,
62
+ withTemporaryChanges,
63
+ } from './snapshot'
64
+
65
+ import {
66
+ waitForApp,
67
+ waitForSync,
68
+ waitFor,
69
+ waitForNode,
70
+ waitForConfigChange,
71
+ isReadOnly,
72
+ isAppReady,
73
+ } from './wait'
74
+
75
+ const jitterUtils = {
76
+ // Traverse
77
+ findNodeById,
78
+ findAllMediaNodes,
79
+ findAllTextNodes,
80
+ getArtboards,
81
+ findNodesByType,
82
+ findNodesByName,
83
+ getParentNode,
84
+ getAncestors,
85
+ flattenTree,
86
+
87
+ // Actions
88
+ replaceAssetUrl,
89
+ replaceText,
90
+ updateNode,
91
+ batchReplace,
92
+ selectNodes,
93
+ clearSelection,
94
+ deleteSelection,
95
+ removeNodes,
96
+ undo,
97
+ redo,
98
+ renameNode,
99
+ moveNode,
100
+ resizeNode,
101
+ setOpacity,
102
+ setRotation,
103
+ setCurrentTime,
104
+ jumpToStart,
105
+ jumpToEnd,
106
+ addObject,
107
+
108
+ // Export
109
+ generateExportUrl,
110
+ generateExportUrlFromCurrentProject,
111
+ parseJitterUrl,
112
+ getFileMeta,
113
+ generateNodeUrl,
114
+ getCurrentProjectUrl,
115
+
116
+ // Snapshot
117
+ createSnapshot,
118
+ restoreFromSnapshot,
119
+ duplicateProject,
120
+ deleteProject,
121
+ createMediaSnapshot,
122
+ createTextSnapshot,
123
+ withTemporaryChanges,
124
+
125
+ // Wait
126
+ waitForApp,
127
+ waitForSync,
128
+ waitFor,
129
+ waitForNode,
130
+ waitForConfigChange,
131
+ isReadOnly,
132
+ isAppReady,
133
+ }
134
+
135
+ // Attach to globalThis for browser access
136
+ if (typeof globalThis !== 'undefined') {
137
+ ;(globalThis as unknown as { jitterUtils: typeof jitterUtils }).jitterUtils =
138
+ jitterUtils
139
+ }
140
+
141
+ export default jitterUtils
@@ -0,0 +1,154 @@
1
+ // Snapshot and restore utilities for temporary project modifications
2
+
3
+ import type { LayerProperties } from './types'
4
+ import { findNodeById } from './traverse'
5
+
6
+ export type Snapshot = Record<string, LayerProperties>
7
+
8
+ /**
9
+ * Create a snapshot of specific nodes' current state
10
+ * Use this before making temporary changes that you want to restore later
11
+ */
12
+ export function createSnapshot(nodeIds: string[]): Snapshot {
13
+ const snapshot: Snapshot = {}
14
+
15
+ for (const nodeId of nodeIds) {
16
+ const node = findNodeById(nodeId)
17
+ if (node?.item) {
18
+ // Deep clone the item to avoid reference issues
19
+ snapshot[nodeId] = JSON.parse(JSON.stringify(node.item))
20
+ }
21
+ }
22
+
23
+ return snapshot
24
+ }
25
+
26
+ /**
27
+ * Restore nodes to their previously saved state
28
+ */
29
+ export function restoreFromSnapshot(snapshot: Snapshot): void {
30
+ for (const [nodeId, data] of Object.entries(snapshot)) {
31
+ window.app.dispatchAction({
32
+ type: 'updateObjWithUndo',
33
+ objId: nodeId,
34
+ data: data,
35
+ })
36
+ }
37
+ }
38
+
39
+ /**
40
+ * Duplicate the current project file
41
+ * Returns the new file's ID
42
+ */
43
+ export async function duplicateProject(): Promise<string> {
44
+ const currentFileId = window.app.props.fileMeta.id
45
+ return await window.app.props.fileActions.duplicateFile(currentFileId)
46
+ }
47
+
48
+ /**
49
+ * Delete a project file by ID
50
+ */
51
+ export async function deleteProject(fileId: string): Promise<void> {
52
+ await window.app.props.fileActions.deleteFile(fileId)
53
+ }
54
+
55
+ /**
56
+ * Create a snapshot of all media nodes for easy restoration
57
+ */
58
+ export function createMediaSnapshot(): {
59
+ snapshot: Snapshot
60
+ nodeIds: string[]
61
+ } {
62
+ const conf = window.app.props.observableImmutableConf.lastImmutableConf
63
+ const nodeIds: string[] = []
64
+ const mediaTypes = new Set(['svg', 'image', 'video', 'gif'])
65
+
66
+ const collectIds = (node: {
67
+ id: string
68
+ item?: { type: string }
69
+ children?: unknown[]
70
+ }): void => {
71
+ if (node.item && mediaTypes.has(node.item.type)) {
72
+ nodeIds.push(node.id)
73
+ }
74
+ if (node.children) {
75
+ ;(node.children as (typeof node)[]).forEach(collectIds)
76
+ }
77
+ }
78
+
79
+ ;(conf.roots || []).forEach(collectIds)
80
+
81
+ return {
82
+ snapshot: createSnapshot(nodeIds),
83
+ nodeIds,
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Create a snapshot of all text nodes for easy restoration
89
+ */
90
+ export function createTextSnapshot(): {
91
+ snapshot: Snapshot
92
+ nodeIds: string[]
93
+ } {
94
+ const conf = window.app.props.observableImmutableConf.lastImmutableConf
95
+ const nodeIds: string[] = []
96
+
97
+ const collectIds = (node: {
98
+ id: string
99
+ item?: { type: string }
100
+ children?: unknown[]
101
+ }): void => {
102
+ if (node.item?.type === 'text') {
103
+ nodeIds.push(node.id)
104
+ }
105
+ if (node.children) {
106
+ ;(node.children as (typeof node)[]).forEach(collectIds)
107
+ }
108
+ }
109
+
110
+ ;(conf.roots || []).forEach(collectIds)
111
+
112
+ return {
113
+ snapshot: createSnapshot(nodeIds),
114
+ nodeIds,
115
+ }
116
+ }
117
+
118
+ export interface ExportWithRestoreOptions {
119
+ replacements: Array<{ nodeId: string; data: Record<string, unknown> }>
120
+ onBeforeExport?: () => void | Promise<void>
121
+ }
122
+
123
+ /**
124
+ * Apply temporary changes, run a callback, then restore original state
125
+ * Useful for exporting with temporary asset replacements
126
+ */
127
+ export async function withTemporaryChanges<T>(
128
+ nodeIds: string[],
129
+ changes: Record<string, Record<string, unknown>>,
130
+ callback: () => T | Promise<T>,
131
+ ): Promise<T> {
132
+ // Create snapshot before changes
133
+ const snapshot = createSnapshot(nodeIds)
134
+
135
+ try {
136
+ // Apply changes
137
+ for (const [nodeId, data] of Object.entries(changes)) {
138
+ window.app.dispatchAction({
139
+ type: 'updateObjWithUndo',
140
+ objId: nodeId,
141
+ data: data,
142
+ })
143
+ }
144
+
145
+ // Wait for changes to sync
146
+ await new Promise((resolve) => setTimeout(resolve, 1000))
147
+
148
+ // Run callback
149
+ return await callback()
150
+ } finally {
151
+ // Always restore original state
152
+ restoreFromSnapshot(snapshot)
153
+ }
154
+ }