@roj-ai/sdk 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (763) hide show
  1. package/dist/bootstrap.d.ts +453 -0
  2. package/dist/bootstrap.d.ts.map +1 -0
  3. package/dist/builtin-events.d.ts +16 -0
  4. package/dist/builtin-events.d.ts.map +1 -0
  5. package/dist/bun-platform/fs.d.ts +9 -0
  6. package/dist/bun-platform/fs.d.ts.map +1 -0
  7. package/dist/bun-platform/index.d.ts +12 -0
  8. package/dist/bun-platform/index.d.ts.map +1 -0
  9. package/dist/bun-platform/process.d.ts +6 -0
  10. package/dist/bun-platform/process.d.ts.map +1 -0
  11. package/dist/config.d.ts +38 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.test.d.ts +2 -0
  14. package/dist/config.test.d.ts.map +1 -0
  15. package/dist/core/agent-loop.integration.test.d.ts +2 -0
  16. package/dist/core/agent-loop.integration.test.d.ts.map +1 -0
  17. package/dist/core/agents/agent-config.test.d.ts +2 -0
  18. package/dist/core/agents/agent-config.test.d.ts.map +1 -0
  19. package/dist/core/agents/agent-roles.d.ts +33 -0
  20. package/dist/core/agents/agent-roles.d.ts.map +1 -0
  21. package/dist/core/agents/agent-shutdown.test.d.ts +6 -0
  22. package/dist/core/agents/agent-shutdown.test.d.ts.map +1 -0
  23. package/dist/core/agents/agent.d.ts +234 -0
  24. package/dist/core/agents/agent.d.ts.map +1 -0
  25. package/dist/core/agents/agent.test.d.ts +2 -0
  26. package/dist/core/agents/agent.test.d.ts.map +1 -0
  27. package/dist/core/agents/communicator.d.ts +3 -0
  28. package/dist/core/agents/communicator.d.ts.map +1 -0
  29. package/dist/core/agents/config.d.ts +84 -0
  30. package/dist/core/agents/config.d.ts.map +1 -0
  31. package/dist/core/agents/context.d.ts +16 -0
  32. package/dist/core/agents/context.d.ts.map +1 -0
  33. package/dist/core/agents/debounce.d.ts +52 -0
  34. package/dist/core/agents/debounce.d.ts.map +1 -0
  35. package/dist/core/agents/handler-events.test.d.ts +5 -0
  36. package/dist/core/agents/handler-events.test.d.ts.map +1 -0
  37. package/dist/core/agents/index.d.ts +2 -0
  38. package/dist/core/agents/index.d.ts.map +1 -0
  39. package/dist/core/agents/response-sanitizer.d.ts +25 -0
  40. package/dist/core/agents/response-sanitizer.d.ts.map +1 -0
  41. package/dist/core/agents/response-sanitizer.test.d.ts +2 -0
  42. package/dist/core/agents/response-sanitizer.test.d.ts.map +1 -0
  43. package/dist/core/agents/retry.d.ts +40 -0
  44. package/dist/core/agents/retry.d.ts.map +1 -0
  45. package/dist/core/agents/schema.d.ts +57 -0
  46. package/dist/core/agents/schema.d.ts.map +1 -0
  47. package/dist/core/agents/state.d.ts +255 -0
  48. package/dist/core/agents/state.d.ts.map +1 -0
  49. package/dist/core/context/state.d.ts +28 -0
  50. package/dist/core/context/state.d.ts.map +1 -0
  51. package/dist/core/errors.d.ts +29 -0
  52. package/dist/core/errors.d.ts.map +1 -0
  53. package/dist/core/event-sourcing.integration.test.d.ts +2 -0
  54. package/dist/core/event-sourcing.integration.test.d.ts.map +1 -0
  55. package/dist/core/events/base-event-store.d.ts +55 -0
  56. package/dist/core/events/base-event-store.d.ts.map +1 -0
  57. package/dist/core/events/event-store.d.ts +108 -0
  58. package/dist/core/events/event-store.d.ts.map +1 -0
  59. package/dist/core/events/file.d.ts +50 -0
  60. package/dist/core/events/file.d.ts.map +1 -0
  61. package/dist/core/events/file.test.d.ts +2 -0
  62. package/dist/core/events/file.test.d.ts.map +1 -0
  63. package/dist/core/events/index.d.ts +4 -0
  64. package/dist/core/events/index.d.ts.map +1 -0
  65. package/dist/core/events/memory.d.ts +43 -0
  66. package/dist/core/events/memory.d.ts.map +1 -0
  67. package/dist/core/events/memory.test.d.ts +2 -0
  68. package/dist/core/events/memory.test.d.ts.map +1 -0
  69. package/dist/core/events/metadata-utils.d.ts +27 -0
  70. package/dist/core/events/metadata-utils.d.ts.map +1 -0
  71. package/dist/core/events/test-helpers.d.ts +28 -0
  72. package/dist/core/events/test-helpers.d.ts.map +1 -0
  73. package/dist/core/events/types.d.ts +46 -0
  74. package/dist/core/events/types.d.ts.map +1 -0
  75. package/dist/core/file-store/file-store.d.ts +56 -0
  76. package/dist/core/file-store/file-store.d.ts.map +1 -0
  77. package/dist/core/file-store/types.d.ts +50 -0
  78. package/dist/core/file-store/types.d.ts.map +1 -0
  79. package/dist/core/image/image-processor.d.ts +15 -0
  80. package/dist/core/image/image-processor.d.ts.map +1 -0
  81. package/dist/core/image/image-processor.test.d.ts +2 -0
  82. package/dist/core/image/image-processor.test.d.ts.map +1 -0
  83. package/dist/core/image/index.d.ts +5 -0
  84. package/dist/core/image/index.d.ts.map +1 -0
  85. package/dist/core/image/noop-resizer.d.ts +5 -0
  86. package/dist/core/image/noop-resizer.d.ts.map +1 -0
  87. package/dist/core/image/types.d.ts +20 -0
  88. package/dist/core/image/types.d.ts.map +1 -0
  89. package/dist/core/image/vips-resizer.d.ts +21 -0
  90. package/dist/core/image/vips-resizer.d.ts.map +1 -0
  91. package/dist/core/image/vips-resizer.test.d.ts +2 -0
  92. package/dist/core/image/vips-resizer.test.d.ts.map +1 -0
  93. package/dist/core/llm/anthropic.d.ts +51 -0
  94. package/dist/core/llm/anthropic.d.ts.map +1 -0
  95. package/dist/core/llm/anthropic.test.d.ts +2 -0
  96. package/dist/core/llm/anthropic.test.d.ts.map +1 -0
  97. package/dist/core/llm/cache-breakpoints.d.ts +17 -0
  98. package/dist/core/llm/cache-breakpoints.d.ts.map +1 -0
  99. package/dist/core/llm/cache-live.test.d.ts +16 -0
  100. package/dist/core/llm/cache-live.test.d.ts.map +1 -0
  101. package/dist/core/llm/index.d.ts +16 -0
  102. package/dist/core/llm/index.d.ts.map +1 -0
  103. package/dist/core/llm/llm-log-types.d.ts +148 -0
  104. package/dist/core/llm/llm-log-types.d.ts.map +1 -0
  105. package/dist/core/llm/logger.d.ts +74 -0
  106. package/dist/core/llm/logger.d.ts.map +1 -0
  107. package/dist/core/llm/logger.test.d.ts +7 -0
  108. package/dist/core/llm/logger.test.d.ts.map +1 -0
  109. package/dist/core/llm/logging-provider.d.ts +20 -0
  110. package/dist/core/llm/logging-provider.d.ts.map +1 -0
  111. package/dist/core/llm/middleware.d.ts +79 -0
  112. package/dist/core/llm/middleware.d.ts.map +1 -0
  113. package/dist/core/llm/mock.d.ts +79 -0
  114. package/dist/core/llm/mock.d.ts.map +1 -0
  115. package/dist/core/llm/mock.test.d.ts +2 -0
  116. package/dist/core/llm/mock.test.d.ts.map +1 -0
  117. package/dist/core/llm/openrouter-mapping.test.d.ts +2 -0
  118. package/dist/core/llm/openrouter-mapping.test.d.ts.map +1 -0
  119. package/dist/core/llm/openrouter.d.ts +37 -0
  120. package/dist/core/llm/openrouter.d.ts.map +1 -0
  121. package/dist/core/llm/openrouter.test.d.ts +2 -0
  122. package/dist/core/llm/openrouter.test.d.ts.map +1 -0
  123. package/dist/core/llm/provider-integration.test.d.ts +12 -0
  124. package/dist/core/llm/provider-integration.test.d.ts.map +1 -0
  125. package/dist/core/llm/provider.d.ts +175 -0
  126. package/dist/core/llm/provider.d.ts.map +1 -0
  127. package/dist/core/llm/routing-provider.d.ts +31 -0
  128. package/dist/core/llm/routing-provider.d.ts.map +1 -0
  129. package/dist/core/llm/routing-provider.test.d.ts +2 -0
  130. package/dist/core/llm/routing-provider.test.d.ts.map +1 -0
  131. package/dist/core/llm/schema.d.ts +24 -0
  132. package/dist/core/llm/schema.d.ts.map +1 -0
  133. package/dist/core/llm/snapshot-fetch.d.ts +21 -0
  134. package/dist/core/llm/snapshot-fetch.d.ts.map +1 -0
  135. package/dist/core/llm/snapshot-middleware.d.ts +71 -0
  136. package/dist/core/llm/snapshot-middleware.d.ts.map +1 -0
  137. package/dist/core/llm/snapshot-middleware.test.d.ts +2 -0
  138. package/dist/core/llm/snapshot-middleware.test.d.ts.map +1 -0
  139. package/dist/core/llm/state.d.ts +73 -0
  140. package/dist/core/llm/state.d.ts.map +1 -0
  141. package/dist/core/llm/tokens.d.ts +36 -0
  142. package/dist/core/llm/tokens.d.ts.map +1 -0
  143. package/dist/core/multi-agent.integration.test.d.ts +2 -0
  144. package/dist/core/multi-agent.integration.test.d.ts.map +1 -0
  145. package/dist/core/plugin-hooks.integration.test.d.ts +2 -0
  146. package/dist/core/plugin-hooks.integration.test.d.ts.map +1 -0
  147. package/dist/core/plugins/hook-types.d.ts +55 -0
  148. package/dist/core/plugins/hook-types.d.ts.map +1 -0
  149. package/dist/core/plugins/index.d.ts +23 -0
  150. package/dist/core/plugins/index.d.ts.map +1 -0
  151. package/dist/core/plugins/plugin-builder.d.ts +474 -0
  152. package/dist/core/plugins/plugin-builder.d.ts.map +1 -0
  153. package/dist/core/preset/config.d.ts +55 -0
  154. package/dist/core/preset/config.d.ts.map +1 -0
  155. package/dist/core/preset/index.d.ts +8 -0
  156. package/dist/core/preset/index.d.ts.map +1 -0
  157. package/dist/core/preset/preset-builder.d.ts +44 -0
  158. package/dist/core/preset/preset-builder.d.ts.map +1 -0
  159. package/dist/core/session-lifecycle.integration.test.d.ts +2 -0
  160. package/dist/core/session-lifecycle.integration.test.d.ts.map +1 -0
  161. package/dist/core/sessions/apply-event.d.ts +19 -0
  162. package/dist/core/sessions/apply-event.d.ts.map +1 -0
  163. package/dist/core/sessions/context.d.ts +34 -0
  164. package/dist/core/sessions/context.d.ts.map +1 -0
  165. package/dist/core/sessions/fork-utils.d.ts +20 -0
  166. package/dist/core/sessions/fork-utils.d.ts.map +1 -0
  167. package/dist/core/sessions/fork-utils.test.d.ts +2 -0
  168. package/dist/core/sessions/fork-utils.test.d.ts.map +1 -0
  169. package/dist/core/sessions/reducer.d.ts +50 -0
  170. package/dist/core/sessions/reducer.d.ts.map +1 -0
  171. package/dist/core/sessions/schema.d.ts +82 -0
  172. package/dist/core/sessions/schema.d.ts.map +1 -0
  173. package/dist/core/sessions/session-environment.d.ts +13 -0
  174. package/dist/core/sessions/session-environment.d.ts.map +1 -0
  175. package/dist/core/sessions/session-manager.d.ts +183 -0
  176. package/dist/core/sessions/session-manager.d.ts.map +1 -0
  177. package/dist/core/sessions/session-store.d.ts +69 -0
  178. package/dist/core/sessions/session-store.d.ts.map +1 -0
  179. package/dist/core/sessions/session.d.ts +212 -0
  180. package/dist/core/sessions/session.d.ts.map +1 -0
  181. package/dist/core/sessions/session.test.d.ts +2 -0
  182. package/dist/core/sessions/session.test.d.ts.map +1 -0
  183. package/dist/core/sessions/state.d.ts +110 -0
  184. package/dist/core/sessions/state.d.ts.map +1 -0
  185. package/dist/core/system.d.ts +97 -0
  186. package/dist/core/system.d.ts.map +1 -0
  187. package/dist/core/tools/context.d.ts +3 -0
  188. package/dist/core/tools/context.d.ts.map +1 -0
  189. package/dist/core/tools/definition.d.ts +10 -0
  190. package/dist/core/tools/definition.d.ts.map +1 -0
  191. package/dist/core/tools/executor.d.ts +28 -0
  192. package/dist/core/tools/executor.d.ts.map +1 -0
  193. package/dist/core/tools/executor.test.d.ts +2 -0
  194. package/dist/core/tools/executor.test.d.ts.map +1 -0
  195. package/dist/core/tools/index.d.ts +4 -0
  196. package/dist/core/tools/index.d.ts.map +1 -0
  197. package/dist/core/tools/schema.d.ts +61 -0
  198. package/dist/core/tools/schema.d.ts.map +1 -0
  199. package/dist/core/tools/state.d.ts +28 -0
  200. package/dist/core/tools/state.d.ts.map +1 -0
  201. package/dist/index.d.ts +111 -0
  202. package/dist/index.d.ts.map +1 -0
  203. package/dist/lib/json/index.d.ts +17 -0
  204. package/dist/lib/json/index.d.ts.map +1 -0
  205. package/dist/lib/logger/console.d.ts +35 -0
  206. package/dist/lib/logger/console.d.ts.map +1 -0
  207. package/dist/lib/logger/console.test.d.ts +2 -0
  208. package/dist/lib/logger/console.test.d.ts.map +1 -0
  209. package/dist/lib/logger/file.d.ts +20 -0
  210. package/dist/lib/logger/file.d.ts.map +1 -0
  211. package/dist/lib/logger/index.d.ts +5 -0
  212. package/dist/lib/logger/index.d.ts.map +1 -0
  213. package/dist/lib/logger/logger.d.ts +87 -0
  214. package/dist/lib/logger/logger.d.ts.map +1 -0
  215. package/dist/lib/logger/ring-buffer.d.ts +33 -0
  216. package/dist/lib/logger/ring-buffer.d.ts.map +1 -0
  217. package/dist/lib/logger/tee.d.ts +15 -0
  218. package/dist/lib/logger/tee.d.ts.map +1 -0
  219. package/dist/lib/mime.d.ts +9 -0
  220. package/dist/lib/mime.d.ts.map +1 -0
  221. package/dist/lib/never.d.ts +2 -0
  222. package/dist/lib/never.d.ts.map +1 -0
  223. package/dist/lib/utils/hash.d.ts +19 -0
  224. package/dist/lib/utils/hash.d.ts.map +1 -0
  225. package/dist/lib/utils/result.d.ts +26 -0
  226. package/dist/lib/utils/result.d.ts.map +1 -0
  227. package/dist/platform/fs.d.ts +39 -0
  228. package/dist/platform/fs.d.ts.map +1 -0
  229. package/dist/platform/index.d.ts +21 -0
  230. package/dist/platform/index.d.ts.map +1 -0
  231. package/dist/platform/process.d.ts +24 -0
  232. package/dist/platform/process.d.ts.map +1 -0
  233. package/dist/plugins/agent-status/plugin.d.ts +8 -0
  234. package/dist/plugins/agent-status/plugin.d.ts.map +1 -0
  235. package/dist/plugins/agents/agents.integration.test.d.ts +2 -0
  236. package/dist/plugins/agents/agents.integration.test.d.ts.map +1 -0
  237. package/dist/plugins/agents/index.d.ts +3 -0
  238. package/dist/plugins/agents/index.d.ts.map +1 -0
  239. package/dist/plugins/agents/plugin.d.ts +57 -0
  240. package/dist/plugins/agents/plugin.d.ts.map +1 -0
  241. package/dist/plugins/context-compact/context-compact.integration.test.d.ts +2 -0
  242. package/dist/plugins/context-compact/context-compact.integration.test.d.ts.map +1 -0
  243. package/dist/plugins/context-compact/context-compactor.d.ts +88 -0
  244. package/dist/plugins/context-compact/context-compactor.d.ts.map +1 -0
  245. package/dist/plugins/context-compact/context-compactor.test.d.ts +2 -0
  246. package/dist/plugins/context-compact/context-compactor.test.d.ts.map +1 -0
  247. package/dist/plugins/context-compact/history-offloader.d.ts +17 -0
  248. package/dist/plugins/context-compact/history-offloader.d.ts.map +1 -0
  249. package/dist/plugins/context-compact/history-offloader.test.d.ts +2 -0
  250. package/dist/plugins/context-compact/history-offloader.test.d.ts.map +1 -0
  251. package/dist/plugins/context-compact/index.d.ts +4 -0
  252. package/dist/plugins/context-compact/index.d.ts.map +1 -0
  253. package/dist/plugins/context-compact/plugin.d.ts +15 -0
  254. package/dist/plugins/context-compact/plugin.d.ts.map +1 -0
  255. package/dist/plugins/filesystem/filesystem.integration.test.d.ts +2 -0
  256. package/dist/plugins/filesystem/filesystem.integration.test.d.ts.map +1 -0
  257. package/dist/plugins/filesystem/helpers.d.ts +34 -0
  258. package/dist/plugins/filesystem/helpers.d.ts.map +1 -0
  259. package/dist/plugins/filesystem/index.d.ts +5 -0
  260. package/dist/plugins/filesystem/index.d.ts.map +1 -0
  261. package/dist/plugins/filesystem/listing.d.ts +38 -0
  262. package/dist/plugins/filesystem/listing.d.ts.map +1 -0
  263. package/dist/plugins/filesystem/plugin.d.ts +53 -0
  264. package/dist/plugins/filesystem/plugin.d.ts.map +1 -0
  265. package/dist/plugins/filesystem/schema.d.ts +7 -0
  266. package/dist/plugins/filesystem/schema.d.ts.map +1 -0
  267. package/dist/plugins/git-status/index.d.ts +2 -0
  268. package/dist/plugins/git-status/index.d.ts.map +1 -0
  269. package/dist/plugins/git-status/plugin.d.ts +12 -0
  270. package/dist/plugins/git-status/plugin.d.ts.map +1 -0
  271. package/dist/plugins/limits-guard/config.d.ts +23 -0
  272. package/dist/plugins/limits-guard/config.d.ts.map +1 -0
  273. package/dist/plugins/limits-guard/index.d.ts +5 -0
  274. package/dist/plugins/limits-guard/index.d.ts.map +1 -0
  275. package/dist/plugins/limits-guard/limit-guard.d.ts +40 -0
  276. package/dist/plugins/limits-guard/limit-guard.d.ts.map +1 -0
  277. package/dist/plugins/limits-guard/limit-guard.test.d.ts +2 -0
  278. package/dist/plugins/limits-guard/limit-guard.test.d.ts.map +1 -0
  279. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts +2 -0
  280. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts.map +1 -0
  281. package/dist/plugins/limits-guard/plugin.d.ts +39 -0
  282. package/dist/plugins/limits-guard/plugin.d.ts.map +1 -0
  283. package/dist/plugins/llm-debug/index.d.ts +2 -0
  284. package/dist/plugins/llm-debug/index.d.ts.map +1 -0
  285. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts +2 -0
  286. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts.map +1 -0
  287. package/dist/plugins/llm-debug/plugin.d.ts +31 -0
  288. package/dist/plugins/llm-debug/plugin.d.ts.map +1 -0
  289. package/dist/plugins/logs/index.d.ts +2 -0
  290. package/dist/plugins/logs/index.d.ts.map +1 -0
  291. package/dist/plugins/logs/plugin.d.ts +10 -0
  292. package/dist/plugins/logs/plugin.d.ts.map +1 -0
  293. package/dist/plugins/mailbox/helpers.d.ts +20 -0
  294. package/dist/plugins/mailbox/helpers.d.ts.map +1 -0
  295. package/dist/plugins/mailbox/index.d.ts +9 -0
  296. package/dist/plugins/mailbox/index.d.ts.map +1 -0
  297. package/dist/plugins/mailbox/mailbox.integration.test.d.ts +2 -0
  298. package/dist/plugins/mailbox/mailbox.integration.test.d.ts.map +1 -0
  299. package/dist/plugins/mailbox/plugin.d.ts +31 -0
  300. package/dist/plugins/mailbox/plugin.d.ts.map +1 -0
  301. package/dist/plugins/mailbox/prompts.d.ts +21 -0
  302. package/dist/plugins/mailbox/prompts.d.ts.map +1 -0
  303. package/dist/plugins/mailbox/query.d.ts +33 -0
  304. package/dist/plugins/mailbox/query.d.ts.map +1 -0
  305. package/dist/plugins/mailbox/schema.d.ts +54 -0
  306. package/dist/plugins/mailbox/schema.d.ts.map +1 -0
  307. package/dist/plugins/mailbox/state.d.ts +40 -0
  308. package/dist/plugins/mailbox/state.d.ts.map +1 -0
  309. package/dist/plugins/resources/index.d.ts +7 -0
  310. package/dist/plugins/resources/index.d.ts.map +1 -0
  311. package/dist/plugins/resources/manifest.d.ts +23 -0
  312. package/dist/plugins/resources/manifest.d.ts.map +1 -0
  313. package/dist/plugins/resources/plugin.d.ts +28 -0
  314. package/dist/plugins/resources/plugin.d.ts.map +1 -0
  315. package/dist/plugins/resources/post-inject.d.ts +39 -0
  316. package/dist/plugins/resources/post-inject.d.ts.map +1 -0
  317. package/dist/plugins/resources/state.d.ts +25 -0
  318. package/dist/plugins/resources/state.d.ts.map +1 -0
  319. package/dist/plugins/result-eviction/index.d.ts +3 -0
  320. package/dist/plugins/result-eviction/index.d.ts.map +1 -0
  321. package/dist/plugins/result-eviction/plugin.d.ts +19 -0
  322. package/dist/plugins/result-eviction/plugin.d.ts.map +1 -0
  323. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts +2 -0
  324. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts.map +1 -0
  325. package/dist/plugins/services/plugin.d.ts +85 -0
  326. package/dist/plugins/services/plugin.d.ts.map +1 -0
  327. package/dist/plugins/services/port-pool.d.ts +32 -0
  328. package/dist/plugins/services/port-pool.d.ts.map +1 -0
  329. package/dist/plugins/services/prompt.d.ts +13 -0
  330. package/dist/plugins/services/prompt.d.ts.map +1 -0
  331. package/dist/plugins/services/schema.d.ts +70 -0
  332. package/dist/plugins/services/schema.d.ts.map +1 -0
  333. package/dist/plugins/services/service.d.ts +86 -0
  334. package/dist/plugins/services/service.d.ts.map +1 -0
  335. package/dist/plugins/services/services.integration.test.d.ts +2 -0
  336. package/dist/plugins/services/services.integration.test.d.ts.map +1 -0
  337. package/dist/plugins/session-lifecycle/index.d.ts +2 -0
  338. package/dist/plugins/session-lifecycle/index.d.ts.map +1 -0
  339. package/dist/plugins/session-lifecycle/plugin.d.ts +97 -0
  340. package/dist/plugins/session-lifecycle/plugin.d.ts.map +1 -0
  341. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts +2 -0
  342. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts.map +1 -0
  343. package/dist/plugins/session-state/plugin.d.ts +48 -0
  344. package/dist/plugins/session-state/plugin.d.ts.map +1 -0
  345. package/dist/plugins/session-stats/index.d.ts +4 -0
  346. package/dist/plugins/session-stats/index.d.ts.map +1 -0
  347. package/dist/plugins/session-stats/plugin.d.ts +29 -0
  348. package/dist/plugins/session-stats/plugin.d.ts.map +1 -0
  349. package/dist/plugins/shell/executor.d.ts +78 -0
  350. package/dist/plugins/shell/executor.d.ts.map +1 -0
  351. package/dist/plugins/shell/index.d.ts +6 -0
  352. package/dist/plugins/shell/index.d.ts.map +1 -0
  353. package/dist/plugins/shell/plugin.d.ts +51 -0
  354. package/dist/plugins/shell/plugin.d.ts.map +1 -0
  355. package/dist/plugins/shell/shell.integration.test.d.ts +2 -0
  356. package/dist/plugins/shell/shell.integration.test.d.ts.map +1 -0
  357. package/dist/plugins/shell/shell.test.d.ts +2 -0
  358. package/dist/plugins/shell/shell.test.d.ts.map +1 -0
  359. package/dist/plugins/skills/discovery.d.ts +69 -0
  360. package/dist/plugins/skills/discovery.d.ts.map +1 -0
  361. package/dist/plugins/skills/discovery.test.d.ts +2 -0
  362. package/dist/plugins/skills/discovery.test.d.ts.map +1 -0
  363. package/dist/plugins/skills/index.d.ts +11 -0
  364. package/dist/plugins/skills/index.d.ts.map +1 -0
  365. package/dist/plugins/skills/plugin.d.ts +94 -0
  366. package/dist/plugins/skills/plugin.d.ts.map +1 -0
  367. package/dist/plugins/skills/prompts.d.ts +29 -0
  368. package/dist/plugins/skills/prompts.d.ts.map +1 -0
  369. package/dist/plugins/skills/schema.d.ts +64 -0
  370. package/dist/plugins/skills/schema.d.ts.map +1 -0
  371. package/dist/plugins/skills/skills.integration.test.d.ts +2 -0
  372. package/dist/plugins/skills/skills.integration.test.d.ts.map +1 -0
  373. package/dist/plugins/snapshotting/index.d.ts +4 -0
  374. package/dist/plugins/snapshotting/index.d.ts.map +1 -0
  375. package/dist/plugins/snapshotting/jj-snapshotter.d.ts +27 -0
  376. package/dist/plugins/snapshotting/jj-snapshotter.d.ts.map +1 -0
  377. package/dist/plugins/snapshotting/plugin.d.ts +15 -0
  378. package/dist/plugins/snapshotting/plugin.d.ts.map +1 -0
  379. package/dist/plugins/snapshotting/snapshotter.d.ts +19 -0
  380. package/dist/plugins/snapshotting/snapshotter.d.ts.map +1 -0
  381. package/dist/plugins/todo/index.d.ts +7 -0
  382. package/dist/plugins/todo/index.d.ts.map +1 -0
  383. package/dist/plugins/todo/plugin.d.ts +95 -0
  384. package/dist/plugins/todo/plugin.d.ts.map +1 -0
  385. package/dist/plugins/todo/prompts.d.ts +13 -0
  386. package/dist/plugins/todo/prompts.d.ts.map +1 -0
  387. package/dist/plugins/todo/schema.d.ts +44 -0
  388. package/dist/plugins/todo/schema.d.ts.map +1 -0
  389. package/dist/plugins/todo/todo.integration.test.d.ts +2 -0
  390. package/dist/plugins/todo/todo.integration.test.d.ts.map +1 -0
  391. package/dist/plugins/uploads/index.d.ts +9 -0
  392. package/dist/plugins/uploads/index.d.ts.map +1 -0
  393. package/dist/plugins/uploads/plugin.d.ts +56 -0
  394. package/dist/plugins/uploads/plugin.d.ts.map +1 -0
  395. package/dist/plugins/uploads/preprocessor.d.ts +70 -0
  396. package/dist/plugins/uploads/preprocessor.d.ts.map +1 -0
  397. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +49 -0
  398. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -0
  399. package/dist/plugins/uploads/preprocessors/index.d.ts +7 -0
  400. package/dist/plugins/uploads/preprocessors/index.d.ts.map +1 -0
  401. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +43 -0
  402. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -0
  403. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts +30 -0
  404. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts.map +1 -0
  405. package/dist/plugins/uploads/schema.d.ts +72 -0
  406. package/dist/plugins/uploads/schema.d.ts.map +1 -0
  407. package/dist/plugins/uploads/state.d.ts +38 -0
  408. package/dist/plugins/uploads/state.d.ts.map +1 -0
  409. package/dist/plugins/uploads/uploads.integration.test.d.ts +2 -0
  410. package/dist/plugins/uploads/uploads.integration.test.d.ts.map +1 -0
  411. package/dist/plugins/user-chat/index.d.ts +7 -0
  412. package/dist/plugins/user-chat/index.d.ts.map +1 -0
  413. package/dist/plugins/user-chat/plugin.d.ts +221 -0
  414. package/dist/plugins/user-chat/plugin.d.ts.map +1 -0
  415. package/dist/plugins/user-chat/prompts.d.ts +13 -0
  416. package/dist/plugins/user-chat/prompts.d.ts.map +1 -0
  417. package/dist/plugins/user-chat/schema.d.ts +82 -0
  418. package/dist/plugins/user-chat/schema.d.ts.map +1 -0
  419. package/dist/plugins/user-chat/user-chat.integration.test.d.ts +2 -0
  420. package/dist/plugins/user-chat/user-chat.integration.test.d.ts.map +1 -0
  421. package/dist/plugins/workers/context.d.ts +159 -0
  422. package/dist/plugins/workers/context.d.ts.map +1 -0
  423. package/dist/plugins/workers/definition.d.ts +118 -0
  424. package/dist/plugins/workers/definition.d.ts.map +1 -0
  425. package/dist/plugins/workers/index.d.ts +11 -0
  426. package/dist/plugins/workers/index.d.ts.map +1 -0
  427. package/dist/plugins/workers/plugin.d.ts +125 -0
  428. package/dist/plugins/workers/plugin.d.ts.map +1 -0
  429. package/dist/plugins/workers/worker.d.ts +76 -0
  430. package/dist/plugins/workers/worker.d.ts.map +1 -0
  431. package/dist/plugins/workers/workers.integration.test.d.ts +2 -0
  432. package/dist/plugins/workers/workers.integration.test.d.ts.map +1 -0
  433. package/dist/prompts/base.d.ts +75 -0
  434. package/dist/prompts/base.d.ts.map +1 -0
  435. package/dist/prompts/builder.d.ts +73 -0
  436. package/dist/prompts/builder.d.ts.map +1 -0
  437. package/dist/prompts/index.d.ts +10 -0
  438. package/dist/prompts/index.d.ts.map +1 -0
  439. package/dist/prompts/macros.d.ts +15 -0
  440. package/dist/prompts/macros.d.ts.map +1 -0
  441. package/dist/prompts/macros.test.d.ts +2 -0
  442. package/dist/prompts/macros.test.d.ts.map +1 -0
  443. package/dist/testing/bootstrap-for-testing.d.ts +12 -0
  444. package/dist/testing/bootstrap-for-testing.d.ts.map +1 -0
  445. package/dist/testing/index.d.ts +8 -0
  446. package/dist/testing/index.d.ts.map +1 -0
  447. package/dist/testing/node-platform.d.ts +12 -0
  448. package/dist/testing/node-platform.d.ts.map +1 -0
  449. package/dist/testing/notification-collector.d.ts +46 -0
  450. package/dist/testing/notification-collector.d.ts.map +1 -0
  451. package/dist/testing/preset-helpers.d.ts +28 -0
  452. package/dist/testing/preset-helpers.d.ts.map +1 -0
  453. package/dist/testing/test-harness.d.ts +117 -0
  454. package/dist/testing/test-harness.d.ts.map +1 -0
  455. package/dist/testing/test-harness.test.d.ts +2 -0
  456. package/dist/testing/test-harness.test.d.ts.map +1 -0
  457. package/dist/testing/wait-helpers.d.ts +17 -0
  458. package/dist/testing/wait-helpers.d.ts.map +1 -0
  459. package/dist/transport/adapter/client-adapter.d.ts +32 -0
  460. package/dist/transport/adapter/client-adapter.d.ts.map +1 -0
  461. package/dist/transport/adapter/index.d.ts +23 -0
  462. package/dist/transport/adapter/index.d.ts.map +1 -0
  463. package/dist/transport/adapter/server-adapter.d.ts +29 -0
  464. package/dist/transport/adapter/server-adapter.d.ts.map +1 -0
  465. package/dist/transport/adapter/types.d.ts +14 -0
  466. package/dist/transport/adapter/types.d.ts.map +1 -0
  467. package/dist/transport/http/app.d.ts +41 -0
  468. package/dist/transport/http/app.d.ts.map +1 -0
  469. package/dist/transport/http/index.d.ts +7 -0
  470. package/dist/transport/http/index.d.ts.map +1 -0
  471. package/dist/transport/http/middleware/bearer-auth.d.ts +16 -0
  472. package/dist/transport/http/middleware/bearer-auth.d.ts.map +1 -0
  473. package/dist/transport/http/middleware/error-handler.d.ts +21 -0
  474. package/dist/transport/http/middleware/error-handler.d.ts.map +1 -0
  475. package/dist/transport/http/routes/files.d.ts +16 -0
  476. package/dist/transport/http/routes/files.d.ts.map +1 -0
  477. package/dist/transport/http/routes/resources.d.ts +12 -0
  478. package/dist/transport/http/routes/resources.d.ts.map +1 -0
  479. package/dist/transport/http/routes/rpc.d.ts +22 -0
  480. package/dist/transport/http/routes/rpc.d.ts.map +1 -0
  481. package/dist/transport/http/routes/rpc.integration.test.d.ts +2 -0
  482. package/dist/transport/http/routes/rpc.integration.test.d.ts.map +1 -0
  483. package/dist/transport/http/routes/rpc.test.d.ts +2 -0
  484. package/dist/transport/http/routes/rpc.test.d.ts.map +1 -0
  485. package/dist/transport/http/routes/upload.d.ts +14 -0
  486. package/dist/transport/http/routes/upload.d.ts.map +1 -0
  487. package/dist/transport/rpc/index.d.ts +8 -0
  488. package/dist/transport/rpc/index.d.ts.map +1 -0
  489. package/dist/transport/rpc/methods.d.ts +25 -0
  490. package/dist/transport/rpc/methods.d.ts.map +1 -0
  491. package/dist/user-config.d.ts +29 -0
  492. package/dist/user-config.d.ts.map +1 -0
  493. package/package.json +154 -0
  494. package/src/bootstrap.ts +268 -0
  495. package/src/builtin-events.ts +25 -0
  496. package/src/bun-platform/fs.ts +50 -0
  497. package/src/bun-platform/index.ts +21 -0
  498. package/src/bun-platform/process.ts +25 -0
  499. package/src/config.test.ts +174 -0
  500. package/src/config.ts +103 -0
  501. package/src/core/agent-loop.integration.test.ts +503 -0
  502. package/src/core/agents/agent-config.test.ts +240 -0
  503. package/src/core/agents/agent-roles.ts +41 -0
  504. package/src/core/agents/agent-shutdown.test.ts +236 -0
  505. package/src/core/agents/agent.test.ts +387 -0
  506. package/src/core/agents/agent.ts +1472 -0
  507. package/src/core/agents/communicator.ts +16 -0
  508. package/src/core/agents/config.ts +98 -0
  509. package/src/core/agents/context.ts +19 -0
  510. package/src/core/agents/debounce.ts +116 -0
  511. package/src/core/agents/handler-events.test.ts +167 -0
  512. package/src/core/agents/index.ts +1 -0
  513. package/src/core/agents/response-sanitizer.test.ts +137 -0
  514. package/src/core/agents/response-sanitizer.ts +67 -0
  515. package/src/core/agents/retry.ts +164 -0
  516. package/src/core/agents/schema.ts +75 -0
  517. package/src/core/agents/state.ts +272 -0
  518. package/src/core/context/state.ts +38 -0
  519. package/src/core/errors.ts +55 -0
  520. package/src/core/event-sourcing.integration.test.ts +191 -0
  521. package/src/core/events/base-event-store.ts +264 -0
  522. package/src/core/events/event-store.ts +143 -0
  523. package/src/core/events/file.test.ts +436 -0
  524. package/src/core/events/file.ts +372 -0
  525. package/src/core/events/index.ts +3 -0
  526. package/src/core/events/memory.test.ts +741 -0
  527. package/src/core/events/memory.ts +131 -0
  528. package/src/core/events/metadata-utils.ts +133 -0
  529. package/src/core/events/test-helpers.ts +31 -0
  530. package/src/core/events/types.ts +64 -0
  531. package/src/core/file-store/file-store.ts +275 -0
  532. package/src/core/file-store/types.ts +52 -0
  533. package/src/core/image/image-processor.test.ts +218 -0
  534. package/src/core/image/image-processor.ts +127 -0
  535. package/src/core/image/index.ts +4 -0
  536. package/src/core/image/noop-resizer.ts +7 -0
  537. package/src/core/image/types.ts +24 -0
  538. package/src/core/image/vips-resizer.test.ts +377 -0
  539. package/src/core/image/vips-resizer.ts +124 -0
  540. package/src/core/llm/__snapshots__/anthropic-assistant-text-with-tool-calls.json +156 -0
  541. package/src/core/llm/__snapshots__/anthropic-consecutive-tool-results.json +152 -0
  542. package/src/core/llm/__snapshots__/anthropic-image-data-url.json +105 -0
  543. package/src/core/llm/__snapshots__/anthropic-image-http-url.json +104 -0
  544. package/src/core/llm/__snapshots__/anthropic-multiple-images.json +113 -0
  545. package/src/core/llm/__snapshots__/anthropic-multiple-tool-calls-requested.json +151 -0
  546. package/src/core/llm/__snapshots__/anthropic-simple-user-message.json +97 -0
  547. package/src/core/llm/__snapshots__/anthropic-system-message-in-conversation.json +119 -0
  548. package/src/core/llm/__snapshots__/anthropic-tool-call.json +123 -0
  549. package/src/core/llm/__snapshots__/anthropic-tool-error-result.json +139 -0
  550. package/src/core/llm/__snapshots__/anthropic-tool-result-with-image.json +152 -0
  551. package/src/core/llm/__snapshots__/anthropic-tool-roundtrip.json +139 -0
  552. package/src/core/llm/__snapshots__/openrouter-assistant-text-with-tool-calls.json +150 -0
  553. package/src/core/llm/__snapshots__/openrouter-consecutive-tool-results.json +150 -0
  554. package/src/core/llm/__snapshots__/openrouter-image-data-url.json +107 -0
  555. package/src/core/llm/__snapshots__/openrouter-image-http-url.json +107 -0
  556. package/src/core/llm/__snapshots__/openrouter-multiple-images.json +113 -0
  557. package/src/core/llm/__snapshots__/openrouter-multiple-tool-calls-requested.json +158 -0
  558. package/src/core/llm/__snapshots__/openrouter-simple-user-message.json +96 -0
  559. package/src/core/llm/__snapshots__/openrouter-system-message-in-conversation.json +108 -0
  560. package/src/core/llm/__snapshots__/openrouter-tool-call.json +129 -0
  561. package/src/core/llm/__snapshots__/openrouter-tool-error-result.json +137 -0
  562. package/src/core/llm/__snapshots__/openrouter-tool-result-with-image.json +148 -0
  563. package/src/core/llm/__snapshots__/openrouter-tool-roundtrip.json +137 -0
  564. package/src/core/llm/anthropic.test.ts +509 -0
  565. package/src/core/llm/anthropic.ts +578 -0
  566. package/src/core/llm/cache-breakpoints.ts +38 -0
  567. package/src/core/llm/cache-live.test.ts +155 -0
  568. package/src/core/llm/index.ts +30 -0
  569. package/src/core/llm/llm-log-types.ts +167 -0
  570. package/src/core/llm/logger.test.ts +270 -0
  571. package/src/core/llm/logger.ts +306 -0
  572. package/src/core/llm/logging-provider.ts +73 -0
  573. package/src/core/llm/middleware.ts +172 -0
  574. package/src/core/llm/mock.test.ts +402 -0
  575. package/src/core/llm/mock.ts +234 -0
  576. package/src/core/llm/openrouter-mapping.test.ts +153 -0
  577. package/src/core/llm/openrouter.test.ts +499 -0
  578. package/src/core/llm/openrouter.ts +458 -0
  579. package/src/core/llm/provider-integration.test.ts +408 -0
  580. package/src/core/llm/provider.ts +238 -0
  581. package/src/core/llm/routing-provider.test.ts +113 -0
  582. package/src/core/llm/routing-provider.ts +86 -0
  583. package/src/core/llm/schema.ts +47 -0
  584. package/src/core/llm/snapshot-fetch.ts +158 -0
  585. package/src/core/llm/snapshot-middleware.test.ts +168 -0
  586. package/src/core/llm/snapshot-middleware.ts +185 -0
  587. package/src/core/llm/state.ts +92 -0
  588. package/src/core/llm/tokens.ts +61 -0
  589. package/src/core/multi-agent.integration.test.ts +340 -0
  590. package/src/core/plugin-hooks.integration.test.ts +428 -0
  591. package/src/core/plugins/hook-types.ts +49 -0
  592. package/src/core/plugins/index.ts +52 -0
  593. package/src/core/plugins/plugin-builder.ts +967 -0
  594. package/src/core/preset/config.ts +110 -0
  595. package/src/core/preset/index.ts +11 -0
  596. package/src/core/preset/preset-builder.ts +111 -0
  597. package/src/core/session-lifecycle.integration.test.ts +202 -0
  598. package/src/core/sessions/apply-event.ts +46 -0
  599. package/src/core/sessions/context.ts +36 -0
  600. package/src/core/sessions/fork-utils.test.ts +158 -0
  601. package/src/core/sessions/fork-utils.ts +71 -0
  602. package/src/core/sessions/reducer.ts +95 -0
  603. package/src/core/sessions/schema.ts +91 -0
  604. package/src/core/sessions/session-environment.ts +12 -0
  605. package/src/core/sessions/session-manager.ts +883 -0
  606. package/src/core/sessions/session-store.ts +141 -0
  607. package/src/core/sessions/session.test.ts +1730 -0
  608. package/src/core/sessions/session.ts +833 -0
  609. package/src/core/sessions/state.ts +520 -0
  610. package/src/core/system.ts +206 -0
  611. package/src/core/tools/context.ts +3 -0
  612. package/src/core/tools/definition.ts +15 -0
  613. package/src/core/tools/executor.test.ts +160 -0
  614. package/src/core/tools/executor.ts +117 -0
  615. package/src/core/tools/index.ts +3 -0
  616. package/src/core/tools/schema.ts +80 -0
  617. package/src/core/tools/state.ts +34 -0
  618. package/src/index.ts +165 -0
  619. package/src/lib/json/index.ts +20 -0
  620. package/src/lib/logger/console.test.ts +348 -0
  621. package/src/lib/logger/console.ts +185 -0
  622. package/src/lib/logger/file.ts +65 -0
  623. package/src/lib/logger/index.ts +4 -0
  624. package/src/lib/logger/logger.ts +114 -0
  625. package/src/lib/logger/ring-buffer.ts +65 -0
  626. package/src/lib/logger/tee.ts +51 -0
  627. package/src/lib/mime.ts +23 -0
  628. package/src/lib/never.ts +3 -0
  629. package/src/lib/utils/hash.ts +38 -0
  630. package/src/lib/utils/result.ts +35 -0
  631. package/src/platform/fs.ts +38 -0
  632. package/src/platform/index.ts +23 -0
  633. package/src/platform/process.ts +28 -0
  634. package/src/plugins/agent-status/plugin.ts +77 -0
  635. package/src/plugins/agents/agents.integration.test.ts +808 -0
  636. package/src/plugins/agents/index.ts +2 -0
  637. package/src/plugins/agents/plugin.ts +242 -0
  638. package/src/plugins/context-compact/context-compact.integration.test.ts +207 -0
  639. package/src/plugins/context-compact/context-compactor.test.ts +923 -0
  640. package/src/plugins/context-compact/context-compactor.ts +343 -0
  641. package/src/plugins/context-compact/history-offloader.test.ts +100 -0
  642. package/src/plugins/context-compact/history-offloader.ts +47 -0
  643. package/src/plugins/context-compact/index.ts +3 -0
  644. package/src/plugins/context-compact/plugin.ts +62 -0
  645. package/src/plugins/filesystem/filesystem.integration.test.ts +485 -0
  646. package/src/plugins/filesystem/helpers.ts +216 -0
  647. package/src/plugins/filesystem/index.ts +4 -0
  648. package/src/plugins/filesystem/listing.ts +276 -0
  649. package/src/plugins/filesystem/plugin.ts +468 -0
  650. package/src/plugins/filesystem/schema.ts +6 -0
  651. package/src/plugins/git-status/index.ts +1 -0
  652. package/src/plugins/git-status/plugin.ts +166 -0
  653. package/src/plugins/limits-guard/config.ts +26 -0
  654. package/src/plugins/limits-guard/index.ts +4 -0
  655. package/src/plugins/limits-guard/limit-guard.test.ts +161 -0
  656. package/src/plugins/limits-guard/limit-guard.ts +164 -0
  657. package/src/plugins/limits-guard/limits-guard.integration.test.ts +437 -0
  658. package/src/plugins/limits-guard/plugin.ts +306 -0
  659. package/src/plugins/llm-debug/index.ts +1 -0
  660. package/src/plugins/llm-debug/llm-debug.integration.test.ts +192 -0
  661. package/src/plugins/llm-debug/plugin.ts +172 -0
  662. package/src/plugins/logs/index.ts +1 -0
  663. package/src/plugins/logs/plugin.ts +39 -0
  664. package/src/plugins/mailbox/helpers.ts +83 -0
  665. package/src/plugins/mailbox/index.ts +13 -0
  666. package/src/plugins/mailbox/mailbox.integration.test.ts +705 -0
  667. package/src/plugins/mailbox/plugin.ts +270 -0
  668. package/src/plugins/mailbox/prompts.ts +104 -0
  669. package/src/plugins/mailbox/query.ts +53 -0
  670. package/src/plugins/mailbox/schema.ts +81 -0
  671. package/src/plugins/mailbox/state.ts +52 -0
  672. package/src/plugins/resources/index.ts +11 -0
  673. package/src/plugins/resources/manifest.ts +25 -0
  674. package/src/plugins/resources/plugin.ts +201 -0
  675. package/src/plugins/resources/post-inject.ts +74 -0
  676. package/src/plugins/resources/state.ts +30 -0
  677. package/src/plugins/result-eviction/index.ts +2 -0
  678. package/src/plugins/result-eviction/plugin.ts +65 -0
  679. package/src/plugins/result-eviction/result-eviction.integration.test.ts +244 -0
  680. package/src/plugins/services/plugin.ts +485 -0
  681. package/src/plugins/services/port-pool.ts +73 -0
  682. package/src/plugins/services/prompt.ts +53 -0
  683. package/src/plugins/services/schema.ts +83 -0
  684. package/src/plugins/services/service.ts +578 -0
  685. package/src/plugins/services/services.integration.test.ts +595 -0
  686. package/src/plugins/session-lifecycle/index.ts +1 -0
  687. package/src/plugins/session-lifecycle/plugin.ts +302 -0
  688. package/src/plugins/session-lifecycle/session-lifecycle.integration.test.ts +639 -0
  689. package/src/plugins/session-state/plugin.ts +179 -0
  690. package/src/plugins/session-stats/index.ts +3 -0
  691. package/src/plugins/session-stats/plugin.ts +120 -0
  692. package/src/plugins/shell/executor.ts +462 -0
  693. package/src/plugins/shell/index.ts +23 -0
  694. package/src/plugins/shell/plugin.ts +118 -0
  695. package/src/plugins/shell/shell.integration.test.ts +273 -0
  696. package/src/plugins/shell/shell.test.ts +314 -0
  697. package/src/plugins/skills/discovery.test.ts +395 -0
  698. package/src/plugins/skills/discovery.ts +276 -0
  699. package/src/plugins/skills/index.ts +32 -0
  700. package/src/plugins/skills/plugin.ts +381 -0
  701. package/src/plugins/skills/prompts.ts +84 -0
  702. package/src/plugins/skills/schema.ts +88 -0
  703. package/src/plugins/skills/skills.integration.test.ts +580 -0
  704. package/src/plugins/snapshotting/index.ts +3 -0
  705. package/src/plugins/snapshotting/jj-snapshotter.ts +122 -0
  706. package/src/plugins/snapshotting/plugin.ts +36 -0
  707. package/src/plugins/snapshotting/snapshotter.ts +20 -0
  708. package/src/plugins/todo/index.ts +11 -0
  709. package/src/plugins/todo/plugin.ts +363 -0
  710. package/src/plugins/todo/prompts.ts +63 -0
  711. package/src/plugins/todo/schema.ts +71 -0
  712. package/src/plugins/todo/todo.integration.test.ts +687 -0
  713. package/src/plugins/uploads/index.ts +13 -0
  714. package/src/plugins/uploads/plugin.ts +406 -0
  715. package/src/plugins/uploads/preprocessor.ts +111 -0
  716. package/src/plugins/uploads/preprocessors/image-classifier.ts +176 -0
  717. package/src/plugins/uploads/preprocessors/index.ts +7 -0
  718. package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +262 -0
  719. package/src/plugins/uploads/preprocessors/zip-preprocessor.ts +210 -0
  720. package/src/plugins/uploads/schema.ts +92 -0
  721. package/src/plugins/uploads/state.ts +42 -0
  722. package/src/plugins/uploads/uploads.integration.test.ts +654 -0
  723. package/src/plugins/user-chat/index.ts +17 -0
  724. package/src/plugins/user-chat/plugin.ts +728 -0
  725. package/src/plugins/user-chat/prompts.ts +30 -0
  726. package/src/plugins/user-chat/schema.ts +80 -0
  727. package/src/plugins/user-chat/user-chat.integration.test.ts +794 -0
  728. package/src/plugins/workers/context.ts +251 -0
  729. package/src/plugins/workers/definition.ts +169 -0
  730. package/src/plugins/workers/index.ts +21 -0
  731. package/src/plugins/workers/plugin.ts +722 -0
  732. package/src/plugins/workers/worker.ts +115 -0
  733. package/src/plugins/workers/workers.integration.test.ts +778 -0
  734. package/src/prompts/base.ts +266 -0
  735. package/src/prompts/builder.ts +194 -0
  736. package/src/prompts/index.ts +36 -0
  737. package/src/prompts/macros.test.ts +107 -0
  738. package/src/prompts/macros.ts +27 -0
  739. package/src/testing/bootstrap-for-testing.ts +39 -0
  740. package/src/testing/index.ts +7 -0
  741. package/src/testing/node-platform.ts +80 -0
  742. package/src/testing/notification-collector.ts +100 -0
  743. package/src/testing/preset-helpers.ts +57 -0
  744. package/src/testing/test-harness.test.ts +63 -0
  745. package/src/testing/test-harness.ts +279 -0
  746. package/src/testing/wait-helpers.ts +84 -0
  747. package/src/transport/adapter/client-adapter.ts +81 -0
  748. package/src/transport/adapter/index.ts +42 -0
  749. package/src/transport/adapter/server-adapter.ts +93 -0
  750. package/src/transport/adapter/types.ts +20 -0
  751. package/src/transport/http/app.ts +129 -0
  752. package/src/transport/http/index.ts +7 -0
  753. package/src/transport/http/middleware/bearer-auth.ts +40 -0
  754. package/src/transport/http/middleware/error-handler.ts +76 -0
  755. package/src/transport/http/routes/files.ts +274 -0
  756. package/src/transport/http/routes/resources.ts +115 -0
  757. package/src/transport/http/routes/rpc.integration.test.ts +243 -0
  758. package/src/transport/http/routes/rpc.test.ts +372 -0
  759. package/src/transport/http/routes/rpc.ts +156 -0
  760. package/src/transport/http/routes/upload.ts +286 -0
  761. package/src/transport/rpc/index.ts +11 -0
  762. package/src/transport/rpc/methods.ts +38 -0
  763. package/src/user-config.ts +33 -0
