managed-deepagents 0.5.0-dev.79 → 0.5.0-dev.80

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 (322) hide show
  1. package/README.md +50 -8
  2. package/dist/channels/assistant-text.js +1 -1
  3. package/dist/channels/assistant-text.js.map +1 -1
  4. package/dist/channels/binding.d.ts.map +1 -1
  5. package/dist/channels/binding.js +3 -1
  6. package/dist/channels/binding.js.map +1 -1
  7. package/dist/channels/index.d.ts +6 -8
  8. package/dist/channels/index.d.ts.map +1 -1
  9. package/dist/channels/index.js +5 -5
  10. package/dist/channels/index.js.map +1 -1
  11. package/dist/channels/manifest.d.ts +36 -3
  12. package/dist/channels/manifest.d.ts.map +1 -1
  13. package/dist/channels/messaging-registry.d.ts +17 -0
  14. package/dist/channels/messaging-registry.d.ts.map +1 -0
  15. package/dist/channels/messaging-registry.js +44 -0
  16. package/dist/channels/messaging-registry.js.map +1 -0
  17. package/dist/channels/registry.d.ts +4 -3
  18. package/dist/channels/registry.d.ts.map +1 -1
  19. package/dist/channels/registry.js +6 -5
  20. package/dist/channels/registry.js.map +1 -1
  21. package/dist/channels/schedule-delivery.d.ts +4 -1
  22. package/dist/channels/schedule-delivery.d.ts.map +1 -1
  23. package/dist/channels/schedule-delivery.js +4 -2
  24. package/dist/channels/schedule-delivery.js.map +1 -1
  25. package/dist/connectors/github/adapter-core.d.ts +15 -0
  26. package/dist/connectors/github/adapter-core.d.ts.map +1 -0
  27. package/dist/connectors/github/adapter-core.js +52 -0
  28. package/dist/connectors/github/adapter-core.js.map +1 -0
  29. package/dist/{channels → connectors}/github/define.d.ts +28 -58
  30. package/dist/connectors/github/define.d.ts.map +1 -0
  31. package/dist/connectors/github/define.js +72 -0
  32. package/dist/connectors/github/define.js.map +1 -0
  33. package/dist/{channels → connectors}/github/http.d.ts +4 -4
  34. package/dist/connectors/github/http.d.ts.map +1 -0
  35. package/dist/{channels → connectors}/github/http.js +13 -24
  36. package/dist/connectors/github/http.js.map +1 -0
  37. package/dist/connectors/github/index.d.ts +59 -16
  38. package/dist/connectors/github/index.d.ts.map +1 -1
  39. package/dist/connectors/github/index.js +159 -73
  40. package/dist/connectors/github/index.js.map +1 -1
  41. package/dist/connectors/github/match.d.ts +20 -0
  42. package/dist/connectors/github/match.d.ts.map +1 -0
  43. package/dist/connectors/github/match.js +41 -0
  44. package/dist/connectors/github/match.js.map +1 -0
  45. package/dist/{channels → connectors}/github/normalize.d.ts +1 -1
  46. package/dist/connectors/github/normalize.d.ts.map +1 -0
  47. package/dist/{channels → connectors}/github/normalize.js +2 -2
  48. package/dist/connectors/github/normalize.js.map +1 -0
  49. package/dist/connectors/github/sandbox.d.ts.map +1 -1
  50. package/dist/connectors/github/sandbox.js +30 -23
  51. package/dist/connectors/github/sandbox.js.map +1 -1
  52. package/dist/connectors/github/source-thread.d.ts.map +1 -0
  53. package/dist/connectors/github/source-thread.js.map +1 -0
  54. package/dist/{channels → connectors}/github/transport.d.ts +7 -1
  55. package/dist/connectors/github/transport.d.ts.map +1 -0
  56. package/dist/{channels → connectors}/github/transport.js +18 -4
  57. package/dist/connectors/github/transport.js.map +1 -0
  58. package/dist/connectors/langsmith/index.d.ts +29 -17
  59. package/dist/connectors/langsmith/index.d.ts.map +1 -1
  60. package/dist/connectors/langsmith/index.js +34 -29
  61. package/dist/connectors/langsmith/index.js.map +1 -1
  62. package/dist/connectors/langsmith/routes.d.ts +4 -15
  63. package/dist/connectors/langsmith/routes.d.ts.map +1 -1
  64. package/dist/connectors/langsmith/routes.js +63 -72
  65. package/dist/connectors/langsmith/routes.js.map +1 -1
  66. package/dist/connectors/mcp/index.d.ts +13 -20
  67. package/dist/connectors/mcp/index.d.ts.map +1 -1
  68. package/dist/connectors/mcp/index.js +92 -112
  69. package/dist/connectors/mcp/index.js.map +1 -1
  70. package/dist/connectors/mcp/load.d.ts.map +1 -1
  71. package/dist/connectors/mcp/load.js +16 -40
  72. package/dist/connectors/mcp/load.js.map +1 -1
  73. package/dist/{channels → connectors}/slack/adapter-core.d.ts +1 -1
  74. package/dist/connectors/slack/adapter-core.d.ts.map +1 -0
  75. package/dist/connectors/slack/adapter-core.js.map +1 -0
  76. package/dist/{channels → connectors}/slack/adapter.d.ts +3 -4
  77. package/dist/connectors/slack/adapter.d.ts.map +1 -0
  78. package/dist/{channels → connectors}/slack/adapter.js +1 -1
  79. package/dist/connectors/slack/adapter.js.map +1 -0
  80. package/dist/{channels → connectors}/slack/http.d.ts +6 -40
  81. package/dist/connectors/slack/http.d.ts.map +1 -0
  82. package/dist/{channels → connectors}/slack/http.js +22 -125
  83. package/dist/connectors/slack/http.js.map +1 -0
  84. package/dist/connectors/slack/index.d.ts +108 -0
  85. package/dist/connectors/slack/index.d.ts.map +1 -0
  86. package/dist/connectors/slack/index.js +191 -0
  87. package/dist/connectors/slack/index.js.map +1 -0
  88. package/dist/{channels → connectors}/slack/normalize.d.ts +5 -5
  89. package/dist/connectors/slack/normalize.d.ts.map +1 -0
  90. package/dist/{channels → connectors}/slack/normalize.js +21 -20
  91. package/dist/connectors/slack/normalize.js.map +1 -0
  92. package/dist/connectors/slack/source-thread.d.ts.map +1 -0
  93. package/dist/connectors/slack/source-thread.js.map +1 -0
  94. package/dist/{channels → connectors}/slack/transport.d.ts +1 -1
  95. package/dist/connectors/slack/transport.d.ts.map +1 -0
  96. package/dist/{channels → connectors}/slack/transport.js +4 -3
  97. package/dist/connectors/slack/transport.js.map +1 -0
  98. package/dist/connectors/tool-selection.d.ts +31 -0
  99. package/dist/connectors/tool-selection.d.ts.map +1 -0
  100. package/dist/connectors/tool-selection.js +54 -0
  101. package/dist/connectors/tool-selection.js.map +1 -0
  102. package/dist/connectors/toolserver/catalog.d.ts +134 -0
  103. package/dist/connectors/toolserver/catalog.d.ts.map +1 -0
  104. package/dist/connectors/toolserver/catalog.js +74 -0
  105. package/dist/connectors/toolserver/catalog.js.map +1 -0
  106. package/dist/connectors/toolserver/index.d.ts +119 -0
  107. package/dist/connectors/toolserver/index.d.ts.map +1 -0
  108. package/dist/connectors/toolserver/index.js +150 -0
  109. package/dist/connectors/toolserver/index.js.map +1 -0
  110. package/dist/connectors/toolserver/load.d.ts +55 -0
  111. package/dist/connectors/toolserver/load.d.ts.map +1 -0
  112. package/dist/connectors/toolserver/load.js +162 -0
  113. package/dist/connectors/toolserver/load.js.map +1 -0
  114. package/dist/extension.d.ts +77 -0
  115. package/dist/extension.d.ts.map +1 -0
  116. package/dist/extension.js +127 -0
  117. package/dist/extension.js.map +1 -0
  118. package/dist/identity/claims.d.ts +18 -0
  119. package/dist/identity/claims.d.ts.map +1 -0
  120. package/dist/identity/claims.js +37 -0
  121. package/dist/identity/claims.js.map +1 -0
  122. package/dist/identity/connect-inference.d.ts +28 -0
  123. package/dist/identity/connect-inference.d.ts.map +1 -0
  124. package/dist/identity/connect-inference.js +39 -0
  125. package/dist/identity/connect-inference.js.map +1 -0
  126. package/dist/identity/connect-provider-types.d.ts +23 -6
  127. package/dist/identity/connect-provider-types.d.ts.map +1 -1
  128. package/dist/identity/connect-provider-types.js +3 -1
  129. package/dist/identity/connect-provider-types.js.map +1 -1
  130. package/dist/identity/connect-provider.d.ts +9 -4
  131. package/dist/identity/connect-provider.d.ts.map +1 -1
  132. package/dist/identity/connect-provider.js +19 -9
  133. package/dist/identity/connect-provider.js.map +1 -1
  134. package/dist/identity/credential-resolvers.d.ts +33 -0
  135. package/dist/identity/credential-resolvers.d.ts.map +1 -0
  136. package/dist/identity/credential-resolvers.js +62 -0
  137. package/dist/identity/credential-resolvers.js.map +1 -0
  138. package/dist/identity/github/connect-http.d.ts +3 -3
  139. package/dist/identity/github/connect-http.d.ts.map +1 -1
  140. package/dist/identity/github/connect-http.js +21 -13
  141. package/dist/identity/github/connect-http.js.map +1 -1
  142. package/dist/identity/github/credentials-store.d.ts +10 -10
  143. package/dist/identity/github/credentials-store.d.ts.map +1 -1
  144. package/dist/identity/github/credentials-store.js +40 -43
  145. package/dist/identity/github/credentials-store.js.map +1 -1
  146. package/dist/identity/github/credentials.d.ts +16 -13
  147. package/dist/identity/github/credentials.d.ts.map +1 -1
  148. package/dist/identity/github/credentials.js +43 -23
  149. package/dist/identity/github/credentials.js.map +1 -1
  150. package/dist/identity/github/index.d.ts +2 -3
  151. package/dist/identity/github/index.d.ts.map +1 -1
  152. package/dist/identity/github/index.js +1 -2
  153. package/dist/identity/github/index.js.map +1 -1
  154. package/dist/identity/github/oauth.d.ts +3 -3
  155. package/dist/identity/github/oauth.d.ts.map +1 -1
  156. package/dist/identity/github/oauth.js +10 -9
  157. package/dist/identity/github/oauth.js.map +1 -1
  158. package/dist/identity/index.d.ts +35 -29
  159. package/dist/identity/index.d.ts.map +1 -1
  160. package/dist/identity/index.js +98 -131
  161. package/dist/identity/index.js.map +1 -1
  162. package/dist/identity/loopback.d.ts +27 -2
  163. package/dist/identity/loopback.d.ts.map +1 -1
  164. package/dist/identity/loopback.js +61 -8
  165. package/dist/identity/loopback.js.map +1 -1
  166. package/dist/identity/options.d.ts +90 -0
  167. package/dist/identity/options.d.ts.map +1 -0
  168. package/dist/identity/options.js +171 -0
  169. package/dist/identity/options.js.map +1 -0
  170. package/dist/identity/slack/connect-http.d.ts +3 -3
  171. package/dist/identity/slack/connect-http.d.ts.map +1 -1
  172. package/dist/identity/slack/connect-http.js +22 -14
  173. package/dist/identity/slack/connect-http.js.map +1 -1
  174. package/dist/identity/slack/index.d.ts +1 -2
  175. package/dist/identity/slack/index.d.ts.map +1 -1
  176. package/dist/identity/slack/index.js +1 -2
  177. package/dist/identity/slack/index.js.map +1 -1
  178. package/dist/identity/slack/links.d.ts +15 -15
  179. package/dist/identity/slack/links.d.ts.map +1 -1
  180. package/dist/identity/slack/links.js +50 -53
  181. package/dist/identity/slack/links.js.map +1 -1
  182. package/dist/identity/slack/oauth.d.ts +2 -2
  183. package/dist/identity/slack/oauth.d.ts.map +1 -1
  184. package/dist/identity/slack/oauth.js +9 -24
  185. package/dist/identity/slack/oauth.js.map +1 -1
  186. package/dist/identity/supabase.js +9 -9
  187. package/dist/identity/supabase.js.map +1 -1
  188. package/dist/identity/types.d.ts +82 -36
  189. package/dist/identity/types.d.ts.map +1 -1
  190. package/dist/index.d.ts +11 -21
  191. package/dist/index.d.ts.map +1 -1
  192. package/dist/index.js +2 -12
  193. package/dist/index.js.map +1 -1
  194. package/dist/ingress/index.d.ts +54 -0
  195. package/dist/ingress/index.d.ts.map +1 -0
  196. package/dist/ingress/index.js +128 -0
  197. package/dist/ingress/index.js.map +1 -0
  198. package/dist/namespaces.d.ts +76 -0
  199. package/dist/namespaces.d.ts.map +1 -0
  200. package/dist/namespaces.js +94 -0
  201. package/dist/namespaces.js.map +1 -0
  202. package/dist/runtime/auth.d.ts +18 -14
  203. package/dist/runtime/auth.d.ts.map +1 -1
  204. package/dist/runtime/auth.js +88 -68
  205. package/dist/runtime/auth.js.map +1 -1
  206. package/dist/runtime/backend.d.ts +1 -1
  207. package/dist/runtime/backend.d.ts.map +1 -1
  208. package/dist/runtime/connector.d.ts +66 -23
  209. package/dist/runtime/connector.d.ts.map +1 -1
  210. package/dist/runtime/connector.js +63 -27
  211. package/dist/runtime/connector.js.map +1 -1
  212. package/dist/runtime/cors.d.ts +2 -3
  213. package/dist/runtime/cors.d.ts.map +1 -1
  214. package/dist/runtime/cors.js +2 -7
  215. package/dist/runtime/cors.js.map +1 -1
  216. package/dist/runtime/credentials.d.ts.map +1 -1
  217. package/dist/runtime/credentials.js +39 -14
  218. package/dist/runtime/credentials.js.map +1 -1
  219. package/dist/runtime/http.d.ts +47 -0
  220. package/dist/runtime/http.d.ts.map +1 -0
  221. package/dist/runtime/http.js +54 -0
  222. package/dist/runtime/http.js.map +1 -0
  223. package/dist/runtime/identity-http.d.ts +6 -16
  224. package/dist/runtime/identity-http.d.ts.map +1 -1
  225. package/dist/runtime/identity-http.js +71 -54
  226. package/dist/runtime/identity-http.js.map +1 -1
  227. package/dist/runtime/identity-runtime.d.ts +18 -17
  228. package/dist/runtime/identity-runtime.d.ts.map +1 -1
  229. package/dist/runtime/identity-runtime.js +55 -39
  230. package/dist/runtime/identity-runtime.js.map +1 -1
  231. package/dist/runtime/index.d.ts +77 -104
  232. package/dist/runtime/index.d.ts.map +1 -1
  233. package/dist/runtime/index.js +36 -35
  234. package/dist/runtime/index.js.map +1 -1
  235. package/dist/runtime/memory/index.d.ts +1 -0
  236. package/dist/runtime/memory/index.d.ts.map +1 -1
  237. package/dist/runtime/memory/index.js +1 -0
  238. package/dist/runtime/memory/index.js.map +1 -1
  239. package/dist/runtime/memory/lazy-context-backend.d.ts +66 -0
  240. package/dist/runtime/memory/lazy-context-backend.d.ts.map +1 -0
  241. package/dist/runtime/memory/lazy-context-backend.js +154 -0
  242. package/dist/runtime/memory/lazy-context-backend.js.map +1 -0
  243. package/dist/runtime/memory/user-repo.js +3 -3
  244. package/dist/runtime/memory/user-repo.js.map +1 -1
  245. package/dist/runtime/sandbox-manager.d.ts +33 -0
  246. package/dist/runtime/sandbox-manager.d.ts.map +1 -1
  247. package/dist/runtime/sandbox-manager.js +173 -9
  248. package/dist/runtime/sandbox-manager.js.map +1 -1
  249. package/dist/runtime/sandbox-stream-retry.d.ts +16 -0
  250. package/dist/runtime/sandbox-stream-retry.d.ts.map +1 -0
  251. package/dist/runtime/sandbox-stream-retry.js +61 -0
  252. package/dist/runtime/sandbox-stream-retry.js.map +1 -0
  253. package/dist/runtime/setup-script.d.ts.map +1 -1
  254. package/dist/runtime/setup-script.js +4 -2
  255. package/dist/runtime/setup-script.js.map +1 -1
  256. package/dist/runtime/validated-token.d.ts +1 -1
  257. package/dist/runtime/validated-token.d.ts.map +1 -1
  258. package/dist/runtime/validated-token.js +75 -33
  259. package/dist/runtime/validated-token.js.map +1 -1
  260. package/dist/sandbox.d.ts +19 -22
  261. package/dist/sandbox.d.ts.map +1 -1
  262. package/dist/sandbox.js +20 -34
  263. package/dist/sandbox.js.map +1 -1
  264. package/dist/schedules.js +8 -9
  265. package/dist/schedules.js.map +1 -1
  266. package/package.json +18 -28
  267. package/dist/channels/collect.d.ts +0 -26
  268. package/dist/channels/collect.d.ts.map +0 -1
  269. package/dist/channels/collect.js +0 -42
  270. package/dist/channels/collect.js.map +0 -1
  271. package/dist/channels/github/adapter-core.d.ts +0 -6
  272. package/dist/channels/github/adapter-core.d.ts.map +0 -1
  273. package/dist/channels/github/adapter-core.js +0 -27
  274. package/dist/channels/github/adapter-core.js.map +0 -1
  275. package/dist/channels/github/adapter.d.ts +0 -16
  276. package/dist/channels/github/adapter.d.ts.map +0 -1
  277. package/dist/channels/github/adapter.js +0 -52
  278. package/dist/channels/github/adapter.js.map +0 -1
  279. package/dist/channels/github/define.d.ts.map +0 -1
  280. package/dist/channels/github/define.js +0 -166
  281. package/dist/channels/github/define.js.map +0 -1
  282. package/dist/channels/github/http.d.ts.map +0 -1
  283. package/dist/channels/github/http.js.map +0 -1
  284. package/dist/channels/github/index.d.ts +0 -12
  285. package/dist/channels/github/index.d.ts.map +0 -1
  286. package/dist/channels/github/index.js +0 -10
  287. package/dist/channels/github/index.js.map +0 -1
  288. package/dist/channels/github/normalize.d.ts.map +0 -1
  289. package/dist/channels/github/normalize.js.map +0 -1
  290. package/dist/channels/github/source-thread.d.ts.map +0 -1
  291. package/dist/channels/github/source-thread.js.map +0 -1
  292. package/dist/channels/github/transport.d.ts.map +0 -1
  293. package/dist/channels/github/transport.js.map +0 -1
  294. package/dist/channels/plugin.d.ts +0 -61
  295. package/dist/channels/plugin.d.ts.map +0 -1
  296. package/dist/channels/plugin.js +0 -80
  297. package/dist/channels/plugin.js.map +0 -1
  298. package/dist/channels/slack/adapter-core.d.ts.map +0 -1
  299. package/dist/channels/slack/adapter-core.js.map +0 -1
  300. package/dist/channels/slack/adapter.d.ts.map +0 -1
  301. package/dist/channels/slack/adapter.js.map +0 -1
  302. package/dist/channels/slack/define.d.ts +0 -74
  303. package/dist/channels/slack/define.d.ts.map +0 -1
  304. package/dist/channels/slack/define.js +0 -160
  305. package/dist/channels/slack/define.js.map +0 -1
  306. package/dist/channels/slack/http.d.ts.map +0 -1
  307. package/dist/channels/slack/http.js.map +0 -1
  308. package/dist/channels/slack/index.d.ts +0 -18
  309. package/dist/channels/slack/index.d.ts.map +0 -1
  310. package/dist/channels/slack/index.js +0 -13
  311. package/dist/channels/slack/index.js.map +0 -1
  312. package/dist/channels/slack/normalize.d.ts.map +0 -1
  313. package/dist/channels/slack/normalize.js.map +0 -1
  314. package/dist/channels/slack/source-thread.d.ts.map +0 -1
  315. package/dist/channels/slack/source-thread.js.map +0 -1
  316. package/dist/channels/slack/transport.d.ts.map +0 -1
  317. package/dist/channels/slack/transport.js.map +0 -1
  318. /package/dist/{channels → connectors}/github/source-thread.d.ts +0 -0
  319. /package/dist/{channels → connectors}/github/source-thread.js +0 -0
  320. /package/dist/{channels → connectors}/slack/adapter-core.js +0 -0
  321. /package/dist/{channels → connectors}/slack/source-thread.d.ts +0 -0
  322. /package/dist/{channels → connectors}/slack/source-thread.js +0 -0
