@bazaar.ai/mcp-human-agents 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 (259) hide show
  1. package/.env.example +15 -0
  2. package/README.md +178 -0
  3. package/dist/mcp-server/src/bin.d.ts +3 -0
  4. package/dist/mcp-server/src/bin.d.ts.map +1 -0
  5. package/dist/mcp-server/src/bin.js +10 -0
  6. package/dist/mcp-server/src/bin.js.map +1 -0
  7. package/dist/mcp-server/src/cli/setup.d.ts +2 -0
  8. package/dist/mcp-server/src/cli/setup.d.ts.map +1 -0
  9. package/dist/mcp-server/src/cli/setup.js +274 -0
  10. package/dist/mcp-server/src/cli/setup.js.map +1 -0
  11. package/dist/mcp-server/src/config/defaults.d.ts +16 -0
  12. package/dist/mcp-server/src/config/defaults.d.ts.map +1 -0
  13. package/dist/mcp-server/src/config/defaults.js +19 -0
  14. package/dist/mcp-server/src/config/defaults.js.map +1 -0
  15. package/dist/mcp-server/src/config/env.d.ts +73 -0
  16. package/dist/mcp-server/src/config/env.d.ts.map +1 -0
  17. package/dist/mcp-server/src/config/env.js +72 -0
  18. package/dist/mcp-server/src/config/env.js.map +1 -0
  19. package/dist/mcp-server/src/config/index.d.ts +3 -0
  20. package/dist/mcp-server/src/config/index.d.ts.map +1 -0
  21. package/dist/mcp-server/src/config/index.js +22 -0
  22. package/dist/mcp-server/src/config/index.js.map +1 -0
  23. package/dist/mcp-server/src/context/generator.d.ts +16 -0
  24. package/dist/mcp-server/src/context/generator.d.ts.map +1 -0
  25. package/dist/mcp-server/src/context/generator.js +61 -0
  26. package/dist/mcp-server/src/context/generator.js.map +1 -0
  27. package/dist/mcp-server/src/context/index.d.ts +3 -0
  28. package/dist/mcp-server/src/context/index.d.ts.map +1 -0
  29. package/dist/mcp-server/src/context/index.js +10 -0
  30. package/dist/mcp-server/src/context/index.js.map +1 -0
  31. package/dist/mcp-server/src/context/templates.d.ts +8 -0
  32. package/dist/mcp-server/src/context/templates.d.ts.map +1 -0
  33. package/dist/mcp-server/src/context/templates.js +41 -0
  34. package/dist/mcp-server/src/context/templates.js.map +1 -0
  35. package/dist/mcp-server/src/git/branch.d.ts +13 -0
  36. package/dist/mcp-server/src/git/branch.d.ts.map +1 -0
  37. package/dist/mcp-server/src/git/branch.js +49 -0
  38. package/dist/mcp-server/src/git/branch.js.map +1 -0
  39. package/dist/mcp-server/src/git/diff.d.ts +10 -0
  40. package/dist/mcp-server/src/git/diff.d.ts.map +1 -0
  41. package/dist/mcp-server/src/git/diff.js +39 -0
  42. package/dist/mcp-server/src/git/diff.js.map +1 -0
  43. package/dist/mcp-server/src/git/index.d.ts +5 -0
  44. package/dist/mcp-server/src/git/index.d.ts.map +1 -0
  45. package/dist/mcp-server/src/git/index.js +16 -0
  46. package/dist/mcp-server/src/git/index.js.map +1 -0
  47. package/dist/mcp-server/src/git/merge.d.ts +6 -0
  48. package/dist/mcp-server/src/git/merge.d.ts.map +1 -0
  49. package/dist/mcp-server/src/git/merge.js +30 -0
  50. package/dist/mcp-server/src/git/merge.js.map +1 -0
  51. package/dist/mcp-server/src/git/worktree.d.ts +11 -0
  52. package/dist/mcp-server/src/git/worktree.d.ts.map +1 -0
  53. package/dist/mcp-server/src/git/worktree.js +38 -0
  54. package/dist/mcp-server/src/git/worktree.js.map +1 -0
  55. package/dist/mcp-server/src/http-wrapper.d.ts +6 -0
  56. package/dist/mcp-server/src/http-wrapper.d.ts.map +1 -0
  57. package/dist/mcp-server/src/http-wrapper.js +85 -0
  58. package/dist/mcp-server/src/http-wrapper.js.map +1 -0
  59. package/dist/mcp-server/src/index.d.ts +2 -0
  60. package/dist/mcp-server/src/index.d.ts.map +1 -0
  61. package/dist/mcp-server/src/index.js +28 -0
  62. package/dist/mcp-server/src/index.js.map +1 -0
  63. package/dist/mcp-server/src/platform-client/client.d.ts +17 -0
  64. package/dist/mcp-server/src/platform-client/client.d.ts.map +1 -0
  65. package/dist/mcp-server/src/platform-client/client.js +68 -0
  66. package/dist/mcp-server/src/platform-client/client.js.map +1 -0
  67. package/dist/mcp-server/src/platform-client/index.d.ts +5 -0
  68. package/dist/mcp-server/src/platform-client/index.d.ts.map +1 -0
  69. package/dist/mcp-server/src/platform-client/index.js +10 -0
  70. package/dist/mcp-server/src/platform-client/index.js.map +1 -0
  71. package/dist/mcp-server/src/platform-client/mock-client.d.ts +28 -0
  72. package/dist/mcp-server/src/platform-client/mock-client.d.ts.map +1 -0
  73. package/dist/mcp-server/src/platform-client/mock-client.js +75 -0
  74. package/dist/mcp-server/src/platform-client/mock-client.js.map +1 -0
  75. package/dist/mcp-server/src/platform-client/polling.d.ts +9 -0
  76. package/dist/mcp-server/src/platform-client/polling.d.ts.map +1 -0
  77. package/dist/mcp-server/src/platform-client/polling.js +40 -0
  78. package/dist/mcp-server/src/platform-client/polling.js.map +1 -0
  79. package/dist/mcp-server/src/platform-client/types.d.ts +2 -0
  80. package/dist/mcp-server/src/platform-client/types.d.ts.map +1 -0
  81. package/dist/mcp-server/src/platform-client/types.js +3 -0
  82. package/dist/mcp-server/src/platform-client/types.js.map +1 -0
  83. package/dist/mcp-server/src/provisioning/authorized-keys.d.ts +14 -0
  84. package/dist/mcp-server/src/provisioning/authorized-keys.d.ts.map +1 -0
  85. package/dist/mcp-server/src/provisioning/authorized-keys.js +48 -0
  86. package/dist/mcp-server/src/provisioning/authorized-keys.js.map +1 -0
  87. package/dist/mcp-server/src/provisioning/cleanup.d.ts +19 -0
  88. package/dist/mcp-server/src/provisioning/cleanup.d.ts.map +1 -0
  89. package/dist/mcp-server/src/provisioning/cleanup.js +96 -0
  90. package/dist/mcp-server/src/provisioning/cleanup.js.map +1 -0
  91. package/dist/mcp-server/src/provisioning/index.d.ts +6 -0
  92. package/dist/mcp-server/src/provisioning/index.d.ts.map +1 -0
  93. package/dist/mcp-server/src/provisioning/index.js +24 -0
  94. package/dist/mcp-server/src/provisioning/index.js.map +1 -0
  95. package/dist/mcp-server/src/provisioning/linux-user.d.ts +15 -0
  96. package/dist/mcp-server/src/provisioning/linux-user.d.ts.map +1 -0
  97. package/dist/mcp-server/src/provisioning/linux-user.js +62 -0
  98. package/dist/mcp-server/src/provisioning/linux-user.js.map +1 -0
  99. package/dist/mcp-server/src/provisioning/privileged.d.ts +40 -0
  100. package/dist/mcp-server/src/provisioning/privileged.d.ts.map +1 -0
  101. package/dist/mcp-server/src/provisioning/privileged.js +123 -0
  102. package/dist/mcp-server/src/provisioning/privileged.js.map +1 -0
  103. package/dist/mcp-server/src/provisioning/ssh-config.d.ts +21 -0
  104. package/dist/mcp-server/src/provisioning/ssh-config.d.ts.map +1 -0
  105. package/dist/mcp-server/src/provisioning/ssh-config.js +161 -0
  106. package/dist/mcp-server/src/provisioning/ssh-config.js.map +1 -0
  107. package/dist/mcp-server/src/provisioning/tmux-session.d.ts +37 -0
  108. package/dist/mcp-server/src/provisioning/tmux-session.d.ts.map +1 -0
  109. package/dist/mcp-server/src/provisioning/tmux-session.js +123 -0
  110. package/dist/mcp-server/src/provisioning/tmux-session.js.map +1 -0
  111. package/dist/mcp-server/src/server.d.ts +3 -0
  112. package/dist/mcp-server/src/server.d.ts.map +1 -0
  113. package/dist/mcp-server/src/server.js +67 -0
  114. package/dist/mcp-server/src/server.js.map +1 -0
  115. package/dist/mcp-server/src/state/gig-store.d.ts +19 -0
  116. package/dist/mcp-server/src/state/gig-store.d.ts.map +1 -0
  117. package/dist/mcp-server/src/state/gig-store.js +52 -0
  118. package/dist/mcp-server/src/state/gig-store.js.map +1 -0
  119. package/dist/mcp-server/src/state/index.d.ts +4 -0
  120. package/dist/mcp-server/src/state/index.d.ts.map +1 -0
  121. package/dist/mcp-server/src/state/index.js +8 -0
  122. package/dist/mcp-server/src/state/index.js.map +1 -0
  123. package/dist/mcp-server/src/state/persistence.d.ts +13 -0
  124. package/dist/mcp-server/src/state/persistence.d.ts.map +1 -0
  125. package/dist/mcp-server/src/state/persistence.js +48 -0
  126. package/dist/mcp-server/src/state/persistence.js.map +1 -0
  127. package/dist/mcp-server/src/state/types.d.ts +15 -0
  128. package/dist/mcp-server/src/state/types.d.ts.map +1 -0
  129. package/dist/mcp-server/src/state/types.js +3 -0
  130. package/dist/mcp-server/src/state/types.js.map +1 -0
  131. package/dist/mcp-server/src/tools/dismiss-human.d.ts +25 -0
  132. package/dist/mcp-server/src/tools/dismiss-human.d.ts.map +1 -0
  133. package/dist/mcp-server/src/tools/dismiss-human.js +78 -0
  134. package/dist/mcp-server/src/tools/dismiss-human.js.map +1 -0
  135. package/dist/mcp-server/src/tools/index.d.ts +9 -0
  136. package/dist/mcp-server/src/tools/index.d.ts.map +1 -0
  137. package/dist/mcp-server/src/tools/index.js +20 -0
  138. package/dist/mcp-server/src/tools/index.js.map +1 -0
  139. package/dist/mcp-server/src/tools/list-humans.d.ts +18 -0
  140. package/dist/mcp-server/src/tools/list-humans.d.ts.map +1 -0
  141. package/dist/mcp-server/src/tools/list-humans.js +35 -0
  142. package/dist/mcp-server/src/tools/list-humans.js.map +1 -0
  143. package/dist/mcp-server/src/tools/message-human.d.ts +10 -0
  144. package/dist/mcp-server/src/tools/message-human.d.ts.map +1 -0
  145. package/dist/mcp-server/src/tools/message-human.js +19 -0
  146. package/dist/mcp-server/src/tools/message-human.js.map +1 -0
  147. package/dist/mcp-server/src/tools/schemas/dismiss-human.schema.d.ts +19 -0
  148. package/dist/mcp-server/src/tools/schemas/dismiss-human.schema.d.ts.map +1 -0
  149. package/dist/mcp-server/src/tools/schemas/dismiss-human.schema.js +22 -0
  150. package/dist/mcp-server/src/tools/schemas/dismiss-human.schema.js.map +1 -0
  151. package/dist/mcp-server/src/tools/schemas/list-humans.schema.d.ts +4 -0
  152. package/dist/mcp-server/src/tools/schemas/list-humans.schema.d.ts.map +1 -0
  153. package/dist/mcp-server/src/tools/schemas/list-humans.schema.js +7 -0
  154. package/dist/mcp-server/src/tools/schemas/list-humans.schema.js.map +1 -0
  155. package/dist/mcp-server/src/tools/schemas/message-human.schema.d.ts +13 -0
  156. package/dist/mcp-server/src/tools/schemas/message-human.schema.d.ts.map +1 -0
  157. package/dist/mcp-server/src/tools/schemas/message-human.schema.js +9 -0
  158. package/dist/mcp-server/src/tools/schemas/message-human.schema.js.map +1 -0
  159. package/dist/mcp-server/src/tools/schemas/summon-human.schema.d.ts +22 -0
  160. package/dist/mcp-server/src/tools/schemas/summon-human.schema.d.ts.map +1 -0
  161. package/dist/mcp-server/src/tools/schemas/summon-human.schema.js +18 -0
  162. package/dist/mcp-server/src/tools/schemas/summon-human.schema.js.map +1 -0
  163. package/dist/mcp-server/src/tools/summon-human.d.ts +31 -0
  164. package/dist/mcp-server/src/tools/summon-human.d.ts.map +1 -0
  165. package/dist/mcp-server/src/tools/summon-human.js +137 -0
  166. package/dist/mcp-server/src/tools/summon-human.js.map +1 -0
  167. package/dist/mcp-server/src/tunnel/client.d.ts +16 -0
  168. package/dist/mcp-server/src/tunnel/client.d.ts.map +1 -0
  169. package/dist/mcp-server/src/tunnel/client.js +100 -0
  170. package/dist/mcp-server/src/tunnel/client.js.map +1 -0
  171. package/dist/mcp-server/src/tunnel/index.d.ts +6 -0
  172. package/dist/mcp-server/src/tunnel/index.d.ts.map +1 -0
  173. package/dist/mcp-server/src/tunnel/index.js +28 -0
  174. package/dist/mcp-server/src/tunnel/index.js.map +1 -0
  175. package/dist/mcp-server/src/utils/errors.d.ts +28 -0
  176. package/dist/mcp-server/src/utils/errors.d.ts.map +1 -0
  177. package/dist/mcp-server/src/utils/errors.js +66 -0
  178. package/dist/mcp-server/src/utils/errors.js.map +1 -0
  179. package/dist/mcp-server/src/utils/exec.d.ts +7 -0
  180. package/dist/mcp-server/src/utils/exec.d.ts.map +1 -0
  181. package/dist/mcp-server/src/utils/exec.js +22 -0
  182. package/dist/mcp-server/src/utils/exec.js.map +1 -0
  183. package/dist/mcp-server/src/utils/ip.d.ts +6 -0
  184. package/dist/mcp-server/src/utils/ip.d.ts.map +1 -0
  185. package/dist/mcp-server/src/utils/ip.js +33 -0
  186. package/dist/mcp-server/src/utils/ip.js.map +1 -0
  187. package/dist/mcp-server/src/utils/logger.d.ts +20 -0
  188. package/dist/mcp-server/src/utils/logger.d.ts.map +1 -0
  189. package/dist/mcp-server/src/utils/logger.js +41 -0
  190. package/dist/mcp-server/src/utils/logger.js.map +1 -0
  191. package/dist/shared/src/contractor.types.d.ts +20 -0
  192. package/dist/shared/src/contractor.types.d.ts.map +1 -0
  193. package/dist/shared/src/contractor.types.js +3 -0
  194. package/dist/shared/src/contractor.types.js.map +1 -0
  195. package/dist/shared/src/gig.types.d.ts +32 -0
  196. package/dist/shared/src/gig.types.d.ts.map +1 -0
  197. package/dist/shared/src/gig.types.js +21 -0
  198. package/dist/shared/src/gig.types.js.map +1 -0
  199. package/dist/shared/src/index.d.ts +5 -0
  200. package/dist/shared/src/index.d.ts.map +1 -0
  201. package/dist/shared/src/index.js +21 -0
  202. package/dist/shared/src/index.js.map +1 -0
  203. package/dist/shared/src/mcp-tool.types.d.ts +45 -0
  204. package/dist/shared/src/mcp-tool.types.d.ts.map +1 -0
  205. package/dist/shared/src/mcp-tool.types.js +3 -0
  206. package/dist/shared/src/mcp-tool.types.js.map +1 -0
  207. package/dist/shared/src/platform-api.types.d.ts +73 -0
  208. package/dist/shared/src/platform-api.types.d.ts.map +1 -0
  209. package/dist/shared/src/platform-api.types.js +3 -0
  210. package/dist/shared/src/platform-api.types.js.map +1 -0
  211. package/package.json +41 -0
  212. package/src/bin.ts +7 -0
  213. package/src/cli/setup.ts +317 -0
  214. package/src/config/defaults.ts +21 -0
  215. package/src/config/env.ts +74 -0
  216. package/src/config/index.ts +2 -0
  217. package/src/context/generator.ts +71 -0
  218. package/src/context/index.ts +6 -0
  219. package/src/context/templates.ts +41 -0
  220. package/src/git/branch.ts +46 -0
  221. package/src/git/diff.ts +34 -0
  222. package/src/git/index.ts +4 -0
  223. package/src/git/merge.ts +36 -0
  224. package/src/git/worktree.ts +42 -0
  225. package/src/http-wrapper.ts +94 -0
  226. package/src/index.ts +32 -0
  227. package/src/platform-client/client.ts +93 -0
  228. package/src/platform-client/index.ts +4 -0
  229. package/src/platform-client/mock-client.ts +92 -0
  230. package/src/platform-client/polling.ts +53 -0
  231. package/src/platform-client/types.ts +9 -0
  232. package/src/provisioning/authorized-keys.ts +52 -0
  233. package/src/provisioning/cleanup.ts +106 -0
  234. package/src/provisioning/index.ts +13 -0
  235. package/src/provisioning/linux-user.ts +66 -0
  236. package/src/provisioning/privileged.ts +128 -0
  237. package/src/provisioning/ssh-config.ts +197 -0
  238. package/src/provisioning/tmux-session.ts +136 -0
  239. package/src/server.ts +111 -0
  240. package/src/state/gig-store.ts +56 -0
  241. package/src/state/index.ts +3 -0
  242. package/src/state/persistence.ts +42 -0
  243. package/src/state/types.ts +14 -0
  244. package/src/tools/dismiss-human.ts +103 -0
  245. package/src/tools/index.ts +9 -0
  246. package/src/tools/list-humans.ts +54 -0
  247. package/src/tools/message-human.ts +28 -0
  248. package/src/tools/schemas/dismiss-human.schema.ts +21 -0
  249. package/src/tools/schemas/list-humans.schema.ts +6 -0
  250. package/src/tools/schemas/message-human.schema.ts +8 -0
  251. package/src/tools/schemas/summon-human.schema.ts +19 -0
  252. package/src/tools/summon-human.ts +180 -0
  253. package/src/tunnel/client.ts +116 -0
  254. package/src/tunnel/index.ts +26 -0
  255. package/src/utils/errors.ts +64 -0
  256. package/src/utils/exec.ts +29 -0
  257. package/src/utils/ip.ts +31 -0
  258. package/src/utils/logger.ts +55 -0
  259. package/tsconfig.json +20 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-humans.js","sourceRoot":"","sources":["../../../../src/tools/list-humans.ts"],"names":[],"mappings":";;AAuBA,gCA8BC;AApDD,qEAGyC;AAgBzC;;GAEG;AACI,KAAK,UAAU,UAAU,CAAC,QAAkB;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE7B,MAAM,WAAW,GAA2B,MAAM,OAAO,CAAC,GAAG,CAC3D,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,SAAS,GAAG,MAAM,IAAA,oCAAkB,EAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG,MAAM,IAAA,iCAAe,EAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAE5D,IAAI,MAAwC,CAAC;QAC7C,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;aAAM,IAAI,SAAS,EAAE,CAAC;YACrB,MAAM,GAAG,WAAW,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,CAAC;QAClB,CAAC;QAED,OAAO;YACL,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI,EAAE,GAAG,CAAC,cAAc;YACxB,MAAM;YACN,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,cAAc,EAAE,GAAG,CAAC,SAAS;YAC7B,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE;YACzC,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,EAAE,WAAW,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { GigStore } from "../state/index.js";
