siclaw 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 (460) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +268 -0
  3. package/dist/agentbox/gateway-client.d.ts +41 -0
  4. package/dist/agentbox/gateway-client.js +108 -0
  5. package/dist/agentbox/gateway-client.js.map +1 -0
  6. package/dist/agentbox/http-server.d.ts +12 -0
  7. package/dist/agentbox/http-server.js +700 -0
  8. package/dist/agentbox/http-server.js.map +1 -0
  9. package/dist/agentbox/mcp-sync.d.ts +6 -0
  10. package/dist/agentbox/mcp-sync.js +26 -0
  11. package/dist/agentbox/mcp-sync.js.map +1 -0
  12. package/dist/agentbox/resource-handlers.d.ts +40 -0
  13. package/dist/agentbox/resource-handlers.js +116 -0
  14. package/dist/agentbox/resource-handlers.js.map +1 -0
  15. package/dist/agentbox/resource-sync.d.ts +28 -0
  16. package/dist/agentbox/resource-sync.js +74 -0
  17. package/dist/agentbox/resource-sync.js.map +1 -0
  18. package/dist/agentbox/session.d.ts +145 -0
  19. package/dist/agentbox/session.js +444 -0
  20. package/dist/agentbox/session.js.map +1 -0
  21. package/dist/agentbox-main.d.ts +7 -0
  22. package/dist/agentbox-main.js +90 -0
  23. package/dist/agentbox-main.js.map +1 -0
  24. package/dist/cli-main.d.ts +1 -0
  25. package/dist/cli-main.js +187 -0
  26. package/dist/cli-main.js.map +1 -0
  27. package/dist/cli-setup.d.ts +17 -0
  28. package/dist/cli-setup.js +247 -0
  29. package/dist/cli-setup.js.map +1 -0
  30. package/dist/core/agent-factory.d.ts +52 -0
  31. package/dist/core/agent-factory.js +547 -0
  32. package/dist/core/agent-factory.js.map +1 -0
  33. package/dist/core/brain-session.d.ts +67 -0
  34. package/dist/core/brain-session.js +15 -0
  35. package/dist/core/brain-session.js.map +1 -0
  36. package/dist/core/brains/claude-sdk-brain.d.ts +76 -0
  37. package/dist/core/brains/claude-sdk-brain.js +403 -0
  38. package/dist/core/brains/claude-sdk-brain.js.map +1 -0
  39. package/dist/core/brains/pi-agent-brain.d.ts +28 -0
  40. package/dist/core/brains/pi-agent-brain.js +84 -0
  41. package/dist/core/brains/pi-agent-brain.js.map +1 -0
  42. package/dist/core/config.d.ts +109 -0
  43. package/dist/core/config.js +294 -0
  44. package/dist/core/config.js.map +1 -0
  45. package/dist/core/extensions/context-pruning.d.ts +38 -0
  46. package/dist/core/extensions/context-pruning.js +162 -0
  47. package/dist/core/extensions/context-pruning.js.map +1 -0
  48. package/dist/core/extensions/deep-investigation.d.ts +2 -0
  49. package/dist/core/extensions/deep-investigation.js +541 -0
  50. package/dist/core/extensions/deep-investigation.js.map +1 -0
  51. package/dist/core/extensions/memory-flush.d.ts +20 -0
  52. package/dist/core/extensions/memory-flush.js +120 -0
  53. package/dist/core/extensions/memory-flush.js.map +1 -0
  54. package/dist/core/llm-proxy.d.ts +37 -0
  55. package/dist/core/llm-proxy.js +578 -0
  56. package/dist/core/llm-proxy.js.map +1 -0
  57. package/dist/core/mcp-client.d.ts +80 -0
  58. package/dist/core/mcp-client.js +285 -0
  59. package/dist/core/mcp-client.js.map +1 -0
  60. package/dist/core/prompt.d.ts +1 -0
  61. package/dist/core/prompt.js +64 -0
  62. package/dist/core/prompt.js.map +1 -0
  63. package/dist/core/tool-adapter.d.ts +45 -0
  64. package/dist/core/tool-adapter.js +154 -0
  65. package/dist/core/tool-adapter.js.map +1 -0
  66. package/dist/cron/cron-api.d.ts +9 -0
  67. package/dist/cron/cron-api.js +94 -0
  68. package/dist/cron/cron-api.js.map +1 -0
  69. package/dist/cron/cron-coordinator.d.ts +29 -0
  70. package/dist/cron/cron-coordinator.js +150 -0
  71. package/dist/cron/cron-coordinator.js.map +1 -0
  72. package/dist/cron/cron-executor.d.ts +15 -0
  73. package/dist/cron/cron-executor.js +90 -0
  74. package/dist/cron/cron-executor.js.map +1 -0
  75. package/dist/cron/cron-matcher.d.ts +19 -0
  76. package/dist/cron/cron-matcher.js +114 -0
  77. package/dist/cron/cron-matcher.js.map +1 -0
  78. package/dist/cron/cron-scheduler.d.ts +42 -0
  79. package/dist/cron/cron-scheduler.js +91 -0
  80. package/dist/cron/cron-scheduler.js.map +1 -0
  81. package/dist/cron/gateway-client.d.ts +32 -0
  82. package/dist/cron/gateway-client.js +91 -0
  83. package/dist/cron/gateway-client.js.map +1 -0
  84. package/dist/cron-main.d.ts +10 -0
  85. package/dist/cron-main.js +75 -0
  86. package/dist/cron-main.js.map +1 -0
  87. package/dist/gateway/agentbox/client.d.ts +187 -0
  88. package/dist/gateway/agentbox/client.js +314 -0
  89. package/dist/gateway/agentbox/client.js.map +1 -0
  90. package/dist/gateway/agentbox/index.d.ts +10 -0
  91. package/dist/gateway/agentbox/index.js +11 -0
  92. package/dist/gateway/agentbox/index.js.map +1 -0
  93. package/dist/gateway/agentbox/k8s-spawner.d.ts +70 -0
  94. package/dist/gateway/agentbox/k8s-spawner.js +466 -0
  95. package/dist/gateway/agentbox/k8s-spawner.js.map +1 -0
  96. package/dist/gateway/agentbox/local-spawner.d.ts +63 -0
  97. package/dist/gateway/agentbox/local-spawner.js +234 -0
  98. package/dist/gateway/agentbox/local-spawner.js.map +1 -0
  99. package/dist/gateway/agentbox/manager.d.ts +121 -0
  100. package/dist/gateway/agentbox/manager.js +325 -0
  101. package/dist/gateway/agentbox/manager.js.map +1 -0
  102. package/dist/gateway/agentbox/process-spawner.d.ts +21 -0
  103. package/dist/gateway/agentbox/process-spawner.js +168 -0
  104. package/dist/gateway/agentbox/process-spawner.js.map +1 -0
  105. package/dist/gateway/agentbox/spawner.d.ts +33 -0
  106. package/dist/gateway/agentbox/spawner.js +10 -0
  107. package/dist/gateway/agentbox/spawner.js.map +1 -0
  108. package/dist/gateway/agentbox/types.d.ts +39 -0
  109. package/dist/gateway/agentbox/types.js +5 -0
  110. package/dist/gateway/agentbox/types.js.map +1 -0
  111. package/dist/gateway/auth/bind-code-store.d.ts +31 -0
  112. package/dist/gateway/auth/bind-code-store.js +73 -0
  113. package/dist/gateway/auth/bind-code-store.js.map +1 -0
  114. package/dist/gateway/auth/index.d.ts +9 -0
  115. package/dist/gateway/auth/index.js +10 -0
  116. package/dist/gateway/auth/index.js.map +1 -0
  117. package/dist/gateway/auth/jwt.d.ts +23 -0
  118. package/dist/gateway/auth/jwt.js +82 -0
  119. package/dist/gateway/auth/jwt.js.map +1 -0
  120. package/dist/gateway/auth/login.d.ts +26 -0
  121. package/dist/gateway/auth/login.js +74 -0
  122. package/dist/gateway/auth/login.js.map +1 -0
  123. package/dist/gateway/auth/middleware.d.ts +23 -0
  124. package/dist/gateway/auth/middleware.js +67 -0
  125. package/dist/gateway/auth/middleware.js.map +1 -0
  126. package/dist/gateway/auth/oauth2.d.ts +57 -0
  127. package/dist/gateway/auth/oauth2.js +113 -0
  128. package/dist/gateway/auth/oauth2.js.map +1 -0
  129. package/dist/gateway/auth/user-store.d.ts +95 -0
  130. package/dist/gateway/auth/user-store.js +291 -0
  131. package/dist/gateway/auth/user-store.js.map +1 -0
  132. package/dist/gateway/channels/channel-manager.d.ts +42 -0
  133. package/dist/gateway/channels/channel-manager.js +156 -0
  134. package/dist/gateway/channels/channel-manager.js.map +1 -0
  135. package/dist/gateway/channels/channel-rpc.d.ts +9 -0
  136. package/dist/gateway/channels/channel-rpc.js +104 -0
  137. package/dist/gateway/channels/channel-rpc.js.map +1 -0
  138. package/dist/gateway/channels/channel-store.d.ts +32 -0
  139. package/dist/gateway/channels/channel-store.js +114 -0
  140. package/dist/gateway/channels/channel-store.js.map +1 -0
  141. package/dist/gateway/channels/discord.d.ts +5 -0
  142. package/dist/gateway/channels/discord.js +177 -0
  143. package/dist/gateway/channels/discord.js.map +1 -0
  144. package/dist/gateway/channels/lark-format.d.ts +41 -0
  145. package/dist/gateway/channels/lark-format.js +620 -0
  146. package/dist/gateway/channels/lark-format.js.map +1 -0
  147. package/dist/gateway/channels/lark.d.ts +5 -0
  148. package/dist/gateway/channels/lark.js +1000 -0
  149. package/dist/gateway/channels/lark.js.map +1 -0
  150. package/dist/gateway/channels/slack.d.ts +5 -0
  151. package/dist/gateway/channels/slack.js +170 -0
  152. package/dist/gateway/channels/slack.js.map +1 -0
  153. package/dist/gateway/channels/telegram.d.ts +5 -0
  154. package/dist/gateway/channels/telegram.js +173 -0
  155. package/dist/gateway/channels/telegram.js.map +1 -0
  156. package/dist/gateway/channels/utils.d.ts +34 -0
  157. package/dist/gateway/channels/utils.js +115 -0
  158. package/dist/gateway/channels/utils.js.map +1 -0
  159. package/dist/gateway/config.d.ts +14 -0
  160. package/dist/gateway/config.js +12 -0
  161. package/dist/gateway/config.js.map +1 -0
  162. package/dist/gateway/cron/notify.d.ts +14 -0
  163. package/dist/gateway/cron/notify.js +40 -0
  164. package/dist/gateway/cron/notify.js.map +1 -0
  165. package/dist/gateway/db/dialect-helpers.d.ts +8 -0
  166. package/dist/gateway/db/dialect-helpers.js +26 -0
  167. package/dist/gateway/db/dialect-helpers.js.map +1 -0
  168. package/dist/gateway/db/index.d.ts +20 -0
  169. package/dist/gateway/db/index.js +140 -0
  170. package/dist/gateway/db/index.js.map +1 -0
  171. package/dist/gateway/db/init-schema.d.ts +8 -0
  172. package/dist/gateway/db/init-schema.js +385 -0
  173. package/dist/gateway/db/init-schema.js.map +1 -0
  174. package/dist/gateway/db/migrate-sqlite.d.ts +8 -0
  175. package/dist/gateway/db/migrate-sqlite.js +335 -0
  176. package/dist/gateway/db/migrate-sqlite.js.map +1 -0
  177. package/dist/gateway/db/repositories/chat-repo.d.ts +64 -0
  178. package/dist/gateway/db/repositories/chat-repo.js +115 -0
  179. package/dist/gateway/db/repositories/chat-repo.js.map +1 -0
  180. package/dist/gateway/db/repositories/config-repo.d.ts +164 -0
  181. package/dist/gateway/db/repositories/config-repo.js +267 -0
  182. package/dist/gateway/db/repositories/config-repo.js.map +1 -0
  183. package/dist/gateway/db/repositories/credential-repo.d.ts +51 -0
  184. package/dist/gateway/db/repositories/credential-repo.js +70 -0
  185. package/dist/gateway/db/repositories/credential-repo.js.map +1 -0
  186. package/dist/gateway/db/repositories/env-repo.d.ts +37 -0
  187. package/dist/gateway/db/repositories/env-repo.js +74 -0
  188. package/dist/gateway/db/repositories/env-repo.js.map +1 -0
  189. package/dist/gateway/db/repositories/mcp-server-repo.d.ts +97 -0
  190. package/dist/gateway/db/repositories/mcp-server-repo.js +83 -0
  191. package/dist/gateway/db/repositories/mcp-server-repo.js.map +1 -0
  192. package/dist/gateway/db/repositories/model-config-repo.d.ts +141 -0
  193. package/dist/gateway/db/repositories/model-config-repo.js +439 -0
  194. package/dist/gateway/db/repositories/model-config-repo.js.map +1 -0
  195. package/dist/gateway/db/repositories/notification-repo.d.ts +50 -0
  196. package/dist/gateway/db/repositories/notification-repo.js +105 -0
  197. package/dist/gateway/db/repositories/notification-repo.js.map +1 -0
  198. package/dist/gateway/db/repositories/permission-repo.d.ts +28 -0
  199. package/dist/gateway/db/repositories/permission-repo.js +74 -0
  200. package/dist/gateway/db/repositories/permission-repo.js.map +1 -0
  201. package/dist/gateway/db/repositories/skill-content-repo.d.ts +29 -0
  202. package/dist/gateway/db/repositories/skill-content-repo.js +90 -0
  203. package/dist/gateway/db/repositories/skill-content-repo.js.map +1 -0
  204. package/dist/gateway/db/repositories/skill-repo.d.ts +170 -0
  205. package/dist/gateway/db/repositories/skill-repo.js +185 -0
  206. package/dist/gateway/db/repositories/skill-repo.js.map +1 -0
  207. package/dist/gateway/db/repositories/skill-review-repo.d.ts +44 -0
  208. package/dist/gateway/db/repositories/skill-review-repo.js +44 -0
  209. package/dist/gateway/db/repositories/skill-review-repo.js.map +1 -0
  210. package/dist/gateway/db/repositories/skill-version-repo.d.ts +30 -0
  211. package/dist/gateway/db/repositories/skill-version-repo.js +56 -0
  212. package/dist/gateway/db/repositories/skill-version-repo.js.map +1 -0
  213. package/dist/gateway/db/repositories/system-config-repo.d.ts +21 -0
  214. package/dist/gateway/db/repositories/system-config-repo.js +86 -0
  215. package/dist/gateway/db/repositories/system-config-repo.js.map +1 -0
  216. package/dist/gateway/db/repositories/user-env-config-repo.d.ts +32 -0
  217. package/dist/gateway/db/repositories/user-env-config-repo.js +79 -0
  218. package/dist/gateway/db/repositories/user-env-config-repo.js.map +1 -0
  219. package/dist/gateway/db/repositories/user-repo.d.ts +59 -0
  220. package/dist/gateway/db/repositories/user-repo.js +83 -0
  221. package/dist/gateway/db/repositories/user-repo.js.map +1 -0
  222. package/dist/gateway/db/repositories/vote-repo.d.ts +26 -0
  223. package/dist/gateway/db/repositories/vote-repo.js +97 -0
  224. package/dist/gateway/db/repositories/vote-repo.js.map +1 -0
  225. package/dist/gateway/db/repositories/workspace-repo.d.ts +27 -0
  226. package/dist/gateway/db/repositories/workspace-repo.js +145 -0
  227. package/dist/gateway/db/repositories/workspace-repo.js.map +1 -0
  228. package/dist/gateway/db/schema-mysql.d.ts +3897 -0
  229. package/dist/gateway/db/schema-mysql.js +354 -0
  230. package/dist/gateway/db/schema-mysql.js.map +1 -0
  231. package/dist/gateway/db/schema-sqlite.d.ts +4147 -0
  232. package/dist/gateway/db/schema-sqlite.js +345 -0
  233. package/dist/gateway/db/schema-sqlite.js.map +1 -0
  234. package/dist/gateway/db/schema.d.ts +3869 -0
  235. package/dist/gateway/db/schema.js +16 -0
  236. package/dist/gateway/db/schema.js.map +1 -0
  237. package/dist/gateway/mcp-config-builder.d.ts +8 -0
  238. package/dist/gateway/mcp-config-builder.js +39 -0
  239. package/dist/gateway/mcp-config-builder.js.map +1 -0
  240. package/dist/gateway/output-redactor.d.ts +27 -0
  241. package/dist/gateway/output-redactor.js +101 -0
  242. package/dist/gateway/output-redactor.js.map +1 -0
  243. package/dist/gateway/plugins/api.d.ts +181 -0
  244. package/dist/gateway/plugins/api.js +28 -0
  245. package/dist/gateway/plugins/api.js.map +1 -0
  246. package/dist/gateway/plugins/channel-bridge.d.ts +72 -0
  247. package/dist/gateway/plugins/channel-bridge.js +586 -0
  248. package/dist/gateway/plugins/channel-bridge.js.map +1 -0
  249. package/dist/gateway/plugins/loader.d.ts +2 -0
  250. package/dist/gateway/plugins/loader.js +83 -0
  251. package/dist/gateway/plugins/loader.js.map +1 -0
  252. package/dist/gateway/plugins/runtime.d.ts +25 -0
  253. package/dist/gateway/plugins/runtime.js +64 -0
  254. package/dist/gateway/plugins/runtime.js.map +1 -0
  255. package/dist/gateway/resource-notifier.d.ts +36 -0
  256. package/dist/gateway/resource-notifier.js +123 -0
  257. package/dist/gateway/resource-notifier.js.map +1 -0
  258. package/dist/gateway/rpc-methods.d.ts +34 -0
  259. package/dist/gateway/rpc-methods.js +3198 -0
  260. package/dist/gateway/rpc-methods.js.map +1 -0
  261. package/dist/gateway/security/cert-manager.d.ts +77 -0
  262. package/dist/gateway/security/cert-manager.js +280 -0
  263. package/dist/gateway/security/cert-manager.js.map +1 -0
  264. package/dist/gateway/security/mtls-middleware.d.ts +33 -0
  265. package/dist/gateway/security/mtls-middleware.js +89 -0
  266. package/dist/gateway/security/mtls-middleware.js.map +1 -0
  267. package/dist/gateway/server.d.ts +54 -0
  268. package/dist/gateway/server.js +1146 -0
  269. package/dist/gateway/server.js.map +1 -0
  270. package/dist/gateway/skill-labels.d.ts +16 -0
  271. package/dist/gateway/skill-labels.js +79 -0
  272. package/dist/gateway/skill-labels.js.map +1 -0
  273. package/dist/gateway/skills/file-writer.d.ts +75 -0
  274. package/dist/gateway/skills/file-writer.js +320 -0
  275. package/dist/gateway/skills/file-writer.js.map +1 -0
  276. package/dist/gateway/skills/script-evaluator.d.ts +42 -0
  277. package/dist/gateway/skills/script-evaluator.js +204 -0
  278. package/dist/gateway/skills/script-evaluator.js.map +1 -0
  279. package/dist/gateway/skills/skill-bundle.d.ts +34 -0
  280. package/dist/gateway/skills/skill-bundle.js +83 -0
  281. package/dist/gateway/skills/skill-bundle.js.map +1 -0
  282. package/dist/gateway/web/dist/assets/index-BF6CtvnV.css +1 -0
  283. package/dist/gateway/web/dist/assets/index-Dumzqsr-.js +680 -0
  284. package/dist/gateway/web/dist/assets/index-n4IMHP1Q.js +675 -0
  285. package/dist/gateway/web/dist/index.html +14 -0
  286. package/dist/gateway/web/dist/noise.png +1 -0
  287. package/dist/gateway/web/dist/robots.txt +2 -0
  288. package/dist/gateway/web/dist/vite.svg +1 -0
  289. package/dist/gateway/ws-protocol.d.ts +68 -0
  290. package/dist/gateway/ws-protocol.js +106 -0
  291. package/dist/gateway/ws-protocol.js.map +1 -0
  292. package/dist/gateway-main.d.ts +1 -0
  293. package/dist/gateway-main.js +129 -0
  294. package/dist/gateway-main.js.map +1 -0
  295. package/dist/lib/s3-backup.d.ts +28 -0
  296. package/dist/lib/s3-backup.js +85 -0
  297. package/dist/lib/s3-backup.js.map +1 -0
  298. package/dist/lib/s3-storage.d.ts +45 -0
  299. package/dist/lib/s3-storage.js +210 -0
  300. package/dist/lib/s3-storage.js.map +1 -0
  301. package/dist/memory/chunker.d.ts +15 -0
  302. package/dist/memory/chunker.js +94 -0
  303. package/dist/memory/chunker.js.map +1 -0
  304. package/dist/memory/embeddings.d.ts +14 -0
  305. package/dist/memory/embeddings.js +143 -0
  306. package/dist/memory/embeddings.js.map +1 -0
  307. package/dist/memory/index.d.ts +18 -0
  308. package/dist/memory/index.js +15 -0
  309. package/dist/memory/index.js.map +1 -0
  310. package/dist/memory/indexer.d.ts +70 -0
  311. package/dist/memory/indexer.js +567 -0
  312. package/dist/memory/indexer.js.map +1 -0
  313. package/dist/memory/mmr.d.ts +22 -0
  314. package/dist/memory/mmr.js +82 -0
  315. package/dist/memory/mmr.js.map +1 -0
  316. package/dist/memory/schema.d.ts +2 -0
  317. package/dist/memory/schema.js +85 -0
  318. package/dist/memory/schema.js.map +1 -0
  319. package/dist/memory/session-summarizer.d.ts +19 -0
  320. package/dist/memory/session-summarizer.js +139 -0
  321. package/dist/memory/session-summarizer.js.map +1 -0
  322. package/dist/memory/stop-words.d.ts +13 -0
  323. package/dist/memory/stop-words.js +132 -0
  324. package/dist/memory/stop-words.js.map +1 -0
  325. package/dist/memory/temporal-decay.d.ts +20 -0
  326. package/dist/memory/temporal-decay.js +63 -0
  327. package/dist/memory/temporal-decay.js.map +1 -0
  328. package/dist/memory/types.d.ts +40 -0
  329. package/dist/memory/types.js +2 -0
  330. package/dist/memory/types.js.map +1 -0
  331. package/dist/shared/resource-sync.d.ts +80 -0
  332. package/dist/shared/resource-sync.js +24 -0
  333. package/dist/shared/resource-sync.js.map +1 -0
  334. package/dist/tools/command-sets.d.ts +61 -0
  335. package/dist/tools/command-sets.js +845 -0
  336. package/dist/tools/command-sets.js.map +1 -0
  337. package/dist/tools/create-skill.d.ts +2 -0
  338. package/dist/tools/create-skill.js +169 -0
  339. package/dist/tools/create-skill.js.map +1 -0
  340. package/dist/tools/credential-list.d.ts +8 -0
  341. package/dist/tools/credential-list.js +139 -0
  342. package/dist/tools/credential-list.js.map +1 -0
  343. package/dist/tools/deep-search/engine.d.ts +40 -0
  344. package/dist/tools/deep-search/engine.js +594 -0
  345. package/dist/tools/deep-search/engine.js.map +1 -0
  346. package/dist/tools/deep-search/events.d.ts +11 -0
  347. package/dist/tools/deep-search/events.js +10 -0
  348. package/dist/tools/deep-search/events.js.map +1 -0
  349. package/dist/tools/deep-search/format.d.ts +11 -0
  350. package/dist/tools/deep-search/format.js +143 -0
  351. package/dist/tools/deep-search/format.js.map +1 -0
  352. package/dist/tools/deep-search/prompts.d.ts +30 -0
  353. package/dist/tools/deep-search/prompts.js +237 -0
  354. package/dist/tools/deep-search/prompts.js.map +1 -0
  355. package/dist/tools/deep-search/sre-knowledge.d.ts +21 -0
  356. package/dist/tools/deep-search/sre-knowledge.js +112 -0
  357. package/dist/tools/deep-search/sre-knowledge.js.map +1 -0
  358. package/dist/tools/deep-search/sub-agent.d.ts +71 -0
  359. package/dist/tools/deep-search/sub-agent.js +401 -0
  360. package/dist/tools/deep-search/sub-agent.js.map +1 -0
  361. package/dist/tools/deep-search/tool.d.ts +9 -0
  362. package/dist/tools/deep-search/tool.js +201 -0
  363. package/dist/tools/deep-search/tool.js.map +1 -0
  364. package/dist/tools/deep-search/types.d.ts +67 -0
  365. package/dist/tools/deep-search/types.js +41 -0
  366. package/dist/tools/deep-search/types.js.map +1 -0
  367. package/dist/tools/dp-tools.d.ts +47 -0
  368. package/dist/tools/dp-tools.js +170 -0
  369. package/dist/tools/dp-tools.js.map +1 -0
  370. package/dist/tools/fork-skill.d.ts +2 -0
  371. package/dist/tools/fork-skill.js +93 -0
  372. package/dist/tools/fork-skill.js.map +1 -0
  373. package/dist/tools/k8s-checks.d.ts +18 -0
  374. package/dist/tools/k8s-checks.js +105 -0
  375. package/dist/tools/k8s-checks.js.map +1 -0
  376. package/dist/tools/kubeconfig-resolver.d.ts +11 -0
  377. package/dist/tools/kubeconfig-resolver.js +53 -0
  378. package/dist/tools/kubeconfig-resolver.js.map +1 -0
  379. package/dist/tools/kubectl.d.ts +12 -0
  380. package/dist/tools/kubectl.js +169 -0
  381. package/dist/tools/kubectl.js.map +1 -0
  382. package/dist/tools/manage-schedule.d.ts +3 -0
  383. package/dist/tools/manage-schedule.js +189 -0
  384. package/dist/tools/manage-schedule.js.map +1 -0
  385. package/dist/tools/memory-get.d.ts +2 -0
  386. package/dist/tools/memory-get.js +99 -0
  387. package/dist/tools/memory-get.js.map +1 -0
  388. package/dist/tools/memory-search.d.ts +3 -0
  389. package/dist/tools/memory-search.js +93 -0
  390. package/dist/tools/memory-search.js.map +1 -0
  391. package/dist/tools/netns-script.d.ts +3 -0
  392. package/dist/tools/netns-script.js +394 -0
  393. package/dist/tools/netns-script.js.map +1 -0
  394. package/dist/tools/node-exec.d.ts +18 -0
  395. package/dist/tools/node-exec.js +342 -0
  396. package/dist/tools/node-exec.js.map +1 -0
  397. package/dist/tools/node-script.d.ts +3 -0
  398. package/dist/tools/node-script.js +266 -0
  399. package/dist/tools/node-script.js.map +1 -0
  400. package/dist/tools/pod-exec.d.ts +4 -0
  401. package/dist/tools/pod-exec.js +146 -0
  402. package/dist/tools/pod-exec.js.map +1 -0
  403. package/dist/tools/pod-nsenter-exec.d.ts +3 -0
  404. package/dist/tools/pod-nsenter-exec.js +333 -0
  405. package/dist/tools/pod-nsenter-exec.js.map +1 -0
  406. package/dist/tools/pod-script.d.ts +3 -0
  407. package/dist/tools/pod-script.js +176 -0
  408. package/dist/tools/pod-script.js.map +1 -0
  409. package/dist/tools/restricted-bash.d.ts +41 -0
  410. package/dist/tools/restricted-bash.js +503 -0
  411. package/dist/tools/restricted-bash.js.map +1 -0
  412. package/dist/tools/run-skill.d.ts +3 -0
  413. package/dist/tools/run-skill.js +169 -0
  414. package/dist/tools/run-skill.js.map +1 -0
  415. package/dist/tools/sanitize-env.d.ts +14 -0
  416. package/dist/tools/sanitize-env.js +95 -0
  417. package/dist/tools/sanitize-env.js.map +1 -0
  418. package/dist/tools/script-resolver.d.ts +35 -0
  419. package/dist/tools/script-resolver.js +213 -0
  420. package/dist/tools/script-resolver.js.map +1 -0
  421. package/dist/tools/tool-render.d.ts +20 -0
  422. package/dist/tools/tool-render.js +77 -0
  423. package/dist/tools/tool-render.js.map +1 -0
  424. package/dist/tools/update-skill.d.ts +2 -0
  425. package/dist/tools/update-skill.js +169 -0
  426. package/dist/tools/update-skill.js.map +1 -0
  427. package/package.json +106 -0
  428. package/settings.example.json +74 -0
  429. package/siclaw.mjs +48 -0
  430. package/skills/core/cluster-events/SKILL.md +150 -0
  431. package/skills/core/deep-investigation/SKILL.md +87 -0
  432. package/skills/core/deep-investigation/default-memory.md +8 -0
  433. package/skills/core/deployment-rollout-debug/SKILL.md +144 -0
  434. package/skills/core/dns-debug/SKILL.md +144 -0
  435. package/skills/core/find-node/SKILL.md +23 -0
  436. package/skills/core/find-node/scripts/find-node.sh +9 -0
  437. package/skills/core/hpa-debug/SKILL.md +159 -0
  438. package/skills/core/image-pull-debug/SKILL.md +151 -0
  439. package/skills/core/ingress-debug/SKILL.md +189 -0
  440. package/skills/core/job-debug/SKILL.md +180 -0
  441. package/skills/core/meta.json +23 -0
  442. package/skills/core/node-health-check/SKILL.md +150 -0
  443. package/skills/core/node-logs/SKILL.md +68 -0
  444. package/skills/core/node-logs/scripts/get-node-logs.sh +78 -0
  445. package/skills/core/node-ping-gateway/SKILL.md +54 -0
  446. package/skills/core/node-ping-gateway/scripts/ping-node-gateway.sh +71 -0
  447. package/skills/core/node-show-gateway/SKILL.md +55 -0
  448. package/skills/core/node-show-gateway/scripts/show-node-gateway.sh +90 -0
  449. package/skills/core/pod-crash-debug/SKILL.md +135 -0
  450. package/skills/core/pod-pending-debug/SKILL.md +146 -0
  451. package/skills/core/pod-ping-gateway/SKILL.md +44 -0
  452. package/skills/core/pod-ping-gateway/scripts/ping-gateway.sh +76 -0
  453. package/skills/core/pod-show-gateway/SKILL.md +54 -0
  454. package/skills/core/pod-show-gateway/scripts/show-gateway.sh +115 -0
  455. package/skills/core/pvc-debug/SKILL.md +169 -0
  456. package/skills/core/service-debug/SKILL.md +164 -0
  457. package/skills/extension/.gitkeep +0 -0
  458. package/skills/platform/create-skill/SKILL.md +288 -0
  459. package/skills/platform/manage-skill/SKILL.md +23 -0
  460. package/skills/platform/update-skill/SKILL.md +52 -0