@@ -1,92 +1,172 @@
1
1
  /**
2
- * GitHub connector — sandbox checkouts, CLI, and credential injection.
2
+ * GitHub connector — workspace tools, sandbox checkout, and optional webhooks.
3
3
  *
4
- * Declares which repositories MDA should clone into the sandbox, whether to
5
- * install the GitHub CLI, and whether resolved identity credentials should be
6
- * available inside the sandbox so the agent can act as the signed-in user.
4
+ * A [tool server integration](../toolserver) like `connectors.gmail`, so the
5
+ * workspace's GitHub tools — issues, pull requests, reviews come from the same
6
+ * gateway against the same credential. GitHub reaches further than an API
7
+ * though: an agent works on a repository by having it checked out. So this
8
+ * connector also provisions the sandbox, declaring which repositories to clone,
9
+ * whether to install the GitHub CLI, and whether resolved identity credentials
10
+ * should be available inside the sandbox so the agent can act as the user.
7
11
  *
8
- * Sandbox provisioning runs via the connector's {@link connector}'s `sandbox`
9
- * hook. Channel ingress lives under `channels/github` (separate plugin).
10
- * Connect-with-GitHub OAuth lives under `identity/github/`.
12
+ * Optional `events` merges former `channels.github` authoring: GitHub App
13
+ * webhook ingress at `POST /connectors/{name}/events`, messaging transport, and
14
+ * deploy requirements. Connect-with-GitHub OAuth remains `connect.github`.
15
+ *
16
+ * The two halves interact in one place: installing the CLI (the default) leaves
17
+ * the integration's tools off, because `gh` already reaches the same API. Naming
18
+ * tools, or dropping the CLI, turns them on. See {@link defaultToolsFromCLI}.
11
19
  */