2
+ import type { MessageHumanInput } from "./schemas/message-human.schema.js";
3
+ export interface MessageHumanResult {
4
+ delivered: boolean;
5
+ }
6
+ /**
7
+ * message_human — send a message into the contractor's tmux session.
8
+ */
9
+ export declare function messageHuman(input: MessageHumanInput, gigStore: GigStore): Promise<MessageHumanResult>;
10
+ //# sourceMappingURL=message-human.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-human.d.ts","sourceRoot":"","sources":["../../../../src/tools/message-human.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,kBAAkB,CAAC,CAY7B"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.messageHuman = messageHuman;
4
+ const tmux_session_js_1 = require("../provisioning/tmux-session.js");
5
+ const logger_js_1 = require("../utils/logger.js");
6
+ /**
7
+ * message_human — send a message into the contractor's tmux session.
8
+ */
9
+ async function messageHuman(input, gigStore) {
10
+ const gig = gigStore.get(input.gigId);
11
+ const delivered = await (0, tmux_session_js_1.displayMessage)(gig.tmuxSession, input.message);
12
+ logger_js_1.logger.info("Message sent to contractor", {
13
+ gigId: input.gigId,
14
+ contractorName: gig.contractorName,
15
+ delivered,
16
+ });
17
+ return { delivered };
18
+ }
19
+ //# sourceMappingURL=message-human.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-human.js","sourceRoot":"","sources":["../../../../src/tools/message-human.ts"],"names":[],"mappings":";;AAYA,oCAeC;AA1BD,qEAAiE;AACjE,kDAA4C;AAO5C;;GAEG;AACI,KAAK,UAAU,YAAY,CAChC,KAAwB,EACxB,QAAkB;IAElB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEtC,MAAM,SAAS,GAAG,MAAM,IAAA,gCAAc,EAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAEvE,kBAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;QACxC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,SAAS;KACV,CAAC,CAAC;IAEH,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ export declare const DismissHumanInputSchema: z.ZodObject<{
3
+ gigId: z.ZodString;
4
+ merge: z.ZodBoolean;
5
+ rating: z.ZodOptional<z.ZodNumber>;
6
+ resolutionNotes: z.ZodOptional<z.ZodString>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ gigId: string;
9
+ merge: boolean;
10
+ rating?: number | undefined;
11
+ resolutionNotes?: string | undefined;
12
+ }, {
13
+ gigId: string;
14
+ merge: boolean;
15
+ rating?: number | undefined;
16
+ resolutionNotes?: string | undefined;
17
+ }>;
18
+ export type DismissHumanInput = z.infer<typeof DismissHumanInputSchema>;
19
+ //# sourceMappingURL=dismiss-human.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dismiss-human.schema.d.ts","sourceRoot":"","sources":["../../../../../src/tools/schemas/dismiss-human.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAgBlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DismissHumanInputSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.DismissHumanInputSchema = zod_1.z.object({
6
+ gigId: zod_1.z.string().describe("The gig ID to dismiss"),
7
+ merge: zod_1.z
8
+ .boolean()
9
+ .describe("Whether to merge contractor's changes into working branch"),
10
+ rating: zod_1.z
11
+ .number()
12
+ .int()
13
+ .min(1)
14
+ .max(5)
15
+ .optional()
16
+ .describe("Rating 1-5 (optional, user can rate later via platform)"),
17
+ resolutionNotes: zod_1.z
18
+ .string()
19
+ .optional()
20
+ .describe("What was fixed (optional)"),
21
+ });
22
+ //# sourceMappingURL=dismiss-human.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dismiss-human.schema.js","sourceRoot":"","sources":["../../../../../src/tools/schemas/dismiss-human.schema.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAEX,QAAA,uBAAuB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC9C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACnD,KAAK,EAAE,OAAC;SACL,OAAO,EAAE;SACT,QAAQ,CAAC,2DAA2D,CAAC;IACxE,MAAM,EAAE,OAAC;SACN,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,yDAAyD,CAAC;IACtE,eAAe,EAAE,OAAC;SACf,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,2BAA2B,CAAC;CACzC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { z } from "zod";
2
+ export declare const ListHumansInputSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
3
+ export type ListHumansInput = z.infer<typeof ListHumansInputSchema>;
4
+ //# sourceMappingURL=list-humans.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-humans.schema.d.ts","sourceRoot":"","sources":["../../../../../src/tools/schemas/list-humans.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,qBAAqB,gDAAe,CAAC;AAElD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ListHumansInputSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ // list_humans takes no input
6
+ exports.ListHumansInputSchema = zod_1.z.object({});
7
+ //# sourceMappingURL=list-humans.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-humans.schema.js","sourceRoot":"","sources":["../../../../../src/tools/schemas/list-humans.schema.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB,6BAA6B;AAChB,QAAA,qBAAqB,GAAG,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { z } from "zod";
2
+ export declare const MessageHumanInputSchema: z.ZodObject<{
3
+ gigId: z.ZodString;
4
+ message: z.ZodString;
5
+ }, "strip", z.ZodTypeAny, {
6
+ message: string;
7
+ gigId: string;
8
+ }, {
9
+ message: string;
10
+ gigId: string;
11
+ }>;
12
+ export type MessageHumanInput = z.infer<typeof MessageHumanInputSchema>;
13
+ //# sourceMappingURL=message-human.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-human.schema.d.ts","sourceRoot":"","sources":["../../../../../src/tools/schemas/message-human.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,uBAAuB;;;;;;;;;EAGlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessageHumanInputSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.MessageHumanInputSchema = zod_1.z.object({
6
+ gigId: zod_1.z.string().describe("The gig ID of the contractor to message"),
7
+ message: zod_1.z.string().describe("The message to send"),
8
+ });
9
+ //# sourceMappingURL=message-human.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-human.schema.js","sourceRoot":"","sources":["../../../../../src/tools/schemas/message-human.schema.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAEX,QAAA,uBAAuB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC9C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IACrE,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;CACpD,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { z } from "zod";
2
+ export declare const SummonHumanInputSchema: z.ZodObject<{
3
+ reason: z.ZodString;
4
+ skills: z.ZodArray<z.ZodString, "many">;
5
+ context: z.ZodString;
6
+ urgency: z.ZodEnum<["low", "medium", "high"]>;
7
+ worktree: z.ZodEnum<["shared", "clean"]>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ reason: string;
10
+ skills: string[];
11
+ context: string;
12
+ urgency: "low" | "medium" | "high";
13
+ worktree: "shared" | "clean";
14
+ }, {
15
+ reason: string;
16
+ skills: string[];
17
+ context: string;
18
+ urgency: "low" | "medium" | "high";
19
+ worktree: "shared" | "clean";
20
+ }>;
21
+ export type SummonHumanInput = z.infer<typeof SummonHumanInputSchema>;
22
+ //# sourceMappingURL=summon-human.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summon-human.schema.d.ts","sourceRoot":"","sources":["../../../../../src/tools/schemas/summon-human.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;EAcjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SummonHumanInputSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.SummonHumanInputSchema = zod_1.z.object({
6
+ reason: zod_1.z.string().describe("Why the AI needs help"),
7
+ skills: zod_1.z.array(zod_1.z.string()).describe("What expertise is needed"),
8
+ context: zod_1.z
9
+ .string()
10
+ .describe("What was tried, what failed, relevant files"),
11
+ urgency: zod_1.z
12
+ .enum(["low", "medium", "high"])
13
+ .describe("How urgent is this request"),
14
+ worktree: zod_1.z
15
+ .enum(["shared", "clean"])
16
+ .describe("shared = human sees AI's dirty working state, clean = fresh checkout"),
17
+ });
18
+ //# sourceMappingURL=summon-human.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summon-human.schema.js","sourceRoot":"","sources":["../../../../../src/tools/schemas/summon-human.schema.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAEX,QAAA,sBAAsB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC7C,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACpD,MAAM,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAChE,OAAO,EAAE,OAAC;SACP,MAAM,EAAE;SACR,QAAQ,CAAC,6CAA6C,CAAC;IAC1D,OAAO,EAAE,OAAC;SACP,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;SAC/B,QAAQ,CAAC,4BAA4B,CAAC;IACzC,QAAQ,EAAE,OAAC;SACR,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;SACzB,QAAQ,CACP,sEAAsE,CACvE;CACJ,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { PlatformClient } from "../platform-client/client.js";
2
+ import { GigStore } from "../state/index.js";
3
+ import type { SummonHumanInput } from "./schemas/summon-human.schema.js";
4
+ export interface SummonHumanDeps {
5
+ platformClient: PlatformClient;
6
+ gigStore: GigStore;
7
+ }
8
+ export interface SummonHumanResult {
9
+ gigId: string;
10
+ contractorName: string;
11
+ sshCommand: string;
12
+ connectionMode: "tunnel" | "direct";
13
+ status: "waiting_for_connection";
14
+ }
15
+ /**
16
+ * summon_human — the most complex MCP tool.
17
+ *
18
+ * Orchestrates the full flow:
19
+ * 1. Detect repo info
20
+ * 2. POST gig to platform
21
+ * 3. Poll for contractor assignment
22
+ * 4. Create Linux user
23
+ * 5. Write SSH pubkey
24
+ * 6. Configure ForceCommand in sshd_config
25
+ * 7. Create tmux session
26
+ * 8. Write CONTEXT.md
27
+ * 9. Notify platform that VM is ready
28
+ * 10. Store active gig
29
+ */
30
+ export declare function summonHuman(input: SummonHumanInput, deps: SummonHumanDeps): Promise<SummonHumanResult>;
31
+ //# sourceMappingURL=summon-human.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summon-human.d.ts","sourceRoot":"","sources":["../../../../src/tools/summon-human.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAYnE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAK7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACpC,MAAM,EAAE,wBAAwB,CAAC;CAClC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAgI5B"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.summonHuman = summonHuman;
4
+ const polling_js_1 = require("../platform-client/polling.js");
5
+ const index_js_1 = require("../provisioning/index.js");
6
+ const index_js_2 = require("../git/index.js");
7
+ const worktree_js_1 = require("../git/worktree.js");
8
+ const index_js_3 = require("../context/index.js");
9
+ const env_js_1 = require("../config/env.js");
10
+ const ip_js_1 = require("../utils/ip.js");
11
+ const index_js_4 = require("../tunnel/index.js");
12
+ const logger_js_1 = require("../utils/logger.js");
13
+ /**
14
+ * summon_human — the most complex MCP tool.
15
+ *
16
+ * Orchestrates the full flow:
17
+ * 1. Detect repo info
18
+ * 2. POST gig to platform
19
+ * 3. Poll for contractor assignment
20
+ * 4. Create Linux user
21
+ * 5. Write SSH pubkey
22
+ * 6. Configure ForceCommand in sshd_config
23
+ * 7. Create tmux session
24
+ * 8. Write CONTEXT.md
25
+ * 9. Notify platform that VM is ready
26
+ * 10. Store active gig
27
+ */
28
+ async function summonHuman(input, deps) {
29
+ const env = (0, env_js_1.getEnv)();
30
+ // 1. Detect repo info
31
+ const repoRoot = await (0, index_js_2.getRepoRoot)();
32
+ const branch = await (0, index_js_2.getCurrentBranch)();
33
+ const repo = await (0, index_js_2.getRepoName)();
34
+ const vmIp = env.VM_EXTERNAL_IP === "auto"
35
+ ? await (0, ip_js_1.getExternalIp)()
36
+ : env.VM_EXTERNAL_IP;
37
+ const vmPort = env.VM_EXTERNAL_SSH_PORT;
38
+ logger_js_1.logger.info("Summoning human contractor", {
39
+ reason: input.reason,
40
+ skills: input.skills.join(", "),
41
+ urgency: input.urgency,
42
+ });
43
+ // 2. Create gig on platform.
44
+ // The MCP tool schema accepts lowercase urgency for readability
45
+ // ("low" / "medium" / "high" reads better in LLM tool descriptions),
46
+ // but the human-layer API Urgency type is uppercase. Translate here.
47
+ const { gigId } = await deps.platformClient.createGig({
48
+ reason: input.reason,
49
+ skills: input.skills,
50
+ context: input.context,
51
+ urgency: input.urgency.toUpperCase(),
52
+ worktreeMode: input.worktree,
53
+ vmIp,
54
+ repo,
55
+ branch,
56
+ projectId: env.PLATFORM_PROJECT_ID,
57
+ });
58
+ // 3. Poll for contractor assignment
59
+ const status = await (0, polling_js_1.pollForAssignment)(deps.platformClient, gigId);
60
+ const contractor = status.contractor;
61
+ logger_js_1.logger.info("Contractor assigned, provisioning access", {
62
+ gigId,
63
+ contractorName: contractor.name,
64
+ });
65
+ // 4. Create Linux user
66
+ await (0, index_js_1.createUser)(contractor.name);
67
+ // 5. Write SSH pubkey
68
+ await (0, index_js_1.writeAuthorizedKey)(contractor.name, contractor.pubkey);
69
+ // 6. Determine working directory
70
+ const tmuxSessionId = (0, index_js_1.sessionName)(gigId);
71
+ let worktreePath = repoRoot;
72
+ if (input.worktree === "clean") {
73
+ worktreePath = `/tmp/hl-worktree-${gigId}`;
74
+ await (0, worktree_js_1.createWorktree)(branch, worktreePath);
75
+ }
76
+ // 7. Create tmux session — owned by the contractor user so their
77
+ // SSH ForceCommand can attach to it. tmux scopes sessions per uid.
78
+ await (0, index_js_1.createSession)(tmuxSessionId, worktreePath, contractor.name);
79
+ // 8. Configure ForceCommand
80
+ await (0, index_js_1.addForceCommand)(contractor.name, tmuxSessionId);
81
+ // 9. Write CONTEXT.md
82
+ await (0, index_js_3.generateContext)({
83
+ reason: input.reason,
84
+ context: input.context,
85
+ skills: input.skills,
86
+ urgency: input.urgency,
87
+ repo,
88
+ branch,
89
+ worktreePath,
90
+ });
91
+ // 10. Set up connectivity: reverse tunnel or direct SSH
92
+ const useTunnel = env.TUNNEL_ENABLED;
93
+ let sshCommand;
94
+ if (useTunnel) {
95
+ // Open reverse tunnel — platform routes contractor traffic through it
96
+ const platformWsUrl = env.PLATFORM_API_URL.replace(/^http/, "ws");
97
+ const handle = (0, index_js_4.openTunnel)(platformWsUrl, env.PLATFORM_API_KEY, gigId);
98
+ (0, index_js_4.storeTunnel)(gigId, handle);
99
+ sshCommand = `(via tunnel to platform)`;
100
+ logger_js_1.logger.info("Reverse tunnel opened", { gigId });
101
+ }
102
+ else {
103
+ // Legacy direct-SSH mode: build SSH command with public IP/port
104
+ sshCommand =
105
+ vmPort === 22
106
+ ? `ssh ${contractor.name}@${vmIp}`
107
+ : `ssh ${contractor.name}@${vmIp} -p ${vmPort}`;
108
+ }
109
+ await deps.platformClient.markReady(gigId, sshCommand);
110
+ // 11. Store active gig
111
+ deps.gigStore.add({
112
+ gigId,
113
+ contractorName: contractor.name,
114
+ linuxUser: contractor.name,
115
+ tmuxSession: tmuxSessionId,
116
+ worktreePath: input.worktree === "clean" ? worktreePath : undefined,
117
+ sshCommand,
118
+ skills: input.skills,
119
+ rate: contractor.rate,
120
+ startedAt: new Date().toISOString(),
121
+ status: "active",
122
+ tunnelActive: useTunnel,
123
+ });
124
+ logger_js_1.logger.info("Human contractor summoned successfully", {
125
+ gigId,
126
+ contractorName: contractor.name,
127
+ connectionMode: useTunnel ? "tunnel" : "direct",
128
+ });
129
+ return {
130
+ gigId,
131
+ contractorName: contractor.name,
132
+ sshCommand,
133
+ connectionMode: useTunnel ? "tunnel" : "direct",
134
+ status: "waiting_for_connection",
135
+ };
136
+ }
137
+ //# sourceMappingURL=summon-human.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summon-human.js","sourceRoot":"","sources":["../../../../src/tools/summon-human.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface TunnelHandle {
2
+ close(): void;
3
+ }
4
+ /**
5
+ * Open a reverse tunnel WebSocket to the platform.
6
+ *
7
+ * The platform will route contractor web-terminal traffic through this
8
+ * tunnel. When data arrives, we relay it to localhost:22 (sshd) and
9
+ * send responses back through the WebSocket.
10
+ *
11
+ * The connection is lazy: the TCP socket to localhost:22 is only
12
+ * created when the first data frame arrives (triggered by the
13
+ * platform's ssh2 client initiating a handshake).
14
+ */
15
+ export declare function openTunnel(platformWsUrl: string, apiKey: string, gigId: string): TunnelHandle;
16
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/tunnel/client.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACxB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,YAAY,CA4Fd"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openTunnel = openTunnel;
4
+ const ws_1 = require("ws");
5
+ const node_net_1 = require("node:net");
6
+ const logger_js_1 = require("../utils/logger.js");
7
+ /**
8
+ * Open a reverse tunnel WebSocket to the platform.
9
+ *
10
+ * The platform will route contractor web-terminal traffic through this
11
+ * tunnel. When data arrives, we relay it to localhost:22 (sshd) and
12
+ * send responses back through the WebSocket.
13
+ *
14
+ * The connection is lazy: the TCP socket to localhost:22 is only
15
+ * created when the first data frame arrives (triggered by the
16
+ * platform's ssh2 client initiating a handshake).
17
+ */
18
+ function openTunnel(platformWsUrl, apiKey, gigId) {
19
+ const wsUrl = `${platformWsUrl}/ws/tunnel?gigId=${encodeURIComponent(gigId)}&token=${encodeURIComponent(apiKey)}`;
20
+ let ws = null;
21
+ let tcp = null;
22
+ let closed = false;
23
+ function connectWs() {
24
+ if (closed)
25
+ return;
26
+ ws = new ws_1.WebSocket(wsUrl);
27
+ ws.binaryType = "nodebuffer";
28
+ ws.on("open", () => {
29
+ logger_js_1.logger.info("Tunnel WebSocket connected", { gigId });
30
+ });
31
+ ws.on("message", (data) => {
32
+ if (!tcp) {
33
+ // Lazy-open TCP to local sshd on first data
34
+ tcp = (0, node_net_1.createConnection)({ host: "127.0.0.1", port: 22 }, () => {
35
+ logger_js_1.logger.info("Tunnel TCP connected to local sshd", { gigId });
36
+ // Send the buffered first frame
37
+ tcp.write(data);
38
+ });
39
+ tcp.on("data", (chunk) => {
40
+ if (ws && ws.readyState === ws_1.WebSocket.OPEN) {
41
+ ws.send(chunk);
42
+ }
43
+ });
44
+ tcp.on("close", () => {
45
+ logger_js_1.logger.info("Tunnel TCP closed", { gigId });
46
+ tcp = null;
47
+ // Don't close the WebSocket — a new terminal session may
48
+ // open another TCP connection via this same tunnel.
49
+ });
50
+ tcp.on("error", (err) => {
51
+ logger_js_1.logger.warn("Tunnel TCP error", {
52
+ gigId,
53
+ error: err.message,
54
+ });
55
+ tcp?.destroy();
56
+ tcp = null;
57
+ });
58
+ }
59
+ else {
60
+ tcp.write(data);
61
+ }
62
+ });
63
+ ws.on("close", (code, reason) => {
64
+ logger_js_1.logger.info("Tunnel WebSocket closed", {
65
+ gigId,
66
+ code,
67
+ reason: reason.toString(),
68
+ });
69
+ tcp?.destroy();
70
+ tcp = null;
71
+ // Reconnect with backoff unless explicitly closed
72
+ if (!closed) {
73
+ const delay = 3_000 + Math.random() * 2_000;
74
+ logger_js_1.logger.info("Tunnel reconnecting", { gigId, delayMs: Math.round(delay) });
75
+ setTimeout(connectWs, delay);
76
+ }
77
+ });
78
+ ws.on("error", (err) => {
79
+ logger_js_1.logger.warn("Tunnel WebSocket error", {
80
+ gigId,
81
+ error: err.message,
82
+ });
83
+ // on("close") will fire after this and handle reconnection
84
+ });
85
+ }
86
+ connectWs();
87
+ return {
88
+ close() {
89
+ closed = true;
90
+ tcp?.destroy();
91
+ tcp = null;
92
+ if (ws && ws.readyState === ws_1.WebSocket.OPEN) {
93
+ ws.close(1000, "Tunnel closed by MCP server");
94
+ }
95
+ ws = null;
96
+ logger_js_1.logger.info("Tunnel closed", { gigId });
97
+ },
98
+ };
99
+ }
100
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/tunnel/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { TunnelHandle } from "./client.js";
2
+ export { openTunnel, type TunnelHandle } from "./client.js";
3
+ export declare function storeTunnel(gigId: string, handle: TunnelHandle): void;
4
+ export declare function closeTunnel(gigId: string): void;
5
+ export declare function hasTunnel(gigId: string): boolean;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tunnel/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAS5D,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAErE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAM/C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhD"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openTunnel = void 0;
4
+ exports.storeTunnel = storeTunnel;
5
+ exports.closeTunnel = closeTunnel;
6
+ exports.hasTunnel = hasTunnel;
7
+ var client_js_1 = require("./client.js");
8
+ Object.defineProperty(exports, "openTunnel", { enumerable: true, get: function () { return client_js_1.openTunnel; } });
9
+ /**
10
+ * In-memory map of active tunnel handles keyed by gigId.
11
+ * Not serialized — tunnels are re-established on restart via
12
+ * the MCP server's crash-recovery flow if needed.
13
+ */
14
+ const activeTunnels = new Map();
15
+ function storeTunnel(gigId, handle) {
16
+ activeTunnels.set(gigId, handle);
17
+ }
18
+ function closeTunnel(gigId) {
19
+ const handle = activeTunnels.get(gigId);
20
+ if (handle) {
21
+ handle.close();
22
+ activeTunnels.delete(gigId);
23
+ }
24
+ }
25
+ function hasTunnel(gigId) {
26
+ return activeTunnels.has(gigId);
27
+ }
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/tunnel/index.ts"],"names":[],"mappings":";;;AAWA,kCAEC;AAED,kCAMC;AAED,8BAEC;AAvBD,yCAA4D;AAAnD,uGAAA,UAAU,OAAA;AAEnB;;;;GAIG;AACH,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEtD,SAAgB,WAAW,CAAC,KAAa,EAAE,MAAoB;IAC7D,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,WAAW,CAAC,KAAa;IACvC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAgB,SAAS,CAAC,KAAa;IACrC,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,28 @@
1
+ export declare class HumanLayerError extends Error {
2
+ readonly code: string;
3
+ constructor(message: string, code: string);
4
+ }
5
+ export declare class ProvisioningError extends HumanLayerError {
6
+ constructor(message: string);
7
+ }
8
+ export declare class SshConfigError extends HumanLayerError {
9
+ constructor(message: string);
10
+ }
11
+ export declare class PlatformApiError extends HumanLayerError {
12
+ readonly statusCode?: number | undefined;
13
+ constructor(message: string, statusCode?: number | undefined);
14
+ }
15
+ export declare class GigNotFoundError extends HumanLayerError {
16
+ constructor(gigId: string);
17
+ }
18
+ export declare class CleanupError extends HumanLayerError {
19
+ readonly partialFailures: string[];
20
+ constructor(message: string, partialFailures: string[]);
21
+ }
22
+ export declare class TmuxError extends HumanLayerError {
23
+ constructor(message: string);
24
+ }
25
+ export declare class GitError extends HumanLayerError {
26
+ constructor(message: string);
27
+ }
28
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,IAAI,EAAE,MAAM;gBAD5B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM;CAK/B;AAED,qBAAa,iBAAkB,SAAQ,eAAe;gBACxC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,cAAe,SAAQ,eAAe;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,gBAAiB,SAAQ,eAAe;aAGjC,UAAU,CAAC,EAAE,MAAM;gBADnC,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA;CAKtC;AAED,qBAAa,gBAAiB,SAAQ,eAAe;gBACvC,KAAK,EAAE,MAAM;CAI1B;AAED,qBAAa,YAAa,SAAQ,eAAe;aAG7B,eAAe,EAAE,MAAM,EAAE;gBADzC,OAAO,EAAE,MAAM,EACC,eAAe,EAAE,MAAM,EAAE;CAK5C;AAED,qBAAa,SAAU,SAAQ,eAAe;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,QAAS,SAAQ,eAAe;gBAC/B,OAAO,EAAE,MAAM;CAI5B"}