@@ -0,0 +1,700 @@
1
+ /**
2
+ * AgentBox HTTP Server
3
+ *
4
+ * Provides HTTP API for Gateway to call, with SSE streaming support.
5
+ */
6
+ import fs from "node:fs";
7
+ import path from "node:path";
8
+ import http from "node:http";
9
+ import https from "node:https";
10
+ import { hasOpenAIProvider, ensureProxy } from "../core/llm-proxy.js";
11
+ import { deepSearchEvents } from "../tools/deep-search/events.js";
12
+ import { createChecklist, buildActivationMessage } from "../tools/dp-tools.js";
13
+ import { loadConfig } from "../core/config.js";
14
+ import { GatewayClient } from "./gateway-client.js";
15
+ import { getResourceHandler } from "./resource-handlers.js";
16
+ import { RESOURCE_DESCRIPTORS } from "../shared/resource-sync.js";
17
+ /**
18
+ * Parse JSON body
19
+ */
20
+ async function parseJsonBody(req) {
21
+ return new Promise((resolve, reject) => {
22
+ let body = "";
23
+ req.on("data", (chunk) => (body += chunk));
24
+ req.on("end", () => {
25
+ try {
26
+ resolve(body ? JSON.parse(body) : {});
27
+ }
28
+ catch (e) {
29
+ reject(new Error("Invalid JSON"));
30
+ }
31
+ });
32
+ req.on("error", reject);
33
+ });
34
+ }
35
+ /**
36
+ * Send JSON response
37
+ */
38
+ function sendJson(res, status, data) {
39
+ res.writeHead(status, { "Content-Type": "application/json" });
40
+ res.end(JSON.stringify(data));
41
+ }
42
+ /**
43
+ * Create HTTP or HTTPS server (auto-detects certificates)
44
+ */
45
+ export function createHttpServer(sessionManager) {
46
+ // Pre-start LLM proxy (fire-and-forget, ready before first prompt)
47
+ if (hasOpenAIProvider()) {
48
+ ensureProxy().catch(err => console.warn("[agentbox] LLM proxy pre-start failed:", err));
49
+ }
50
+ // ── Idle self-destruct: exit when no SSE connections and no sessions for 5 min ──
51
+ const IDLE_TIMEOUT_MS = 5 * 60 * 1000;
52
+ let activeSseCount = 0;
53
+ let idleTimer = null;
54
+ function resetIdleTimer() {
55
+ if (idleTimer) {
56
+ clearTimeout(idleTimer);
57
+ idleTimer = null;
58
+ }
59
+ }
60
+ function checkIdle() {
61
+ if (activeSseCount === 0 && sessionManager.activeCount() === 0) {
62
+ if (idleTimer)
63
+ return; // already scheduled
64
+ idleTimer = setTimeout(() => {
65
+ // Re-check before exiting (new connection may have arrived)
66
+ if (activeSseCount === 0 && sessionManager.activeCount() === 0) {
67
+ console.log("[agentbox] No connections for 5 min, shutting down");
68
+ process.exit(0);
69
+ }
70
+ idleTimer = null;
71
+ }, IDLE_TIMEOUT_MS);
72
+ console.log(`[agentbox] Idle detected, will shut down in ${IDLE_TIMEOUT_MS / 1000}s if no activity`);
73
+ }
74
+ }
75
+ // Start initial idle check (pod may never receive any connections)
76
+ checkIdle();
77
+ // Wire session release → idle check (session released after TTL)
78
+ sessionManager.onSessionRelease = () => checkIdle();
79
+ const routes = [];
80
+ // Route registration helper
81
+ function addRoute(method, path, handler) {
82
+ const paramNames = [];
83
+ const patternStr = path.replace(/:(\w+)/g, (_, name) => {
84
+ paramNames.push(name);
85
+ return "([^/]+)";
86
+ });
87
+ routes.push({
88
+ method,
89
+ pattern: new RegExp(`^${patternStr}$`),
90
+ paramNames,
91
+ handler,
92
+ });
93
+ }
94
+ // ==================== Routes ====================
95
+ /**
96
+ * GET /health - health check
97
+ */
98
+ addRoute("GET", "/health", async (_req, res) => {
99
+ sendJson(res, 200, {
100
+ status: "ok",
101
+ sessions: sessionManager.list().length,
102
+ timestamp: new Date().toISOString(),
103
+ });
104
+ });
105
+ /**
106
+ * GET /api/sessions - list all sessions
107
+ */
108
+ addRoute("GET", "/api/sessions", async (_req, res) => {
109
+ const sessions = sessionManager.list().map((s) => ({
110
+ id: s.id,
111
+ createdAt: s.createdAt.toISOString(),
112
+ lastActiveAt: s.lastActiveAt.toISOString(),
113
+ }));
114
+ sendJson(res, 200, { sessions });
115
+ });
116
+ /**
117
+ * POST /api/prompt - send a message
118
+ *
119
+ * Body: { sessionId?: string, text: string }
120
+ * Response: { ok: true, sessionId: string }
121
+ *
122
+ * The message is sent to the Agent, and responses are returned via SSE stream.
123
+ */
124
+ addRoute("POST", "/api/prompt", async (req, res) => {
125
+ const body = (await parseJsonBody(req));
126
+ if (!body.text) {
127
+ sendJson(res, 400, { error: "Missing 'text' field" });
128
+ return;
129
+ }
130
+ const managed = await sessionManager.getOrCreate(body.sessionId, body.mode, body.brainType);
131
+ // Materialize credential files from payload (sent by gateway in prompt body)
132
+ if (body.credentials?.files?.length) {
133
+ const credDir = path.resolve(process.cwd(), loadConfig().paths.credentialsDir);
134
+ fs.mkdirSync(credDir, { recursive: true });
135
+ // Clear existing files
136
+ for (const entry of fs.readdirSync(credDir)) {
137
+ fs.rmSync(path.join(credDir, entry), { recursive: true });
138
+ }
139
+ // Write credential files
140
+ for (const file of body.credentials.files) {
141
+ fs.writeFileSync(path.join(credDir, file.name), file.content, file.mode ? { mode: file.mode } : undefined);
142
+ }
143
+ // Write manifest
144
+ fs.writeFileSync(path.join(credDir, "manifest.json"), JSON.stringify(body.credentials.manifest, null, 2));
145
+ managed.kubeconfigRef.credentialsDir = credDir;
146
+ console.log(`[agentbox-http] Materialized ${body.credentials.files.length} credential files to ${credDir}`);
147
+ }
148
+ // Dynamically register provider config from gateway DB (before findModel)
149
+ if (body.modelConfig && body.modelProvider && managed.brain.registerProvider) {
150
+ try {
151
+ managed.brain.registerProvider(body.modelProvider, body.modelConfig);
152
+ console.log(`[agentbox-http] Registered provider "${body.modelProvider}" from gateway DB config`);
153
+ // Update LLM config ref so deep_search sub-agents follow the main model
154
+ const mc = body.modelConfig;
155
+ if (mc.baseUrl && mc.apiKey) {
156
+ managed.llmConfigRef.apiKey = mc.apiKey;
157
+ managed.llmConfigRef.baseUrl = mc.baseUrl;
158
+ if (mc.api) {
159
+ managed.llmConfigRef.api = mc.api;
160
+ }
161
+ // Use the specific modelId from the prompt if available
162
+ if (body.modelId) {
163
+ managed.llmConfigRef.model = body.modelId;
164
+ }
165
+ console.log(`[agentbox-http] Updated llmConfigRef: baseUrl=${mc.baseUrl.slice(0, 40)}... model=${managed.llmConfigRef.model}`);
166
+ }
167
+ }
168
+ catch (err) {
169
+ console.warn(`[agentbox-http] Failed to register provider "${body.modelProvider}":`, err instanceof Error ? err.message : err);
170
+ }
171
+ }
172
+ // Set model if specified in prompt request (ensures model is applied before first prompt)
173
+ if (body.modelProvider && body.modelId) {
174
+ const found = managed.brain.findModel(body.modelProvider, body.modelId);
175
+ if (found) {
176
+ const currentModel = managed.brain.getModel();
177
+ if (!currentModel || currentModel.id !== found.id || currentModel.provider !== found.provider) {
178
+ console.log(`[agentbox-http] Setting model for session ${managed.id}: ${found.provider}/${found.id}`);
179
+ await managed.brain.setModel(found);
180
+ }
181
+ }
182
+ }
183
+ // Reset prompt state and start buffering events before async execution
184
+ managed._promptDone = false;
185
+ managed._aborted = false;
186
+ managed._eventBuffer = [];
187
+ // Unsubscribe previous buffer listener if any
188
+ if (managed._bufferUnsub) {
189
+ managed._bufferUnsub();
190
+ }
191
+ // Subscribe to buffer events so SSE can replay them even if it connects late
192
+ const brainUnsub = managed.brain.subscribe((event) => {
193
+ if (!managed._promptDone) {
194
+ managed._eventBuffer.push(event);
195
+ }
196
+ });
197
+ // Also buffer deep_search progress events (same stream as session events)
198
+ const deepProgressBufHandler = (event) => {
199
+ if (!managed._promptDone) {
200
+ managed._eventBuffer.push({
201
+ type: "tool_progress",
202
+ toolName: "deep_search",
203
+ progress: event,
204
+ });
205
+ }
206
+ };
207
+ deepSearchEvents.on("progress", deepProgressBufHandler);
208
+ managed._bufferUnsub = () => {
209
+ brainUnsub();
210
+ deepSearchEvents.off("progress", deepProgressBufHandler);
211
+ };
212
+ // --- DP input transformation (SDK brain only — pi-agent uses extension input handlers) ---
213
+ let promptText = body.text;
214
+ if (managed.dpState) {
215
+ const dpState = managed.dpState;
216
+ const DP_MARKER = "[Deep Investigation]\n";
217
+ const EXIT_MARKER = "[DP_EXIT]\n";
218
+ if (promptText.startsWith(DP_MARKER)) {
219
+ const question = promptText.slice(DP_MARKER.length).trim();
220
+ if (question) {
221
+ dpState.checklist = createChecklist(question);
222
+ promptText = buildActivationMessage(question);
223
+ console.log(`[agentbox-http] DP activated for SDK brain, session ${managed.id}`);
224
+ }
225
+ }
226
+ else if (promptText.startsWith(EXIT_MARKER)) {
227
+ const userText = promptText.slice(EXIT_MARKER.length).trim();
228
+ if (dpState.checklist) {
229
+ for (const item of dpState.checklist.items) {
230
+ if (item.status === "pending" || item.status === "in_progress") {
231
+ item.status = "skipped";
232
+ item.summary = "User exited investigation";
233
+ }
234
+ }
235
+ }
236
+ dpState.checklist = null;
237
+ promptText = `The user has exited deep investigation mode. ${userText}`;
238
+ console.log(`[agentbox-http] DP exited for SDK brain, session ${managed.id}`);
239
+ }
240
+ }
241
+ // Execute prompt asynchronously; notify SSE to close on completion
242
+ console.log(`[agentbox-http] Starting prompt for session ${managed.id}`);
243
+ const actuallyFinish = () => {
244
+ managed._promptDone = true;
245
+ // Stop buffering
246
+ if (managed._bufferUnsub) {
247
+ managed._bufferUnsub();
248
+ managed._bufferUnsub = null;
249
+ }
250
+ for (const cb of managed._promptDoneCallbacks) {
251
+ cb();
252
+ }
253
+ managed._promptDoneCallbacks.clear();
254
+ // Schedule delayed release — gives frontend time to query context/model
255
+ // after SSE closes. If a new prompt arrives before the TTL, the timer is
256
+ // cancelled in getOrCreate() and the session stays alive.
257
+ sessionManager.scheduleRelease(managed.id);
258
+ };
259
+ const onPromptFinish = () => {
260
+ // If the agent is still active, auto-compaction is in progress, or an
261
+ // auto-retry is pending, defer SSE close until the agent is truly done —
262
+ // otherwise the frontend misses events.
263
+ if (managed.isAgentActive || managed.isCompacting || managed.isRetrying) {
264
+ console.log(`[agentbox-http] Prompt resolved but agent still busy for session ${managed.id} (active=${managed.isAgentActive} compacting=${managed.isCompacting} retrying=${managed.isRetrying}), deferring SSE close`);
265
+ const unsub = managed.brain.subscribe((event) => {
266
+ if (event.type === "agent_end" || event.type === "auto_compaction_end" || event.type === "auto_retry_end") {
267
+ // Use setTimeout to let synchronous follow-up events (e.g.
268
+ // auto_compaction_start right after agent_end, or agent_start
269
+ // right after auto_retry_end) fire first.
270
+ setTimeout(() => {
271
+ if (!managed.isCompacting && !managed.isAgentActive && !managed.isRetrying) {
272
+ unsub();
273
+ actuallyFinish();
274
+ }
275
+ }, 50);
276
+ }
277
+ });
278
+ return;
279
+ }
280
+ actuallyFinish();
281
+ };
282
+ managed.brain.prompt(promptText).then(() => {
283
+ console.log(`[agentbox-http] Prompt completed for session ${managed.id}`);
284
+ onPromptFinish();
285
+ }).catch((err) => {
286
+ console.error(`[agentbox-http] Prompt error for session ${managed.id}:`, err);
287
+ onPromptFinish();
288
+ });
289
+ sendJson(res, 200, { ok: true, sessionId: managed.id, brainType: managed.brainType });
290
+ });
291
+ /**
292
+ * GET /api/stream/:sessionId - SSE event stream
293
+ *
294
+ * Subscribe to the event stream of the specified session.
295
+ */
296
+ addRoute("GET", "/api/stream/:sessionId", async (req, res, params) => {
297
+ const { sessionId } = params;
298
+ console.log(`[agentbox-http] SSE stream request for session ${sessionId}`);
299
+ const managed = sessionManager.get(sessionId);
300
+ if (!managed) {
301
+ console.log(`[agentbox-http] Session ${sessionId} not found`);
302
+ sendJson(res, 404, { error: "Session not found" });
303
+ return;
304
+ }
305
+ console.log(`[agentbox-http] Starting SSE stream for session ${sessionId}`);
306
+ // Track active SSE connections for idle self-destruct
307
+ activeSseCount++;
308
+ resetIdleTimer();
309
+ // Set SSE response headers
310
+ res.writeHead(200, {
311
+ "Content-Type": "text/event-stream",
312
+ "Cache-Control": "no-cache",
313
+ Connection: "keep-alive",
314
+ "Access-Control-Allow-Origin": "*",
315
+ });
316
+ // Track connection state
317
+ let closed = false;
318
+ let sseEventCount = 0;
319
+ // Write a single SSE event
320
+ const writeEvent = (event) => {
321
+ if (closed || res.writableEnded)
322
+ return;
323
+ try {
324
+ sseEventCount++;
325
+ const data = JSON.stringify(event);
326
+ res.write(`data: ${data}\n\n`);
327
+ }
328
+ catch (err) {
329
+ console.warn(`[agentbox-http] SSE write error for session ${sessionId}:`, err);
330
+ closed = true;
331
+ }
332
+ };
333
+ // Close SSE helper
334
+ const closeSSE = () => {
335
+ if (!closed && !res.writableEnded) {
336
+ closed = true;
337
+ res.end();
338
+ }
339
+ };
340
+ // Replay any buffered events (emitted before SSE connected)
341
+ for (const event of managed._eventBuffer) {
342
+ writeEvent(event);
343
+ }
344
+ // If prompt already finished before SSE connected, close immediately
345
+ if (managed._promptDone) {
346
+ console.log(`[agentbox-http] Prompt already done for session ${sessionId}, closing SSE after replay (${managed._eventBuffer.length} events)`);
347
+ closeSSE();
348
+ return;
349
+ }
350
+ // Subscribe to Agent events (live, after buffer replay)
351
+ const unsubscribe = managed.brain.subscribe((event) => {
352
+ writeEvent(event);
353
+ });
354
+ // Also forward deep_search progress events as tool_progress SSE events
355
+ const deepProgressSSEHandler = (event) => {
356
+ writeEvent({
357
+ type: "tool_progress",
358
+ toolName: "deep_search",
359
+ progress: event,
360
+ });
361
+ };
362
+ deepSearchEvents.on("progress", deepProgressSSEHandler);
363
+ // Heartbeat: send SSE comment every 30s to keep connection alive
364
+ // during long agent thinking periods (prevents proxy/fetch body timeouts)
365
+ const heartbeat = setInterval(() => {
366
+ if (closed || res.writableEnded) {
367
+ clearInterval(heartbeat);
368
+ return;
369
+ }
370
+ try {
371
+ res.write(": heartbeat\n\n");
372
+ }
373
+ catch {
374
+ clearInterval(heartbeat);
375
+ }
376
+ }, 30_000);
377
+ // Cleanup helper: unsubscribe from all event sources
378
+ const unsubAll = () => {
379
+ unsubscribe();
380
+ deepSearchEvents.off("progress", deepProgressSSEHandler);
381
+ };
382
+ // Decrement SSE counter and check idle (called once per SSE lifecycle)
383
+ let sseCountDecremented = false;
384
+ const decrementSse = () => {
385
+ if (!sseCountDecremented) {
386
+ sseCountDecremented = true;
387
+ activeSseCount--;
388
+ checkIdle();
389
+ }
390
+ };
391
+ // Close SSE when prompt completes
392
+ const cleanup = () => {
393
+ console.log(`[agentbox-http] SSE closing for session ${sessionId} (prompt done, ${sseEventCount} events sent)`);
394
+ clearInterval(heartbeat);
395
+ unsubAll();
396
+ closeSSE();
397
+ decrementSse();
398
+ };
399
+ managed._promptDoneCallbacks.add(cleanup);
400
+ // Unsubscribe when client disconnects
401
+ req.on("close", () => {
402
+ console.log(`[agentbox-http] SSE client disconnected for session ${sessionId} (${sseEventCount} events sent)`);
403
+ closed = true;
404
+ clearInterval(heartbeat);
405
+ managed._promptDoneCallbacks.delete(cleanup);
406
+ unsubAll();
407
+ decrementSse();
408
+ });
409
+ // Handle response errors
410
+ res.on("error", (err) => {
411
+ console.warn(`[agentbox-http] SSE response error for session ${sessionId}:`, err);
412
+ closed = true;
413
+ clearInterval(heartbeat);
414
+ managed._promptDoneCallbacks.delete(cleanup);
415
+ unsubAll();
416
+ decrementSse();
417
+ });
418
+ });
419
+ /**
420
+ * POST /api/sessions/:sessionId/steer - send a steer instruction (insert user message after current tool is interrupted)
421
+ */
422
+ addRoute("POST", "/api/sessions/:sessionId/steer", async (req, res, params) => {
423
+ const { sessionId } = params;
424
+ const managed = sessionManager.get(sessionId);
425
+ if (!managed) {
426
+ sendJson(res, 404, { error: "Session not found" });
427
+ return;
428
+ }
429
+ const body = (await parseJsonBody(req));
430
+ if (!body.text) {
431
+ sendJson(res, 400, { error: "Missing 'text' field" });
432
+ return;
433
+ }
434
+ console.log(`[agentbox-http] Steering session ${sessionId}: ${body.text.slice(0, 80)}`);
435
+ try {
436
+ await managed.brain.steer(body.text);
437
+ sendJson(res, 200, { ok: true });
438
+ }
439
+ catch (err) {
440
+ console.error(`[agentbox-http] Steer error for session ${sessionId}:`, err);
441
+ sendJson(res, 500, { error: "Steer failed" });
442
+ }
443
+ });
444
+ /**
445
+ * POST /api/sessions/:sessionId/clear-queue - clear queued steer/followUp messages
446
+ */
447
+ addRoute("POST", "/api/sessions/:sessionId/clear-queue", async (_req, res, params) => {
448
+ const { sessionId } = params;
449
+ const managed = sessionManager.get(sessionId);
450
+ if (!managed) {
451
+ sendJson(res, 404, { error: "Session not found" });
452
+ return;
453
+ }
454
+ console.log(`[agentbox-http] Clearing queue for session ${sessionId}`);
455
+ const cleared = managed.brain.clearQueue();
456
+ sendJson(res, 200, { ok: true, ...cleared });
457
+ });
458
+ /**
459
+ * POST /api/sessions/:sessionId/abort - abort the current prompt
460
+ */
461
+ addRoute("POST", "/api/sessions/:sessionId/abort", async (_req, res, params) => {
462
+ const { sessionId } = params;
463
+ const managed = sessionManager.get(sessionId);
464
+ if (!managed) {
465
+ sendJson(res, 404, { error: "Session not found" });
466
+ return;
467
+ }
468
+ console.log(`[agentbox-http] Aborting session ${sessionId} (abort endpoint called)`);
469
+ console.trace(`[agentbox-http] Abort stack trace for session ${sessionId}`);
470
+ managed._aborted = true;
471
+ try {
472
+ await managed.brain.abort();
473
+ sendJson(res, 200, { ok: true });
474
+ }
475
+ catch (err) {
476
+ console.error(`[agentbox-http] Abort error for session ${sessionId}:`, err);
477
+ sendJson(res, 500, { error: "Abort failed" });
478
+ }
479
+ });
480
+ /**
481
+ * POST /api/reload-{mcp,skills} — unified resource reload endpoints
482
+ *
483
+ * Each endpoint delegates to the matching AgentBoxResourceHandler:
484
+ * fetch → materialize → postReload.
485
+ * URL paths are preserved for backward compatibility.
486
+ */
487
+ let _reloadGatewayClient = null;
488
+ function getReloadGatewayClient() {
489
+ const gatewayUrl = process.env.SICLAW_GATEWAY_URL;
490
+ if (!gatewayUrl)
491
+ return null;
492
+ if (!_reloadGatewayClient)
493
+ _reloadGatewayClient = new GatewayClient({ gatewayUrl });
494
+ return _reloadGatewayClient;
495
+ }
496
+ for (const descriptor of Object.values(RESOURCE_DESCRIPTORS)) {
497
+ addRoute("POST", descriptor.reloadPath, async (_req, res) => {
498
+ const resourceType = descriptor.type;
499
+ console.log(`[agentbox-http] Reloading ${resourceType} configuration`);
500
+ const client = getReloadGatewayClient();
501
+ if (!client) {
502
+ console.warn(`[agentbox-http] No SICLAW_GATEWAY_URL configured, skipping ${resourceType} reload`);
503
+ sendJson(res, 200, { ok: true, count: 0, type: resourceType });
504
+ return;
505
+ }
506
+ const handler = getResourceHandler(resourceType);
507
+ if (!handler) {
508
+ sendJson(res, 500, { error: `No handler for resource type "${resourceType}"` });
509
+ return;
510
+ }
511
+ try {
512
+ const payload = await handler.fetch(client.toClientLike());
513
+ const count = await handler.materialize(payload);
514
+ // Build session list for postReload (skills needs brain.reload())
515
+ const sessions = sessionManager.list().map((s) => ({
516
+ id: s.id,
517
+ brain: s.brain,
518
+ }));
519
+ if (handler.postReload) {
520
+ await handler.postReload({ sessions });
521
+ }
522
+ console.log(`[agentbox-http] ${resourceType} reloaded: ${count} items`);
523
+ sendJson(res, 200, { ok: true, count, type: resourceType });
524
+ }
525
+ catch (err) {
526
+ console.error(`[agentbox-http] Failed to reload ${resourceType}: ${err.message}`);
527
+ sendJson(res, 500, { error: `${resourceType} reload failed: ${err.message}` });
528
+ }
529
+ });
530
+ }
531
+ /**
532
+ * GET /api/models - list available models (read from settings.json)
533
+ */
534
+ addRoute("GET", "/api/models", async (_req, res) => {
535
+ const config = loadConfig();
536
+ const models = [];
537
+ for (const [provider, providerConfig] of Object.entries(config.providers)) {
538
+ for (const m of providerConfig.models) {
539
+ models.push({
540
+ id: m.id,
541
+ name: m.name,
542
+ provider,
543
+ contextWindow: m.contextWindow ?? 0,
544
+ maxTokens: m.maxTokens ?? 0,
545
+ reasoning: m.reasoning ?? false,
546
+ });
547
+ }
548
+ }
549
+ sendJson(res, 200, { models });
550
+ });
551
+ /**
552
+ * GET /api/sessions/:sessionId/model - get current model
553
+ */
554
+ addRoute("GET", "/api/sessions/:sessionId/model", async (_req, res, params) => {
555
+ const { sessionId } = params;
556
+ const managed = sessionManager.get(sessionId);
557
+ if (!managed) {
558
+ sendJson(res, 404, { error: "Session not found" });
559
+ return;
560
+ }
561
+ const model = managed.brain.getModel();
562
+ sendJson(res, 200, {
563
+ model: model ?? null,
564
+ brainType: managed.brainType,
565
+ });
566
+ });
567
+ /**
568
+ * POST /api/sessions/:sessionId/model - switch model
569
+ */
570
+ addRoute("POST", "/api/sessions/:sessionId/model", async (req, res, params) => {
571
+ const { sessionId } = params;
572
+ const managed = sessionManager.get(sessionId);
573
+ if (!managed) {
574
+ sendJson(res, 404, { error: "Session not found" });
575
+ return;
576
+ }
577
+ const body = (await parseJsonBody(req));
578
+ if (!body.provider || !body.modelId) {
579
+ sendJson(res, 400, { error: "Missing 'provider' and/or 'modelId'" });
580
+ return;
581
+ }
582
+ const model = managed.brain.findModel(body.provider, body.modelId);
583
+ if (!model) {
584
+ sendJson(res, 404, { error: "Model not found" });
585
+ return;
586
+ }
587
+ console.log(`[agentbox-http] Switching model for session ${sessionId}: ${model.provider}/${model.id}`);
588
+ await managed.brain.setModel(model);
589
+ sendJson(res, 200, { ok: true, model });
590
+ });
591
+ /**
592
+ * GET /api/sessions/:sessionId/context - get context usage
593
+ */
594
+ addRoute("GET", "/api/sessions/:sessionId/context", async (_req, res, params) => {
595
+ const { sessionId } = params;
596
+ const managed = sessionManager.get(sessionId);
597
+ if (!managed) {
598
+ sendJson(res, 404, { error: "Session not found" });
599
+ return;
600
+ }
601
+ const usage = managed.brain.getContextUsage();
602
+ const stats = managed.brain.getSessionStats();
603
+ sendJson(res, 200, {
604
+ tokens: usage?.tokens ?? 0,
605
+ contextWindow: usage?.contextWindow ?? 0,
606
+ percent: usage?.percent ?? 0,
607
+ isCompacting: managed.isCompacting,
608
+ inputTokens: stats.tokens.input,
609
+ outputTokens: stats.tokens.output,
610
+ cacheReadTokens: stats.tokens.cacheRead,
611
+ cacheWriteTokens: stats.tokens.cacheWrite,
612
+ cost: stats.cost,
613
+ });
614
+ });
615
+ /**
616
+ * POST /api/sessions/:sessionId/close - close session
617
+ */
618
+ addRoute("POST", "/api/sessions/:sessionId/close", async (_req, res, params) => {
619
+ const { sessionId } = params;
620
+ await sessionManager.close(sessionId);
621
+ sendJson(res, 200, { ok: true });
622
+ });
623
+ // ==================== Server ====================
624
+ /** Main request handler shared by HTTP and HTTPS servers */
625
+ const requestHandler = async (req, res) => {
626
+ const method = req.method || "GET";
627
+ const url = new URL(req.url || "/", `http://${req.headers.host}`);
628
+ const pathname = url.pathname;
629
+ // CORS preflight
630
+ if (method === "OPTIONS") {
631
+ res.writeHead(200, {
632
+ "Access-Control-Allow-Origin": "*",
633
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
634
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
635
+ });
636
+ res.end();
637
+ return;
638
+ }
639
+ // mTLS Gateway identity check (HTTPS only, skip /health for K8s probes)
640
+ if (useTls && pathname !== "/health") {
641
+ const tlsSocket = req.socket;
642
+ const peerCert = tlsSocket.getPeerCertificate?.();
643
+ if (!peerCert || !peerCert.subject) {
644
+ sendJson(res, 403, { error: "Client certificate required" });
645
+ return;
646
+ }
647
+ if (peerCert.subject.OU !== "Gateway") {
648
+ console.warn(`[agentbox-http] Rejected request from OU=${peerCert.subject.OU} (expected Gateway)`);
649
+ sendJson(res, 403, { error: "Forbidden: only Gateway can access this API" });
650
+ return;
651
+ }
652
+ }
653
+ // Match route
654
+ for (const route of routes) {
655
+ if (route.method !== method)
656
+ continue;
657
+ const match = pathname.match(route.pattern);
658
+ if (!match)
659
+ continue;
660
+ // Extract path parameters
661
+ const params = {};
662
+ route.paramNames.forEach((name, i) => {
663
+ params[name] = match[i + 1];
664
+ });
665
+ try {
666
+ await route.handler(req, res, params);
667
+ }
668
+ catch (err) {
669
+ console.error(`[agentbox-http] Error handling ${method} ${pathname}:`, err);
670
+ if (!res.headersSent) {
671
+ sendJson(res, 500, { error: "Internal server error" });
672
+ }
673
+ }
674
+ return;
675
+ }
676
+ // 404
677
+ sendJson(res, 404, { error: "Not found" });
678
+ };
679
+ // Detect TLS certificates
680
+ const certPath = process.env.SICLAW_CERT_PATH || "/etc/siclaw/certs";
681
+ const certFile = path.join(certPath, "tls.crt");
682
+ const keyFile = path.join(certPath, "tls.key");
683
+ const caFile = path.join(certPath, "ca.crt");
684
+ const useTls = fs.existsSync(certFile) && fs.existsSync(keyFile) && fs.existsSync(caFile);
685
+ if (useTls) {
686
+ console.log(`[agentbox-http] TLS certificates found at ${certPath}, starting HTTPS server`);
687
+ const server = https.createServer({
688
+ cert: fs.readFileSync(certFile),
689
+ key: fs.readFileSync(keyFile),
690
+ ca: fs.readFileSync(caFile),
691
+ requestCert: true,
692
+ rejectUnauthorized: false, // Allow K8s probes without client cert; app-layer checks OU for non-health routes
693
+ }, requestHandler);
694
+ return server;
695
+ }
696
+ console.log("[agentbox-http] No TLS certificates found, starting HTTP server (dev mode)");
697
+ const server = http.createServer(requestHandler);
698
+ return server;
699
+ }
700
+ //# sourceMappingURL=http-server.js.map