20
+ import { z } from "zod";
21
+ import { GITHUB_CHANNEL_REQUIRED_ENV, toGitHubChannelManifest, } from "./define.js";
22
+ import { handleGitHubEventsRequest } from "./http.js";
23
+ import { transportFromEnv } from "./transport.js";
12
24
  import { CONNECTOR_BRAND, } from "../../runtime/connector.js";
25
+ import { GITHUB_SLUG, toolServerConnectorSchema, toolServerTools, } from "../toolserver/index.js";
13
26
  import { provisionGitHubSandbox } from "./sandbox.js";
14
- export { connect, credentials, } from "../../identity/github/index.js";
15
27
  export { provisionGitHubSandbox, buildGitHubProvisionScript, CLONE_FAILED_MARKDOWN, isBenignCheckoutFailure, GITHUB_TOKEN_REMOTE_PATH, GITHUB_PROVISION_REMOTE_PATH, } from "./sandbox.js";
28
+ export { GITHUB_CHANNEL_REQUIRED_ENV, requiredGitHubPermissions, toGitHubChannelManifest, } from "./define.js";
29
+ /** Sandbox-relative paths may not escape the workspace or be absolute. */
30
+ const relativePath = (message) => z.string(message).refine(isSafeRelativePath, message);
31
+ const repositoryCheckout = z
32
+ .object({
33
+ repo: z
34
+ .string()
35
+ .refine(isExactRepo, 'repo must look like "owner/repo"')
36
+ .optional(),
37
+ from: z.literal("event.repository").optional(),
38
+ path: relativePath("path must be a safe relative sandbox path"),
39
+ ref: z.string().optional(),
40
+ depth: z.int("depth must be >= 1").min(1, "depth must be >= 1").optional(),
41
+ sparsePaths: z
42
+ .array(relativePath("sparsePaths must be safe relative paths"))
43
+ .optional(),
44
+ submodules: z.boolean().optional(),
45
+ write: z.boolean().optional(),
46
+ onReuse: z
47
+ .enum(["keep", "reset", "fetch"], {
48
+ error: 'onReuse must be "keep", "reset", or "fetch"',
49
+ })
50
+ .optional(),
51
+ })
52
+ .refine((repo) => repo.repo !== undefined || repo.from === "event.repository", 'requires `repo` or from: "event.repository"');
53
+ const githubEventHandler = z.object({
54
+ on: z
55
+ .string('on must be a non-empty string (e.g. "pull_request", "pull_request.opened", or "*")')
56
+ .trim()
57
+ .min(1, 'on must be a non-empty string (e.g. "pull_request", "pull_request.opened", or "*")'),
58
+ repositories: z.array(z.string()).optional(),
59
+ autoReply: z.boolean().default(true),
60
+ prompt: z.custom((prompt) => typeof prompt === "function", "requires a `prompt` function"),
61
+ });
16
62
  /**
17
- * Build the branded GitHub connector declaration.
63
+ * The GitHub connector's arguments: the gateway options, plus the sandbox ones.
18
64
  *
19
- * Validates authoring config and implements a `sandbox` hook so checkout / CLI /
20
- * credential provisioning runs through the public connector protocol.
65
+ * Checkout paths are the security-relevant part: they land in the sandbox, so
66
+ * each one must stay inside the workspace and no two may collide.
21
67
  */
