@jait/gateway 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 (474) hide show
  1. package/bin/jait.mjs +144 -0
  2. package/dist/config.d.ts +24 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +73 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/db/connection.d.ts +37 -0
  7. package/dist/db/connection.d.ts.map +1 -0
  8. package/dist/db/connection.js +85 -0
  9. package/dist/db/connection.js.map +1 -0
  10. package/dist/db/index.d.ts +4 -0
  11. package/dist/db/index.d.ts.map +1 -0
  12. package/dist/db/index.js +4 -0
  13. package/dist/db/index.js.map +1 -0
  14. package/dist/db/migrations.d.ts +24 -0
  15. package/dist/db/migrations.d.ts.map +1 -0
  16. package/dist/db/migrations.js +312 -0
  17. package/dist/db/migrations.js.map +1 -0
  18. package/dist/db/schema.d.ts +2253 -0
  19. package/dist/db/schema.d.ts.map +1 -0
  20. package/dist/db/schema.js +195 -0
  21. package/dist/db/schema.js.map +1 -0
  22. package/dist/foundation.d.ts +26 -0
  23. package/dist/foundation.d.ts.map +1 -0
  24. package/dist/foundation.js +15 -0
  25. package/dist/foundation.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +413 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/lib/uuidv7.d.ts +10 -0
  31. package/dist/lib/uuidv7.d.ts.map +1 -0
  32. package/dist/lib/uuidv7.js +33 -0
  33. package/dist/lib/uuidv7.js.map +1 -0
  34. package/dist/memory/contracts.d.ts +42 -0
  35. package/dist/memory/contracts.d.ts.map +1 -0
  36. package/dist/memory/contracts.js +2 -0
  37. package/dist/memory/contracts.js.map +1 -0
  38. package/dist/memory/embeddings.d.ts +4 -0
  39. package/dist/memory/embeddings.d.ts.map +1 -0
  40. package/dist/memory/embeddings.js +26 -0
  41. package/dist/memory/embeddings.js.map +1 -0
  42. package/dist/memory/service.d.ts +17 -0
  43. package/dist/memory/service.d.ts.map +1 -0
  44. package/dist/memory/service.js +82 -0
  45. package/dist/memory/service.js.map +1 -0
  46. package/dist/memory/sqlite-backend.d.ts +11 -0
  47. package/dist/memory/sqlite-backend.d.ts.map +1 -0
  48. package/dist/memory/sqlite-backend.js +68 -0
  49. package/dist/memory/sqlite-backend.js.map +1 -0
  50. package/dist/plugins/contracts.d.ts +11 -0
  51. package/dist/plugins/contracts.d.ts.map +1 -0
  52. package/dist/plugins/contracts.js +2 -0
  53. package/dist/plugins/contracts.js.map +1 -0
  54. package/dist/providers/claude-code-provider.d.ts +39 -0
  55. package/dist/providers/claude-code-provider.d.ts.map +1 -0
  56. package/dist/providers/claude-code-provider.js +322 -0
  57. package/dist/providers/claude-code-provider.js.map +1 -0
  58. package/dist/providers/codex-provider.d.ts +51 -0
  59. package/dist/providers/codex-provider.d.ts.map +1 -0
  60. package/dist/providers/codex-provider.js +826 -0
  61. package/dist/providers/codex-provider.js.map +1 -0
  62. package/dist/providers/contracts.d.ts +167 -0
  63. package/dist/providers/contracts.d.ts.map +1 -0
  64. package/dist/providers/contracts.js +13 -0
  65. package/dist/providers/contracts.js.map +1 -0
  66. package/dist/providers/index.d.ts +6 -0
  67. package/dist/providers/index.d.ts.map +1 -0
  68. package/dist/providers/index.js +5 -0
  69. package/dist/providers/index.js.map +1 -0
  70. package/dist/providers/jait-provider.d.ts +23 -0
  71. package/dist/providers/jait-provider.d.ts.map +1 -0
  72. package/dist/providers/jait-provider.js +67 -0
  73. package/dist/providers/jait-provider.js.map +1 -0
  74. package/dist/providers/registry.d.ts +39 -0
  75. package/dist/providers/registry.d.ts.map +1 -0
  76. package/dist/providers/registry.js +64 -0
  77. package/dist/providers/registry.js.map +1 -0
  78. package/dist/pty-broker-client.d.ts +46 -0
  79. package/dist/pty-broker-client.d.ts.map +1 -0
  80. package/dist/pty-broker-client.js +142 -0
  81. package/dist/pty-broker-client.js.map +1 -0
  82. package/dist/routes/auth.d.ts +6 -0
  83. package/dist/routes/auth.d.ts.map +1 -0
  84. package/dist/routes/auth.js +236 -0
  85. package/dist/routes/auth.js.map +1 -0
  86. package/dist/routes/chat.d.ts +32 -0
  87. package/dist/routes/chat.d.ts.map +1 -0
  88. package/dist/routes/chat.js +1503 -0
  89. package/dist/routes/chat.js.map +1 -0
  90. package/dist/routes/consent.d.ts +10 -0
  91. package/dist/routes/consent.d.ts.map +1 -0
  92. package/dist/routes/consent.js +127 -0
  93. package/dist/routes/consent.js.map +1 -0
  94. package/dist/routes/filesystem.d.ts +14 -0
  95. package/dist/routes/filesystem.d.ts.map +1 -0
  96. package/dist/routes/filesystem.js +152 -0
  97. package/dist/routes/filesystem.js.map +1 -0
  98. package/dist/routes/git.d.ts +17 -0
  99. package/dist/routes/git.d.ts.map +1 -0
  100. package/dist/routes/git.js +213 -0
  101. package/dist/routes/git.js.map +1 -0
  102. package/dist/routes/health.d.ts +7 -0
  103. package/dist/routes/health.d.ts.map +1 -0
  104. package/dist/routes/health.js +21 -0
  105. package/dist/routes/health.js.map +1 -0
  106. package/dist/routes/hooks.d.ts +9 -0
  107. package/dist/routes/hooks.d.ts.map +1 -0
  108. package/dist/routes/hooks.js +22 -0
  109. package/dist/routes/hooks.js.map +1 -0
  110. package/dist/routes/jobs.d.ts +5 -0
  111. package/dist/routes/jobs.d.ts.map +1 -0
  112. package/dist/routes/jobs.js +333 -0
  113. package/dist/routes/jobs.js.map +1 -0
  114. package/dist/routes/mcp-server.d.ts +23 -0
  115. package/dist/routes/mcp-server.d.ts.map +1 -0
  116. package/dist/routes/mcp-server.js +177 -0
  117. package/dist/routes/mcp-server.js.map +1 -0
  118. package/dist/routes/mobile.d.ts +12 -0
  119. package/dist/routes/mobile.d.ts.map +1 -0
  120. package/dist/routes/mobile.js +64 -0
  121. package/dist/routes/mobile.js.map +1 -0
  122. package/dist/routes/network.d.ts +3 -0
  123. package/dist/routes/network.d.ts.map +1 -0
  124. package/dist/routes/network.js +367 -0
  125. package/dist/routes/network.js.map +1 -0
  126. package/dist/routes/repositories.d.ts +18 -0
  127. package/dist/routes/repositories.d.ts.map +1 -0
  128. package/dist/routes/repositories.js +90 -0
  129. package/dist/routes/repositories.js.map +1 -0
  130. package/dist/routes/screen-share.d.ts +17 -0
  131. package/dist/routes/screen-share.d.ts.map +1 -0
  132. package/dist/routes/screen-share.js +92 -0
  133. package/dist/routes/screen-share.js.map +1 -0
  134. package/dist/routes/sessions.d.ts +18 -0
  135. package/dist/routes/sessions.d.ts.map +1 -0
  136. package/dist/routes/sessions.js +169 -0
  137. package/dist/routes/sessions.js.map +1 -0
  138. package/dist/routes/terminals.d.ts +15 -0
  139. package/dist/routes/terminals.d.ts.map +1 -0
  140. package/dist/routes/terminals.js +326 -0
  141. package/dist/routes/terminals.js.map +1 -0
  142. package/dist/routes/threads.d.ts +38 -0
  143. package/dist/routes/threads.d.ts.map +1 -0
  144. package/dist/routes/threads.js +488 -0
  145. package/dist/routes/threads.js.map +1 -0
  146. package/dist/routes/trust.d.ts +9 -0
  147. package/dist/routes/trust.d.ts.map +1 -0
  148. package/dist/routes/trust.js +25 -0
  149. package/dist/routes/trust.js.map +1 -0
  150. package/dist/routes/voice.d.ts +5 -0
  151. package/dist/routes/voice.d.ts.map +1 -0
  152. package/dist/routes/voice.js +37 -0
  153. package/dist/routes/voice.js.map +1 -0
  154. package/dist/routes/workspace.d.ts +13 -0
  155. package/dist/routes/workspace.d.ts.map +1 -0
  156. package/dist/routes/workspace.js +275 -0
  157. package/dist/routes/workspace.js.map +1 -0
  158. package/dist/scheduler/contracts.d.ts +15 -0
  159. package/dist/scheduler/contracts.d.ts.map +1 -0
  160. package/dist/scheduler/contracts.js +2 -0
  161. package/dist/scheduler/contracts.js.map +1 -0
  162. package/dist/scheduler/hooks.d.ts +20 -0
  163. package/dist/scheduler/hooks.d.ts.map +1 -0
  164. package/dist/scheduler/hooks.js +78 -0
  165. package/dist/scheduler/hooks.js.map +1 -0
  166. package/dist/scheduler/service.d.ts +65 -0
  167. package/dist/scheduler/service.d.ts.map +1 -0
  168. package/dist/scheduler/service.js +188 -0
  169. package/dist/scheduler/service.js.map +1 -0
  170. package/dist/security/consent-executor.d.ts +48 -0
  171. package/dist/security/consent-executor.d.ts.map +1 -0
  172. package/dist/security/consent-executor.js +158 -0
  173. package/dist/security/consent-executor.js.map +1 -0
  174. package/dist/security/consent-manager.d.ts +105 -0
  175. package/dist/security/consent-manager.d.ts.map +1 -0
  176. package/dist/security/consent-manager.js +227 -0
  177. package/dist/security/consent-manager.js.map +1 -0
  178. package/dist/security/contracts.d.ts +31 -0
  179. package/dist/security/contracts.d.ts.map +1 -0
  180. package/dist/security/contracts.js +2 -0
  181. package/dist/security/contracts.js.map +1 -0
  182. package/dist/security/http-auth.d.ts +10 -0
  183. package/dist/security/http-auth.d.ts.map +1 -0
  184. package/dist/security/http-auth.js +48 -0
  185. package/dist/security/http-auth.js.map +1 -0
  186. package/dist/security/index.d.ts +10 -0
  187. package/dist/security/index.d.ts.map +1 -0
  188. package/dist/security/index.js +9 -0
  189. package/dist/security/index.js.map +1 -0
  190. package/dist/security/path-guard.d.ts +40 -0
  191. package/dist/security/path-guard.d.ts.map +1 -0
  192. package/dist/security/path-guard.js +125 -0
  193. package/dist/security/path-guard.js.map +1 -0
  194. package/dist/security/sandbox-manager.d.ts +43 -0
  195. package/dist/security/sandbox-manager.d.ts.map +1 -0
  196. package/dist/security/sandbox-manager.js +110 -0
  197. package/dist/security/sandbox-manager.js.map +1 -0
  198. package/dist/security/ssrf-guard.d.ts +11 -0
  199. package/dist/security/ssrf-guard.d.ts.map +1 -0
  200. package/dist/security/ssrf-guard.js +59 -0
  201. package/dist/security/ssrf-guard.js.map +1 -0
  202. package/dist/security/tool-permissions.d.ts +61 -0
  203. package/dist/security/tool-permissions.d.ts.map +1 -0
  204. package/dist/security/tool-permissions.js +105 -0
  205. package/dist/security/tool-permissions.js.map +1 -0
  206. package/dist/security/tool-profiles.d.ts +23 -0
  207. package/dist/security/tool-profiles.d.ts.map +1 -0
  208. package/dist/security/tool-profiles.js +106 -0
  209. package/dist/security/tool-profiles.js.map +1 -0
  210. package/dist/security/trust-engine.d.ts +61 -0
  211. package/dist/security/trust-engine.d.ts.map +1 -0
  212. package/dist/security/trust-engine.js +192 -0
  213. package/dist/security/trust-engine.js.map +1 -0
  214. package/dist/server.d.ts +54 -0
  215. package/dist/server.d.ts.map +1 -0
  216. package/dist/server.js +188 -0
  217. package/dist/server.js.map +1 -0
  218. package/dist/services/audit.d.ts +60 -0
  219. package/dist/services/audit.d.ts.map +1 -0
  220. package/dist/services/audit.js +58 -0
  221. package/dist/services/audit.js.map +1 -0
  222. package/dist/services/device-registry.d.ts +15 -0
  223. package/dist/services/device-registry.d.ts.map +1 -0
  224. package/dist/services/device-registry.js +32 -0
  225. package/dist/services/device-registry.js.map +1 -0
  226. package/dist/services/git.d.ts +168 -0
  227. package/dist/services/git.d.ts.map +1 -0
  228. package/dist/services/git.js +957 -0
  229. package/dist/services/git.js.map +1 -0
  230. package/dist/services/repositories.d.ts +32 -0
  231. package/dist/services/repositories.d.ts.map +1 -0
  232. package/dist/services/repositories.js +70 -0
  233. package/dist/services/repositories.js.map +1 -0
  234. package/dist/services/session-state.d.ts +20 -0
  235. package/dist/services/session-state.d.ts.map +1 -0
  236. package/dist/services/session-state.js +89 -0
  237. package/dist/services/session-state.js.map +1 -0
  238. package/dist/services/sessions.d.ts +68 -0
  239. package/dist/services/sessions.d.ts.map +1 -0
  240. package/dist/services/sessions.js +136 -0
  241. package/dist/services/sessions.js.map +1 -0
  242. package/dist/services/thread-title.d.ts +23 -0
  243. package/dist/services/thread-title.d.ts.map +1 -0
  244. package/dist/services/thread-title.js +141 -0
  245. package/dist/services/thread-title.js.map +1 -0
  246. package/dist/services/threads.d.ts +64 -0
  247. package/dist/services/threads.d.ts.map +1 -0
  248. package/dist/services/threads.js +202 -0
  249. package/dist/services/threads.js.map +1 -0
  250. package/dist/services/users.d.ts +39 -0
  251. package/dist/services/users.d.ts.map +1 -0
  252. package/dist/services/users.js +203 -0
  253. package/dist/services/users.js.map +1 -0
  254. package/dist/sessions/contracts.d.ts +14 -0
  255. package/dist/sessions/contracts.d.ts.map +1 -0
  256. package/dist/sessions/contracts.js +2 -0
  257. package/dist/sessions/contracts.js.map +1 -0
  258. package/dist/surfaces/browser.d.ts +65 -0
  259. package/dist/surfaces/browser.d.ts.map +1 -0
  260. package/dist/surfaces/browser.js +615 -0
  261. package/dist/surfaces/browser.js.map +1 -0
  262. package/dist/surfaces/contracts.d.ts +34 -0
  263. package/dist/surfaces/contracts.d.ts.map +1 -0
  264. package/dist/surfaces/contracts.js +2 -0
  265. package/dist/surfaces/contracts.js.map +1 -0
  266. package/dist/surfaces/filesystem.d.ts +76 -0
  267. package/dist/surfaces/filesystem.d.ts.map +1 -0
  268. package/dist/surfaces/filesystem.js +245 -0
  269. package/dist/surfaces/filesystem.js.map +1 -0
  270. package/dist/surfaces/index.d.ts +6 -0
  271. package/dist/surfaces/index.d.ts.map +1 -0
  272. package/dist/surfaces/index.js +5 -0
  273. package/dist/surfaces/index.js.map +1 -0
  274. package/dist/surfaces/registry.d.ts +24 -0
  275. package/dist/surfaces/registry.d.ts.map +1 -0
  276. package/dist/surfaces/registry.js +59 -0
  277. package/dist/surfaces/registry.js.map +1 -0
  278. package/dist/surfaces/terminal.d.ts +76 -0
  279. package/dist/surfaces/terminal.d.ts.map +1 -0
  280. package/dist/surfaces/terminal.js +271 -0
  281. package/dist/surfaces/terminal.js.map +1 -0
  282. package/dist/tools/agent-loop.d.ts +302 -0
  283. package/dist/tools/agent-loop.d.ts.map +1 -0
  284. package/dist/tools/agent-loop.js +918 -0
  285. package/dist/tools/agent-loop.js.map +1 -0
  286. package/dist/tools/agent-tools.d.ts +39 -0
  287. package/dist/tools/agent-tools.d.ts.map +1 -0
  288. package/dist/tools/agent-tools.js +263 -0
  289. package/dist/tools/agent-tools.js.map +1 -0
  290. package/dist/tools/browser-tools.d.ts +38 -0
  291. package/dist/tools/browser-tools.d.ts.map +1 -0
  292. package/dist/tools/browser-tools.js +725 -0
  293. package/dist/tools/browser-tools.js.map +1 -0
  294. package/dist/tools/chat-modes.d.ts +75 -0
  295. package/dist/tools/chat-modes.d.ts.map +1 -0
  296. package/dist/tools/chat-modes.js +228 -0
  297. package/dist/tools/chat-modes.js.map +1 -0
  298. package/dist/tools/contracts.d.ts +69 -0
  299. package/dist/tools/contracts.d.ts.map +1 -0
  300. package/dist/tools/contracts.js +2 -0
  301. package/dist/tools/contracts.js.map +1 -0
  302. package/dist/tools/core/agent.d.ts +31 -0
  303. package/dist/tools/core/agent.d.ts.map +1 -0
  304. package/dist/tools/core/agent.js +65 -0
  305. package/dist/tools/core/agent.js.map +1 -0
  306. package/dist/tools/core/edit.d.ts +30 -0
  307. package/dist/tools/core/edit.d.ts.map +1 -0
  308. package/dist/tools/core/edit.js +109 -0
  309. package/dist/tools/core/edit.js.map +1 -0
  310. package/dist/tools/core/execute.d.ts +36 -0
  311. package/dist/tools/core/execute.d.ts.map +1 -0
  312. package/dist/tools/core/execute.js +81 -0
  313. package/dist/tools/core/execute.js.map +1 -0
  314. package/dist/tools/core/get-fs.d.ts +32 -0
  315. package/dist/tools/core/get-fs.d.ts.map +1 -0
  316. package/dist/tools/core/get-fs.js +143 -0
  317. package/dist/tools/core/get-fs.js.map +1 -0
  318. package/dist/tools/core/index.d.ts +26 -0
  319. package/dist/tools/core/index.d.ts.map +1 -0
  320. package/dist/tools/core/index.js +26 -0
  321. package/dist/tools/core/index.js.map +1 -0
  322. package/dist/tools/core/jait.d.ts +60 -0
  323. package/dist/tools/core/jait.d.ts.map +1 -0
  324. package/dist/tools/core/jait.js +256 -0
  325. package/dist/tools/core/jait.js.map +1 -0
  326. package/dist/tools/core/read.d.ts +26 -0
  327. package/dist/tools/core/read.d.ts.map +1 -0
  328. package/dist/tools/core/read.js +118 -0
  329. package/dist/tools/core/read.js.map +1 -0
  330. package/dist/tools/core/search.d.ts +34 -0
  331. package/dist/tools/core/search.d.ts.map +1 -0
  332. package/dist/tools/core/search.js +187 -0
  333. package/dist/tools/core/search.js.map +1 -0
  334. package/dist/tools/core/todo.d.ts +38 -0
  335. package/dist/tools/core/todo.d.ts.map +1 -0
  336. package/dist/tools/core/todo.js +116 -0
  337. package/dist/tools/core/todo.js.map +1 -0
  338. package/dist/tools/core/web.d.ts +34 -0
  339. package/dist/tools/core/web.d.ts.map +1 -0
  340. package/dist/tools/core/web.js +120 -0
  341. package/dist/tools/core/web.js.map +1 -0
  342. package/dist/tools/cron-tools.d.ts +7 -0
  343. package/dist/tools/cron-tools.d.ts.map +1 -0
  344. package/dist/tools/cron-tools.js +116 -0
  345. package/dist/tools/cron-tools.js.map +1 -0
  346. package/dist/tools/file-tools.d.ts +32 -0
  347. package/dist/tools/file-tools.d.ts.map +1 -0
  348. package/dist/tools/file-tools.js +178 -0
  349. package/dist/tools/file-tools.js.map +1 -0
  350. package/dist/tools/gateway-tools.d.ts +15 -0
  351. package/dist/tools/gateway-tools.d.ts.map +1 -0
  352. package/dist/tools/gateway-tools.js +39 -0
  353. package/dist/tools/gateway-tools.js.map +1 -0
  354. package/dist/tools/index.d.ts +57 -0
  355. package/dist/tools/index.d.ts.map +1 -0
  356. package/dist/tools/index.js +170 -0
  357. package/dist/tools/index.js.map +1 -0
  358. package/dist/tools/mcp-bridge.d.ts +111 -0
  359. package/dist/tools/mcp-bridge.d.ts.map +1 -0
  360. package/dist/tools/mcp-bridge.js +166 -0
  361. package/dist/tools/mcp-bridge.js.map +1 -0
  362. package/dist/tools/memory-tools.d.ts +19 -0
  363. package/dist/tools/memory-tools.d.ts.map +1 -0
  364. package/dist/tools/memory-tools.js +78 -0
  365. package/dist/tools/memory-tools.js.map +1 -0
  366. package/dist/tools/meta-tools.d.ts +25 -0
  367. package/dist/tools/meta-tools.d.ts.map +1 -0
  368. package/dist/tools/meta-tools.js +125 -0
  369. package/dist/tools/meta-tools.js.map +1 -0
  370. package/dist/tools/network-tools.d.ts +21 -0
  371. package/dist/tools/network-tools.d.ts.map +1 -0
  372. package/dist/tools/network-tools.js +189 -0
  373. package/dist/tools/network-tools.js.map +1 -0
  374. package/dist/tools/os-tools.d.ts +18 -0
  375. package/dist/tools/os-tools.d.ts.map +1 -0
  376. package/dist/tools/os-tools.js +210 -0
  377. package/dist/tools/os-tools.js.map +1 -0
  378. package/dist/tools/prompts/claude-prompt.d.ts +8 -0
  379. package/dist/tools/prompts/claude-prompt.d.ts.map +1 -0
  380. package/dist/tools/prompts/claude-prompt.js +228 -0
  381. package/dist/tools/prompts/claude-prompt.js.map +1 -0
  382. package/dist/tools/prompts/default-openai-prompt.d.ts +8 -0
  383. package/dist/tools/prompts/default-openai-prompt.d.ts.map +1 -0
  384. package/dist/tools/prompts/default-openai-prompt.js +67 -0
  385. package/dist/tools/prompts/default-openai-prompt.js.map +1 -0
  386. package/dist/tools/prompts/default-prompt.d.ts +7 -0
  387. package/dist/tools/prompts/default-prompt.d.ts.map +1 -0
  388. package/dist/tools/prompts/default-prompt.js +50 -0
  389. package/dist/tools/prompts/default-prompt.js.map +1 -0
  390. package/dist/tools/prompts/gemini-prompt.d.ts +8 -0
  391. package/dist/tools/prompts/gemini-prompt.d.ts.map +1 -0
  392. package/dist/tools/prompts/gemini-prompt.js +118 -0
  393. package/dist/tools/prompts/gemini-prompt.js.map +1 -0
  394. package/dist/tools/prompts/gpt5-codex-prompt.d.ts +8 -0
  395. package/dist/tools/prompts/gpt5-codex-prompt.d.ts.map +1 -0
  396. package/dist/tools/prompts/gpt5-codex-prompt.js +72 -0
  397. package/dist/tools/prompts/gpt5-codex-prompt.js.map +1 -0
  398. package/dist/tools/prompts/gpt5-prompt.d.ts +8 -0
  399. package/dist/tools/prompts/gpt5-prompt.d.ts.map +1 -0
  400. package/dist/tools/prompts/gpt5-prompt.js +177 -0
  401. package/dist/tools/prompts/gpt5-prompt.js.map +1 -0
  402. package/dist/tools/prompts/gpt51-prompt.d.ts +8 -0
  403. package/dist/tools/prompts/gpt51-prompt.d.ts.map +1 -0
  404. package/dist/tools/prompts/gpt51-prompt.js +178 -0
  405. package/dist/tools/prompts/gpt51-prompt.js.map +1 -0
  406. package/dist/tools/prompts/gpt52-prompt.d.ts +8 -0
  407. package/dist/tools/prompts/gpt52-prompt.d.ts.map +1 -0
  408. package/dist/tools/prompts/gpt52-prompt.js +198 -0
  409. package/dist/tools/prompts/gpt52-prompt.js.map +1 -0
  410. package/dist/tools/prompts/index.d.ts +22 -0
  411. package/dist/tools/prompts/index.d.ts.map +1 -0
  412. package/dist/tools/prompts/index.js +23 -0
  413. package/dist/tools/prompts/index.js.map +1 -0
  414. package/dist/tools/prompts/prompt-registry.d.ts +44 -0
  415. package/dist/tools/prompts/prompt-registry.d.ts.map +1 -0
  416. package/dist/tools/prompts/prompt-registry.js +60 -0
  417. package/dist/tools/prompts/prompt-registry.js.map +1 -0
  418. package/dist/tools/prompts/shared-sections.d.ts +28 -0
  419. package/dist/tools/prompts/shared-sections.d.ts.map +1 -0
  420. package/dist/tools/prompts/shared-sections.js +111 -0
  421. package/dist/tools/prompts/shared-sections.js.map +1 -0
  422. package/dist/tools/prompts/xai-prompt.d.ts +8 -0
  423. package/dist/tools/prompts/xai-prompt.d.ts.map +1 -0
  424. package/dist/tools/prompts/xai-prompt.js +68 -0
  425. package/dist/tools/prompts/xai-prompt.js.map +1 -0
  426. package/dist/tools/redeploy-tools.d.ts +30 -0
  427. package/dist/tools/redeploy-tools.d.ts.map +1 -0
  428. package/dist/tools/redeploy-tools.js +191 -0
  429. package/dist/tools/redeploy-tools.js.map +1 -0
  430. package/dist/tools/registry.d.ts +51 -0
  431. package/dist/tools/registry.d.ts.map +1 -0
  432. package/dist/tools/registry.js +148 -0
  433. package/dist/tools/registry.js.map +1 -0
  434. package/dist/tools/screen-share-tools.d.ts +31 -0
  435. package/dist/tools/screen-share-tools.d.ts.map +1 -0
  436. package/dist/tools/screen-share-tools.js +183 -0
  437. package/dist/tools/screen-share-tools.js.map +1 -0
  438. package/dist/tools/surface-tools.d.ts +23 -0
  439. package/dist/tools/surface-tools.d.ts.map +1 -0
  440. package/dist/tools/surface-tools.js +99 -0
  441. package/dist/tools/surface-tools.js.map +1 -0
  442. package/dist/tools/terminal-tools.d.ts +37 -0
  443. package/dist/tools/terminal-tools.d.ts.map +1 -0
  444. package/dist/tools/terminal-tools.js +448 -0
  445. package/dist/tools/terminal-tools.js.map +1 -0
  446. package/dist/tools/thread-tools.d.ts +61 -0
  447. package/dist/tools/thread-tools.d.ts.map +1 -0
  448. package/dist/tools/thread-tools.js +484 -0
  449. package/dist/tools/thread-tools.js.map +1 -0
  450. package/dist/tools/token-estimator.d.ts +55 -0
  451. package/dist/tools/token-estimator.d.ts.map +1 -0
  452. package/dist/tools/token-estimator.js +82 -0
  453. package/dist/tools/token-estimator.js.map +1 -0
  454. package/dist/tools/tool-names.d.ts +64 -0
  455. package/dist/tools/tool-names.d.ts.map +1 -0
  456. package/dist/tools/tool-names.js +76 -0
  457. package/dist/tools/tool-names.js.map +1 -0
  458. package/dist/tools/validate.d.ts +27 -0
  459. package/dist/tools/validate.d.ts.map +1 -0
  460. package/dist/tools/validate.js +99 -0
  461. package/dist/tools/validate.js.map +1 -0
  462. package/dist/tools/voice-tools.d.ts +8 -0
  463. package/dist/tools/voice-tools.d.ts.map +1 -0
  464. package/dist/tools/voice-tools.js +32 -0
  465. package/dist/tools/voice-tools.js.map +1 -0
  466. package/dist/voice/service.d.ts +42 -0
  467. package/dist/voice/service.d.ts.map +1 -0
  468. package/dist/voice/service.js +75 -0
  469. package/dist/voice/service.js.map +1 -0
  470. package/dist/ws.d.ts +90 -0
  471. package/dist/ws.d.ts.map +1 -0
  472. package/dist/ws.js +562 -0
  473. package/dist/ws.js.map +1 -0
  474. package/package.json +61 -0
