@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,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sessionName = sessionName;
4
+ exports.createSession = createSession;
5
+ exports.hasClientsAttached = hasClientsAttached;
6
+ exports.sessionExists = sessionExists;
7
+ exports.displayMessage = displayMessage;
8
+ exports.killSession = killSession;
9
+ exports.getLastActivity = getLastActivity;
10
+ const exec_js_1 = require("../utils/exec.js");
11
+ const privileged_js_1 = require("./privileged.js");
12
+ const errors_js_1 = require("../utils/errors.js");
13
+ const logger_js_1 = require("../utils/logger.js");
14
+ const defaults_js_1 = require("../config/defaults.js");
15
+ /**
16
+ * Generate a tmux session name for a gig.
17
+ */
18
+ function sessionName(gigId) {
19
+ return `${defaults_js_1.TMUX_SESSION_PREFIX}${gigId}`;
20
+ }
21
+ /**
22
+ * Create a new tmux session **owned by the contractor user** so that
23
+ * sshd's ForceCommand (`tmux attach -t ...`) running as that user can
24
+ * see and attach to it.
25
+ *
26
+ * Without `runAsUser`, a tmux session created by the MCP server (root)
27
+ * is owned by root, and the contractor's later attach silently fails
28
+ * because tmux scopes sessions per-uid via the socket directory.
29
+ */
30
+ async function createSession(session, workdir, user) {
31
+ const cmd = `tmux new-session -d -s ${session} -c ${workdir}`;
32
+ try {
33
+ if (user) {
34
+ await (0, privileged_js_1.runAsUser)(user, cmd);
35
+ }
36
+ else {
37
+ await (0, exec_js_1.exec)(cmd);
38
+ }
39
+ logger_js_1.logger.info("tmux session created", { session, workdir, user });
40
+ }
41
+ catch (error) {
42
+ throw new errors_js_1.TmuxError(`Failed to create tmux session ${session}: ${error}`);
43
+ }
44
+ }
45
+ /**
46
+ * Check if a tmux session has any clients attached.
47
+ * Used to detect if a contractor is currently connected.
48
+ */
49
+ async function hasClientsAttached(session) {
50
+ try {
51
+ const { stdout } = await (0, exec_js_1.exec)(`tmux list-clients -t ${session}`);
52
+ return stdout.trim().length > 0;
53
+ }
54
+ catch {
55
+ // Session might not exist or have no clients
56
+ return false;
57
+ }
58
+ }
59
+ /**
60
+ * Check if a tmux session exists.
61
+ */
62
+ async function sessionExists(session) {
63
+ try {
64
+ await (0, exec_js_1.exec)(`tmux has-session -t ${session}`);
65
+ return true;
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ }
71
+ /**
72
+ * Send a display message to a tmux session.
73
+ * The message is shown as an overlay for the specified duration.
74
+ */
75
+ async function displayMessage(session, message, durationMs = 10_000) {
76
+ try {
77
+ // Escape single quotes in message
78
+ const escaped = message.replace(/'/g, "'\\''");
79
+ await (0, exec_js_1.exec)(`tmux display-message -t ${session} -d ${durationMs} '${escaped}'`);
80
+ return true;
81
+ }
82
+ catch {
83
+ logger_js_1.logger.warn("Failed to display message in tmux session", { session });
84
+ return false;
85
+ }
86
+ }
87
+ /**
88
+ * Kill a tmux session, optionally showing a warning first.
89
+ */
90
+ async function killSession(session, warningSeconds = 0) {
91
+ try {
92
+ if (warningSeconds > 0 && (await hasClientsAttached(session))) {
93
+ await displayMessage(session, `⚠ Session ending in ${warningSeconds} seconds`, warningSeconds * 1000);
94
+ await sleep(warningSeconds * 1000);
95
+ }
96
+ await (0, exec_js_1.exec)(`tmux kill-session -t ${session}`);
97
+ logger_js_1.logger.info("tmux session killed", { session });
98
+ }
99
+ catch {
100
+ // Session might already be gone
101
+ logger_js_1.logger.debug("tmux session already gone", { session });
102
+ }
103
+ }
104
+ /**
105
+ * Get the last activity time for a session (if detectable).
106
+ */
107
+ async function getLastActivity(session) {
108
+ try {
109
+ const { stdout } = await (0, exec_js_1.exec)(`tmux display-message -t ${session} -p '#{session_activity}'`);
110
+ const timestamp = parseInt(stdout.trim(), 10);
111
+ if (!isNaN(timestamp)) {
112
+ return new Date(timestamp * 1000);
113
+ }
114
+ }
115
+ catch {
116
+ // Can't determine activity
117
+ }
118
+ return undefined;
119
+ }
120
+ function sleep(ms) {
121
+ return new Promise((resolve) => setTimeout(resolve, ms));
122
+ }
123
+ //# sourceMappingURL=tmux-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux-session.js","sourceRoot":"","sources":["../../../../src/provisioning/tmux-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function createServer(): Promise<McpServer>;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoBpE,wBAAsB,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC,CA0FvD"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createServer = createServer;
4
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
+ const env_js_1 = require("./config/env.js");
6
+ const gig_store_js_1 = require("./state/gig-store.js");
7
+ const persistence_js_1 = require("./state/persistence.js");
8
+ const client_js_1 = require("./platform-client/client.js");
9
+ const mock_client_js_1 = require("./platform-client/mock-client.js");
10
+ const logger_js_1 = require("./utils/logger.js");
11
+ const index_js_1 = require("./tools/index.js");
12
+ async function createServer() {
13
+ const env = (0, env_js_1.getEnv)();
14
+ // Initialize dependencies
15
+ const gigStore = new gig_store_js_1.GigStore();
16
+ const persistence = new persistence_js_1.StatePersistence(env.STATE_FILE_PATH);
17
+ // Restore state from disk (crash recovery)
18
+ await persistence.load(gigStore);
19
+ // Choose platform client
20
+ const platformClient = env.USE_MOCK_PLATFORM
21
+ ? new mock_client_js_1.MockPlatformClient()
22
+ : new client_js_1.HttpPlatformClient(env.PLATFORM_API_URL, env.PLATFORM_API_KEY);
23
+ if (env.USE_MOCK_PLATFORM) {
24
+ logger_js_1.logger.info("Using mock platform client");
25
+ }
26
+ else {
27
+ logger_js_1.logger.info("Using HTTP platform client", {
28
+ url: env.PLATFORM_API_URL,
29
+ });
30
+ }
31
+ const deps = { platformClient, gigStore };
32
+ // Create MCP server
33
+ const server = new mcp_js_1.McpServer({
34
+ name: "human-agents",
35
+ version: "0.1.0",
36
+ });
37
+ // Register tools
38
+ server.tool("summon_human", "Summon a human contractor to help with a task. They will SSH into the VM and work in a tmux session.", index_js_1.SummonHumanInputSchema.shape, async ({ reason, skills, context, urgency, worktree }) => {
39
+ const result = await (0, index_js_1.summonHuman)({ reason, skills, context, urgency, worktree }, deps);
40
+ await persistence.save(gigStore);
41
+ return {
42
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
43
+ };
44
+ });
45
+ server.tool("dismiss_human", "Dismiss a human contractor, revoke their access, and optionally merge their changes.", index_js_1.DismissHumanInputSchema.shape, async ({ gigId, merge, rating, resolutionNotes }) => {
46
+ const result = await (0, index_js_1.dismissHuman)({ gigId, merge, rating, resolutionNotes }, deps);
47
+ await persistence.save(gigStore);
48
+ return {
49
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
50
+ };
51
+ });
52
+ server.tool("list_humans", "List all currently active human contractors on this VM.", index_js_1.ListHumansInputSchema.shape, async () => {
53
+ const result = await (0, index_js_1.listHumans)(gigStore);
54
+ return {
55
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
56
+ };
57
+ });
58
+ server.tool("message_human", "Send a message to a human contractor's tmux session.", index_js_1.MessageHumanInputSchema.shape, async ({ gigId, message }) => {
59
+ const result = await (0, index_js_1.messageHuman)({ gigId, message }, gigStore);
60
+ return {
61
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
62
+ };
63
+ });
64
+ logger_js_1.logger.info("MCP server created with 4 tools registered");
65
+ return server;
66
+ }
67
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ActiveGig } from "./types.js";
2
+ /**
3
+ * In-memory store of active gigs on this VM.
4
+ * Backed by optional file persistence for crash recovery.
5
+ */
6
+ export declare class GigStore {
7
+ private gigs;
8
+ add(gig: ActiveGig): void;
9
+ get(gigId: string): ActiveGig;
10
+ tryGet(gigId: string): ActiveGig | undefined;
11
+ remove(gigId: string): void;
12
+ list(): ActiveGig[];
13
+ has(gigId: string): boolean;
14
+ /** Serialize all active gigs for crash recovery. */
15
+ serialize(): string;
16
+ /** Restore gigs from serialized data. */
17
+ restore(data: string): void;
18
+ }
19
+ //# sourceMappingURL=gig-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gig-store.d.ts","sourceRoot":"","sources":["../../../../src/state/gig-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;GAGG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,IAAI,CAAgC;IAE5C,GAAG,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAQzB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS;IAM7B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI5C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK3B,IAAI,IAAI,SAAS,EAAE;IAInB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3B,oDAAoD;IACpD,SAAS,IAAI,MAAM;IAInB,yCAAyC;IACzC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAO5B"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GigStore = void 0;
4
+ const errors_js_1 = require("../utils/errors.js");
5
+ const logger_js_1 = require("../utils/logger.js");
6
+ /**
7
+ * In-memory store of active gigs on this VM.
8
+ * Backed by optional file persistence for crash recovery.
9
+ */
10
+ class GigStore {
11
+ gigs = new Map();
12
+ add(gig) {
13
+ this.gigs.set(gig.gigId, gig);
14
+ logger_js_1.logger.info("Gig added to store", {
15
+ gigId: gig.gigId,
16
+ contractorName: gig.contractorName,
17
+ });
18
+ }
19
+ get(gigId) {
20
+ const gig = this.gigs.get(gigId);
21
+ if (!gig)
22
+ throw new errors_js_1.GigNotFoundError(gigId);
23
+ return gig;
24
+ }
25
+ tryGet(gigId) {
26
+ return this.gigs.get(gigId);
27
+ }
28
+ remove(gigId) {
29
+ this.gigs.delete(gigId);
30
+ logger_js_1.logger.info("Gig removed from store", { gigId });
31
+ }
32
+ list() {
33
+ return Array.from(this.gigs.values());
34
+ }
35
+ has(gigId) {
36
+ return this.gigs.has(gigId);
37
+ }
38
+ /** Serialize all active gigs for crash recovery. */
39
+ serialize() {
40
+ return JSON.stringify(Array.from(this.gigs.values()), null, 2);
41
+ }
42
+ /** Restore gigs from serialized data. */
43
+ restore(data) {
44
+ const gigs = JSON.parse(data);
45
+ for (const gig of gigs) {
46
+ this.gigs.set(gig.gigId, gig);
47
+ }
48
+ logger_js_1.logger.info(`Restored ${gigs.length} gigs from persistence`);
49
+ }
50
+ }
51
+ exports.GigStore = GigStore;
52
+ //# sourceMappingURL=gig-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gig-store.js","sourceRoot":"","sources":["../../../../src/state/gig-store.ts"],"names":[],"mappings":";;;AAAA,kDAAsD;AACtD,kDAA4C;AAG5C;;;GAGG;AACH,MAAa,QAAQ;IACX,IAAI,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE5C,GAAG,CAAC,GAAc;QAChB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,kBAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAChC,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,cAAc,EAAE,GAAG,CAAC,cAAc;SACnC,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,KAAa;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,4BAAgB,CAAC,KAAK,CAAC,CAAC;QAC5C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,kBAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,GAAG,CAAC,KAAa;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,oDAAoD;IACpD,SAAS;QACP,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,yCAAyC;IACzC,OAAO,CAAC,IAAY;QAClB,MAAM,IAAI,GAAgB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,kBAAM,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,wBAAwB,CAAC,CAAC;IAC/D,CAAC;CACF;AA/CD,4BA+CC"}
@@ -0,0 +1,4 @@
1
+ export { GigStore } from "./gig-store.js";
2
+ export { StatePersistence } from "./persistence.js";
3
+ export type { ActiveGig } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/state/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StatePersistence = exports.GigStore = void 0;
4
+ var gig_store_js_1 = require("./gig-store.js");
5
+ Object.defineProperty(exports, "GigStore", { enumerable: true, get: function () { return gig_store_js_1.GigStore; } });
6
+ var persistence_js_1 = require("./persistence.js");
7
+ Object.defineProperty(exports, "StatePersistence", { enumerable: true, get: function () { return persistence_js_1.StatePersistence; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/state/index.ts"],"names":[],"mappings":";;;AAAA,+CAA0C;AAAjC,wGAAA,QAAQ,OAAA;AACjB,mDAAoD;AAA3C,kHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,13 @@
1
+ import type { GigStore } from "./gig-store.js";
2
+ /**
3
+ * Persist gig store to disk for crash recovery.
4
+ * On startup, reads the file and restores any active gigs
5
+ * that need cleanup.
6
+ */
7
+ export declare class StatePersistence {
8
+ private readonly filePath;
9
+ constructor(filePath: string);
10
+ save(store: GigStore): Promise<void>;
11
+ load(store: GigStore): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../../src/state/persistence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;GAIG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAEvC,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAapC,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAe3C"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StatePersistence = void 0;
4
+ const promises_1 = require("node:fs/promises");
5
+ const node_path_1 = require("node:path");
6
+ const logger_js_1 = require("../utils/logger.js");
7
+ /**
8
+ * Persist gig store to disk for crash recovery.
9
+ * On startup, reads the file and restores any active gigs
10
+ * that need cleanup.
11
+ */
12
+ class StatePersistence {
13
+ filePath;
14
+ constructor(filePath) {
15
+ this.filePath = filePath;
16
+ }
17
+ async save(store) {
18
+ try {
19
+ await (0, promises_1.mkdir)((0, node_path_1.dirname)(this.filePath), { recursive: true });
20
+ await (0, promises_1.writeFile)(this.filePath, store.serialize(), "utf-8");
21
+ logger_js_1.logger.debug("State persisted to disk", { path: this.filePath });
22
+ }
23
+ catch (error) {
24
+ logger_js_1.logger.warn("Failed to persist state", {
25
+ path: this.filePath,
26
+ error: String(error),
27
+ });
28
+ }
29
+ }
30
+ async load(store) {
31
+ try {
32
+ const data = await (0, promises_1.readFile)(this.filePath, "utf-8");
33
+ store.restore(data);
34
+ }
35
+ catch (error) {
36
+ if (error.code === "ENOENT") {
37
+ logger_js_1.logger.debug("No state file found, starting fresh");
38
+ return;
39
+ }
40
+ logger_js_1.logger.warn("Failed to load state", {
41
+ path: this.filePath,
42
+ error: String(error),
43
+ });
44
+ }
45
+ }
46
+ }
47
+ exports.StatePersistence = StatePersistence;
48
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../../src/state/persistence.ts"],"names":[],"mappings":";;;AAAA,+CAA8D;AAC9D,yCAAoC;AACpC,kDAA4C;AAG5C;;;;GAIG;AACH,MAAa,gBAAgB;IACE;IAA7B,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAEjD,KAAK,CAAC,IAAI,CAAC,KAAe;QACxB,IAAI,CAAC;YACH,MAAM,IAAA,gBAAK,EAAC,IAAA,mBAAO,EAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,MAAM,IAAA,oBAAS,EAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;YAC3D,kBAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kBAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBACrC,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAe;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,kBAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YACD,kBAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;gBAClC,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AA/BD,4CA+BC"}
@@ -0,0 +1,15 @@
1
+ export interface ActiveGig {
2
+ gigId: string;
3
+ contractorName: string;
4
+ linuxUser: string;
5
+ tmuxSession: string;
6
+ worktreePath?: string;
7
+ sshCommand: string;
8
+ skills: string[];
9
+ rate: number;
10
+ startedAt: string;
11
+ status: "provisioning" | "active" | "dismissing";
12
+ /** Whether this gig uses a reverse tunnel instead of direct SSH. */
13
+ tunnelActive?: boolean;
14
+ }
15
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/state/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,YAAY,CAAC;IACjD,oEAAoE;IACpE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/state/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import type { PlatformClient } from "../platform-client/client.js";
2
+ import { GigStore } from "../state/index.js";
3
+ import type { DismissHumanInput } from "./schemas/dismiss-human.schema.js";
4
+ export interface DismissHumanDeps {
5
+ platformClient: PlatformClient;
6
+ gigStore: GigStore;
7
+ }
8
+ export interface DismissHumanResult {
9
+ filesChanged: string[];
10
+ merged: boolean;
11
+ durationMinutes: number;
12
+ }
13
+ /**
14
+ * dismiss_human — clean up a contractor's access and report completion.
15
+ *
16
+ * 1. Update gig status to "dismissing"
17
+ * 2. Optionally merge contractor's changes
18
+ * 3. Get list of files changed
19
+ * 4. Run aggressive cleanup (tmux, processes, SSH, lock account)
20
+ * 5. Remove worktree if "clean" mode was used
21
+ * 6. Report completion to platform
22
+ * 7. Remove gig from store
23
+ */
24
+ export declare function dismissHuman(input: DismissHumanInput, deps: DismissHumanDeps): Promise<DismissHumanResult>;
25
+ //# sourceMappingURL=dismiss-human.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dismiss-human.d.ts","sourceRoot":"","sources":["../../../../src/tools/dismiss-human.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAMnE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAmE7B"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dismissHuman = dismissHuman;
4
+ const cleanup_js_1 = require("../provisioning/cleanup.js");
5
+ const merge_js_1 = require("../git/merge.js");
6
+ const diff_js_1 = require("../git/diff.js");
7
+ const worktree_js_1 = require("../git/worktree.js");
8
+ const index_js_1 = require("../tunnel/index.js");
9
+ const logger_js_1 = require("../utils/logger.js");
10
+ /**
11
+ * dismiss_human — clean up a contractor's access and report completion.
12
+ *
13
+ * 1. Update gig status to "dismissing"
14
+ * 2. Optionally merge contractor's changes
15
+ * 3. Get list of files changed
16
+ * 4. Run aggressive cleanup (tmux, processes, SSH, lock account)
17
+ * 5. Remove worktree if "clean" mode was used
18
+ * 6. Report completion to platform
19
+ * 7. Remove gig from store
20
+ */
21
+ async function dismissHuman(input, deps) {
22
+ const gig = deps.gigStore.get(input.gigId);
23
+ gig.status = "dismissing";
24
+ logger_js_1.logger.info("Dismissing human contractor", {
25
+ gigId: input.gigId,
26
+ contractorName: gig.contractorName,
27
+ merge: input.merge,
28
+ });
29
+ // Calculate duration
30
+ const startedAt = new Date(gig.startedAt);
31
+ const durationMinutes = Math.round((Date.now() - startedAt.getTime()) / 60_000);
32
+ // Merge if requested
33
+ let filesChanged = [];
34
+ if (input.merge && gig.worktreePath) {
35
+ await (0, merge_js_1.mergeContractorChanges)(gig.worktreePath);
36
+ filesChanged = await (0, diff_js_1.getFilesChanged)();
37
+ }
38
+ else if (input.merge) {
39
+ // Shared worktree — changes are already in place
40
+ filesChanged = await (0, diff_js_1.getFilesChanged)();
41
+ }
42
+ // Close reverse tunnel if active
43
+ if (gig.tunnelActive) {
44
+ (0, index_js_1.closeTunnel)(input.gigId);
45
+ }
46
+ // Aggressive cleanup
47
+ await (0, cleanup_js_1.cleanupContractor)({
48
+ username: gig.linuxUser,
49
+ tmuxSession: gig.tmuxSession,
50
+ });
51
+ // Remove worktree if "clean" mode
52
+ if (gig.worktreePath) {
53
+ await (0, worktree_js_1.removeWorktree)(gig.worktreePath);
54
+ }
55
+ // Report to platform
56
+ await deps.platformClient.completeGig({
57
+ gigId: input.gigId,
58
+ durationMinutes,
59
+ filesChanged,
60
+ merged: input.merge,
61
+ rating: input.rating,
62
+ resolutionNotes: input.resolutionNotes,
63
+ });
64
+ // Remove from store
65
+ deps.gigStore.remove(input.gigId);
66
+ logger_js_1.logger.info("Human contractor dismissed", {
67
+ gigId: input.gigId,
68
+ durationMinutes,
69
+ filesChanged: filesChanged.length,
70
+ merged: input.merge,
71
+ });
72
+ return {
73
+ filesChanged,
74
+ merged: input.merge,
75
+ durationMinutes,
76
+ };
77
+ }
78
+ //# sourceMappingURL=dismiss-human.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dismiss-human.js","sourceRoot":"","sources":["../../../../src/tools/dismiss-human.ts"],"names":[],"mappings":";;AAgCA,oCAsEC;AArGD,2DAA+D;AAC/D,8CAAyD;AACzD,4CAAiD;AACjD,oDAAoD;AACpD,iDAAiD;AAEjD,kDAA4C;AAc5C;;;;;;;;;;GAUG;AACI,KAAK,UAAU,YAAY,CAChC,KAAwB,EACxB,IAAsB;IAEtB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,GAAG,CAAC,MAAM,GAAG,YAAY,CAAC;IAE1B,kBAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;QACzC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAChC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,CAC5C,CAAC;IAEF,qBAAqB;IACrB,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QACpC,MAAM,IAAA,iCAAsB,EAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC/C,YAAY,GAAG,MAAM,IAAA,yBAAe,GAAE,CAAC;IACzC,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QACvB,iDAAiD;QACjD,YAAY,GAAG,MAAM,IAAA,yBAAe,GAAE,CAAC;IACzC,CAAC;IAED,iCAAiC;IACjC,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QACrB,IAAA,sBAAW,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,qBAAqB;IACrB,MAAM,IAAA,8BAAiB,EAAC;QACtB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,WAAW,EAAE,GAAG,CAAC,WAAW;KAC7B,CAAC,CAAC;IAEH,kCAAkC;IAClC,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QACrB,MAAM,IAAA,4BAAc,EAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;IAED,qBAAqB;IACrB,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;QACpC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,eAAe;QACf,YAAY;QACZ,MAAM,EAAE,KAAK,CAAC,KAAK;QACnB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,eAAe,EAAE,KAAK,CAAC,eAAe;KACvC,CAAC,CAAC;IAEH,oBAAoB;IACpB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAElC,kBAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;QACxC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,eAAe;QACf,YAAY,EAAE,YAAY,CAAC,MAAM;QACjC,MAAM,EAAE,KAAK,CAAC,KAAK;KACpB,CAAC,CAAC;IAEH,OAAO;QACL,YAAY;QACZ,MAAM,EAAE,KAAK,CAAC,KAAK;QACnB,eAAe;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { summonHuman, type SummonHumanDeps, type SummonHumanResult } from "./summon-human.js";
2
+ export { dismissHuman, type DismissHumanDeps, type DismissHumanResult } from "./dismiss-human.js";
3
+ export { listHumans, type ListHumansResult } from "./list-humans.js";
4
+ export { messageHuman, type MessageHumanResult } from "./message-human.js";
5
+ export { SummonHumanInputSchema } from "./schemas/summon-human.schema.js";
6
+ export { DismissHumanInputSchema } from "./schemas/dismiss-human.schema.js";
7
+ export { ListHumansInputSchema } from "./schemas/list-humans.schema.js";
8
+ export { MessageHumanInputSchema } from "./schemas/message-human.schema.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessageHumanInputSchema = exports.ListHumansInputSchema = exports.DismissHumanInputSchema = exports.SummonHumanInputSchema = exports.messageHuman = exports.listHumans = exports.dismissHuman = exports.summonHuman = void 0;
4
+ var summon_human_js_1 = require("./summon-human.js");
5
+ Object.defineProperty(exports, "summonHuman", { enumerable: true, get: function () { return summon_human_js_1.summonHuman; } });
6
+ var dismiss_human_js_1 = require("./dismiss-human.js");
7
+ Object.defineProperty(exports, "dismissHuman", { enumerable: true, get: function () { return dismiss_human_js_1.dismissHuman; } });
8
+ var list_humans_js_1 = require("./list-humans.js");
9
+ Object.defineProperty(exports, "listHumans", { enumerable: true, get: function () { return list_humans_js_1.listHumans; } });
10
+ var message_human_js_1 = require("./message-human.js");
11
+ Object.defineProperty(exports, "messageHuman", { enumerable: true, get: function () { return message_human_js_1.messageHuman; } });
12
+ var summon_human_schema_js_1 = require("./schemas/summon-human.schema.js");
13
+ Object.defineProperty(exports, "SummonHumanInputSchema", { enumerable: true, get: function () { return summon_human_schema_js_1.SummonHumanInputSchema; } });
14
+ var dismiss_human_schema_js_1 = require("./schemas/dismiss-human.schema.js");
15
+ Object.defineProperty(exports, "DismissHumanInputSchema", { enumerable: true, get: function () { return dismiss_human_schema_js_1.DismissHumanInputSchema; } });
16
+ var list_humans_schema_js_1 = require("./schemas/list-humans.schema.js");
17
+ Object.defineProperty(exports, "ListHumansInputSchema", { enumerable: true, get: function () { return list_humans_schema_js_1.ListHumansInputSchema; } });
18
+ var message_human_schema_js_1 = require("./schemas/message-human.schema.js");
19
+ Object.defineProperty(exports, "MessageHumanInputSchema", { enumerable: true, get: function () { return message_human_schema_js_1.MessageHumanInputSchema; } });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/tools/index.ts"],"names":[],"mappings":";;;AAAA,qDAA8F;AAArF,8GAAA,WAAW,OAAA;AACpB,uDAAkG;AAAzF,gHAAA,YAAY,OAAA;AACrB,mDAAqE;AAA5D,4GAAA,UAAU,OAAA;AACnB,uDAA2E;AAAlE,gHAAA,YAAY,OAAA;AAErB,2EAA0E;AAAjE,gIAAA,sBAAsB,OAAA;AAC/B,6EAA4E;AAAnE,kIAAA,uBAAuB,OAAA;AAChC,yEAAwE;AAA/D,8HAAA,qBAAqB,OAAA;AAC9B,6EAA4E;AAAnE,kIAAA,uBAAuB,OAAA"}
@@ -0,0 +1,18 @@
1
+ import { GigStore } from "../state/index.js";
2
+ export interface ActiveContractorInfo {
3
+ gigId: string;
4
+ name: string;
5
+ status: "waiting" | "connected" | "idle";
6
+ skills: string[];
7
+ connectedSince?: string;
8
+ lastActivity?: string;
9
+ rate: number;
10
+ }
11
+ export interface ListHumansResult {
12
+ contractors: ActiveContractorInfo[];
13
+ }
14
+ /**
15
+ * list_humans — show currently active contractors on this VM.
16
+ */
17
+ export declare function listHumans(gigStore: GigStore): Promise<ListHumansResult>;
18
+ //# sourceMappingURL=list-humans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-humans.d.ts","sourceRoot":"","sources":["../../../../src/tools/list-humans.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAM7C,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;IACzC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA8B9E"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listHumans = listHumans;
4
+ const tmux_session_js_1 = require("../provisioning/tmux-session.js");
5
+ /**
6
+ * list_humans — show currently active contractors on this VM.
7
+ */
8
+ async function listHumans(gigStore) {
9
+ const gigs = gigStore.list();
10
+ const contractors = await Promise.all(gigs.map(async (gig) => {
11
+ const connected = await (0, tmux_session_js_1.hasClientsAttached)(gig.tmuxSession);
12
+ const lastActivity = await (0, tmux_session_js_1.getLastActivity)(gig.tmuxSession);
13
+ let status;
14
+ if (!connected && gig.status === "active") {
15
+ status = "waiting";
16
+ }
17
+ else if (connected) {
18
+ status = "connected";
19
+ }
20
+ else {
21
+ status = "idle";
22
+ }
23
+ return {
24
+ gigId: gig.gigId,
25
+ name: gig.contractorName,
26
+ status,
27
+ skills: gig.skills,
28
+ connectedSince: gig.startedAt,
29
+ lastActivity: lastActivity?.toISOString(),
30
+ rate: gig.rate,
31
+ };
32
+ }));
33
+ return { contractors };
34
+ }
35
+ //# sourceMappingURL=list-humans.js.map