22
- export function connector(config = {}) {
23
- validateGitHubConnector(config);
24
- const instance = {
25
- [CONNECTOR_BRAND]: true,
26
- kind: "github",
27
- repositories: config.repositories ?? [],
28
- installCLI: config.installCLI !== false,
29
- injectCredentials: config.injectCredentials !== false,
30
- async sandbox(ctx) {
31
- await provisionGitHubSandbox(ctx.backend, instance, {
32
- mode: ctx.mode,
33
- config: ctx.config,
34
- identity: ctx.identity,
35
- });
36
- },
37
- };
38
- return instance;
39
- }
40
- /** Validate a GitHub connector config without constructing a connector. */
41
- export function validateGitHubConnector(config) {
42
- if (config === null || typeof config !== "object") {
43
- throw new Error("github.connector(...) requires a config object.");
44
- }
45
- if (config.installCLI !== undefined &&
46
- typeof config.installCLI !== "boolean") {
47
- throw new Error("github.connector(...) installCLI must be a boolean.");
48
- }
49
- if (config.injectCredentials !== undefined &&
50
- typeof config.injectCredentials !== "boolean") {
51
- throw new Error("github.connector(...) injectCredentials must be a boolean.");
52
- }
53
- const seenPaths = new Set();
54
- for (const repo of config.repositories ?? []) {
55
- validateRepositoryCheckout(repo);
56
- if (seenPaths.has(repo.path)) {
57
- throw new Error(`github.connector(...) Duplicate repository checkout path "${repo.path}".`);
68
+ const githubConnectorConfig = toolServerConnectorSchema({
69
+ repositories: z
70
+ .array(repositoryCheckout)
71
+ .check((ctx) => {
72
+ const seen = new Set();
73
+ for (const repo of ctx.value) {
74
+ if (seen.has(repo.path)) {
75
+ ctx.issues.push({
76
+ code: "custom",
77
+ input: ctx.value,
78
+ message: `duplicate repository checkout path "${repo.path}"`,
79
+ });
80
+ }
81
+ seen.add(repo.path);
58
82
  }
59
- seenPaths.add(repo.path);
60
- }
83
+ })
84
+ .prefault([]),
85
+ installCLI: z.boolean().default(true),
86
+ injectCredentials: z.boolean().default(true),
87
+ events: z
88
+ .array(githubEventHandler)
89
+ .nonempty("requires a non-empty `events` array")
90
+ .optional(),
91
+ }).transform(defaultToolsFromCLI);
92
+ const githubTools = toolServerTools(GITHUB_SLUG, "connectors.github");
93
+ function hide(target, key, value) {
94
+ Object.defineProperty(target, key, { value, enumerable: false });
61
95
  }
62
- function validateRepositoryCheckout(repo) {
63
- if (repo === null || typeof repo !== "object") {
64
- throw new Error("github.connector(...) repositories entries must be objects.");
65
- }
66
- if (repo.repo === undefined && repo.from !== "event.repository") {
67
- throw new Error('github.connector(...) repository checkout requires `repo` or from: "event.repository".');
68
- }
69
- if (repo.repo !== undefined && !isExactRepo(repo.repo)) {
70
- throw new Error(`github.connector(...) repo "${repo.repo}" must look like "owner/repo".`);
71
- }
72
- if (typeof repo.path !== "string" || !isSafeRelativePath(repo.path)) {
73
- throw new Error(`github.connector(...) repository path "${String(repo.path)}" must be a safe relative sandbox path.`);
96
+ /**
97
+ * Leave the integration's tools off when the sandbox has `gh`.
98
+ *
99
+ * The CLI and the tools are two routes to the same API, and an agent that can run
100
+ * `gh` does not need the integration's tool definitions in its prompt to reach the
101
+ * same endpoints. So the CLI installed by default — implies no tools, and a
102
+ * project gets them by naming them or by dropping the CLI.
103
+ *
104
+ * Any explicit selection wins, including `excludeTools` on its own: asking for a
105
+ * tool is asking for it, whatever else is in the sandbox.
106
+ */
107
+ function defaultToolsFromCLI(args) {
108
+ const selected = args.includeTools !== undefined || args.excludeTools !== undefined;
109
+ if (selected || !args.installCLI) {
110
+ return args;
74
111
  }
75
- if (repo.depth !== undefined &&
76
- (!Number.isInteger(repo.depth) || repo.depth < 1)) {
77
- throw new Error("github.connector(...) repository depth must be >= 1.");
112
+ return { ...args, includeTools: [] };
113
+ }
114
+ /**
115
+ * Build the branded GitHub connector declaration.
116
+ *
117
+ * Sandbox + tools follow today's defaults. When {@link GitHubConnectorConfig.events}
118
+ * is set, Events / messaging / requirements hooks are attached as well.
119
+ *
120
+ * At least one of repositories, tool selection (`includeTools` /
121
+ * `excludeTools`), or `events` gives the connector a purpose beyond default
122
+ * sandbox provisioning — but an empty config remains valid (sandbox-only).
123
+ */
124
+ export function githubConnector(config) {
125
+ const validate = githubConnectorConfig["~standard"].validate;
126
+ const result = validate(config);
127
+ if (result instanceof Promise) {
128
+ throw new TypeError("connectors.github(...) needs a schema that validates synchronously");
78
129
  }
79
- if (repo.sparsePaths !== undefined &&
80
- (!Array.isArray(repo.sparsePaths) ||
81
- repo.sparsePaths.some((path) => !isSafeRelativePath(path)))) {
82
- throw new Error("github.connector(...) sparsePaths must be safe relative paths.");
130
+ if (result.issues) {
131
+ const message = result.issues.map((issue) => issue.message).join("; ");
132
+ throw new Error(`connectors.github(...) ${message}`);
83
133
  }
84
- if (repo.onReuse !== undefined &&
85
- repo.onReuse !== "keep" &&
86
- repo.onReuse !== "reset" &&
87
- repo.onReuse !== "fetch") {
88
- throw new Error('github.connector(...) onReuse must be "keep", "reset", or "fetch".');
134
+ const args = result.value;
135
+ // `events` is authoring-only: the Connector.events hook owns that property.
136
+ const { events: eventHandlers, ...rest } = args;
137
+ const self = { kind: "github", ...rest };
138
+ hide(self, CONNECTOR_BRAND, true);
139
+ hide(self, "tools", (ctx) => githubTools(ctx, self));
140
+ hide(self, "sandbox", async (ctx) => {
141
+ await provisionGitHubSandbox(ctx.backend, self, {
142
+ mode: ctx.mode,
143
+ config: ctx.config,
144
+ identity: ctx.identity,
145
+ });
146
+ });
147
+ if (eventHandlers !== undefined && eventHandlers.length > 0) {
148
+ const webhookConfig = {
149
+ events: eventHandlers,
150
+ };
151
+ hide(self, "events", (ctx) => handleGitHubEventsRequest(ctx.request, {
152
+ name: ctx.name,
153
+ config: webhookConfig,
154
+ definition: { config: webhookConfig },
155
+ rawBody: ctx.rawBody,
156
+ }));
157
+ hide(self, "messaging", (env) => transportFromEnv(env));
158
+ hide(self, "requirements", (name) => toGitHubRequirements(name, webhookConfig));
89
159
  }
160
+ return self;
161
+ }
162
+ /** Build deploy/runtime requirements for a file-derived connector name. */
163
+ export function toGitHubRequirements(name, config) {
164
+ return {
165
+ name,
166
+ provider: "github",
167
+ ...toGitHubChannelManifest(config),
168
+ requiredEnv: [...GITHUB_CHANNEL_REQUIRED_ENV],
169
+ };
90
170
  }
91
171
  function isExactRepo(pattern) {
92
172
  const [owner, repo, extra] = pattern.split("/");
@@ -103,4 +183,10 @@ function isSafeRelativePath(path) {
103
183
  }
104
184
  return !path.split("/").some((part) => part === "..");
105
185
  }
186
+ export { githubTriggerMatches, matchGitHubHandler } from "./match.js";
187
+ export { verifyGitHubWebhookSignature, normalizeGitHubEvent, extractIssueOrPullNumber, GITHUB_WEBHOOK_SECRET_ENV, } from "./normalize.js";
188
+ export { createGitHubAppTransport, transportFromEnv, GITHUB_APP_ID_ENV, GITHUB_APP_PRIVATE_KEY_ENV, GITHUB_INSTALLATION_ID_ENV, } from "./transport.js";
189
+ export { encodeGitHubSourceThreadKey, decodeGitHubSourceThreadKey, } from "./source-thread.js";
190
+ export { handleGitHubEventsRequest } from "./http.js";
191
+ export { githubChannelAdapter, githubConfigFromManifest, } from "./adapter-core.js";
106
192
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/connectors/github/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/connectors/github/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Pure GitHub handler routing — kept out of `define.ts` so normalize/http can
3
+ * load without pulling the channel authoring module (and its adapter) back in.
4
+ */
5
+ import type { RequiredGitHubChannelConfig, RequiredGitHubChannelHandler } from "./define.js";
6
+ /**
7
+ * Whether a handler `on` filter matches a delivery.
8
+ *
9
+ * @param on - `"*"`, `"pull_request"`, or `"pull_request.opened"`
10
+ * @param eventName - `X-GitHub-Event`
11
+ * @param action - `payload.action` when present
12
+ */
13
+ export declare function githubTriggerMatches(on: string, eventName: string, action?: string): boolean;
14
+ /**
15
+ * Find the first handler that matches event/action + repository.
16
+ *
17
+ * @returns The handler, or `undefined` when no handler matches (event ignored).
18
+ */
19
+ export declare function matchGitHubHandler(config: RequiredGitHubChannelConfig, eventName: string, repository: string | undefined, action?: string): RequiredGitHubChannelHandler | undefined;
20
+ //# sourceMappingURL=match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../../../src/connectors/github/match.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,2BAA2B,EAC3B,4BAA4B,EAC7B,MAAM,aAAa,CAAC;AAErB;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAMT;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,2BAA2B,EACnC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,MAAM,CAAC,EAAE,MAAM,GACd,4BAA4B,GAAG,SAAS,CAU1C"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Pure GitHub handler routing — kept out of `define.ts` so normalize/http can
3
+ * load without pulling the channel authoring module (and its adapter) back in.
4
+ */
5
+ /**
6
+ * Whether a handler `on` filter matches a delivery.
7
+ *
8
+ * @param on - `"*"`, `"pull_request"`, or `"pull_request.opened"`
9
+ * @param eventName - `X-GitHub-Event`
10
+ * @param action - `payload.action` when present
11
+ */
12
+ export function githubTriggerMatches(on, eventName, action) {
13
+ if (!on || !eventName)
14
+ return false;
15
+ if (on === "*")
16
+ return true;
17
+ if (on === eventName)
18
+ return true;
19
+ if (action !== undefined && on === `${eventName}.${action}`)
20
+ return true;
21
+ return false;
22
+ }
23
+ /**
24
+ * Find the first handler that matches event/action + repository.
25
+ *
26
+ * @returns The handler, or `undefined` when no handler matches (event ignored).
27
+ */
28
+ export function matchGitHubHandler(config, eventName, repository, action) {
29
+ for (const handler of config.events) {
30
+ if (!githubTriggerMatches(handler.on, eventName, action))
31
+ continue;
32
+ const repos = handler.repositories;
33
+ if (repos && repos.length > 0) {
34
+ if (!repository || !repos.includes(repository))
35
+ continue;
36
+ }
37
+ return handler;
38
+ }
39
+ return undefined;
40
+ }
41
+ //# sourceMappingURL=match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.js","sourceRoot":"","sources":["../../../src/connectors/github/match.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,EAAU,EACV,SAAiB,EACjB,MAAe;IAEf,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,EAAE,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,MAAM,KAAK,SAAS,IAAI,EAAE,KAAK,GAAG,SAAS,IAAI,MAAM,EAAE;QAAE,OAAO,IAAI,CAAC;IACzE,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAmC,EACnC,SAAiB,EACjB,UAA8B,EAC9B,MAAe;IAEf,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC;YAAE,SAAS;QACnE,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;QACnC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,SAAS;QAC3D,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * GitHub App webhook verify + normalize into {@link ChannelEvent}.
3
3
  */
4
- import type { ChannelEvent } from "../types.js";
4
+ import type { ChannelEvent } from "../../channels/types.js";
5
5
  import type { GitHubWebhookPromptEvent, RequiredGitHubChannelConfig, RequiredGitHubChannelHandler } from "./define.js";
6
6
  export declare const GITHUB_WEBHOOK_SECRET_ENV = "GITHUB_WEBHOOK_SECRET";
7
7
  export interface GitHubNormalizeResult {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/connectors/github/normalize.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EACV,wBAAwB,EACxB,2BAA2B,EAC3B,4BAA4B,EAC7B,MAAM,aAAa,CAAC;AAIrB,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AAEjE,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,YAAY,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,4BAA4B,CAAC;IACvC,sEAAsE;IACtE,WAAW,CAAC,EAAE,wBAAwB,CAAC;CACxC;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,GACb,IAAI,CA0BN;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,EACD,MAAM,EAAE,2BAA2B,EACnC,sBAAsB,CAAC,EAAE,MAAM,GAC9B,qBAAqB,CAgGvB;AAED,sEAAsE;AACtE,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,GAAG,SAAS,CAMpB"}
@@ -3,8 +3,8 @@
3
3
  */
4
4
  import { createHmac, timingSafeEqual } from "node:crypto";
5
5
  import { randomUUID } from "node:crypto";
6
- import { ChannelError } from "../errors.js";
7
- import { matchGitHubHandler } from "./define.js";
6
+ import { ChannelError } from "../../channels/errors.js";
7
+ import { matchGitHubHandler } from "./match.js";
8
8
  import { encodeGitHubSourceThreadKey } from "./source-thread.js";
9
9
  export const GITHUB_WEBHOOK_SECRET_ENV = "GITHUB_WEBHOOK_SECRET";
10
10
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/connectors/github/normalize.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../../src/connectors/github/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAmB,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,YAAY,CAAC;AAE5E,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,yBAAyB,CAAC;AAOjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,gFAAgF;AAChF,eAAO,MAAM,wBAAwB,sBAAsB,CAAC;AAC5D,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAE3E,gEAAgE;AAChE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,wBAAwB,EAAE,SAAS,CAAC,GAC1E,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC,CAAC;AAEzD,kDAAkD;AAClD,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;IACzC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,IAAI,CAAC,CAgEf;AAED,qFAAqF;AACrF,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE;IAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACvE,MAAM,CA8CR;AAED,yEAAyE;AACzE,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,IAAI,CAAC,6BAA6B,EAAE,QAAQ,GAAG,UAAU,CAAC,GAClE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAqD7B;AAsMD,mEAAmE;AACnE,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAiGvD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAMjE;AAkCD,wEAAwE;AACxE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAI/D"}
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../../src/connectors/github/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAmB,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,YAAY,CAAC;AAE5E,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,yBAAyB,CAAC;AAQjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,gFAAgF;AAChF,eAAO,MAAM,wBAAwB,sBAAsB,CAAC;AAC5D,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAE3E,gEAAgE;AAChE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,wBAAwB,EAAE,SAAS,CAAC,GAC1E,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC,CAAC;AAEzD,kDAAkD;AAClD,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;IACzC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,IAAI,CAAC,CAgEf;AAED,qFAAqF;AACrF,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE;IAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACvE,MAAM,CAuDR;AAED,yEAAyE;AACzE,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,IAAI,CAAC,6BAA6B,EAAE,QAAQ,GAAG,UAAU,CAAC,GAClE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAqD7B;AAuMD,mEAAmE;AACnE,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAiGvD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAMjE;AAuCD,wEAAwE;AACxE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAI/D"}
@@ -5,10 +5,11 @@
5
5
  * declared repositories. When a thread starts against a reused sandbox, refresh
6
6
  * credentials and apply each checkout's `onReuse` policy (default `fetch`).
7
7
  */
8
- import { defaultResolveActorToken } from "../../identity/github/credentials.js";
8
+ import { defaultResolveUserToken } from "../../identity/github/credentials.js";
9
9
  import { createCredentialsProvider } from "../../runtime/credentials.js";
10
10
  import { buildRuntimeIdentity, resolveRuntimeConfigurable, } from "../../runtime/identity-runtime.js";
11
11
  import { assertSetupSucceeded } from "../../runtime/setup-script.js";
12
+ import { executeWithStreamRetry } from "../../runtime/sandbox-stream-retry.js";
12
13
  /** Absolute paths used for GitHub provisioning artifacts inside the sandbox. */
13
14
  export const GITHUB_TOKEN_REMOTE_PATH = "/tmp/mda-gh-token";
14
15
  export const GITHUB_PROVISION_REMOTE_PATH = "/tmp/mda-github-provision.sh";
@@ -50,11 +51,11 @@ export async function provisionGitHubSandbox(backend, connector, options) {
50
51
  const configurable = resolveRuntimeConfigurable({
51
52
  configurable: options.config?.configurable,
52
53
  });
53
- const actorId = buildRuntimeIdentity(configurable)?.actor.id;
54
+ const actorId = buildRuntimeIdentity(configurable)?.user.id;
54
55
  const slackHint = typeof actorId === "string" && actorId.startsWith("slack:")
55
56
  ? " Slack is running as an unlinked Slack actor — Connect Slack in the app UI while signed in, then Connect GitHub on that same account."
56
57
  : " Connect GitHub for this actor in the app UI (same account Slack is linked to), or set GITHUB_TOKEN.";
57
- throw new Error("github.connector(...): cannot clone repositories without GitHub credentials" +
58
+ throw new Error("connectors.github(...): cannot clone repositories without GitHub credentials" +
58
59
  ` (actor=${actorId ?? "none"}).${slackHint}`);
59
60
  }
60
61
  const script = buildGitHubProvisionScript(connector, {
@@ -79,11 +80,10 @@ export function buildGitHubProvisionScript(connector, options) {
79
80
  // Same-thread refresh: rewrite token + gh wrapper only. Skip apt/git
80
81
  // install and `gh api user` identity probes so we don't add latency (or
81
82
  // another sandbox round-trip that can 502) on every message.
82
- if (connector.injectCredentials && options.hasToken) {
83
- lines.push(...injectCredentialsScriptLines({ light: true }));
84
- }
85
- else if (connector.injectCredentials) {
86
- lines.push(...clearInjectedCredentialsScriptLines());
83
+ if (connector.injectCredentials) {
84
+ lines.push(...(options.hasToken
85
+ ? injectCredentialsScriptLines({ light: true })
86
+ : clearInjectedCredentialsScriptLines()));
87
87
  }
88
88
  return `${lines.join("\n")}\n`;
89
89
  }
@@ -95,8 +95,13 @@ export function buildGitHubProvisionScript(connector, options) {
95
95
  if (needsGit) {
96
96
  lines.push(...ensureGitScriptLines());
97
97
  }
98
- if (connector.injectCredentials && options.hasToken) {
99
- lines.push(...injectCredentialsScriptLines());
98
+ // Fail closed on every mode: a sandbox reused by a new thread can still hold
99
+ // the previous actor's token, so an actor without one must clear it before
100
+ // any checkout sync runs.
101
+ if (connector.injectCredentials) {
102
+ lines.push(...(options.hasToken
103
+ ? injectCredentialsScriptLines()
104
+ : clearInjectedCredentialsScriptLines()));
100
105
  }
101
106
  for (const repo of connector.repositories) {
102
107
  if (!repo.repo) {
@@ -122,14 +127,14 @@ export async function resolveSandboxGitHubToken(connector, options) {
122
127
  });
123
128
  const runtimeIdentity = buildRuntimeIdentity(configurable);
124
129
  const repoHint = firstStaticRepo(connector);
125
- if (identityConfig?.scoping.credentials === "custom" &&
130
+ if (identityConfig?.scope.credentials === "custom" &&
126
131
  identityConfig.credentials &&
127
132
  runtimeIdentity) {
128
133
  // Connect-with-GitHub vault first — same path tools use for write: ["actor"].
129
134
  // Do this before provider.for so a missing PAT / installation source cannot
130
135
  // mask a vault hit, and vault/store errors surface instead of being swallowed.
131
136
  try {
132
- const vaultToken = await defaultResolveActorToken({
137
+ const vaultToken = await defaultResolveUserToken({
133
138
  identity: runtimeIdentity,
134
139
  scopes: ["repo"],
135
140
  });
@@ -138,8 +143,8 @@ export async function resolveSandboxGitHubToken(connector, options) {
138
143
  }
139
144
  catch (err) {
140
145
  const detail = err instanceof Error ? err.message : String(err);
141
- throw new Error(`github.connector(...): failed to read Connect-with-GitHub credentials` +
142
- ` (actor=${runtimeIdentity.actor.id}): ${detail}`);
146
+ throw new Error(`connectors.github(...): failed to read Connect-with-GitHub credentials` +
147
+ ` (actor=${runtimeIdentity.user.id}): ${detail}`);
143
148
  }
144
149
  const provider = createCredentialsProvider(identityConfig, runtimeIdentity);
145
150
  if (provider) {
@@ -229,7 +234,7 @@ function installCLIScriptLines() {
229
234
  " elif command -v brew >/dev/null 2>&1; then",
230
235
  " brew install gh",
231
236
  " else",
232
- ' echo "github.connector(...): unable to install gh CLI" >&2',
237
+ ' echo "connectors.github(...): unable to install gh CLI" >&2',
233
238
  " exit 1",
234
239
  " fi",
235
240
  "fi",
@@ -248,7 +253,7 @@ function ensureGitScriptLines() {
248
253
  " elif command -v brew >/dev/null 2>&1; then",
249
254
  " brew install git",
250
255
  " else",
251
- ' echo "github.connector(...): git is required to checkout repositories" >&2',
256
+ ' echo "connectors.github(...): git is required to checkout repositories" >&2',
252
257
  " exit 1",
253
258
  " fi",
254
259
  "fi",
@@ -257,9 +262,10 @@ function ensureGitScriptLines() {
257
262
  /**
258
263
  * Remove previously injected GitHub credentials from a reused sandbox.
259
264
  *
260
- * Thread-scoped sandboxes are shared across Slack users in the same thread; when
261
- * the current actor has no token we must clear any prior actor's token file /
262
- * gh auth / git helpers before returning.
265
+ * Thread-scoped sandboxes are shared across Slack users in the same thread, and
266
+ * agent-scoped sandboxes are shared across every thread and actor; when the
267
+ * current actor has no token we must clear any prior actor's token file / gh
268
+ * auth / git helpers before returning.
263
269
  */
264
270
  function clearInjectedCredentialsScriptLines() {
265
271
  return [
@@ -380,7 +386,7 @@ function cloneRepositoryScriptLines(repo) {
380
386
  // Use `if ! clone; then …; else …; fi` so the failure branch is valid even
381
387
  // when there is no post-clone work (empty `then` before `else` is a syntax error).
382
388
  lines.push(` if ! git clone "\${CLONE_ARGS[@]}" ${remote} ${path}; then`);
383
- lines.push(` rm -rf ${path}`, ` mkdir -p ${path}`, ` cat > ${noticePath} <<'MDA_CLONE_FAILED_EOF'`, "# Repository clone failed", "", `MDA could not clone ${repoLabel} into this directory.`, "", "Common causes:", "- the branch/ref does not exist on the remote (omit ref to use the default branch)", "- the repository is private and Connect-with-GitHub / GITHUB_TOKEN cannot access it", "- the repository name is wrong or was renamed", "- network / GitHub availability issues", "", "The agent run continued without this checkout. Fix access (or set", "MDA_GITHUB_CHECKOUT_REPO to a repo you can read), then start a new thread", "so the sandbox is reprovisioned.", "MDA_CLONE_FAILED_EOF", ` echo "github.connector(...): clone failed for ${repoLabel}; wrote ${CLONE_FAILED_MARKDOWN}" >&2`);
389
+ lines.push(` rm -rf ${path}`, ` mkdir -p ${path}`, ` cat > ${noticePath} <<'MDA_CLONE_FAILED_EOF'`, "# Repository clone failed", "", `MDA could not clone ${repoLabel} into this directory.`, "", "Common causes:", "- the branch/ref does not exist on the remote (omit ref to use the default branch)", "- the repository is private and Connect-with-GitHub / GITHUB_TOKEN cannot access it", "- the repository name is wrong or was renamed", "- network / GitHub availability issues", "", "The agent run continued without this checkout. Fix access (or set", "MDA_GITHUB_CHECKOUT_REPO to a repo you can read), then start a new thread", "so the sandbox is reprovisioned.", "MDA_CLONE_FAILED_EOF", ` echo "connectors.github(...): clone failed for ${repoLabel}; wrote ${CLONE_FAILED_MARKDOWN}" >&2`);
384
390
  if ((repo.sparsePaths && repo.sparsePaths.length > 0) || repo.submodules) {
385
391
  lines.push(" else");
386
392
  if (repo.sparsePaths && repo.sparsePaths.length > 0) {
@@ -406,7 +412,7 @@ function reuseRepositoryScriptLines(repo) {
406
412
  const lines = [
407
413
  `if [ -d ${path}/.git ]; then`,
408
414
  // Soft-fail refresh so a stale remote cannot abort the run.
409
- ` git -C ${path} fetch --prune origin ${quotedRef} || echo "github.connector(...): fetch failed for ${path}" >&2`,
415
+ ` git -C ${path} fetch --prune origin ${quotedRef} || echo "connectors.github(...): fetch failed for ${path}" >&2`,
410
416
  ];
411
417
  if (onReuse === "reset") {
412
418
  lines.push(` git -C ${path} checkout -f ${quotedRef} || true`, ` git -C ${path} reset --hard FETCH_HEAD || true`);
@@ -441,10 +447,11 @@ async function uploadAndRun(backend, connector, script, extraFiles = []) {
441
447
  let result;
442
448
  if (typeof backend.uploadFiles === "function") {
443
449
  await backend.uploadFiles(files);
444
- result = (await backend.execute(`bash ${GITHUB_PROVISION_REMOTE_PATH}`));
450
+ // Fresh sandboxes often reject the first websocket execute; retry in place.
451
+ result = (await executeWithStreamRetry((command) => backend.execute(command), `bash ${GITHUB_PROVISION_REMOTE_PATH}`));
445
452
  }
446
453
  else {
447
- result = (await backend.execute(script));
454
+ result = (await executeWithStreamRetry((command) => backend.execute(command), script));
448
455
  }
449
456
  if (typeof result.exitCode === "number" && result.exitCode !== 0) {
450
457
  // Clone/ref failures must not abort the agent run. Leave notice files and