@@ -0,0 +1,485 @@
1
+ import z from 'zod/v4'
2
+ import { ValidationErrors } from '~/core/errors.js'
3
+ import { createEventsFactory } from '~/core/events/types.js'
4
+ import { definePlugin } from '~/core/plugins/plugin-builder.js'
5
+ import { sessionEvents } from '~/core/sessions/state.js'
6
+ import { createTool } from '~/core/tools/definition.js'
7
+ import { Err, Ok } from '~/lib/utils/result.js'
8
+ import type { PortPool } from './port-pool.js'
9
+ import { buildServiceStatusMessage } from './prompt.js'
10
+ import type { ServiceConfig, ServiceEntry } from './schema.js'
11
+ import { getProcessStartTime, ServiceExecutor } from './service.js'
12
+
13
+ export const serviceEvents = createEventsFactory({
14
+ events: {
15
+ service_status_changed: z.object({
16
+ serviceType: z.string(),
17
+ toStatus: z.enum(['stopped', 'starting', 'ready', 'stopping', 'failed', 'paused']),
18
+ port: z.number().optional(),
19
+ error: z.string().optional(),
20
+ pid: z.number().optional(),
21
+ pidStartTime: z.number().optional(),
22
+ }),
23
+ },
24
+ })
25
+
26
+ export type ServiceStatusChangedEvent = (typeof serviceEvents)['Events']['service_status_changed']
27
+
28
+ /**
29
+ * Session-wide service configuration.
30
+ */
31
+ export interface ServicePluginConfig {
32
+ services: ServiceConfig[]
33
+ portPool: PortPool
34
+ }
35
+
36
+ /**
37
+ * Agent-specific service configuration.
38
+ */
39
+ export interface ServiceAgentConfig {
40
+ services: string[]
41
+ }
42
+
43
+ export const servicePlugin = definePlugin('services')
44
+ .pluginConfig<ServicePluginConfig>()
45
+ .isSessionEnabled(({ pluginConfig }) => pluginConfig !== undefined && pluginConfig.services.length > 0)
46
+ .events([serviceEvents, sessionEvents])
47
+ .state({
48
+ key: 'services',
49
+ initial: (): Map<string, ServiceEntry> => new Map(),
50
+ reduce: (services, event) => {
51
+ switch (event.type) {
52
+ case 'service_status_changed': {
53
+ const newServices = new Map(services)
54
+ const existing = newServices.get(event.serviceType)
55
+
56
+ if (!existing && event.toStatus === 'starting') {
57
+ newServices.set(event.serviceType, {
58
+ serviceType: event.serviceType,
59
+ status: event.toStatus,
60
+ port: event.port,
61
+ startedAt: event.timestamp,
62
+ pid: event.pid,
63
+ pidStartTime: event.pidStartTime,
64
+ })
65
+ } else if (existing) {
66
+ const updated: ServiceEntry = {
67
+ ...existing,
68
+ status: event.toStatus,
69
+ }
70
+ if (event.toStatus === 'starting') {
71
+ updated.startedAt = event.timestamp
72
+ updated.error = undefined
73
+ updated.port = event.port
74
+ updated.pid = event.pid
75
+ updated.pidStartTime = event.pidStartTime
76
+ }
77
+ if (event.toStatus === 'ready') {
78
+ updated.readyAt = event.timestamp
79
+ if (event.port !== undefined) {
80
+ updated.port = event.port
81
+ }
82
+ }
83
+ if (event.toStatus === 'failed' && event.error) {
84
+ updated.error = event.error
85
+ updated.pid = undefined
86
+ updated.pidStartTime = undefined
87
+ }
88
+ if (event.toStatus === 'stopped') {
89
+ updated.stoppedAt = event.timestamp
90
+ updated.pid = undefined
91
+ updated.pidStartTime = undefined
92
+ }
93
+ newServices.set(event.serviceType, updated)
94
+ }
95
+
96
+ return newServices
97
+ }
98
+
99
+ case 'session_restarted': {
100
+ let changed = false
101
+ const newServices = new Map(services)
102
+ for (const [serviceType, entry] of services) {
103
+ if (entry.status === 'starting' || entry.status === 'ready') {
104
+ newServices.set(serviceType, {
105
+ ...entry,
106
+ status: 'stopped',
107
+ port: undefined,
108
+ pid: undefined,
109
+ pidStartTime: undefined,
110
+ stoppedAt: event.timestamp,
111
+ })
112
+ changed = true
113
+ }
114
+ }
115
+ return changed ? newServices : services
116
+ }
117
+
118
+ default:
119
+ return services
120
+ }
121
+ },
122
+ })
123
+ .context(async (ctx, pluginConfig) => {
124
+ const executor = new ServiceExecutor(ctx.logger, pluginConfig.portPool, { fs: ctx.platform.fs, process: ctx.platform.process })
125
+ executor.onStatusChanged = (sessionId, serviceType, status, port, error, pid, pidStartTime) => {
126
+ void ctx.emitEvent(serviceEvents.create('service_status_changed', {
127
+ serviceType,
128
+ toStatus: status,
129
+ port,
130
+ error,
131
+ pid,
132
+ pidStartTime,
133
+ }))
134
+ // Broadcast service status to connected clients (DO → SPA) via WS
135
+ ctx.notify('serviceStatus', { sessionId: String(sessionId), serviceType, status, port })
136
+ }
137
+ return { executor }
138
+ })
139
+ .agentConfig<ServiceAgentConfig>()
140
+ .method('start', {
141
+ input: z.object({
142
+ serviceType: z.string().optional(),
143
+ all: z.boolean().optional(),
144
+ waitForReady: z.boolean().optional(),
145
+ }),
146
+ output: z.object({
147
+ started: z.array(z.string()).optional(),
148
+ }),
149
+ handler: async (ctx, input) => {
150
+ const serviceMap = new Map(ctx.pluginConfig.services.map((svc) => [svc.type, svc]))
151
+ const started: string[] = []
152
+
153
+ if (input.serviceType) {
154
+ const svcConfig = serviceMap.get(input.serviceType)
155
+ if (!svcConfig) return Err(ValidationErrors.invalid(`Service ${input.serviceType} not found`))
156
+
157
+ const currentStatus = ctx.pluginContext.executor.getStatus(input.serviceType)
158
+ if (currentStatus === 'starting' || currentStatus === 'ready') {
159
+ return Ok({ started: [] })
160
+ }
161
+
162
+ const preferredPort = ctx.pluginState.get(input.serviceType)?.port
163
+ await ctx.pluginContext.executor.start(svcConfig, ctx.sessionId, ctx.sessionState.workspaceDir, preferredPort)
164
+ started.push(input.serviceType)
165
+ } else {
166
+ for (const svcConfig of ctx.pluginConfig.services) {
167
+ if (input.all || svcConfig.autoStart) {
168
+ const status = ctx.pluginContext.executor.getStatus(svcConfig.type)
169
+ if (status === 'ready' || status === 'starting') {
170
+ // Re-notify for already running services (e.g. after reconnect)
171
+ const entry = ctx.pluginState.get(svcConfig.type)
172
+ if (entry?.port) {
173
+ ctx.notify('serviceStatus', { sessionId: String(ctx.sessionId), serviceType: svcConfig.type, status, port: entry.port })
174
+ }
175
+ } else {
176
+ const preferredPort = ctx.pluginState.get(svcConfig.type)?.port
177
+ await ctx.pluginContext.executor.start(svcConfig, ctx.sessionId, ctx.sessionState.workspaceDir, preferredPort)
178
+ started.push(svcConfig.type)
179
+ }
180
+ }
181
+ }
182
+ }
183
+
184
+ if (input.waitForReady && started.length > 0) {
185
+ const results = await Promise.all(started.map((svc) => ctx.pluginContext.executor.waitForReady(svc)))
186
+ const firstError = results.find((r) => !r.ok)
187
+ if (firstError && !firstError.ok) {
188
+ return Err(ValidationErrors.invalid(firstError.error.message))
189
+ }
190
+ }
191
+
192
+ return Ok({ started: started.length > 0 ? started : undefined })
193
+ },
194
+ })
195
+ .method('stop', {
196
+ input: z.object({
197
+ serviceType: z.string(),
198
+ }),
199
+ output: z.object({}),
200
+ handler: async (ctx, input) => {
201
+ const result = await ctx.pluginContext.executor.stop(input.serviceType, ctx.sessionId)
202
+ if (!result.ok) return Err(ValidationErrors.invalid(result.error.message))
203
+ return Ok({})
204
+ },
205
+ })
206
+ .method('restart', {
207
+ input: z.object({
208
+ serviceType: z.string(),
209
+ }),
210
+ output: z.object({}),
211
+ handler: async (ctx, input) => {
212
+ const svcConfig = ctx.pluginConfig.services.find((s) => s.type === input.serviceType)
213
+ if (!svcConfig) return Err(ValidationErrors.invalid(`Service ${input.serviceType} not found`))
214
+
215
+ const preferredPort = ctx.pluginState.get(input.serviceType)?.port
216
+ const result = await ctx.pluginContext.executor.restart(svcConfig, ctx.sessionId, ctx.sessionState.workspaceDir, preferredPort)
217
+ if (!result.ok) return Err(ValidationErrors.invalid(result.error.message))
218
+ return Ok({})
219
+ },
220
+ })
221
+ .method('list', {
222
+ input: z.object({}),
223
+ output: z.object({
224
+ services: z.array(z.object({
225
+ serviceType: z.string(),
226
+ status: z.string(),
227
+ port: z.number().optional(),
228
+ })),
229
+ }),
230
+ handler: async (ctx) => {
231
+ const services = []
232
+ for (const svcConfig of ctx.pluginConfig.services) {
233
+ const status = ctx.pluginContext.executor.getStatus(svcConfig.type)
234
+ const stateEntry = ctx.pluginState.get(svcConfig.type)
235
+ services.push({
236
+ serviceType: svcConfig.type,
237
+ status: status ?? stateEntry?.status ?? 'stopped',
238
+ port: stateEntry?.port,
239
+ })
240
+ }
241
+ return Ok({ services })
242
+ },
243
+ })
244
+ .method('status', {
245
+ input: z.object({
246
+ serviceType: z.string(),
247
+ logLines: z.number().int().min(1).max(200).optional(),
248
+ }),
249
+ output: z.object({
250
+ serviceType: z.string(),
251
+ status: z.string(),
252
+ port: z.number().optional(),
253
+ error: z.string().optional(),
254
+ recentLogs: z.array(z.string()),
255
+ }),
256
+ handler: async (ctx, input) => {
257
+ const status = ctx.pluginContext.executor.getStatus(input.serviceType)
258
+ const logsResult = ctx.pluginContext.executor.getLogs(input.serviceType, input.logLines ?? 10)
259
+ const stateEntry = ctx.pluginState.get(input.serviceType)
260
+
261
+ return Ok({
262
+ serviceType: input.serviceType,
263
+ status: status ?? 'stopped',
264
+ port: stateEntry?.port,
265
+ error: stateEntry?.error,
266
+ recentLogs: logsResult.ok ? logsResult.value : [],
267
+ })
268
+ },
269
+ })
270
+ .method('logs', {
271
+ input: z.object({
272
+ serviceType: z.string(),
273
+ lines: z.number().int().min(1).max(200).optional(),
274
+ }),
275
+ output: z.object({
276
+ serviceType: z.string(),
277
+ lines: z.array(z.string()),
278
+ }),
279
+ handler: async (ctx, input) => {
280
+ const logsResult = ctx.pluginContext.executor.getLogs(input.serviceType, input.lines ?? 50)
281
+ if (!logsResult.ok) return Err(ValidationErrors.invalid(logsResult.error.message))
282
+
283
+ return Ok({
284
+ serviceType: input.serviceType,
285
+ lines: logsResult.value,
286
+ })
287
+ },
288
+ })
289
+ .sessionHook('onSessionReady', async (ctx) => {
290
+ // Reconcile: kill orphaned process groups from previous server instance
291
+ // and mark corresponding services as stopped. Port is preserved in state
292
+ // so the next start() reuses it via preferredPort.
293
+ // Also re-notify running services so DO re-registers their URLs.
294
+ for (const [serviceType, entry] of ctx.pluginState) {
295
+ if (entry.status === 'starting' || entry.status === 'ready' || entry.status === 'paused') {
296
+ const executorStatus = ctx.pluginContext.executor.getStatus(serviceType)
297
+ if (!executorStatus) {
298
+ if (entry.pid !== undefined) {
299
+ // PID-reuse guard: only kill if we can confirm this PID still
300
+ // belongs to the process we spawned. If we stored a pidStartTime,
301
+ // the current start time must match — a mismatch means the kernel
302
+ // recycled the PID for an unrelated process and SIGKILL would be
303
+ // disastrous. On non-Linux (no /proc), start times are always
304
+ // undefined and we fall back to the pre-existing kill-and-hope path.
305
+ const currentStartTime = await getProcessStartTime(ctx.platform.fs, entry.pid)
306
+ const pidReused = entry.pidStartTime !== undefined
307
+ && currentStartTime !== undefined
308
+ && currentStartTime !== entry.pidStartTime
309
+
310
+ if (pidReused) {
311
+ ctx.logger.warn('PID reuse detected during orphan reconcile — refusing to kill', {
312
+ serviceType,
313
+ pid: entry.pid,
314
+ storedStartTime: entry.pidStartTime,
315
+ currentStartTime,
316
+ })
317
+ } else {
318
+ try {
319
+ process.kill(-entry.pid, 'SIGKILL')
320
+ ctx.logger.info('Killed orphaned service process group', { serviceType, pid: entry.pid })
321
+ } catch (err) {
322
+ ctx.logger.debug('Orphaned service process already gone', { serviceType, pid: entry.pid, err })
323
+ }
324
+ }
325
+ }
326
+ await ctx.emitEvent(serviceEvents.create('service_status_changed', {
327
+ serviceType,
328
+ toStatus: 'stopped',
329
+ }))
330
+ } else if (executorStatus === 'ready' && entry.port) {
331
+ // Re-notify so DO can re-register service URL after reconnect
332
+ ctx.notify('serviceStatus', { sessionId: String(ctx.sessionId), serviceType, status: 'ready', port: entry.port })
333
+ }
334
+ }
335
+ }
336
+
337
+ // Auto-start services configured with autoStart
338
+ for (const svcConfig of ctx.pluginConfig.services) {
339
+ if (svcConfig.autoStart) {
340
+ const status = ctx.pluginContext.executor.getStatus(svcConfig.type)
341
+ if (status !== 'ready' && status !== 'starting') {
342
+ const preferredPort = ctx.pluginState.get(svcConfig.type)?.port
343
+ await ctx.pluginContext.executor.start(svcConfig, ctx.sessionId, ctx.sessionState.workspaceDir, preferredPort)
344
+ }
345
+ }
346
+ }
347
+ })
348
+ .sessionHook('onSessionClose', async (ctx) => {
349
+ for (const svcConfig of ctx.pluginConfig.services) {
350
+ const status = ctx.pluginContext.executor.getStatus(svcConfig.type)
351
+ if (status === 'ready' || status === 'starting') {
352
+ await ctx.pluginContext.executor.stop(svcConfig.type, ctx.sessionId)
353
+ }
354
+ }
355
+ })
356
+ .tools((ctx) => {
357
+ const serviceMap = new Map(ctx.pluginConfig.services.map((svc) => [svc.type, svc]))
358
+ const visibleServices = ctx.pluginAgentConfig?.services ?? []
359
+ const visibleServiceTypes = visibleServices.filter((t) => serviceMap.has(t))
360
+ if (visibleServiceTypes.length === 0) return []
361
+
362
+ const serviceList = visibleServiceTypes.join(', ')
363
+
364
+ return [
365
+ createTool({
366
+ name: 'service_start',
367
+ description:
368
+ `Start a stopped or failed session service. Only call this if the session context shows the service is not running — if it is already "ready", you do not need to start it. Available services: ${serviceList}`,
369
+ input: z.object({
370
+ serviceType: z.string().describe('Service type identifier'),
371
+ }),
372
+ execute: async (input) => {
373
+ if (!visibleServiceTypes.includes(input.serviceType)) {
374
+ return Err({ message: `Service not visible: ${input.serviceType}`, recoverable: false })
375
+ }
376
+
377
+ const result = await ctx.self.start({
378
+ serviceType: input.serviceType,
379
+ })
380
+ if (!result.ok) return Err({ message: result.error.message, recoverable: false })
381
+
382
+ const readyResult = await ctx.pluginContext.executor.waitForReady(input.serviceType)
383
+ if (!readyResult.ok) return Err(readyResult.error)
384
+
385
+ return Ok(JSON.stringify({ status: 'ready', serviceType: input.serviceType }))
386
+ },
387
+ }),
388
+ createTool({
389
+ name: 'service_stop',
390
+ description: `Stop a running session service. Available services: ${serviceList}`,
391
+ input: z.object({
392
+ serviceType: z.string().describe('Service type identifier'),
393
+ }),
394
+ execute: async (input) => {
395
+ if (!visibleServiceTypes.includes(input.serviceType)) {
396
+ return Err({ message: `Service not visible: ${input.serviceType}`, recoverable: false })
397
+ }
398
+
399
+ const result = await ctx.self.stop({
400
+ serviceType: input.serviceType,
401
+ })
402
+ if (!result.ok) return Err({ message: result.error.message, recoverable: false })
403
+
404
+ return Ok(JSON.stringify({ status: 'stopping', serviceType: input.serviceType }))
405
+ },
406
+ }),
407
+ createTool({
408
+ name: 'service_restart',
409
+ description: `Restart a session service (stop + start). Available services: ${serviceList}`,
410
+ input: z.object({
411
+ serviceType: z.string().describe('Service type identifier'),
412
+ }),
413
+ execute: async (input) => {
414
+ if (!visibleServiceTypes.includes(input.serviceType)) {
415
+ return Err({ message: `Service not visible: ${input.serviceType}`, recoverable: false })
416
+ }
417
+
418
+ const result = await ctx.self.restart({
419
+ serviceType: input.serviceType,
420
+ })
421
+ if (!result.ok) return Err({ message: result.error.message, recoverable: false })
422
+
423
+ const readyResult = await ctx.pluginContext.executor.waitForReady(input.serviceType)
424
+ if (!readyResult.ok) return Err(readyResult.error)
425
+
426
+ return Ok(JSON.stringify({ status: 'ready', serviceType: input.serviceType }))
427
+ },
428
+ }),
429
+ createTool({
430
+ name: 'service_status',
431
+ description:
432
+ `Get the status of a session service including port, error, and recent log lines. Only call this to troubleshoot issues — if the session context already shows the service as "ready", you do not need to check status. Available services: ${serviceList}`,
433
+ input: z.object({
434
+ serviceType: z.string().describe('Service type identifier'),
435
+ logLines: z.number().int().min(1).max(200).optional().describe('Number of recent log lines to include (default: 10)'),
436
+ }),
437
+ execute: async (input) => {
438
+ if (!visibleServiceTypes.includes(input.serviceType)) {
439
+ return Err({ message: `Service not visible: ${input.serviceType}`, recoverable: false })
440
+ }
441
+
442
+ const result = await ctx.self.status({
443
+ serviceType: input.serviceType,
444
+ logLines: input.logLines,
445
+ })
446
+ if (!result.ok) return Err({ message: result.error.message, recoverable: false })
447
+
448
+ return Ok(JSON.stringify(result.value))
449
+ },
450
+ }),
451
+ createTool({
452
+ name: 'service_logs',
453
+ description: `Get recent log output from a session service. Available services: ${serviceList}`,
454
+ input: z.object({
455
+ serviceType: z.string().describe('Service type identifier'),
456
+ lines: z.number().int().min(1).max(200).optional().describe('Number of log lines to return (default: 50)'),
457
+ }),
458
+ execute: async (input) => {
459
+ if (!visibleServiceTypes.includes(input.serviceType)) {
460
+ return Err({ message: `Service not visible: ${input.serviceType}`, recoverable: false })
461
+ }
462
+
463
+ const result = await ctx.self.logs({
464
+ serviceType: input.serviceType,
465
+ lines: input.lines,
466
+ })
467
+ if (!result.ok) return Err({ message: result.error.message, recoverable: false })
468
+
469
+ return Ok(JSON.stringify(result.value))
470
+ },
471
+ }),
472
+ ]
473
+ })
474
+ .status((ctx) => {
475
+ const serviceMap = new Map(ctx.pluginConfig.services.map((svc) => [svc.type, svc]))
476
+ const visibleServices = ctx.pluginAgentConfig?.services ?? []
477
+ const visibleServiceTypes = visibleServices.filter((t) => serviceMap.has(t))
478
+ if (visibleServiceTypes.length === 0) return null
479
+
480
+ const services = Array.from(ctx.pluginState.values()).filter((s) => visibleServiceTypes.includes(s.serviceType))
481
+ const configs = Array.from(serviceMap.values()).filter((c) => visibleServiceTypes.includes(c.type))
482
+
483
+ return buildServiceStatusMessage(services, configs)
484
+ })
485
+ .build()
@@ -0,0 +1,73 @@
1
+ /**
2
+ * PortPool - Manages port allocation from a global range.
3
+ *
4
+ * Ports are assigned from the upper registered range (10000–49151) to avoid
5
+ * common dev server defaults and OS ephemeral ports. Allocation is random
6
+ * to minimize predictable conflicts across sessions.
7
+ */
8
+
9
+ export class PortPool {
10
+ private readonly allocated = new Set<number>()
11
+
12
+ constructor(
13
+ private readonly minPort = 10000,
14
+ private readonly maxPort = 49151,
15
+ ) {}
16
+
17
+ /**
18
+ * Try to allocate a specific (preferred) port.
19
+ * Returns true if the port was available and is now allocated.
20
+ */
21
+ tryAllocate(port: number): boolean {
22
+ if (port < this.minPort || port > this.maxPort) return false
23
+ if (this.allocated.has(port)) return false
24
+ this.allocated.add(port)
25
+ return true
26
+ }
27
+
28
+ /**
29
+ * Allocate a random available port from the range.
30
+ * Returns null if the pool is exhausted (practically impossible).
31
+ */
32
+ allocate(): number | null {
33
+ const range = this.maxPort - this.minPort + 1
34
+ if (this.allocated.size >= range) return null
35
+
36
+ // Random probe — fast for sparse pools
37
+ const maxAttempts = 100
38
+ for (let i = 0; i < maxAttempts; i++) {
39
+ const port = this.minPort + Math.floor(Math.random() * range)
40
+ if (!this.allocated.has(port)) {
41
+ this.allocated.add(port)
42
+ return port
43
+ }
44
+ }
45
+
46
+ // Fallback: linear scan (only if pool is very dense)
47
+ for (let port = this.minPort; port <= this.maxPort; port++) {
48
+ if (!this.allocated.has(port)) {
49
+ this.allocated.add(port)
50
+ return port
51
+ }
52
+ }
53
+
54
+ return null
55
+ }
56
+
57
+ /**
58
+ * Allocate preferred port if available, otherwise allocate a random port.
59
+ */
60
+ allocatePreferred(preferred: number | undefined): number | null {
61
+ if (preferred !== undefined && this.tryAllocate(preferred)) {
62
+ return preferred
63
+ }
64
+ return this.allocate()
65
+ }
66
+
67
+ /**
68
+ * Release a previously allocated port back to the pool.
69
+ */
70
+ release(port: number): void {
71
+ this.allocated.delete(port)
72
+ }
73
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Service Status Prompt Builder
3
+ *
4
+ * Builds a system message section describing the current state
5
+ * of session services for injection into agent context.
6
+ */
7
+
8
+ import type { ServiceConfig, ServiceEntry } from '~/plugins/services/schema.js'
9
+
10
+ /**
11
+ * Build a service status message for agent context.
12
+ * Returns null if there are no services to show.
13
+ */
14
+ export function buildServiceStatusMessage(
15
+ services: ServiceEntry[],
16
+ configs: ServiceConfig[],
17
+ ): string | null {
18
+ if (services.length === 0 && configs.length === 0) return null
19
+
20
+ const configMap = new Map(configs.map((c) => [c.type, c]))
21
+ const lines: string[] = [
22
+ '## Session Services',
23
+ '',
24
+ ]
25
+
26
+ // Show all configured services (with runtime status if available)
27
+ const serviceMap = new Map(services.map((s) => [s.serviceType, s]))
28
+
29
+ for (const config of configs) {
30
+ const entry = serviceMap.get(config.type)
31
+ const status = entry?.status ?? 'stopped'
32
+ let line = `- ${config.type}: ${config.description} — ${status}`
33
+
34
+ if (
35
+ entry?.port !== undefined
36
+ && entry.status !== 'stopped'
37
+ && entry.status !== 'failed'
38
+ && entry.status !== 'paused'
39
+ ) {
40
+ line += ` (port ${entry.port})`
41
+ }
42
+ if (entry?.error) {
43
+ line += ` (error: ${entry.error})`
44
+ }
45
+
46
+ lines.push(line)
47
+ }
48
+
49
+ lines.push('')
50
+ lines.push('Use service tools (service_start, service_stop, service_restart, service_status, service_logs) to manage these services.')
51
+
52
+ return lines.join('\n')
53
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Service domain types
3
+ *
4
+ * Services are session-scoped background processes (e.g., dev servers)
5
+ * that agents can observe and control. Unlike workers, services are
6
+ * long-running, one instance per type, and shared across agents.
7
+ */
8
+
9
+ // ============================================================================
10
+ // Service Status
11
+ // ============================================================================
12
+
13
+ /**
14
+ * Service lifecycle status.
15
+ */
16
+ export type ServiceStatus = 'stopped' | 'starting' | 'ready' | 'stopping' | 'failed' | 'paused'
17
+
18
+ // ============================================================================
19
+ // Service Config (declared in presets)
20
+ // ============================================================================
21
+
22
+ /**
23
+ * Arguments passed to command callback for dynamic command construction.
24
+ */
25
+ export interface ServiceCommandArgs {
26
+ port: number
27
+ }
28
+
29
+ /**
30
+ * Service configuration declared inline in presets.
31
+ * Defines how to spawn and monitor a background process.
32
+ */
33
+ export interface ServiceConfig {
34
+ /** Unique service type within preset, e.g. 'astro-dev' */
35
+ type: string
36
+ /** Human-readable description */
37
+ description: string
38
+ /** Shell command to run, or a callback receiving allocated port */
39
+ command: string | ((args: ServiceCommandArgs) => string)
40
+ /** Working directory (defaults to workspace dir) */
41
+ cwd?: string
42
+ /** Additional environment variables */
43
+ env?: Record<string, string>
44
+ /** Start automatically with session (default: false) */
45
+ autoStart?: boolean
46
+ /** Regex pattern to detect "ready" in stdout */
47
+ readyPattern?: string
48
+ /** SIGTERM→SIGKILL timeout in ms (default: 5000) */
49
+ gracefulStopMs?: number
50
+ /** Ring buffer size for log lines (default: 200) */
51
+ logBufferSize?: number
52
+ /** Startup timeout in ms — service marked as failed if not ready within this time (default: 30000) */
53
+ startupTimeoutMs?: number
54
+ /** Auto-pause configuration (interface prepared, not yet implemented) */
55
+ autoPause?: { inactivityMs: number }
56
+ }
57
+
58
+ // ============================================================================
59
+ // Service Entry (in SessionState)
60
+ // ============================================================================
61
+
62
+ /**
63
+ * Service entry tracked in session state.
64
+ * Updated via service_status_changed events.
65
+ */
66
+ export interface ServiceEntry {
67
+ serviceType: string
68
+ status: ServiceStatus
69
+ port?: number
70
+ error?: string
71
+ startedAt?: number
72
+ readyAt?: number
73
+ stoppedAt?: number
74
+ /** Process group PID (tracked for orphan cleanup after restart) */
75
+ pid?: number
76
+ /**
77
+ * Process start time in clock ticks since boot, read from /proc/<pid>/stat field 22.
78
+ * Used to detect PID reuse during orphan reconcile: before SIGKILL, we re-read the
79
+ * current start time and compare — mismatch means the PID was recycled by an
80
+ * unrelated process and must NOT be killed. Linux-only; undefined on macOS/Windows.
81
+ */
82
+ pidStartTime?: number
83
+ }