@schlenkr/ragents 0.1.0

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 (788) hide show
  1. package/LICENSE +166 -0
  2. package/README.md +88 -0
  3. package/apps/server/agent-home/settings.json +3 -0
  4. package/apps/server/package.json +29 -0
  5. package/apps/server/src/access-projection.ts +97 -0
  6. package/apps/server/src/access-service.ts +22 -0
  7. package/apps/server/src/access-session.ts +204 -0
  8. package/apps/server/src/api/contracts.ts +203 -0
  9. package/apps/server/src/api/core-methods.ts +163 -0
  10. package/apps/server/src/api/delivery.ts +40 -0
  11. package/apps/server/src/api/reference.ts +146 -0
  12. package/apps/server/src/api/rights.ts +26 -0
  13. package/apps/server/src/chat-attachments.ts +52 -0
  14. package/apps/server/src/chat-context.ts +6 -0
  15. package/apps/server/src/chat-events.ts +185 -0
  16. package/apps/server/src/chat-handler.ts +37 -0
  17. package/apps/server/src/config-definition.ts +80 -0
  18. package/apps/server/src/config-file.ts +324 -0
  19. package/apps/server/src/config.ts +46 -0
  20. package/apps/server/src/data-directory.ts +42 -0
  21. package/apps/server/src/external-access.ts +40 -0
  22. package/apps/server/src/help-files.ts +63 -0
  23. package/apps/server/src/host-resolution-hooks.mjs +31 -0
  24. package/apps/server/src/host-resolution.ts +3 -0
  25. package/apps/server/src/host-version.ts +74 -0
  26. package/apps/server/src/layout.ts +36 -0
  27. package/apps/server/src/main.ts +54 -0
  28. package/apps/server/src/plugin-support/actor-programs/capability-resolver.ts +107 -0
  29. package/apps/server/src/plugin-support/actor-programs/limits.ts +33 -0
  30. package/apps/server/src/plugin-support/actor-programs/operations.ts +19 -0
  31. package/apps/server/src/plugin-support/actor-programs/service.ts +16 -0
  32. package/apps/server/src/plugin-support/agent-tool.ts +60 -0
  33. package/apps/server/src/plugin-support/asset-path.ts +4 -0
  34. package/apps/server/src/plugin-support/await-with-signal.ts +18 -0
  35. package/apps/server/src/plugin-support/chat-display-contract.ts +7 -0
  36. package/apps/server/src/plugin-support/chat-display-policy.ts +55 -0
  37. package/apps/server/src/plugin-support/front-matter.ts +44 -0
  38. package/apps/server/src/plugin-support/http.ts +93 -0
  39. package/apps/server/src/plugin-support/language-server/contract.ts +18 -0
  40. package/apps/server/src/plugin-support/language-server/plugin.ts +32 -0
  41. package/apps/server/src/plugin-support/language-server/snapshot-method.ts +17 -0
  42. package/apps/server/src/plugin-support/language-server/tools.ts +73 -0
  43. package/apps/server/src/plugin-support/model-choice.ts +109 -0
  44. package/apps/server/src/plugin-support/model-upstreams.ts +12 -0
  45. package/apps/server/src/plugin-support/native-typescript-child.ts +78 -0
  46. package/apps/server/src/plugin-support/native-typescript-executor.ts +260 -0
  47. package/apps/server/src/plugin-support/plugin-config.ts +48 -0
  48. package/apps/server/src/plugin-support/plugin-folder.ts +81 -0
  49. package/apps/server/src/plugin-support/plugin-module.ts +14 -0
  50. package/apps/server/src/plugin-support/plugins-root.ts +41 -0
  51. package/apps/server/src/plugin-support/product-model-settings-contract.ts +24 -0
  52. package/apps/server/src/plugin-support/product-model-settings.ts +120 -0
  53. package/apps/server/src/plugin-support/product-start-options.ts +104 -0
  54. package/apps/server/src/plugin-support/prompt.ts +68 -0
  55. package/apps/server/src/plugin-support/provision.ts +85 -0
  56. package/apps/server/src/plugin-support/run-scripts.ts +88 -0
  57. package/apps/server/src/plugin-support/shell-platform.ts +21 -0
  58. package/apps/server/src/plugin-support/skills.ts +97 -0
  59. package/apps/server/src/plugin-support/start-entries-contract.ts +71 -0
  60. package/apps/server/src/plugin-support/start-options-contract.ts +65 -0
  61. package/apps/server/src/plugin-support/system-prompts.ts +138 -0
  62. package/apps/server/src/plugin-support/thinking-level.ts +8 -0
  63. package/apps/server/src/plugin-support/tool-availability.ts +20 -0
  64. package/apps/server/src/plugin-support/workspace-ownership.ts +36 -0
  65. package/apps/server/src/plugin-support/workspace-sandbox-host.ts +213 -0
  66. package/apps/server/src/plugin-support/workspace-tool-naming.ts +11 -0
  67. package/apps/server/src/plugin-support/zip.ts +69 -0
  68. package/apps/server/src/profile/compose.ts +69 -0
  69. package/apps/server/src/profile/plugin-discovery.ts +112 -0
  70. package/apps/server/src/profile/plugin-list.ts +19 -0
  71. package/apps/server/src/profile/provisioning.ts +81 -0
  72. package/apps/server/src/protocol.ts +106 -0
  73. package/apps/server/src/provider.ts +817 -0
  74. package/apps/server/src/ragents/actor-chat-history.ts +111 -0
  75. package/apps/server/src/ragents/chat-projection.ts +55 -0
  76. package/apps/server/src/ragents/chat-text-positions.ts +43 -0
  77. package/apps/server/src/ragents/coordinator.ts +5 -0
  78. package/apps/server/src/ragents/document-store.ts +12 -0
  79. package/apps/server/src/ragents/engine.ts +417 -0
  80. package/apps/server/src/ragents/global-chat.ts +40 -0
  81. package/apps/server/src/ragents/host-services.ts +26 -0
  82. package/apps/server/src/ragents/journal-chat-events.ts +52 -0
  83. package/apps/server/src/ragents/product-runtime.ts +31 -0
  84. package/apps/server/src/ragents/runtime-bridge.ts +7 -0
  85. package/apps/server/src/ragents/session.ts +859 -0
  86. package/apps/server/src/ragents/start-option-state.ts +37 -0
  87. package/apps/server/src/ragents/typescript-tools.ts +182 -0
  88. package/apps/server/src/ragents/workspace-runtime.ts +64 -0
  89. package/apps/server/src/rpc/dispatcher.ts +178 -0
  90. package/apps/server/src/rpc/http-transport.ts +178 -0
  91. package/apps/server/src/rpc/stdio-transport.ts +44 -0
  92. package/apps/server/src/run-preparation-contract.ts +20 -0
  93. package/apps/server/src/run-preparation-input.ts +16 -0
  94. package/apps/server/src/run-preparation.ts +147 -0
  95. package/apps/server/src/run-transfer.ts +264 -0
  96. package/apps/server/src/server.ts +312 -0
  97. package/apps/server/src/settings.ts +209 -0
  98. package/apps/server/src/startup.ts +13 -0
  99. package/apps/server/src/title-compactor.ts +131 -0
  100. package/apps/server/src/title-settings-contract.ts +9 -0
  101. package/apps/server/src/title-settings.ts +67 -0
  102. package/apps/web/package.json +41 -0
  103. package/apps/web/src/AccessContext.tsx +125 -0
  104. package/apps/web/src/App.tsx +315 -0
  105. package/apps/web/src/CanvasShortcuts.tsx +60 -0
  106. package/apps/web/src/DiffCode.tsx +89 -0
  107. package/apps/web/src/HelpDialog.tsx +87 -0
  108. package/apps/web/src/MaterialSettings.tsx +40 -0
  109. package/apps/web/src/Overview.tsx +201 -0
  110. package/apps/web/src/PluginActivation.ts +41 -0
  111. package/apps/web/src/PluginChat.tsx +552 -0
  112. package/apps/web/src/PluginRegistry.tsx +689 -0
  113. package/apps/web/src/RunPreparationChat.tsx +111 -0
  114. package/apps/web/src/RunStore.ts +86 -0
  115. package/apps/web/src/SessionList.tsx +148 -0
  116. package/apps/web/src/SettingsModal.tsx +949 -0
  117. package/apps/web/src/SourceCode.tsx +49 -0
  118. package/apps/web/src/StartOptions.tsx +231 -0
  119. package/apps/web/src/StartSurface.tsx +161 -0
  120. package/apps/web/src/StatusGroup.tsx +18 -0
  121. package/apps/web/src/ThemeSettings.tsx +46 -0
  122. package/apps/web/src/TitleModelSettings.tsx +100 -0
  123. package/apps/web/src/Toolbar.tsx +28 -0
  124. package/apps/web/src/WorkspacePanel.tsx +309 -0
  125. package/apps/web/src/access-session.ts +27 -0
  126. package/apps/web/src/access-token.ts +31 -0
  127. package/apps/web/src/api.ts +368 -0
  128. package/apps/web/src/chat/ChatInputToolbar.tsx +488 -0
  129. package/apps/web/src/chat/ChatMessages.tsx +666 -0
  130. package/apps/web/src/chat/ChatPanel.tsx +61 -0
  131. package/apps/web/src/chat/DetailModeSwitch.tsx +58 -0
  132. package/apps/web/src/chat/Markdown.tsx +104 -0
  133. package/apps/web/src/chat/QuestionCard.tsx +107 -0
  134. package/apps/web/src/chat/StepPopover.tsx +82 -0
  135. package/apps/web/src/chat/WorkingScenes.tsx +235 -0
  136. package/apps/web/src/chat/attachments.ts +53 -0
  137. package/apps/web/src/chat/chat-scroll.ts +41 -0
  138. package/apps/web/src/chat/chat-target.ts +21 -0
  139. package/apps/web/src/chat/requests.ts +23 -0
  140. package/apps/web/src/chat/texts.ts +61 -0
  141. package/apps/web/src/chat/types.ts +26 -0
  142. package/apps/web/src/chat/useAttachmentCapabilities.ts +35 -0
  143. package/apps/web/src/chat/useChat.ts +46 -0
  144. package/apps/web/src/chat/user-location.ts +22 -0
  145. package/apps/web/src/column/ColumnApp.tsx +158 -0
  146. package/apps/web/src/column/ColumnMenu.tsx +37 -0
  147. package/apps/web/src/column/ColumnRunHeader.tsx +43 -0
  148. package/apps/web/src/column/column-location.ts +30 -0
  149. package/apps/web/src/column/host-contract.ts +83 -0
  150. package/apps/web/src/column/host.ts +101 -0
  151. package/apps/web/src/column/use-session-list.ts +42 -0
  152. package/apps/web/src/column.tsx +43 -0
  153. package/apps/web/src/diff-view.css +38 -0
  154. package/apps/web/src/help-samples.ts +11 -0
  155. package/apps/web/src/highlighting.css +74 -0
  156. package/apps/web/src/highlighting.ts +262 -0
  157. package/apps/web/src/lib/format.ts +5 -0
  158. package/apps/web/src/lib/guards.ts +8 -0
  159. package/apps/web/src/lib/http.ts +9 -0
  160. package/apps/web/src/lib/labels.ts +11 -0
  161. package/apps/web/src/lib/local-storage-setting.ts +39 -0
  162. package/apps/web/src/main.tsx +30 -0
  163. package/apps/web/src/material-settings.ts +104 -0
  164. package/apps/web/src/model-settings-events.ts +1 -0
  165. package/apps/web/src/page-opener.tsx +14 -0
  166. package/apps/web/src/panel/LoginForm.tsx +31 -0
  167. package/apps/web/src/panel/OverviewPage.tsx +90 -0
  168. package/apps/web/src/panel/PanelPage.tsx +9 -0
  169. package/apps/web/src/panel/SettingsPage.tsx +102 -0
  170. package/apps/web/src/panel/contract.ts +101 -0
  171. package/apps/web/src/panel/target-state.ts +53 -0
  172. package/apps/web/src/panel.tsx +30 -0
  173. package/apps/web/src/plugin-bootstrap.ts +90 -0
  174. package/apps/web/src/plugin-discovery.ts +5 -0
  175. package/apps/web/src/rpc/client.ts +301 -0
  176. package/apps/web/src/rpc.ts +4 -0
  177. package/apps/web/src/run-overview.ts +34 -0
  178. package/apps/web/src/run-preparation.ts +16 -0
  179. package/apps/web/src/run-read-state.ts +33 -0
  180. package/apps/web/src/settings-contributions.ts +274 -0
  181. package/apps/web/src/theme.ts +135 -0
  182. package/apps/web/src/title-model-settings.ts +51 -0
  183. package/apps/web/src/toolLine.ts +67 -0
  184. package/apps/web/src/ui/ListDetail.tsx +149 -0
  185. package/apps/web/src/ui/SectionLabel.tsx +7 -0
  186. package/apps/web/src/ui/SvgEdge.tsx +39 -0
  187. package/apps/web/src/ui/alert.tsx +75 -0
  188. package/apps/web/src/ui/badge.tsx +51 -0
  189. package/apps/web/src/ui/button.tsx +57 -0
  190. package/apps/web/src/ui/card.tsx +102 -0
  191. package/apps/web/src/ui/checkbox.tsx +26 -0
  192. package/apps/web/src/ui/dialog.tsx +250 -0
  193. package/apps/web/src/ui/dropdown-menu.tsx +265 -0
  194. package/apps/web/src/ui/empty.tsx +103 -0
  195. package/apps/web/src/ui/field.tsx +236 -0
  196. package/apps/web/src/ui/frame.css +4 -0
  197. package/apps/web/src/ui/index.ts +43 -0
  198. package/apps/web/src/ui/input.tsx +19 -0
  199. package/apps/web/src/ui/label.tsx +17 -0
  200. package/apps/web/src/ui/modal-controller.ts +70 -0
  201. package/apps/web/src/ui/modal.tsx +62 -0
  202. package/apps/web/src/ui/popover.tsx +102 -0
  203. package/apps/web/src/ui/progress.tsx +80 -0
  204. package/apps/web/src/ui/radio-group.tsx +35 -0
  205. package/apps/web/src/ui/select.tsx +198 -0
  206. package/apps/web/src/ui/separator.tsx +22 -0
  207. package/apps/web/src/ui/skeleton.tsx +13 -0
  208. package/apps/web/src/ui/spinner.tsx +10 -0
  209. package/apps/web/src/ui/switch.tsx +29 -0
  210. package/apps/web/src/ui/table.tsx +113 -0
  211. package/apps/web/src/ui/tabs.tsx +79 -0
  212. package/apps/web/src/ui/tailwind.css +21 -0
  213. package/apps/web/src/ui/textarea.tsx +17 -0
  214. package/apps/web/src/ui/theme.css +300 -0
  215. package/apps/web/src/ui/toggle-group.tsx +87 -0
  216. package/apps/web/src/ui/toggle.tsx +42 -0
  217. package/apps/web/src/ui/tooltip.tsx +63 -0
  218. package/apps/web/src/ui/useFileInput.ts +50 -0
  219. package/apps/web/src/virtual-plugins.d.ts +3 -0
  220. package/apps/web/src/vite-env.d.ts +1 -0
  221. package/package.json +82 -0
  222. package/packages/agent/package.json +64 -0
  223. package/packages/agent/src/config.ts +161 -0
  224. package/packages/agent/src/core/agent-session-runtime.ts +548 -0
  225. package/packages/agent/src/core/agent-session-services.ts +224 -0
  226. package/packages/agent/src/core/agent-session.ts +3357 -0
  227. package/packages/agent/src/core/auth-guidance.ts +18 -0
  228. package/packages/agent/src/core/auth-storage.ts +271 -0
  229. package/packages/agent/src/core/bash-executor.ts +156 -0
  230. package/packages/agent/src/core/compaction/branch-summarization.ts +372 -0
  231. package/packages/agent/src/core/compaction/compaction.ts +875 -0
  232. package/packages/agent/src/core/compaction/index.ts +7 -0
  233. package/packages/agent/src/core/compaction/utils.ts +174 -0
  234. package/packages/agent/src/core/defaults.ts +3 -0
  235. package/packages/agent/src/core/diagnostics.ts +15 -0
  236. package/packages/agent/src/core/event-bus.ts +33 -0
  237. package/packages/agent/src/core/exec.ts +107 -0
  238. package/packages/agent/src/core/experimental.ts +3 -0
  239. package/packages/agent/src/core/extensions/index.ts +149 -0
  240. package/packages/agent/src/core/extensions/loader.ts +709 -0
  241. package/packages/agent/src/core/extensions/runner.ts +1132 -0
  242. package/packages/agent/src/core/extensions/types.ts +1460 -0
  243. package/packages/agent/src/core/extensions/wrapper.ts +45 -0
  244. package/packages/agent/src/core/footer-data-provider.ts +388 -0
  245. package/packages/agent/src/core/http-dispatcher.ts +106 -0
  246. package/packages/agent/src/core/index.ts +78 -0
  247. package/packages/agent/src/core/messages.ts +195 -0
  248. package/packages/agent/src/core/model-config.ts +287 -0
  249. package/packages/agent/src/core/model-registry.ts +126 -0
  250. package/packages/agent/src/core/model-resolver.ts +675 -0
  251. package/packages/agent/src/core/model-runtime.ts +517 -0
  252. package/packages/agent/src/core/output-guard.ts +108 -0
  253. package/packages/agent/src/core/package-manager.ts +2441 -0
  254. package/packages/agent/src/core/prompt-templates.ts +284 -0
  255. package/packages/agent/src/core/provider-composer.ts +549 -0
  256. package/packages/agent/src/core/resolve-config-value.ts +287 -0
  257. package/packages/agent/src/core/resource-loader.ts +946 -0
  258. package/packages/agent/src/core/runtime-credentials.ts +48 -0
  259. package/packages/agent/src/core/sdk.ts +358 -0
  260. package/packages/agent/src/core/session-cwd.ts +59 -0
  261. package/packages/agent/src/core/session-manager.ts +1623 -0
  262. package/packages/agent/src/core/settings-manager.ts +1212 -0
  263. package/packages/agent/src/core/skills.ts +487 -0
  264. package/packages/agent/src/core/slash-commands.ts +41 -0
  265. package/packages/agent/src/core/source-info.ts +40 -0
  266. package/packages/agent/src/core/system-prompt.ts +147 -0
  267. package/packages/agent/src/core/timings.ts +50 -0
  268. package/packages/agent/src/core/tools/bash.ts +314 -0
  269. package/packages/agent/src/core/tools/edit-diff.ts +704 -0
  270. package/packages/agent/src/core/tools/edit.ts +222 -0
  271. package/packages/agent/src/core/tools/file-mutation-queue.ts +61 -0
  272. package/packages/agent/src/core/tools/index.ts +130 -0
  273. package/packages/agent/src/core/tools/output-accumulator.ts +222 -0
  274. package/packages/agent/src/core/tools/path-utils.ts +118 -0
  275. package/packages/agent/src/core/tools/read.ts +195 -0
  276. package/packages/agent/src/core/tools/tool-definition-wrapper.ts +45 -0
  277. package/packages/agent/src/core/tools/truncate.ts +276 -0
  278. package/packages/agent/src/core/tools/write.ts +90 -0
  279. package/packages/agent/src/core/trust-manager.ts +244 -0
  280. package/packages/agent/src/index.ts +287 -0
  281. package/packages/agent/src/utils/ansi.ts +60 -0
  282. package/packages/agent/src/utils/child-process.ts +137 -0
  283. package/packages/agent/src/utils/exif-orientation.ts +183 -0
  284. package/packages/agent/src/utils/frontmatter.ts +39 -0
  285. package/packages/agent/src/utils/fs-watch.ts +30 -0
  286. package/packages/agent/src/utils/git.ts +226 -0
  287. package/packages/agent/src/utils/image-convert.ts +49 -0
  288. package/packages/agent/src/utils/image-process.ts +119 -0
  289. package/packages/agent/src/utils/image-resize-core.ts +164 -0
  290. package/packages/agent/src/utils/image-resize-worker.ts +42 -0
  291. package/packages/agent/src/utils/image-resize.ts +123 -0
  292. package/packages/agent/src/utils/json.ts +6 -0
  293. package/packages/agent/src/utils/mime.ts +116 -0
  294. package/packages/agent/src/utils/paths.ts +118 -0
  295. package/packages/agent/src/utils/photon.ts +139 -0
  296. package/packages/agent/src/utils/shell.ts +225 -0
  297. package/packages/agent/src/utils/sleep.ts +18 -0
  298. package/packages/agent/src/utils/tools-manager.ts +63 -0
  299. package/packages/agent-core/package.json +32 -0
  300. package/packages/agent-core/src/agent-loop.ts +877 -0
  301. package/packages/agent-core/src/agent.ts +598 -0
  302. package/packages/agent-core/src/index.ts +4 -0
  303. package/packages/agent-core/src/types.ts +455 -0
  304. package/packages/agent-core/src/uuid.ts +54 -0
  305. package/packages/ai/package.json +46 -0
  306. package/packages/ai/src/api/ai-sdk-messages.ts +102 -0
  307. package/packages/ai/src/api/ai-sdk-transport.ts +53 -0
  308. package/packages/ai/src/api/ai-sdk.lazy.ts +4 -0
  309. package/packages/ai/src/api/ai-sdk.ts +273 -0
  310. package/packages/ai/src/api/lazy.ts +75 -0
  311. package/packages/ai/src/api/openrouter-images.lazy.ts +10 -0
  312. package/packages/ai/src/api/openrouter-images.ts +98 -0
  313. package/packages/ai/src/api/simple-options.ts +77 -0
  314. package/packages/ai/src/api/transform-messages.ts +185 -0
  315. package/packages/ai/src/api-registry.ts +226 -0
  316. package/packages/ai/src/auth/context.ts +45 -0
  317. package/packages/ai/src/auth/credential-store.ts +51 -0
  318. package/packages/ai/src/auth/helpers.ts +47 -0
  319. package/packages/ai/src/auth/resolve.ts +139 -0
  320. package/packages/ai/src/auth/types.ts +220 -0
  321. package/packages/ai/src/compat/extension-oauth-types.ts +45 -0
  322. package/packages/ai/src/env-api-keys.ts +24 -0
  323. package/packages/ai/src/image-models.generated.ts +533 -0
  324. package/packages/ai/src/images-models.ts +274 -0
  325. package/packages/ai/src/index.ts +33 -0
  326. package/packages/ai/src/models-store.ts +38 -0
  327. package/packages/ai/src/models.generated.ts +6 -0
  328. package/packages/ai/src/models.ts +705 -0
  329. package/packages/ai/src/oauth.ts +10 -0
  330. package/packages/ai/src/providers/all.ts +64 -0
  331. package/packages/ai/src/providers/faux.ts +539 -0
  332. package/packages/ai/src/providers/openrouter-images.ts +14 -0
  333. package/packages/ai/src/providers/openrouter.models.ts +6050 -0
  334. package/packages/ai/src/providers/openrouter.ts +15 -0
  335. package/packages/ai/src/session-resources.ts +24 -0
  336. package/packages/ai/src/types.ts +692 -0
  337. package/packages/ai/src/utils/abort-signals.ts +41 -0
  338. package/packages/ai/src/utils/deferred-tools.ts +39 -0
  339. package/packages/ai/src/utils/diagnostics.ts +45 -0
  340. package/packages/ai/src/utils/error-body.ts +129 -0
  341. package/packages/ai/src/utils/estimate.ts +146 -0
  342. package/packages/ai/src/utils/event-stream.ts +88 -0
  343. package/packages/ai/src/utils/hash.ts +13 -0
  344. package/packages/ai/src/utils/headers.ts +18 -0
  345. package/packages/ai/src/utils/json-parse.ts +124 -0
  346. package/packages/ai/src/utils/node-http-proxy.ts +112 -0
  347. package/packages/ai/src/utils/overflow.ts +165 -0
  348. package/packages/ai/src/utils/provider-env.ts +52 -0
  349. package/packages/ai/src/utils/retry.ts +101 -0
  350. package/packages/ai/src/utils/sanitize-unicode.ts +25 -0
  351. package/packages/ai/src/utils/typebox-helpers.ts +24 -0
  352. package/packages/ai/src/utils/validation.ts +383 -0
  353. package/packages/ragents/package.json +31 -0
  354. package/packages/ragents/src/access.ts +54 -0
  355. package/packages/ragents/src/agents/actor-input.ts +191 -0
  356. package/packages/ragents/src/agents/catalog.ts +220 -0
  357. package/packages/ragents/src/agents/delivery.ts +187 -0
  358. package/packages/ragents/src/agents/live.ts +71 -0
  359. package/packages/ragents/src/agents/plugins.ts +130 -0
  360. package/packages/ragents/src/agents/scheduler.ts +1048 -0
  361. package/packages/ragents/src/agents/schemas.ts +64 -0
  362. package/packages/ragents/src/agents/tool-orientation.ts +12 -0
  363. package/packages/ragents/src/agents/tools.ts +709 -0
  364. package/packages/ragents/src/agents/toolset.ts +324 -0
  365. package/packages/ragents/src/agents/turn.ts +65 -0
  366. package/packages/ragents/src/agents/workspace-tools.ts +11 -0
  367. package/packages/ragents/src/agents/workspaces.ts +15 -0
  368. package/packages/ragents/src/domain/draft.ts +11 -0
  369. package/packages/ragents/src/domain/driver.ts +56 -0
  370. package/packages/ragents/src/domain/event-semantics.ts +668 -0
  371. package/packages/ragents/src/domain/event-validation.ts +620 -0
  372. package/packages/ragents/src/domain/events.ts +236 -0
  373. package/packages/ragents/src/domain/json-patch.ts +77 -0
  374. package/packages/ragents/src/domain/json.ts +86 -0
  375. package/packages/ragents/src/domain/model.ts +267 -0
  376. package/packages/ragents/src/domain/plugin-state.ts +33 -0
  377. package/packages/ragents/src/domain/portable-id.ts +9 -0
  378. package/packages/ragents/src/domain/projection.ts +506 -0
  379. package/packages/ragents/src/domain/schema-errors.ts +56 -0
  380. package/packages/ragents/src/domain/vocabulary.ts +37 -0
  381. package/packages/ragents/src/drivers/agent-runtime.ts +1503 -0
  382. package/packages/ragents/src/drivers/agent.ts +108 -0
  383. package/packages/ragents/src/drivers/attachments.ts +56 -0
  384. package/packages/ragents/src/drivers/skill-preload.ts +205 -0
  385. package/packages/ragents/src/drivers/types.ts +77 -0
  386. package/packages/ragents/src/http/contracts.ts +80 -0
  387. package/packages/ragents/src/http/methods.ts +150 -0
  388. package/packages/ragents/src/index.ts +161 -0
  389. package/packages/ragents/src/plugin-host.ts +1184 -0
  390. package/packages/ragents/src/plugin-types.ts +373 -0
  391. package/packages/ragents/src/rpc/contract.ts +76 -0
  392. package/packages/ragents/src/rpc/contribution.ts +67 -0
  393. package/packages/ragents/src/rpc/peer.ts +208 -0
  394. package/packages/ragents/src/rpc/protocol.ts +129 -0
  395. package/packages/ragents/src/runtime/artifacts.ts +95 -0
  396. package/packages/ragents/src/runtime/canonical-hash.ts +5 -0
  397. package/packages/ragents/src/runtime/canonical-json.ts +41 -0
  398. package/packages/ragents/src/runtime/command.ts +35 -0
  399. package/packages/ragents/src/runtime/decisions/actions.ts +77 -0
  400. package/packages/ragents/src/runtime/decisions/actors.ts +283 -0
  401. package/packages/ragents/src/runtime/decisions/artifacts.ts +28 -0
  402. package/packages/ragents/src/runtime/decisions/inputs.ts +79 -0
  403. package/packages/ragents/src/runtime/decisions/subscriptions.ts +135 -0
  404. package/packages/ragents/src/runtime/decisions/turns.ts +166 -0
  405. package/packages/ragents/src/runtime/domain-error.ts +10 -0
  406. package/packages/ragents/src/runtime/durable-fs.ts +13 -0
  407. package/packages/ragents/src/runtime/failures.ts +18 -0
  408. package/packages/ragents/src/runtime/guards.ts +196 -0
  409. package/packages/ragents/src/runtime/journal-storage.ts +228 -0
  410. package/packages/ragents/src/runtime/journal.ts +952 -0
  411. package/packages/ragents/src/runtime/orchestration.ts +711 -0
  412. package/packages/ragents/src/runtime/serial-queue.ts +13 -0
  413. package/packages/ragents/src/runtime/services.ts +15 -0
  414. package/packages/ragents/src/runtime/stop.ts +186 -0
  415. package/packages/ragents/src/script/driver.ts +18 -0
  416. package/packages/ragents/src/script/mediators.ts +386 -0
  417. package/packages/ragents/src/script/programs.ts +10 -0
  418. package/packages/ragents/src/script/std.ts +27 -0
  419. package/packages/ragents/src/script/types.ts +6 -0
  420. package/packages/ragents/src/typescript/async-compiler.ts +322 -0
  421. package/packages/ragents/src/typescript/build-contract.ts +14 -0
  422. package/packages/ragents/src/typescript/compiler-worker.ts +52 -0
  423. package/packages/ragents/src/typescript/compiler.ts +304 -0
  424. package/packages/ragents/src/typescript/index.ts +48 -0
  425. package/packages/ragents/src/typescript/native-executor.ts +40 -0
  426. package/packages/ragents/src/typescript/native-program.ts +5 -0
  427. package/packages/ragents/src/typescript/run-context.ts +199 -0
  428. package/packages/ragents/src/typescript/schema.ts +176 -0
  429. package/packages/ragents/src/typescript/snippet.ts +121 -0
  430. package/packages/workspace-executor/package.json +25 -0
  431. package/packages/workspace-executor/src/context.ts +123 -0
  432. package/packages/workspace-executor/src/executor.ts +134 -0
  433. package/packages/workspace-executor/src/git-config-environment.ts +10 -0
  434. package/packages/workspace-executor/src/index.ts +52 -0
  435. package/packages/workspace-executor/src/language-server/adapters/fsharp.ts +59 -0
  436. package/packages/workspace-executor/src/language-server/adapters/index.ts +7 -0
  437. package/packages/workspace-executor/src/language-server/adapters/roslyn.ts +54 -0
  438. package/packages/workspace-executor/src/language-server/adapters/typescript.ts +46 -0
  439. package/packages/workspace-executor/src/language-server/contract.ts +23 -0
  440. package/packages/workspace-executor/src/language-server/diagnostics.ts +62 -0
  441. package/packages/workspace-executor/src/language-server/host.ts +409 -0
  442. package/packages/workspace-executor/src/language-server/json-rpc.ts +103 -0
  443. package/packages/workspace-executor/src/language-server/roots.ts +29 -0
  444. package/packages/workspace-executor/src/language-server/session.ts +442 -0
  445. package/packages/workspace-executor/src/language-server/solution.ts +13 -0
  446. package/packages/workspace-executor/src/managed-process.ts +329 -0
  447. package/packages/workspace-executor/src/paths.ts +43 -0
  448. package/packages/workspace-executor/src/run-marker.ts +6 -0
  449. package/packages/workspace-executor/src/safe-environment.ts +47 -0
  450. package/packages/workspace-executor/src/sandbox-tools.ts +258 -0
  451. package/packages/workspace-executor/src/session-ident.ts +37 -0
  452. package/packages/workspace-executor/src/shell-platform.ts +11 -0
  453. package/packages/workspace-executor/src/tools.ts +28 -0
  454. package/plugins/package.json +8 -0
  455. package/plugins/ragents.activity/server/index.ts +9 -0
  456. package/plugins/ragents.activity/web/ActivityHeader.tsx +58 -0
  457. package/plugins/ragents.activity/web/activity.ts +144 -0
  458. package/plugins/ragents.activity/web/index.tsx +13 -0
  459. package/plugins/ragents.actor-programs/client-ui/DataTable.tsx +100 -0
  460. package/plugins/ragents.actor-programs/client-ui/FilePicker.tsx +65 -0
  461. package/plugins/ragents.actor-programs/client-ui/FlowDiagram.tsx +234 -0
  462. package/plugins/ragents.actor-programs/client-ui/FlowDiagramRenderer.tsx +85 -0
  463. package/plugins/ragents.actor-programs/client-ui/Form.tsx +126 -0
  464. package/plugins/ragents.actor-programs/client-ui/Layout.tsx +27 -0
  465. package/plugins/ragents.actor-programs/client-ui/MessageList.tsx +30 -0
  466. package/plugins/ragents.actor-programs/client-ui/Viewers.tsx +41 -0
  467. package/plugins/ragents.actor-programs/client-ui/WorkflowDiagram.tsx +14 -0
  468. package/plugins/ragents.actor-programs/client-ui/contracts.d.ts +84 -0
  469. package/plugins/ragents.actor-programs/client-ui/file-contracts.d.ts +19 -0
  470. package/plugins/ragents.actor-programs/client-ui/file-selection.ts +24 -0
  471. package/plugins/ragents.actor-programs/client-ui/flow-diagram-contracts.d.ts +27 -0
  472. package/plugins/ragents.actor-programs/client-ui/flow-diagram.css +23 -0
  473. package/plugins/ragents.actor-programs/client-ui/form-contracts.d.ts +38 -0
  474. package/plugins/ragents.actor-programs/client-ui/frame-layout.ts +4 -0
  475. package/plugins/ragents.actor-programs/client-ui/index.tsx +81 -0
  476. package/plugins/ragents.actor-programs/client-ui/layout-contracts.d.ts +33 -0
  477. package/plugins/ragents.actor-programs/client-ui/message-list-contracts.d.ts +33 -0
  478. package/plugins/ragents.actor-programs/client-ui/table-contracts.d.ts +35 -0
  479. package/plugins/ragents.actor-programs/client-ui/viewer-contracts.d.ts +37 -0
  480. package/plugins/ragents.actor-programs/client-ui/workflow-diagram-contracts.d.ts +10 -0
  481. package/plugins/ragents.actor-programs/contract.ts +180 -0
  482. package/plugins/ragents.actor-programs/parameter-types.ts +3 -0
  483. package/plugins/ragents.actor-programs/prompt.hbs +79 -0
  484. package/plugins/ragents.actor-programs/server/agent-tools.ts +31 -0
  485. package/plugins/ragents.actor-programs/server/app-project.ts +284 -0
  486. package/plugins/ragents.actor-programs/server/authoring-contracts.ts +10 -0
  487. package/plugins/ragents.actor-programs/server/client-compiler.ts +174 -0
  488. package/plugins/ragents.actor-programs/server/client-contracts.ts +187 -0
  489. package/plugins/ragents.actor-programs/server/client-runtime.ts +16 -0
  490. package/plugins/ragents.actor-programs/server/controls-template.ts +118 -0
  491. package/plugins/ragents.actor-programs/server/controls-tool.ts +48 -0
  492. package/plugins/ragents.actor-programs/server/index.ts +51 -0
  493. package/plugins/ragents.actor-programs/server/methods.ts +72 -0
  494. package/plugins/ragents.actor-programs/server/project-diagnostics.ts +138 -0
  495. package/plugins/ragents.actor-programs/server/prompts.ts +21 -0
  496. package/plugins/ragents.actor-programs/server/routes.ts +235 -0
  497. package/plugins/ragents.actor-programs/server/runtime-libraries.ts +4 -0
  498. package/plugins/ragents.actor-programs/server/runtime.ts +721 -0
  499. package/plugins/ragents.actor-programs/server/tailwind.ts +22 -0
  500. package/plugins/ragents.actor-programs/server/templates.ts +400 -0
  501. package/plugins/ragents.actor-programs/server/tool-contributor.ts +29 -0
  502. package/plugins/ragents.actor-programs/summary.hbs +17 -0
  503. package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +463 -0
  504. package/plugins/ragents.actor-programs/web/AppsPanel.tsx +436 -0
  505. package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +116 -0
  506. package/plugins/ragents.actor-programs/web/ExpandIcon.tsx +5 -0
  507. package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +31 -0
  508. package/plugins/ragents.actor-programs/web/FunctionForm.tsx +102 -0
  509. package/plugins/ragents.actor-programs/web/ProgramSource.tsx +81 -0
  510. package/plugins/ragents.actor-programs/web/api.ts +353 -0
  511. package/plugins/ragents.actor-programs/web/bridge.ts +122 -0
  512. package/plugins/ragents.actor-programs/web/chat-state.ts +37 -0
  513. package/plugins/ragents.actor-programs/web/context.ts +30 -0
  514. package/plugins/ragents.actor-programs/web/function-call.ts +28 -0
  515. package/plugins/ragents.actor-programs/web/function-input.ts +40 -0
  516. package/plugins/ragents.actor-programs/web/index.tsx +96 -0
  517. package/plugins/ragents.actor-programs/web/invocations.ts +43 -0
  518. package/plugins/ragents.actor-programs/web/program-state.ts +68 -0
  519. package/plugins/ragents.actor-programs/web/state-revision.ts +16 -0
  520. package/plugins/ragents.actor-programs/workflow/index.ts +202 -0
  521. package/plugins/ragents.actor-programs/workflow/prompt-reader.ts +15 -0
  522. package/plugins/ragents.ask/ask.hbs +4 -0
  523. package/plugins/ragents.ask/contract.ts +17 -0
  524. package/plugins/ragents.ask/server/answer-method.ts +15 -0
  525. package/plugins/ragents.ask/server/ask-service.ts +152 -0
  526. package/plugins/ragents.ask/server/ask-tool.ts +39 -0
  527. package/plugins/ragents.ask/server/contract.ts +22 -0
  528. package/plugins/ragents.ask/server/index.ts +26 -0
  529. package/plugins/ragents.ask/server/tool-contributor.ts +11 -0
  530. package/plugins/ragents.ask/web/QuestionSection.tsx +47 -0
  531. package/plugins/ragents.ask/web/api.ts +6 -0
  532. package/plugins/ragents.ask/web/constants.ts +1 -0
  533. package/plugins/ragents.ask/web/index.tsx +50 -0
  534. package/plugins/ragents.browser/provision.ts +48 -0
  535. package/plugins/ragents.browser/server/browser.ts +393 -0
  536. package/plugins/ragents.browser/server/contract.ts +36 -0
  537. package/plugins/ragents.browser/server/index.ts +35 -0
  538. package/plugins/ragents.browser/server/tools.ts +197 -0
  539. package/plugins/ragents.browser/skills/browser-testing/SKILL.md +36 -0
  540. package/plugins/ragents.documents/contract.ts +33 -0
  541. package/plugins/ragents.documents/prompt.hbs +18 -0
  542. package/plugins/ragents.documents/server/config.ts +14 -0
  543. package/plugins/ragents.documents/server/document-write-tool.ts +45 -0
  544. package/plugins/ragents.documents/server/files-route.ts +137 -0
  545. package/plugins/ragents.documents/server/index.ts +38 -0
  546. package/plugins/ragents.documents/server/show-document-tool.ts +73 -0
  547. package/plugins/ragents.documents/server/store.ts +35 -0
  548. package/plugins/ragents.documents/server/tool-contributor.ts +16 -0
  549. package/plugins/ragents.documents/web/DocumentViewer.tsx +450 -0
  550. package/plugins/ragents.documents/web/api.ts +8 -0
  551. package/plugins/ragents.documents/web/index.tsx +279 -0
  552. package/plugins/ragents.lsp-fsharp/provision.ts +74 -0
  553. package/plugins/ragents.lsp-fsharp/server/index.ts +16 -0
  554. package/plugins/ragents.lsp-fsharp/web/index.tsx +7 -0
  555. package/plugins/ragents.lsp-roslyn/provision.ts +54 -0
  556. package/plugins/ragents.lsp-roslyn/server/index.ts +15 -0
  557. package/plugins/ragents.lsp-roslyn/web/api.ts +10 -0
  558. package/plugins/ragents.lsp-roslyn/web/index.tsx +7 -0
  559. package/plugins/ragents.lsp-roslyn/web/language-server-plugin.tsx +236 -0
  560. package/plugins/ragents.lsp-typescript/server/index.ts +7 -0
  561. package/plugins/ragents.lsp-typescript/web/index.tsx +7 -0
  562. package/plugins/ragents.model-relay/server/config.ts +37 -0
  563. package/plugins/ragents.model-relay/server/index.ts +31 -0
  564. package/plugins/ragents.model-relay/server/relay.ts +213 -0
  565. package/plugins/ragents.orchestration/canvas.hbs +50 -0
  566. package/plugins/ragents.orchestration/contract.ts +322 -0
  567. package/plugins/ragents.orchestration/orchestration.hbs +105 -0
  568. package/plugins/ragents.orchestration/server/canvas-tool.ts +248 -0
  569. package/plugins/ragents.orchestration/server/index.ts +64 -0
  570. package/plugins/ragents.orchestration/server/run-stop-tool.ts +30 -0
  571. package/plugins/ragents.orchestration/tiled-layout.ts +47 -0
  572. package/plugins/ragents.orchestration/web/ActorCanvasControls.tsx +159 -0
  573. package/plugins/ragents.orchestration/web/ActorChat.tsx +56 -0
  574. package/plugins/ragents.orchestration/web/ActorChatControls.tsx +64 -0
  575. package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +36 -0
  576. package/plugins/ragents.orchestration/web/ActorNet.tsx +607 -0
  577. package/plugins/ragents.orchestration/web/ActorPopout.tsx +36 -0
  578. package/plugins/ragents.orchestration/web/ActorShortcut.tsx +76 -0
  579. package/plugins/ragents.orchestration/web/ActorTile.tsx +22 -0
  580. package/plugins/ragents.orchestration/web/CanvasStartup.tsx +14 -0
  581. package/plugins/ragents.orchestration/web/CanvasTiles.tsx +47 -0
  582. package/plugins/ragents.orchestration/web/CardSizeSettings.tsx +42 -0
  583. package/plugins/ragents.orchestration/web/Center.tsx +576 -0
  584. package/plugins/ragents.orchestration/web/DocumentsSection.tsx +37 -0
  585. package/plugins/ragents.orchestration/web/ExecutionsPanel.tsx +109 -0
  586. package/plugins/ragents.orchestration/web/FlowInspector.tsx +932 -0
  587. package/plugins/ragents.orchestration/web/JournalStatus.tsx +87 -0
  588. package/plugins/ragents.orchestration/web/MaterialBody.tsx +104 -0
  589. package/plugins/ragents.orchestration/web/ScriptActorCard.tsx +56 -0
  590. package/plugins/ragents.orchestration/web/StopRunButton.tsx +52 -0
  591. package/plugins/ragents.orchestration/web/TiledCanvas.tsx +281 -0
  592. package/plugins/ragents.orchestration/web/ZoomSettings.tsx +38 -0
  593. package/plugins/ragents.orchestration/web/actor-conversation.ts +64 -0
  594. package/plugins/ragents.orchestration/web/actor-header-settings.ts +41 -0
  595. package/plugins/ragents.orchestration/web/api.ts +33 -0
  596. package/plugins/ragents.orchestration/web/canvas-layout-storage.ts +39 -0
  597. package/plugins/ragents.orchestration/web/canvas-layout.ts +326 -0
  598. package/plugins/ragents.orchestration/web/canvas-scene.ts +311 -0
  599. package/plugins/ragents.orchestration/web/canvas-stage.ts +21 -0
  600. package/plugins/ragents.orchestration/web/canvas-startup.ts +36 -0
  601. package/plugins/ragents.orchestration/web/canvas-view-settings.ts +48 -0
  602. package/plugins/ragents.orchestration/web/card-size-settings.ts +36 -0
  603. package/plugins/ragents.orchestration/web/column/AddresseeControl.tsx +116 -0
  604. package/plugins/ragents.orchestration/web/column/ColumnSettings.tsx +50 -0
  605. package/plugins/ragents.orchestration/web/column/RunColumn.tsx +370 -0
  606. package/plugins/ragents.orchestration/web/column/column-actors.ts +38 -0
  607. package/plugins/ragents.orchestration/web/column/column-settings.ts +47 -0
  608. package/plugins/ragents.orchestration/web/column/column-state.ts +59 -0
  609. package/plugins/ragents.orchestration/web/column/sheet-status.ts +30 -0
  610. package/plugins/ragents.orchestration/web/constants.ts +10 -0
  611. package/plugins/ragents.orchestration/web/contract.ts +25 -0
  612. package/plugins/ragents.orchestration/web/executions.ts +124 -0
  613. package/plugins/ragents.orchestration/web/format.ts +4 -0
  614. package/plugins/ragents.orchestration/web/index.tsx +182 -0
  615. package/plugins/ragents.orchestration/web/keyboard-navigation.ts +55 -0
  616. package/plugins/ragents.orchestration/web/material-layout.ts +14 -0
  617. package/plugins/ragents.orchestration/web/run-view.ts +199 -0
  618. package/plugins/ragents.orchestration/web/tile-docking.ts +99 -0
  619. package/plugins/ragents.orchestration/web/tiled-view-settings.ts +76 -0
  620. package/plugins/ragents.orchestration/web/useCanvasMeasurements.ts +78 -0
  621. package/plugins/ragents.orchestration/web/zoom-settings.ts +28 -0
  622. package/plugins/ragents.overseer/contract.ts +165 -0
  623. package/plugins/ragents.overseer/server/api.ts +82 -0
  624. package/plugins/ragents.overseer/server/coordinator-prompt.ts +13 -0
  625. package/plugins/ragents.overseer/server/index.ts +71 -0
  626. package/plugins/ragents.overseer/server/orientation.ts +33 -0
  627. package/plugins/ragents.overseer/server/quick-answer.ts +54 -0
  628. package/plugins/ragents.overseer/server/reset-method.ts +5 -0
  629. package/plugins/ragents.overseer/server/run-directory.ts +49 -0
  630. package/plugins/ragents.overseer/server/settings-method.ts +8 -0
  631. package/plugins/ragents.overseer/server/settings.ts +83 -0
  632. package/plugins/ragents.overseer/server/user-location.ts +96 -0
  633. package/plugins/ragents.overseer/web/ModelSettings.tsx +70 -0
  634. package/plugins/ragents.overseer/web/chat-display.ts +10 -0
  635. package/plugins/ragents.overseer/web/index.tsx +208 -0
  636. package/plugins/ragents.overseer/web/model-settings.ts +61 -0
  637. package/plugins/ragents.overseer/web/quick-answers.ts +64 -0
  638. package/plugins/ragents.processes/contract.ts +61 -0
  639. package/plugins/ragents.processes/server/index.ts +36 -0
  640. package/plugins/ragents.processes/server/methods.ts +39 -0
  641. package/plugins/ragents.processes/server/observer.ts +179 -0
  642. package/plugins/ragents.processes/server/process-table.ts +395 -0
  643. package/plugins/ragents.processes/server/snapshot.ts +63 -0
  644. package/plugins/ragents.processes/server/terminator.ts +164 -0
  645. package/plugins/ragents.processes/web/ProcessHeader.tsx +157 -0
  646. package/plugins/ragents.processes/web/index.tsx +23 -0
  647. package/plugins/ragents.processes/web/processes.ts +75 -0
  648. package/plugins/ragents.product/model-settings-contract.ts +10 -0
  649. package/plugins/ragents.product/preamble.hbs +9 -0
  650. package/plugins/ragents.product/server/config.ts +73 -0
  651. package/plugins/ragents.product/server/index.ts +117 -0
  652. package/plugins/ragents.product/server/relay.ts +118 -0
  653. package/plugins/ragents.product/server/runtime.ts +30 -0
  654. package/plugins/ragents.product/web/ModelControl.tsx +81 -0
  655. package/plugins/ragents.product/web/ProductModelSettings.tsx +131 -0
  656. package/plugins/ragents.product/web/SystemPromptControl.tsx +136 -0
  657. package/plugins/ragents.product/web/index.tsx +29 -0
  658. package/plugins/ragents.product/web/model-settings.ts +39 -0
  659. package/plugins/ragents.product/web/start-options.tsx +12 -0
  660. package/plugins/ragents.profile-distribution/contract.ts +38 -0
  661. package/plugins/ragents.profile-distribution/server/archive.ts +159 -0
  662. package/plugins/ragents.profile-distribution/server/config.ts +27 -0
  663. package/plugins/ragents.profile-distribution/server/index.ts +93 -0
  664. package/plugins/ragents.profile-distribution/server/web.ts +48 -0
  665. package/plugins/ragents.reference/examples.ts +33 -0
  666. package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +27 -0
  667. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +10 -0
  668. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +80 -0
  669. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +82 -0
  670. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +154 -0
  671. package/plugins/ragents.reference/run-scripts/balcony-wizard/package.json +9 -0
  672. package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +32 -0
  673. package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +59 -0
  674. package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +14 -0
  675. package/plugins/ragents.reference/run-scripts/conversation-circle/package.json +9 -0
  676. package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +87 -0
  677. package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +26 -0
  678. package/plugins/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +32 -0
  679. package/plugins/ragents.reference/run-scripts/learning-afternoon/RUN.md +24 -0
  680. package/plugins/ragents.reference/run-scripts/learning-afternoon/package.json +10 -0
  681. package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -0
  682. package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +5 -0
  683. package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -0
  684. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/client.tsx +27 -0
  685. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +127 -0
  686. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/state.ts +38 -0
  687. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/view.tsx +42 -0
  688. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/workflow.ts +38 -0
  689. package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +223 -0
  690. package/plugins/ragents.reference/run-scripts/moderated-round/RUN.md +12 -0
  691. package/plugins/ragents.reference/run-scripts/moderated-round/package.json +9 -0
  692. package/plugins/ragents.reference/run-scripts/moderated-round/src/server.ts +60 -0
  693. package/plugins/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +26 -0
  694. package/plugins/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +24 -0
  695. package/plugins/ragents.reference/run-scripts/shared-actor-list/RUN.md +18 -0
  696. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +16 -0
  697. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/client.tsx +39 -0
  698. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +15 -0
  699. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/server.ts +14 -0
  700. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +13 -0
  701. package/plugins/ragents.reference/run-scripts/shared-actor-list/package.json +9 -0
  702. package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +65 -0
  703. package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +26 -0
  704. package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +42 -0
  705. package/plugins/ragents.reference/run-scripts/word-game/RUN.md +25 -0
  706. package/plugins/ragents.reference/run-scripts/word-game/package.json +11 -0
  707. package/plugins/ragents.reference/run-scripts/word-game/src/client.tsx +27 -0
  708. package/plugins/ragents.reference/run-scripts/word-game/src/contract.ts +23 -0
  709. package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +106 -0
  710. package/plugins/ragents.reference/run-scripts/word-game/src/state.ts +22 -0
  711. package/plugins/ragents.reference/run-scripts/word-game/src/view.tsx +54 -0
  712. package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +253 -0
  713. package/plugins/ragents.reference/server/index.ts +12 -0
  714. package/plugins/ragents.reference/skills/100-shared-actor-list/SKILL.md +12 -0
  715. package/plugins/ragents.reference/skills/110-all-card-slots/SKILL.md +12 -0
  716. package/plugins/ragents.reference/skills/120-canvas-conversation-circle/SKILL.md +12 -0
  717. package/plugins/ragents.reference/skills/130-canvas-pipeline-with-approval/SKILL.md +12 -0
  718. package/plugins/ragents.reference/skills/140-canvas-team-tree-and-topic-grid/SKILL.md +12 -0
  719. package/plugins/ragents.reference/skills/150-editorial-workbench/SKILL.md +12 -0
  720. package/plugins/ragents.reference/skills/160-learning-companion/SKILL.md +12 -0
  721. package/plugins/ragents.reference/skills/170-photo-collection/SKILL.md +12 -0
  722. package/plugins/ragents.reference/skills/180-decision-workbench/SKILL.md +12 -0
  723. package/plugins/ragents.reference/skills/190-review-queue/SKILL.md +12 -0
  724. package/plugins/ragents.reference/skills/20-circle-of-four/SKILL.md +12 -0
  725. package/plugins/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +12 -0
  726. package/plugins/ragents.reference/skills/210-moderator-handover/SKILL.md +12 -0
  727. package/plugins/ragents.reference/skills/220-actor-approval-list/SKILL.md +12 -0
  728. package/plugins/ragents.reference/skills/230-shared-state-views/SKILL.md +12 -0
  729. package/plugins/ragents.reference/skills/240-live-result-list/SKILL.md +12 -0
  730. package/plugins/ragents.reference/skills/250-balcony-wizard/SKILL.md +12 -0
  731. package/plugins/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +12 -0
  732. package/plugins/ragents.reference/skills/35-actor-input-fifo/SKILL.md +12 -0
  733. package/plugins/ragents.reference/skills/40-subscription-matrix/SKILL.md +12 -0
  734. package/plugins/ragents.reference/skills/50-subscription-removal/SKILL.md +12 -0
  735. package/plugins/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +12 -0
  736. package/plugins/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +12 -0
  737. package/plugins/ragents.reference/skills/70-headless-counter/SKILL.md +12 -0
  738. package/plugins/ragents.reference/skills/75-lsp-demo/SKILL.md +12 -0
  739. package/plugins/ragents.reference/skills/80-actor-text-analysis/SKILL.md +12 -0
  740. package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +12 -0
  741. package/plugins/ragents.reference/skills/95-hello-world/SKILL.md +12 -0
  742. package/plugins/ragents.reference/skills/decision-brief/SKILL.md +33 -0
  743. package/plugins/ragents.reference/skills/learning-sprint/SKILL.md +33 -0
  744. package/plugins/ragents.reference/walkthroughs.ts +219 -0
  745. package/plugins/ragents.reference/web/StartGuides.tsx +89 -0
  746. package/plugins/ragents.reference/web/index.tsx +10 -0
  747. package/plugins/ragents.todo/contract.ts +60 -0
  748. package/plugins/ragents.todo/server/index.ts +10 -0
  749. package/plugins/ragents.todo/server/todo-tool.ts +70 -0
  750. package/plugins/ragents.todo/server/tool-contributor.ts +9 -0
  751. package/plugins/ragents.todo/web/TodoSection.tsx +47 -0
  752. package/plugins/ragents.todo/web/index.ts +12 -0
  753. package/plugins/ragents.transcript/server/index.ts +20 -0
  754. package/plugins/ragents.transcript/server/transcript.ts +78 -0
  755. package/plugins/ragents.watch/contract.ts +48 -0
  756. package/plugins/ragents.watch/server/condition.ts +56 -0
  757. package/plugins/ragents.watch/server/contract.ts +4 -0
  758. package/plugins/ragents.watch/server/functions.ts +62 -0
  759. package/plugins/ragents.watch/server/index.ts +39 -0
  760. package/plugins/ragents.watch/server/observation.ts +69 -0
  761. package/plugins/ragents.watch/server/service.ts +294 -0
  762. package/plugins/ragents.workspace/client/transport.ts +13 -0
  763. package/plugins/ragents.workspace/client/workspace-client.ts +247 -0
  764. package/plugins/ragents.workspace/contract.ts +182 -0
  765. package/plugins/ragents.workspace/prompt.hbs +14 -0
  766. package/plugins/ragents.workspace/server/binding.ts +92 -0
  767. package/plugins/ragents.workspace/server/browse-route.ts +134 -0
  768. package/plugins/ragents.workspace/server/clients.ts +161 -0
  769. package/plugins/ragents.workspace/server/index.ts +91 -0
  770. package/plugins/ragents.workspace/server/runtime.ts +170 -0
  771. package/plugins/ragents.workspace/web/FileBrowser.tsx +271 -0
  772. package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +216 -0
  773. package/plugins/ragents.workspace/web/api.ts +8 -0
  774. package/plugins/ragents.workspace/web/file-icons.tsx +94 -0
  775. package/plugins/ragents.workspace/web/index.tsx +37 -0
  776. package/ragents.config.core.ts +65 -0
  777. package/ragents.config.developer.ts +46 -0
  778. package/scripts/agent/agent-cli.ts +461 -0
  779. package/scripts/agent/journal.ts +125 -0
  780. package/scripts/package/build-package.ts +249 -0
  781. package/scripts/package/host-links.d.mts +1 -0
  782. package/scripts/package/host-links.mjs +39 -0
  783. package/scripts/package/publish-package.ts +129 -0
  784. package/scripts/package/ragents.mjs +59 -0
  785. package/scripts/provision/run-provision.ts +72 -0
  786. package/scripts/remote/connect.ts +265 -0
  787. package/scripts/remote/start.ts +91 -0
  788. package/scripts/workspace-client/run-workspace-client.ts +112 -0