@@ -0,0 +1,166 @@
1
+ /**
2
+ * MCP Tool Bridge — connects external MCP tool servers to Jait's registry.
3
+ *
4
+ * MCP (Model Context Protocol) lets users bring their own tool servers.
5
+ * This bridge:
6
+ * 1. Connects to an MCP server via stdio or HTTP/SSE transport
7
+ * 2. Discovers its tools via `tools/list`
8
+ * 3. Wraps each tool as a ToolDefinition and registers it
9
+ * 4. Proxies tool execution via `tools/call`
10
+ *
11
+ * All MCP tools get tier: "external", category: "external", source: "mcp".
12
+ *
13
+ * Scaffold — transport & full MCP protocol will be implemented when
14
+ * the MCP SDK is integrated. For now this provides the type contracts
15
+ * and registration flow.
16
+ */
17
+ /**
18
+ * Connect to an MCP server and discover its tools.
19
+ *
20
+ * TODO: Implement actual MCP protocol transport. For now this is a
21
+ * scaffold that documents the expected flow and types.
22
+ */
23
+ export async function connectMcpServer(_config) {
24
+ // Scaffold — real implementation will use @modelcontextprotocol/sdk
25
+ return {
26
+ serverId: _config.id,
27
+ serverName: _config.name,
28
+ status: "disconnected",
29
+ tools: [],
30
+ error: "MCP transport not yet implemented — scaffold only",
31
+ };
32
+ }
33
+ /**
34
+ * Call a tool on an MCP server.
35
+ *
36
+ * TODO: Implement actual MCP tools/call. For now returns an error
37
+ * indicating the scaffold state.
38
+ */
39
+ export async function callMcpTool(_serverId, _toolName, _args) {
40
+ return {
41
+ ok: false,
42
+ message: `MCP tool execution not yet implemented (server: ${_serverId}, tool: ${_toolName})`,
43
+ };
44
+ }
45
+ // ── Register MCP tools into ToolRegistry ─────────────────────────────
46
+ /**
47
+ * Wraps an MCP tool descriptor as a Jait ToolDefinition and registers it.
48
+ *
49
+ * The tool name is prefixed with the server id to avoid collisions:
50
+ * e.g. "github:create_issue" → registered as "mcp.github.create_issue"
51
+ */
52
+ export function wrapMcpTool(serverId, descriptor) {
53
+ const jaitName = `mcp.${serverId}.${descriptor.name}`;
54
+ return {
55
+ name: jaitName,
56
+ description: `[MCP: ${serverId}] ${descriptor.description}`,
57
+ parameters: descriptor.inputSchema,
58
+ tier: "external",
59
+ category: "external",
60
+ source: "mcp",
61
+ async execute(input, _context) {
62
+ return callMcpTool(serverId, descriptor.name, input);
63
+ },
64
+ };
65
+ }
66
+ /**
67
+ * Register all tools from an MCP server connection into a ToolRegistry.
68
+ * Returns the number of tools registered.
69
+ */
70
+ export function registerMcpTools(registry, connection) {
71
+ let count = 0;
72
+ for (const descriptor of connection.tools) {
73
+ const tool = wrapMcpTool(connection.serverId, descriptor);
74
+ registry.register(tool);
75
+ count++;
76
+ }
77
+ return count;
78
+ }
79
+ /**
80
+ * Unregister all MCP tools from a specific server.
81
+ */
82
+ export function unregisterMcpTools(registry, serverId) {
83
+ const prefix = `mcp.${serverId}.`;
84
+ const toRemove = registry.listNames().filter((n) => n.startsWith(prefix));
85
+ for (const _name of toRemove) {
86
+ // ToolRegistry doesn't have unregister yet — we'll need to add it
87
+ // For now, tools from disconnected servers will return errors on execute
88
+ }
89
+ return toRemove.length;
90
+ }
91
+ // ── MCP server manager ───────────────────────────────────────────────
92
+ /**
93
+ * Manages multiple MCP server connections.
94
+ * Tracks connection state, provides reconnection, and manages tool lifecycle.
95
+ */
96
+ export class McpManager {
97
+ registry;
98
+ connections = new Map();
99
+ configs = new Map();
100
+ constructor(registry) {
101
+ this.registry = registry;
102
+ }
103
+ /** Add an MCP server configuration */
104
+ addServer(config) {
105
+ this.configs.set(config.id, config);
106
+ }
107
+ /** Remove an MCP server */
108
+ removeServer(serverId) {
109
+ this.disconnect(serverId);
110
+ this.configs.delete(serverId);
111
+ }
112
+ /** Connect to a specific server and register its tools */
113
+ async connect(serverId) {
114
+ const config = this.configs.get(serverId);
115
+ if (!config) {
116
+ return {
117
+ serverId,
118
+ serverName: serverId,
119
+ status: "error",
120
+ tools: [],
121
+ error: `No config found for MCP server '${serverId}'`,
122
+ };
123
+ }
124
+ const connection = await connectMcpServer(config);
125
+ this.connections.set(serverId, connection);
126
+ if (connection.status === "connected") {
127
+ registerMcpTools(this.registry, connection);
128
+ }
129
+ return connection;
130
+ }
131
+ /** Disconnect from a specific server */
132
+ disconnect(serverId) {
133
+ unregisterMcpTools(this.registry, serverId);
134
+ this.connections.delete(serverId);
135
+ }
136
+ /** Connect to all configured servers */
137
+ async connectAll() {
138
+ const results = [];
139
+ for (const config of this.configs.values()) {
140
+ if (config.enabled !== false) {
141
+ results.push(await this.connect(config.id));
142
+ }
143
+ }
144
+ return results;
145
+ }
146
+ /** Get connection status for all servers */
147
+ getStatus() {
148
+ const out = [];
149
+ for (const config of this.configs.values()) {
150
+ const conn = this.connections.get(config.id);
151
+ out.push({
152
+ id: config.id,
153
+ name: config.name,
154
+ status: conn?.status ?? "disconnected",
155
+ toolCount: conn?.tools.length ?? 0,
156
+ error: conn?.error,
157
+ });
158
+ }
159
+ return out;
160
+ }
161
+ /** Get all server configs */
162
+ getConfigs() {
163
+ return [...this.configs.values()];
164
+ }
165
+ }
166
+ //# sourceMappingURL=mcp-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-bridge.js","sourceRoot":"","sources":["../../src/tools/mcp-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { MemoryService, MemoryScope } from "../memory/contracts.js";
2
+ import type { ToolDefinition } from "./contracts.js";
3
+ export declare function createMemorySaveTool(memory: MemoryService): ToolDefinition<{
4
+ scope: MemoryScope;
5
+ content: string;
6
+ sourceType: string;
7
+ sourceId: string;
8
+ sourceSurface: string;
9
+ ttlSeconds?: number;
10
+ }>;
11
+ export declare function createMemorySearchTool(memory: MemoryService): ToolDefinition<{
12
+ query: string;
13
+ limit?: number;
14
+ scope?: MemoryScope;
15
+ }>;
16
+ export declare function createMemoryForgetTool(memory: MemoryService): ToolDefinition<{
17
+ id: string;
18
+ }>;
19
+ //# sourceMappingURL=memory-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-tools.d.ts","sourceRoot":"","sources":["../../src/tools/memory-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAAC;IAC1E,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CAmCD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC,CAqBpI;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB5F"}
@@ -0,0 +1,78 @@
1
+ export function createMemorySaveTool(memory) {
2
+ return {
3
+ name: "memory.save",
4
+ description: "Save a memory entry for later retrieval.",
5
+ tier: "standard",
6
+ category: "memory",
7
+ source: "builtin",
8
+ parameters: {
9
+ type: "object",
10
+ properties: {
11
+ scope: { type: "string", enum: ["workspace", "project", "contact"] },
12
+ content: { type: "string" },
13
+ sourceType: { type: "string" },
14
+ sourceId: { type: "string" },
15
+ sourceSurface: { type: "string" },
16
+ ttlSeconds: { type: "number" },
17
+ },
18
+ required: ["scope", "content", "sourceType", "sourceId", "sourceSurface"],
19
+ },
20
+ async execute(input) {
21
+ const expiresAt = input.ttlSeconds ? new Date(Date.now() + input.ttlSeconds * 1000).toISOString() : undefined;
22
+ const entry = await memory.save({
23
+ scope: input.scope,
24
+ content: input.content,
25
+ source: {
26
+ type: input.sourceType,
27
+ id: input.sourceId,
28
+ surface: input.sourceSurface,
29
+ },
30
+ expiresAt,
31
+ });
32
+ return { ok: true, message: `Saved memory ${entry.id}`, data: entry };
33
+ },
34
+ };
35
+ }
36
+ export function createMemorySearchTool(memory) {
37
+ return {
38
+ name: "memory.search",
39
+ description: "Search saved memories using semantic similarity.",
40
+ tier: "standard",
41
+ category: "memory",
42
+ source: "builtin",
43
+ parameters: {
44
+ type: "object",
45
+ properties: {
46
+ query: { type: "string" },
47
+ limit: { type: "number" },
48
+ scope: { type: "string", enum: ["workspace", "project", "contact"] },
49
+ },
50
+ required: ["query"],
51
+ },
52
+ async execute(input) {
53
+ const results = await memory.search(input.query, input.limit ?? 5, input.scope);
54
+ return { ok: true, message: `Found ${results.length} memories`, data: results };
55
+ },
56
+ };
57
+ }
58
+ export function createMemoryForgetTool(memory) {
59
+ return {
60
+ name: "memory.forget",
61
+ description: "Forget a memory by ID.",
62
+ tier: "standard",
63
+ category: "memory",
64
+ source: "builtin",
65
+ parameters: {
66
+ type: "object",
67
+ properties: {
68
+ id: { type: "string" },
69
+ },
70
+ required: ["id"],
71
+ },
72
+ async execute(input) {
73
+ const removed = await memory.forget(input.id);
74
+ return { ok: removed, message: removed ? `Forgot memory ${input.id}` : `Memory ${input.id} not found` };
75
+ },
76
+ };
77
+ }
78
+ //# sourceMappingURL=memory-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-tools.js","sourceRoot":"","sources":["../../src/tools/memory-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Meta-tools — tools.search and tools.list
3
+ *
4
+ * These are "discovery" tools that let the LLM find and load tool schemas
5
+ * on demand, rather than sending all 40+ schemas in every request.
6
+ *
7
+ * tools.list — Returns a brief catalogue of all available tools grouped by
8
+ * category, with tier badges. Lightweight (names + one-liners).
9
+ * tools.search — Searches tools by keyword and returns FULL schemas so the
10
+ * LLM can use them in subsequent rounds.
11
+ *
12
+ * Both are tier: "core" so they're always available.
13
+ */
14
+ import type { ToolDefinition } from "./contracts.js";
15
+ import type { ToolRegistry } from "./registry.js";
16
+ interface ToolsListInput {
17
+ category?: string;
18
+ }
19
+ export declare function createToolsListTool(registry: ToolRegistry): ToolDefinition<ToolsListInput>;
20
+ interface ToolsSearchInput {
21
+ query: string;
22
+ }
23
+ export declare function createToolsSearchTool(registry: ToolRegistry): ToolDefinition<ToolsSearchInput>;
24
+ export {};
25
+ //# sourceMappingURL=meta-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-tools.d.ts","sourceRoot":"","sources":["../../src/tools/meta-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAKlD,UAAU,cAAc;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,cAAc,CAAC,cAAc,CAAC,CAuE1F;AAID,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,GAAG,cAAc,CAAC,gBAAgB,CAAC,CA+C9F"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Meta-tools — tools.search and tools.list
3
+ *
4
+ * These are "discovery" tools that let the LLM find and load tool schemas
5
+ * on demand, rather than sending all 40+ schemas in every request.
6
+ *
7
+ * tools.list — Returns a brief catalogue of all available tools grouped by
8
+ * category, with tier badges. Lightweight (names + one-liners).
9
+ * tools.search — Searches tools by keyword and returns FULL schemas so the
10
+ * LLM can use them in subsequent rounds.
11
+ *
12
+ * Both are tier: "core" so they're always available.
13
+ */
14
+ import { toOpenAIName } from "./agent-loop.js";
15
+ export function createToolsListTool(registry) {
16
+ return {
17
+ name: "tools.list",
18
+ description: "List all available tools grouped by category. Use this to discover what tools exist before calling tools.search for full schemas. Optionally filter by category.",
19
+ parameters: {
20
+ type: "object",
21
+ properties: {
22
+ category: {
23
+ type: "string",
24
+ description: "Optional category filter: terminal, filesystem, os, surfaces, scheduler, gateway, screen, browser, web, memory, voice, agent, meta, external",
25
+ enum: [
26
+ "terminal",
27
+ "filesystem",
28
+ "os",
29
+ "surfaces",
30
+ "scheduler",
31
+ "gateway",
32
+ "screen",
33
+ "browser",
34
+ "web",
35
+ "memory",
36
+ "voice",
37
+ "agent",
38
+ "meta",
39
+ "external",
40
+ ],
41
+ },
42
+ },
43
+ required: [],
44
+ },
45
+ tier: "core",
46
+ category: "meta",
47
+ source: "builtin",
48
+ async execute(input) {
49
+ let tools = registry.listInfo();
50
+ if (input.category) {
51
+ tools = tools.filter((t) => t.category === input.category);
52
+ }
53
+ // Group by category
54
+ const grouped = new Map();
55
+ for (const t of tools) {
56
+ const cat = t.category;
57
+ if (!grouped.has(cat))
58
+ grouped.set(cat, []);
59
+ grouped.get(cat).push(t);
60
+ }
61
+ const lines = [];
62
+ for (const [cat, items] of grouped) {
63
+ lines.push(`## ${cat}`);
64
+ for (const t of items) {
65
+ const tierBadge = t.tier === "core" ? " [core]" : t.tier === "external" ? " [external]" : "";
66
+ lines.push(`- **${t.name}**${tierBadge}: ${t.description}`);
67
+ }
68
+ lines.push("");
69
+ }
70
+ return {
71
+ ok: true,
72
+ message: `Found ${tools.length} tool(s) across ${grouped.size} category/categories.`,
73
+ data: {
74
+ total: tools.length,
75
+ categories: [...grouped.keys()],
76
+ catalogue: lines.join("\n"),
77
+ },
78
+ };
79
+ },
80
+ };
81
+ }
82
+ export function createToolsSearchTool(registry) {
83
+ return {
84
+ name: "tools.search",
85
+ description: "Search available tools by keyword and return their FULL schemas (name, description, parameters). Call this when you need a tool that isn\u2019t in your current set \u2014 e.g. browser, cron, memory, screen, voice, or any MCP tool.",
86
+ parameters: {
87
+ type: "object",
88
+ properties: {
89
+ query: {
90
+ type: "string",
91
+ description: "Search keyword(s). Matches against tool names, descriptions, and categories. Examples: 'browser', 'schedule cron', 'memory save', 'screenshot'.",
92
+ },
93
+ },
94
+ required: ["query"],
95
+ },
96
+ tier: "core",
97
+ category: "meta",
98
+ source: "builtin",
99
+ async execute(input) {
100
+ const results = registry.search(input.query);
101
+ if (results.length === 0) {
102
+ return {
103
+ ok: true,
104
+ message: `No tools found matching "${input.query}". Try broader keywords or use tools.list to see all available tools.`,
105
+ data: { matches: [] },
106
+ };
107
+ }
108
+ // Return full schemas so the LLM can use them
109
+ const schemas = results.map((t) => ({
110
+ name: t.name,
111
+ openai_name: toOpenAIName(t.name),
112
+ description: t.description,
113
+ tier: t.tier ?? "standard",
114
+ category: t.category ?? "external",
115
+ parameters: t.parameters,
116
+ }));
117
+ return {
118
+ ok: true,
119
+ message: `Found ${results.length} tool(s) matching "${input.query}". You can now call these tools directly.`,
120
+ data: { matches: schemas },
121
+ };
122
+ },
123
+ };
124
+ }
125
+ //# sourceMappingURL=meta-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-tools.js","sourceRoot":"","sources":["../../src/tools/meta-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ToolDefinition } from "./contracts.js";
2
+ export interface NetworkScanHost {
3
+ ip: string;
4
+ mac: string | null;
5
+ hostname: string | null;
6
+ alive: boolean;
7
+ openPorts: number[];
8
+ sshReachable: boolean;
9
+ agentStatus: "not-installed" | "installed" | "running" | "unreachable";
10
+ lastSeen: string;
11
+ }
12
+ export interface NetworkScanData {
13
+ subnet: string;
14
+ hosts: NetworkScanHost[];
15
+ scannedAt: string;
16
+ durationMs: number;
17
+ }
18
+ export declare function getLatestNetworkScan(): NetworkScanData | null;
19
+ export declare function setLatestNetworkScan(data: NetworkScanData): void;
20
+ export declare function createNetworkScanTool(): ToolDefinition;
21
+ //# sourceMappingURL=network-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-tools.d.ts","sourceRoot":"","sources":["../../src/tools/network-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,gBAAgB,CAAC;AAuEjE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,eAAe,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;IACvE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAKD,wBAAgB,oBAAoB,IAAI,eAAe,GAAG,IAAI,CAE7D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAEhE;AAMD,wBAAgB,qBAAqB,IAAI,cAAc,CAkItD"}
@@ -0,0 +1,189 @@
1
+ import { exec } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { platform, networkInterfaces } from "node:os";
4
+ import { createConnection } from "node:net";
5
+ const execAsync = promisify(exec);
6
+ // ---------------------------------------------------------------------------
7
+ // Helpers (shared with routes/network.ts — extract later if needed)
8
+ // ---------------------------------------------------------------------------
9
+ function getLocalSubnets() {
10
+ const ifaces = networkInterfaces();
11
+ const subnets = [];
12
+ for (const entries of Object.values(ifaces)) {
13
+ if (!entries)
14
+ continue;
15
+ for (const entry of entries) {
16
+ if (entry.family === "IPv4" && !entry.internal) {
17
+ // Skip link-local / APIPA addresses (169.254.x.x)
18
+ if (entry.address.startsWith("169.254."))
19
+ continue;
20
+ const parts = entry.address.split(".");
21
+ subnets.push(parts.slice(0, 3).join("."));
22
+ }
23
+ }
24
+ }
25
+ return [...new Set(subnets)];
26
+ }
27
+ function parseArpTable(output) {
28
+ const results = [];
29
+ const lineRegex = /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(?:at\s+)?([0-9a-fA-F]{2}[:-][0-9a-fA-F]{2}[:-][0-9a-fA-F]{2}[:-][0-9a-fA-F]{2}[:-][0-9a-fA-F]{2}[:-][0-9a-fA-F]{2})/;
30
+ for (const line of output.split("\n")) {
31
+ const match = lineRegex.exec(line);
32
+ if (match) {
33
+ results.push({ ip: match[1], mac: match[2].replace(/-/g, ":").toLowerCase() });
34
+ }
35
+ }
36
+ return results;
37
+ }
38
+ function probePort(ip, port, timeoutMs = 2000) {
39
+ return new Promise((resolve) => {
40
+ const socket = createConnection({ host: ip, port, timeout: timeoutMs });
41
+ socket.once("connect", () => { socket.destroy(); resolve(true); });
42
+ socket.once("timeout", () => { socket.destroy(); resolve(false); });
43
+ socket.once("error", () => { socket.destroy(); resolve(false); });
44
+ });
45
+ }
46
+ async function reverseResolve(ip) {
47
+ try {
48
+ const cmd = platform() === "win32"
49
+ ? `nslookup ${ip} 2>nul`
50
+ : `host ${ip} 2>/dev/null || true`;
51
+ const { stdout } = await execAsync(cmd, { timeout: 3000 });
52
+ const winMatch = /Name:\s+(\S+)/i.exec(stdout);
53
+ if (winMatch)
54
+ return winMatch[1];
55
+ const linMatch = /pointer\s+(\S+)/i.exec(stdout);
56
+ if (linMatch)
57
+ return linMatch[1].replace(/\.$/, "");
58
+ return null;
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ /** In-memory cache of the latest scan result, populated by the tool/job */
65
+ let latestScan = null;
66
+ export function getLatestNetworkScan() {
67
+ return latestScan;
68
+ }
69
+ export function setLatestNetworkScan(data) {
70
+ latestScan = data;
71
+ }
72
+ // ---------------------------------------------------------------------------
73
+ // Tool definitions
74
+ // ---------------------------------------------------------------------------
75
+ export function createNetworkScanTool() {
76
+ return {
77
+ name: "network.scan",
78
+ description: "Scan the local network using ARP + port probing. Discovers hosts, checks SSH (port 22), and detects running Jait gateway nodes. Returns a summary of discovered hosts.",
79
+ tier: "standard",
80
+ category: "network",
81
+ source: "builtin",
82
+ parameters: {
83
+ type: "object",
84
+ properties: {
85
+ subnet: {
86
+ type: "string",
87
+ description: 'Target subnet prefix (e.g. "192.168.1"). If omitted, auto-detects from local interfaces.',
88
+ },
89
+ },
90
+ },
91
+ execute: async (input) => {
92
+ const { subnet: targetSubnet } = (input ?? {});
93
+ const subnets = targetSubnet ? [targetSubnet] : getLocalSubnets();
94
+ if (subnets.length === 0) {
95
+ return { ok: false, message: "No active IPv4 subnets found" };
96
+ }
97
+ const start = Date.now();
98
+ // 1. Collect / refresh ARP table
99
+ let arpEntries = [];
100
+ try {
101
+ const { stdout } = await execAsync("arp -a", { timeout: 10000 });
102
+ arpEntries = parseArpTable(stdout);
103
+ }
104
+ catch {
105
+ // continue without ARP
106
+ }
107
+ // 2. Quick ping sweep for every detected subnet to populate ARP cache
108
+ try {
109
+ for (const subnet of subnets) {
110
+ if (platform() === "win32") {
111
+ const pingCmd = Array.from({ length: 254 }, (_, i) => `start /b ping -n 1 -w 500 ${subnet}.${i + 1} > nul 2>&1`).join(" & ");
112
+ await execAsync(pingCmd, { timeout: 30000 }).catch(() => { });
113
+ }
114
+ else {
115
+ const pingCmd = `for i in $(seq 1 254); do ping -c 1 -W 1 ${subnet}.$i & done; wait`;
116
+ await execAsync(pingCmd, { timeout: 30000, shell: "/bin/bash" }).catch(() => { });
117
+ }
118
+ }
119
+ // Re-read ARP table after all sweeps
120
+ const { stdout } = await execAsync("arp -a", { timeout: 10000 });
121
+ arpEntries = parseArpTable(stdout);
122
+ }
123
+ catch {
124
+ // use existing ARP entries
125
+ }
126
+ // 3. Filter to subnet
127
+ const subnetFiltered = arpEntries.filter((e) => subnets.some((s) => e.ip.startsWith(s + ".")));
128
+ // 4. Probe ports in parallel
129
+ const PROBE_PORTS = [22, 80, 443, 8000, 8080];
130
+ const hosts = await Promise.all(subnetFiltered.map(async (entry) => {
131
+ const portResults = await Promise.all(PROBE_PORTS.map(async (port) => ({
132
+ port,
133
+ open: await probePort(entry.ip, port, 1500),
134
+ })));
135
+ const openPorts = portResults.filter((p) => p.open).map((p) => p.port);
136
+ const sshReachable = openPorts.includes(22);
137
+ const hostname = await reverseResolve(entry.ip);
138
+ let agentStatus = "not-installed";
139
+ if (openPorts.includes(8000)) {
140
+ try {
141
+ const res = await fetch(`http://${entry.ip}:8000/health`, {
142
+ signal: AbortSignal.timeout(2000),
143
+ });
144
+ if (res.ok) {
145
+ const health = (await res.json());
146
+ if (health.name === "jait-gateway")
147
+ agentStatus = "running";
148
+ }
149
+ }
150
+ catch {
151
+ agentStatus = "not-installed";
152
+ }
153
+ }
154
+ return {
155
+ ip: entry.ip,
156
+ mac: entry.mac,
157
+ hostname,
158
+ alive: true,
159
+ openPorts,
160
+ sshReachable,
161
+ agentStatus,
162
+ lastSeen: new Date().toISOString(),
163
+ };
164
+ }));
165
+ // Sort by IP
166
+ hosts.sort((a, b) => {
167
+ const aNum = a.ip.split(".").map(Number).reduce((sum, n) => sum * 256 + n, 0);
168
+ const bNum = b.ip.split(".").map(Number).reduce((sum, n) => sum * 256 + n, 0);
169
+ return aNum - bNum;
170
+ });
171
+ const result = {
172
+ subnet: subnets.map(s => s + ".0/24").join(", "),
173
+ hosts,
174
+ scannedAt: new Date().toISOString(),
175
+ durationMs: Date.now() - start,
176
+ };
177
+ // Cache for the UI network panel
178
+ latestScan = result;
179
+ const gatewayCount = hosts.filter((h) => h.agentStatus === "running").length;
180
+ const sshCount = hosts.filter((h) => h.sshReachable).length;
181
+ return {
182
+ ok: true,
183
+ message: `Network scan complete: ${hosts.length} hosts found (${sshCount} with SSH, ${gatewayCount} running Jait Gateway)`,
184
+ data: result,
185
+ };
186
+ },
187
+ };
188
+ }
189
+ //# sourceMappingURL=network-tools.js.map