@@ -0,0 +1,704 @@
1
+ /**
2
+ * Shared diff computation utilities for the edit and similar tools.
3
+ */
4
+
5
+ import * as Diff from "diff";
6
+ import { constants } from "fs";
7
+ import { access, readFile } from "fs/promises";
8
+ import { resolveToCwd } from "./path-utils.ts";
9
+
10
+ export function detectLineEnding(content: string): "\r\n" | "\n" {
11
+ const crlfIdx = content.indexOf("\r\n");
12
+ const lfIdx = content.indexOf("\n");
13
+ if (lfIdx === -1) return "\n";
14
+ if (crlfIdx === -1) return "\n";
15
+ return crlfIdx < lfIdx ? "\r\n" : "\n";
16
+ }
17
+
18
+ export function normalizeToLF(text: string): string {
19
+ return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
20
+ }
21
+
22
+ export function restoreLineEndings(text: string, ending: "\r\n" | "\n"): string {
23
+ return ending === "\r\n" ? text.replace(/\n/g, "\r\n") : text;
24
+ }
25
+
26
+ /**
27
+ * Normalize text for fuzzy matching. Applies progressive transformations:
28
+ * - Strip trailing whitespace from each line
29
+ * - Normalize smart quotes to ASCII equivalents
30
+ * - Normalize Unicode dashes/hyphens to ASCII hyphen
31
+ * - Normalize special Unicode spaces to regular space
32
+ */
33
+ export function normalizeForFuzzyMatch(text: string): string {
34
+ return (
35
+ text
36
+ .normalize("NFKC")
37
+ // Strip trailing whitespace per line
38
+ .split("\n")
39
+ .map((line) => line.trimEnd())
40
+ .join("\n")
41
+ // Smart single quotes → '
42
+ .replace(/[\u2018\u2019\u201A\u201B]/g, "'")
43
+ // Smart double quotes → "
44
+ .replace(/[\u201C\u201D\u201E\u201F]/g, '"')
45
+ // Various dashes/hyphens → -
46
+ // U+2010 hyphen, U+2011 non-breaking hyphen, U+2012 figure dash,
47
+ // U+2013 en-dash, U+2014 em-dash, U+2015 horizontal bar, U+2212 minus
48
+ .replace(/[\u2010\u2011\u2012\u2013\u2014\u2015\u2212]/g, "-")
49
+ // Special spaces → regular space
50
+ // U+00A0 NBSP, U+2002-U+200A various spaces, U+202F narrow NBSP,
51
+ // U+205F medium math space, U+3000 ideographic space
52
+ .replace(/[\u00A0\u2002-\u200A\u202F\u205F\u3000]/g, " ")
53
+ );
54
+ }
55
+
56
+ function splitLinesWithEndings(content: string): string[] {
57
+ return content.match(/[^\n]*\n|[^\n]+/g) ?? [];
58
+ }
59
+
60
+ interface LineSpan {
61
+ start: number;
62
+ end: number;
63
+ }
64
+
65
+ interface MatchedEdit {
66
+ editIndex: number;
67
+ matchIndex: number;
68
+ matchLength: number;
69
+ newText: string;
70
+ }
71
+
72
+ type TextReplacement = Pick<MatchedEdit, "matchIndex" | "matchLength" | "newText">;
73
+
74
+ function getLineSpans(content: string): LineSpan[] {
75
+ let offset = 0;
76
+ return splitLinesWithEndings(content).map((line) => {
77
+ const span = { start: offset, end: offset + line.length };
78
+ offset = span.end;
79
+ return span;
80
+ });
81
+ }
82
+
83
+ function getReplacementLineRange(lines: LineSpan[], replacement: TextReplacement) {
84
+ const replacementStart = replacement.matchIndex;
85
+ const replacementEnd = replacement.matchIndex + replacement.matchLength;
86
+
87
+ let startLine = -1;
88
+ for (let i = 0; i < lines.length; i++) {
89
+ const line = lines[i];
90
+ if (replacementStart >= line.start && replacementStart < line.end) {
91
+ startLine = i;
92
+ break;
93
+ }
94
+ }
95
+ if (startLine === -1) {
96
+ throw new Error("Replacement range is outside the base content.");
97
+ }
98
+
99
+ let endLine = startLine;
100
+ while (endLine < lines.length && lines[endLine].end < replacementEnd) {
101
+ endLine++;
102
+ }
103
+ if (endLine >= lines.length) {
104
+ throw new Error("Replacement range is outside the base content.");
105
+ }
106
+
107
+ return { startLine, endLine: endLine + 1 };
108
+ }
109
+
110
+ function applyReplacements(content: string, replacements: TextReplacement[], offset = 0): string {
111
+ let result = content;
112
+ for (let i = replacements.length - 1; i >= 0; i--) {
113
+ const replacement = replacements[i];
114
+ const matchIndex = replacement.matchIndex - offset;
115
+ result =
116
+ result.substring(0, matchIndex) + replacement.newText + result.substring(matchIndex + replacement.matchLength);
117
+ }
118
+ return result;
119
+ }
120
+
121
+ /**
122
+ * Apply replacements matched against `baseContent` to `originalContent` while
123
+ * preserving unchanged line blocks from the original.
124
+ *
125
+ * This is useful when `baseContent` is a normalized view of the original. Each
126
+ * replacement is widened to the lines it actually touches, those touched lines
127
+ * are rewritten from the normalized base, and all other lines are copied back
128
+ * from `originalContent`. The actual replacement ranges drive preservation so
129
+ * duplicate normalized lines cannot be aligned to the wrong occurrence.
130
+ */
131
+ export function applyReplacementsPreservingUnchangedLines(
132
+ originalContent: string,
133
+ baseContent: string,
134
+ replacements: TextReplacement[],
135
+ ): string {
136
+ const originalLines = splitLinesWithEndings(originalContent);
137
+ const baseLines = getLineSpans(baseContent);
138
+ if (originalLines.length !== baseLines.length) {
139
+ throw new Error("Cannot preserve unchanged lines because the base content has a different line count.");
140
+ }
141
+
142
+ const groups: Array<{ startLine: number; endLine: number; replacements: TextReplacement[] }> = [];
143
+ const sortedReplacements = [...replacements].sort((a, b) => a.matchIndex - b.matchIndex);
144
+ for (const replacement of sortedReplacements) {
145
+ const range = getReplacementLineRange(baseLines, replacement);
146
+ const current = groups[groups.length - 1];
147
+ if (current && range.startLine < current.endLine) {
148
+ current.endLine = Math.max(current.endLine, range.endLine);
149
+ current.replacements.push(replacement);
150
+ continue;
151
+ }
152
+ groups.push({ ...range, replacements: [replacement] });
153
+ }
154
+
155
+ let originalLineIndex = 0;
156
+ let result = "";
157
+ for (const group of groups) {
158
+ result += originalLines.slice(originalLineIndex, group.startLine).join("");
159
+
160
+ const groupStartOffset = baseLines[group.startLine].start;
161
+ const groupEndOffset = baseLines[group.endLine - 1].end;
162
+ result += applyReplacements(
163
+ baseContent.slice(groupStartOffset, groupEndOffset),
164
+ group.replacements,
165
+ groupStartOffset,
166
+ );
167
+ originalLineIndex = group.endLine;
168
+ }
169
+ result += originalLines.slice(originalLineIndex).join("");
170
+
171
+ return result;
172
+ }
173
+
174
+ export interface FuzzyMatchResult {
175
+ /** Whether a match was found */
176
+ found: boolean;
177
+ /** The index where the match starts (in the content that should be used for replacement) */
178
+ index: number;
179
+ /** Length of the matched text */
180
+ matchLength: number;
181
+ /** Whether fuzzy matching was used (false = exact match) */
182
+ usedFuzzyMatch: boolean;
183
+ /**
184
+ * The content to use for replacement operations.
185
+ * When exact match: original content. When fuzzy match: normalized content.
186
+ */
187
+ contentForReplacement: string;
188
+ }
189
+
190
+ export interface Edit {
191
+ oldText: string;
192
+ newText: string;
193
+ /** 1-based index of the occurrence to replace when oldText is not unique */
194
+ occurrence?: number;
195
+ /** Line number close to the intended occurrence; the closest occurrence wins */
196
+ nearLine?: number;
197
+ /** Replace every occurrence instead of requiring a unique match */
198
+ replaceAll?: boolean;
199
+ }
200
+
201
+ export interface AppliedEditsResult {
202
+ baseContent: string;
203
+ newContent: string;
204
+ /** Number of replaced regions, which is larger than edits.length when replaceAll is used */
205
+ replacementCount: number;
206
+ }
207
+
208
+ /**
209
+ * Find oldText in content, trying exact match first, then fuzzy match.
210
+ * When fuzzy matching is used, the returned contentForReplacement is the
211
+ * fuzzy-normalized version of the content (trailing whitespace stripped,
212
+ * Unicode quotes/dashes normalized to ASCII).
213
+ */
214
+ export function fuzzyFindText(content: string, oldText: string): FuzzyMatchResult {
215
+ // Try exact match first
216
+ const exactIndex = content.indexOf(oldText);
217
+ if (exactIndex !== -1) {
218
+ return {
219
+ found: true,
220
+ index: exactIndex,
221
+ matchLength: oldText.length,
222
+ usedFuzzyMatch: false,
223
+ contentForReplacement: content,
224
+ };
225
+ }
226
+
227
+ // Try fuzzy match - work entirely in normalized space
228
+ const fuzzyContent = normalizeForFuzzyMatch(content);
229
+ const fuzzyOldText = normalizeForFuzzyMatch(oldText);
230
+ const fuzzyIndex = fuzzyContent.indexOf(fuzzyOldText);
231
+
232
+ if (fuzzyIndex === -1) {
233
+ return {
234
+ found: false,
235
+ index: -1,
236
+ matchLength: 0,
237
+ usedFuzzyMatch: false,
238
+ contentForReplacement: content,
239
+ };
240
+ }
241
+
242
+ // When fuzzy matching, return offsets in normalized space. Callers can use
243
+ // the normalized content to compute replacements, then decide how much of
244
+ // that normalized output should be written back.
245
+ return {
246
+ found: true,
247
+ index: fuzzyIndex,
248
+ matchLength: fuzzyOldText.length,
249
+ usedFuzzyMatch: true,
250
+ contentForReplacement: fuzzyContent,
251
+ };
252
+ }
253
+
254
+ /** Strip UTF-8 BOM if present, return both the BOM (if any) and the text without it */
255
+ export function stripBom(content: string): { bom: string; text: string } {
256
+ return content.startsWith("\uFEFF") ? { bom: "\uFEFF", text: content.slice(1) } : { bom: "", text: content };
257
+ }
258
+
259
+ const MAX_LISTED_OCCURRENCES = 20;
260
+ const MAX_CONTEXT_LINE_LENGTH = 120;
261
+
262
+ function collectMatchIndices(content: string, needle: string): number[] {
263
+ if (needle.length === 0) {
264
+ return [];
265
+ }
266
+ const indices: number[] = [];
267
+ for (let index = content.indexOf(needle); index !== -1; index = content.indexOf(needle, index + needle.length)) {
268
+ indices.push(index);
269
+ }
270
+ return indices;
271
+ }
272
+
273
+ interface OccurrenceMatches {
274
+ indices: number[];
275
+ matchLength: number;
276
+ }
277
+
278
+ /** Exact occurrences when there are any, otherwise the fuzzy-normalized ones. */
279
+ function findOccurrences(content: string, oldText: string): OccurrenceMatches {
280
+ const exactIndices = collectMatchIndices(content, oldText);
281
+ if (exactIndices.length > 0) {
282
+ return { indices: exactIndices, matchLength: oldText.length };
283
+ }
284
+ const fuzzyOldText = normalizeForFuzzyMatch(oldText);
285
+ return {
286
+ indices: collectMatchIndices(normalizeForFuzzyMatch(content), fuzzyOldText),
287
+ matchLength: fuzzyOldText.length,
288
+ };
289
+ }
290
+
291
+ /** Line numbers (1-based) for ascending indices into content. */
292
+ function getLineNumbers(content: string, indices: number[]): number[] {
293
+ const lineNumbers: number[] = [];
294
+ let line = 1;
295
+ let cursor = 0;
296
+ for (const index of indices) {
297
+ while (cursor < index) {
298
+ if (content[cursor] === "\n") line++;
299
+ cursor++;
300
+ }
301
+ lineNumbers.push(line);
302
+ }
303
+ return lineNumbers;
304
+ }
305
+
306
+ function formatOccurrences(content: string, indices: number[]): string {
307
+ const lines = content.split("\n");
308
+ const shown = indices.slice(0, MAX_LISTED_OCCURRENCES);
309
+ const entries = getLineNumbers(content, shown).map((line) => {
310
+ const text = lines[line - 1].trim();
311
+ const context = text.length > MAX_CONTEXT_LINE_LENGTH ? `${text.slice(0, MAX_CONTEXT_LINE_LENGTH)}...` : text;
312
+ return ` line ${line}: ${context}`;
313
+ });
314
+ const remaining = indices.length - shown.length;
315
+ return (remaining > 0 ? [...entries, ` ... and ${remaining} more`] : entries).join("\n");
316
+ }
317
+
318
+ function getNotFoundError(path: string, editIndex: number, totalEdits: number): Error {
319
+ if (totalEdits === 1) {
320
+ return new Error(
321
+ `Could not find the exact text in ${path}. The old text must match exactly including all whitespace and newlines.`,
322
+ );
323
+ }
324
+ return new Error(
325
+ `Could not find edits[${editIndex}] in ${path}. The oldText must match exactly including all whitespace and newlines.`,
326
+ );
327
+ }
328
+
329
+ function getDuplicateError(
330
+ path: string,
331
+ editIndex: number,
332
+ totalEdits: number,
333
+ fuzzyContent: string,
334
+ indices: number[],
335
+ ): Error {
336
+ const header =
337
+ totalEdits === 1
338
+ ? `Found ${indices.length} occurrences of the text in ${path}. The text must be unique.`
339
+ : `Found ${indices.length} occurrences of edits[${editIndex}] in ${path}. Each oldText must be unique.`;
340
+ return new Error(
341
+ `${header} Occurrences:\n${formatOccurrences(fuzzyContent, indices)}\n` +
342
+ `Either extend oldText with surrounding context, or set edits[${editIndex}].occurrence (1-based), edits[${editIndex}].nearLine or edits[${editIndex}].replaceAll.`,
343
+ );
344
+ }
345
+
346
+ function validateEditAnchors(path: string, editIndex: number, edit: Edit): void {
347
+ if (edit.replaceAll && (edit.occurrence !== undefined || edit.nearLine !== undefined)) {
348
+ throw new Error(
349
+ `edits[${editIndex}].replaceAll cannot be combined with occurrence or nearLine in ${path}. Use either replaceAll or one anchor.`,
350
+ );
351
+ }
352
+ if (edit.occurrence !== undefined && (!Number.isInteger(edit.occurrence) || edit.occurrence < 1)) {
353
+ throw new Error(`edits[${editIndex}].occurrence must be an integer >= 1 in ${path}.`);
354
+ }
355
+ if (edit.nearLine !== undefined && (!Number.isInteger(edit.nearLine) || edit.nearLine < 1)) {
356
+ throw new Error(`edits[${editIndex}].nearLine must be an integer >= 1 in ${path}.`);
357
+ }
358
+ }
359
+
360
+ function pickByOccurrence(
361
+ path: string,
362
+ editIndex: number,
363
+ occurrence: number,
364
+ content: string,
365
+ indices: number[],
366
+ ): number {
367
+ if (occurrence > indices.length) {
368
+ throw new Error(
369
+ `edits[${editIndex}].occurrence is ${occurrence}, but ${path} contains ${indices.length} occurrence(s). Occurrences:\n${formatOccurrences(content, indices)}`,
370
+ );
371
+ }
372
+ return indices[occurrence - 1];
373
+ }
374
+
375
+ function pickByNearLine(path: string, editIndex: number, nearLine: number, content: string, indices: number[]): number {
376
+ const distances = getLineNumbers(content, indices).map((line) => Math.abs(line - nearLine));
377
+ const shortest = distances.reduce((best, distance) => Math.min(best, distance));
378
+ const closest = indices.filter((_, i) => distances[i] === shortest);
379
+ if (closest.length > 1) {
380
+ throw new Error(
381
+ `edits[${editIndex}].nearLine ${nearLine} is ambiguous in ${path}: ${closest.length} occurrences are equally close. Occurrences:\n${formatOccurrences(content, indices)}`,
382
+ );
383
+ }
384
+ return closest[0];
385
+ }
386
+
387
+ /** Occurrence indices this edit replaces: all, the anchored one, or the single unique one. */
388
+ function selectOccurrences(
389
+ path: string,
390
+ editIndex: number,
391
+ totalEdits: number,
392
+ edit: Edit,
393
+ content: string,
394
+ indices: number[],
395
+ ): number[] {
396
+ if (edit.replaceAll) {
397
+ return indices;
398
+ }
399
+
400
+ const byOccurrence =
401
+ edit.occurrence === undefined ? undefined : pickByOccurrence(path, editIndex, edit.occurrence, content, indices);
402
+ const byNearLine =
403
+ edit.nearLine === undefined ? undefined : pickByNearLine(path, editIndex, edit.nearLine, content, indices);
404
+ if (byOccurrence !== undefined && byNearLine !== undefined && byOccurrence !== byNearLine) {
405
+ throw new Error(
406
+ `edits[${editIndex}].occurrence and edits[${editIndex}].nearLine select different occurrences in ${path}. Use only one of them.`,
407
+ );
408
+ }
409
+ const anchored = byOccurrence ?? byNearLine;
410
+ if (anchored !== undefined) {
411
+ return [anchored];
412
+ }
413
+
414
+ const fuzzyContent = normalizeForFuzzyMatch(content);
415
+ const fuzzyIndices = collectMatchIndices(fuzzyContent, normalizeForFuzzyMatch(edit.oldText));
416
+ if (fuzzyIndices.length > 1) {
417
+ throw getDuplicateError(path, editIndex, totalEdits, fuzzyContent, fuzzyIndices);
418
+ }
419
+ return [indices[0]];
420
+ }
421
+
422
+ function getEmptyOldTextError(path: string, editIndex: number, totalEdits: number): Error {
423
+ if (totalEdits === 1) {
424
+ return new Error(`oldText must not be empty in ${path}.`);
425
+ }
426
+ return new Error(`edits[${editIndex}].oldText must not be empty in ${path}.`);
427
+ }
428
+
429
+ function getNoChangeError(path: string, totalEdits: number): Error {
430
+ if (totalEdits === 1) {
431
+ return new Error(
432
+ `No changes made to ${path}. The replacement produced identical content. This might indicate an issue with special characters or the text not existing as expected.`,
433
+ );
434
+ }
435
+ return new Error(`No changes made to ${path}. The replacements produced identical content.`);
436
+ }
437
+
438
+ /**
439
+ * Apply one or more exact-text replacements to LF-normalized content.
440
+ *
441
+ * All edits are matched against the same original content. An edit replaces its
442
+ * unique match, the match picked by occurrence or nearLine, or every match when
443
+ * replaceAll is set. Replacements are applied in reverse order so offsets remain
444
+ * stable. If any edit needs fuzzy matching, the operation runs in fuzzy-normalized
445
+ * content space and then overlays those line-level changes onto the original
446
+ * content so unchanged line blocks keep their original bytes.
447
+ */
448
+ export function applyEditsToNormalizedContent(
449
+ normalizedContent: string,
450
+ edits: Edit[],
451
+ path: string,
452
+ ): AppliedEditsResult {
453
+ const normalizedEdits = edits.map((edit) => ({
454
+ ...edit,
455
+ oldText: normalizeToLF(edit.oldText),
456
+ newText: normalizeToLF(edit.newText),
457
+ }));
458
+
459
+ for (let i = 0; i < normalizedEdits.length; i++) {
460
+ if (normalizedEdits[i].oldText.length === 0) {
461
+ throw getEmptyOldTextError(path, i, normalizedEdits.length);
462
+ }
463
+ validateEditAnchors(path, i, normalizedEdits[i]);
464
+ }
465
+
466
+ const initialMatches = normalizedEdits.map((edit) => fuzzyFindText(normalizedContent, edit.oldText));
467
+ const usedFuzzyMatch = initialMatches.some((match) => match.usedFuzzyMatch);
468
+ const replacementBaseContent = usedFuzzyMatch ? normalizeForFuzzyMatch(normalizedContent) : normalizedContent;
469
+
470
+ const matchedEdits: MatchedEdit[] = [];
471
+ for (let i = 0; i < normalizedEdits.length; i++) {
472
+ const edit = normalizedEdits[i];
473
+ const { indices, matchLength } = findOccurrences(replacementBaseContent, edit.oldText);
474
+ if (indices.length === 0) {
475
+ throw getNotFoundError(path, i, normalizedEdits.length);
476
+ }
477
+
478
+ const selected = selectOccurrences(path, i, normalizedEdits.length, edit, replacementBaseContent, indices);
479
+ for (const matchIndex of selected) {
480
+ matchedEdits.push({
481
+ editIndex: i,
482
+ matchIndex,
483
+ matchLength,
484
+ newText: edit.newText,
485
+ });
486
+ }
487
+ }
488
+
489
+ matchedEdits.sort((a, b) => a.matchIndex - b.matchIndex);
490
+ for (let i = 1; i < matchedEdits.length; i++) {
491
+ const previous = matchedEdits[i - 1];
492
+ const current = matchedEdits[i];
493
+ if (previous.matchIndex + previous.matchLength > current.matchIndex) {
494
+ throw new Error(
495
+ `edits[${previous.editIndex}] and edits[${current.editIndex}] overlap in ${path}. Merge them into one edit or target disjoint regions.`,
496
+ );
497
+ }
498
+ }
499
+
500
+ const baseContent = normalizedContent;
501
+ const newContent = usedFuzzyMatch
502
+ ? applyReplacementsPreservingUnchangedLines(normalizedContent, replacementBaseContent, matchedEdits)
503
+ : applyReplacements(replacementBaseContent, matchedEdits);
504
+
505
+ if (baseContent === newContent) {
506
+ throw getNoChangeError(path, normalizedEdits.length);
507
+ }
508
+
509
+ return { baseContent, newContent, replacementCount: matchedEdits.length };
510
+ }
511
+
512
+ /** Generate a standard unified patch. */
513
+ export function generateUnifiedPatch(path: string, oldContent: string, newContent: string, contextLines = 4): string {
514
+ return Diff.createTwoFilesPatch(path, path, oldContent, newContent, undefined, undefined, {
515
+ context: contextLines,
516
+ headerOptions: Diff.FILE_HEADERS_ONLY,
517
+ });
518
+ }
519
+
520
+ /**
521
+ * Generate a display-oriented diff string with line numbers and context.
522
+ * Returns both the diff string and the first changed line number (in the new file).
523
+ */
524
+ export function generateDiffString(
525
+ oldContent: string,
526
+ newContent: string,
527
+ contextLines = 4,
528
+ ): { diff: string; firstChangedLine: number | undefined } {
529
+ const parts = Diff.diffLines(oldContent, newContent);
530
+ const output: string[] = [];
531
+
532
+ const oldLines = oldContent.split("\n");
533
+ const newLines = newContent.split("\n");
534
+ const maxLineNum = Math.max(oldLines.length, newLines.length);
535
+ const lineNumWidth = String(maxLineNum).length;
536
+
537
+ let oldLineNum = 1;
538
+ let newLineNum = 1;
539
+ let lastWasChange = false;
540
+ let firstChangedLine: number | undefined;
541
+
542
+ for (let i = 0; i < parts.length; i++) {
543
+ const part = parts[i];
544
+ const raw = part.value.split("\n");
545
+ if (raw[raw.length - 1] === "") {
546
+ raw.pop();
547
+ }
548
+
549
+ if (part.added || part.removed) {
550
+ // Capture the first changed line (in the new file)
551
+ if (firstChangedLine === undefined) {
552
+ firstChangedLine = newLineNum;
553
+ }
554
+
555
+ // Show the change
556
+ for (const line of raw) {
557
+ if (part.added) {
558
+ const lineNum = String(newLineNum).padStart(lineNumWidth, " ");
559
+ output.push(`+${lineNum} ${line}`);
560
+ newLineNum++;
561
+ } else {
562
+ // removed
563
+ const lineNum = String(oldLineNum).padStart(lineNumWidth, " ");
564
+ output.push(`-${lineNum} ${line}`);
565
+ oldLineNum++;
566
+ }
567
+ }
568
+ lastWasChange = true;
569
+ } else {
570
+ // Context lines - only show a few before/after changes
571
+ const nextPartIsChange = i < parts.length - 1 && (parts[i + 1].added || parts[i + 1].removed);
572
+ const hasLeadingChange = lastWasChange;
573
+ const hasTrailingChange = nextPartIsChange;
574
+
575
+ if (hasLeadingChange && hasTrailingChange) {
576
+ if (raw.length <= contextLines * 2) {
577
+ for (const line of raw) {
578
+ const lineNum = String(oldLineNum).padStart(lineNumWidth, " ");
579
+ output.push(` ${lineNum} ${line}`);
580
+ oldLineNum++;
581
+ newLineNum++;
582
+ }
583
+ } else {
584
+ const leadingLines = raw.slice(0, contextLines);
585
+ const trailingLines = raw.slice(raw.length - contextLines);
586
+ const skippedLines = raw.length - leadingLines.length - trailingLines.length;
587
+
588
+ for (const line of leadingLines) {
589
+ const lineNum = String(oldLineNum).padStart(lineNumWidth, " ");
590
+ output.push(` ${lineNum} ${line}`);
591
+ oldLineNum++;
592
+ newLineNum++;
593
+ }
594
+
595
+ output.push(` ${"".padStart(lineNumWidth, " ")} ...`);
596
+ oldLineNum += skippedLines;
597
+ newLineNum += skippedLines;
598
+
599
+ for (const line of trailingLines) {
600
+ const lineNum = String(oldLineNum).padStart(lineNumWidth, " ");
601
+ output.push(` ${lineNum} ${line}`);
602
+ oldLineNum++;
603
+ newLineNum++;
604
+ }
605
+ }
606
+ } else if (hasLeadingChange) {
607
+ const shownLines = raw.slice(0, contextLines);
608
+ const skippedLines = raw.length - shownLines.length;
609
+
610
+ for (const line of shownLines) {
611
+ const lineNum = String(oldLineNum).padStart(lineNumWidth, " ");
612
+ output.push(` ${lineNum} ${line}`);
613
+ oldLineNum++;
614
+ newLineNum++;
615
+ }
616
+
617
+ if (skippedLines > 0) {
618
+ output.push(` ${"".padStart(lineNumWidth, " ")} ...`);
619
+ oldLineNum += skippedLines;
620
+ newLineNum += skippedLines;
621
+ }
622
+ } else if (hasTrailingChange) {
623
+ const skippedLines = Math.max(0, raw.length - contextLines);
624
+ if (skippedLines > 0) {
625
+ output.push(` ${"".padStart(lineNumWidth, " ")} ...`);
626
+ oldLineNum += skippedLines;
627
+ newLineNum += skippedLines;
628
+ }
629
+
630
+ for (const line of raw.slice(skippedLines)) {
631
+ const lineNum = String(oldLineNum).padStart(lineNumWidth, " ");
632
+ output.push(` ${lineNum} ${line}`);
633
+ oldLineNum++;
634
+ newLineNum++;
635
+ }
636
+ } else {
637
+ // Skip these context lines entirely
638
+ oldLineNum += raw.length;
639
+ newLineNum += raw.length;
640
+ }
641
+
642
+ lastWasChange = false;
643
+ }
644
+ }
645
+
646
+ return { diff: output.join("\n"), firstChangedLine };
647
+ }
648
+
649
+ export interface EditDiffResult {
650
+ diff: string;
651
+ firstChangedLine: number | undefined;
652
+ }
653
+
654
+ export interface EditDiffError {
655
+ error: string;
656
+ }
657
+
658
+ /**
659
+ * Compute the diff for one or more edit operations without applying them.
660
+ * Used for preview rendering in the TUI before the tool executes.
661
+ */
662
+ export async function computeEditsDiff(
663
+ path: string,
664
+ edits: Edit[],
665
+ cwd: string,
666
+ ): Promise<EditDiffResult | EditDiffError> {
667
+ const absolutePath = resolveToCwd(path, cwd);
668
+
669
+ try {
670
+ // Check if file exists and is readable
671
+ try {
672
+ await access(absolutePath, constants.R_OK);
673
+ } catch (error: unknown) {
674
+ const errorMessage = error instanceof Error && "code" in error ? `Error code: ${error.code}` : String(error);
675
+ return { error: `Could not edit file: ${path}. ${errorMessage}.` };
676
+ }
677
+
678
+ // Read the file
679
+ const rawContent = await readFile(absolutePath, "utf-8");
680
+
681
+ // Strip BOM before matching (LLM won't include invisible BOM in oldText)
682
+ const { text: content } = stripBom(rawContent);
683
+ const normalizedContent = normalizeToLF(content);
684
+ const { baseContent, newContent } = applyEditsToNormalizedContent(normalizedContent, edits, path);
685
+
686
+ // Generate the diff
687
+ return generateDiffString(baseContent, newContent);
688
+ } catch (err) {
689
+ return { error: err instanceof Error ? err.message : String(err) };
690
+ }
691
+ }
692
+
693
+ /**
694
+ * Compute the diff for a single edit operation without applying it.
695
+ * Kept as a convenience wrapper for single-edit callers.
696
+ */
697
+ export async function computeEditDiff(
698
+ path: string,
699
+ oldText: string,
700
+ newText: string,
701
+ cwd: string,
702
+ ): Promise<EditDiffResult | EditDiffError> {
703
+ return computeEditsDiff(path, [{ oldText, newText }], cwd);
704
+ }