agent-nuvira 1.14.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 (379) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +891 -0
  3. package/dist/agent-sdk/src/agent.d.ts +118 -0
  4. package/dist/agent-sdk/src/agent.d.ts.map +1 -0
  5. package/dist/agent-sdk/src/agent.js +88 -0
  6. package/dist/agent-sdk/src/agent.js.map +1 -0
  7. package/dist/agent-sdk/src/index.d.ts +33 -0
  8. package/dist/agent-sdk/src/index.d.ts.map +1 -0
  9. package/dist/agent-sdk/src/index.js +32 -0
  10. package/dist/agent-sdk/src/index.js.map +1 -0
  11. package/dist/agent-sdk/src/register.d.ts +70 -0
  12. package/dist/agent-sdk/src/register.d.ts.map +1 -0
  13. package/dist/agent-sdk/src/register.js +181 -0
  14. package/dist/agent-sdk/src/register.js.map +1 -0
  15. package/dist/agent-sdk/src/scaffold.d.ts +50 -0
  16. package/dist/agent-sdk/src/scaffold.d.ts.map +1 -0
  17. package/dist/agent-sdk/src/scaffold.js +291 -0
  18. package/dist/agent-sdk/src/scaffold.js.map +1 -0
  19. package/dist/agent-sdk/src/testing.d.ts +187 -0
  20. package/dist/agent-sdk/src/testing.d.ts.map +1 -0
  21. package/dist/agent-sdk/src/testing.js +243 -0
  22. package/dist/agent-sdk/src/testing.js.map +1 -0
  23. package/dist/agent-sdk/src/types.d.ts +202 -0
  24. package/dist/agent-sdk/src/types.d.ts.map +1 -0
  25. package/dist/agent-sdk/src/types.js +11 -0
  26. package/dist/agent-sdk/src/types.js.map +1 -0
  27. package/dist/agents/agent.d.ts +132 -0
  28. package/dist/agents/agent.d.ts.map +1 -0
  29. package/dist/agents/agent.js +19 -0
  30. package/dist/agents/agent.js.map +1 -0
  31. package/dist/agents/agents/context-gatherer.d.ts +42 -0
  32. package/dist/agents/agents/context-gatherer.d.ts.map +1 -0
  33. package/dist/agents/agents/context-gatherer.js +366 -0
  34. package/dist/agents/agents/context-gatherer.js.map +1 -0
  35. package/dist/agents/agents/debugger.d.ts +58 -0
  36. package/dist/agents/agents/debugger.d.ts.map +1 -0
  37. package/dist/agents/agents/debugger.js +257 -0
  38. package/dist/agents/agents/debugger.js.map +1 -0
  39. package/dist/agents/agents/git-agent.d.ts +34 -0
  40. package/dist/agents/agents/git-agent.d.ts.map +1 -0
  41. package/dist/agents/agents/git-agent.js +200 -0
  42. package/dist/agents/agents/git-agent.js.map +1 -0
  43. package/dist/agents/agents/github-release-agent.d.ts +65 -0
  44. package/dist/agents/agents/github-release-agent.d.ts.map +1 -0
  45. package/dist/agents/agents/github-release-agent.js +439 -0
  46. package/dist/agents/agents/github-release-agent.js.map +1 -0
  47. package/dist/agents/agents/package-agent.d.ts +33 -0
  48. package/dist/agents/agents/package-agent.d.ts.map +1 -0
  49. package/dist/agents/agents/package-agent.js +233 -0
  50. package/dist/agents/agents/package-agent.js.map +1 -0
  51. package/dist/agents/agents/planner.d.ts +26 -0
  52. package/dist/agents/agents/planner.d.ts.map +1 -0
  53. package/dist/agents/agents/planner.js +222 -0
  54. package/dist/agents/agents/planner.js.map +1 -0
  55. package/dist/agents/agents/reviewer.d.ts +34 -0
  56. package/dist/agents/agents/reviewer.d.ts.map +1 -0
  57. package/dist/agents/agents/reviewer.js +159 -0
  58. package/dist/agents/agents/reviewer.js.map +1 -0
  59. package/dist/agents/agents/runner.d.ts +73 -0
  60. package/dist/agents/agents/runner.d.ts.map +1 -0
  61. package/dist/agents/agents/runner.js +299 -0
  62. package/dist/agents/agents/runner.js.map +1 -0
  63. package/dist/agents/agents/security-agent.d.ts +33 -0
  64. package/dist/agents/agents/security-agent.d.ts.map +1 -0
  65. package/dist/agents/agents/security-agent.js +184 -0
  66. package/dist/agents/agents/security-agent.js.map +1 -0
  67. package/dist/agents/agents/tester.d.ts +96 -0
  68. package/dist/agents/agents/tester.d.ts.map +1 -0
  69. package/dist/agents/agents/tester.js +410 -0
  70. package/dist/agents/agents/tester.js.map +1 -0
  71. package/dist/agents/agents/writer.d.ts +51 -0
  72. package/dist/agents/agents/writer.d.ts.map +1 -0
  73. package/dist/agents/agents/writer.js +384 -0
  74. package/dist/agents/agents/writer.js.map +1 -0
  75. package/dist/agents/context-vault.d.ts +49 -0
  76. package/dist/agents/context-vault.d.ts.map +1 -0
  77. package/dist/agents/context-vault.js +134 -0
  78. package/dist/agents/context-vault.js.map +1 -0
  79. package/dist/agents/orchestrator.d.ts +97 -0
  80. package/dist/agents/orchestrator.d.ts.map +1 -0
  81. package/dist/agents/orchestrator.js +696 -0
  82. package/dist/agents/orchestrator.js.map +1 -0
  83. package/dist/agents/utils/file-tree.d.ts +28 -0
  84. package/dist/agents/utils/file-tree.d.ts.map +1 -0
  85. package/dist/agents/utils/file-tree.js +93 -0
  86. package/dist/agents/utils/file-tree.js.map +1 -0
  87. package/dist/cli/agent.d.ts +25 -0
  88. package/dist/cli/agent.d.ts.map +1 -0
  89. package/dist/cli/agent.js +374 -0
  90. package/dist/cli/agent.js.map +1 -0
  91. package/dist/cli/benchmark.d.ts +24 -0
  92. package/dist/cli/benchmark.d.ts.map +1 -0
  93. package/dist/cli/benchmark.js +235 -0
  94. package/dist/cli/benchmark.js.map +1 -0
  95. package/dist/cli/cache.d.ts +12 -0
  96. package/dist/cli/cache.d.ts.map +1 -0
  97. package/dist/cli/cache.js +58 -0
  98. package/dist/cli/cache.js.map +1 -0
  99. package/dist/cli/chat.d.ts +37 -0
  100. package/dist/cli/chat.d.ts.map +1 -0
  101. package/dist/cli/chat.js +393 -0
  102. package/dist/cli/chat.js.map +1 -0
  103. package/dist/cli/commands.d.ts +24 -0
  104. package/dist/cli/commands.d.ts.map +1 -0
  105. package/dist/cli/commands.js +18 -0
  106. package/dist/cli/commands.js.map +1 -0
  107. package/dist/cli/config.d.ts +19 -0
  108. package/dist/cli/config.d.ts.map +1 -0
  109. package/dist/cli/config.js +162 -0
  110. package/dist/cli/config.js.map +1 -0
  111. package/dist/cli/dashboard.d.ts +34 -0
  112. package/dist/cli/dashboard.d.ts.map +1 -0
  113. package/dist/cli/dashboard.js +126 -0
  114. package/dist/cli/dashboard.js.map +1 -0
  115. package/dist/cli/doctor.d.ts +68 -0
  116. package/dist/cli/doctor.d.ts.map +1 -0
  117. package/dist/cli/doctor.js +585 -0
  118. package/dist/cli/doctor.js.map +1 -0
  119. package/dist/cli/edit.d.ts +11 -0
  120. package/dist/cli/edit.d.ts.map +1 -0
  121. package/dist/cli/edit.js +86 -0
  122. package/dist/cli/edit.js.map +1 -0
  123. package/dist/cli/execute.d.ts +25 -0
  124. package/dist/cli/execute.d.ts.map +1 -0
  125. package/dist/cli/execute.js +186 -0
  126. package/dist/cli/execute.js.map +1 -0
  127. package/dist/cli/federation.d.ts +31 -0
  128. package/dist/cli/federation.d.ts.map +1 -0
  129. package/dist/cli/federation.js +387 -0
  130. package/dist/cli/federation.js.map +1 -0
  131. package/dist/cli/history.d.ts +22 -0
  132. package/dist/cli/history.d.ts.map +1 -0
  133. package/dist/cli/history.js +140 -0
  134. package/dist/cli/history.js.map +1 -0
  135. package/dist/cli/init.d.ts +49 -0
  136. package/dist/cli/init.d.ts.map +1 -0
  137. package/dist/cli/init.js +423 -0
  138. package/dist/cli/init.js.map +1 -0
  139. package/dist/cli/learn.d.ts +31 -0
  140. package/dist/cli/learn.d.ts.map +1 -0
  141. package/dist/cli/learn.js +320 -0
  142. package/dist/cli/learn.js.map +1 -0
  143. package/dist/cli/memory.d.ts +38 -0
  144. package/dist/cli/memory.d.ts.map +1 -0
  145. package/dist/cli/memory.js +295 -0
  146. package/dist/cli/memory.js.map +1 -0
  147. package/dist/cli/model-picker.d.ts +18 -0
  148. package/dist/cli/model-picker.d.ts.map +1 -0
  149. package/dist/cli/model-picker.js +225 -0
  150. package/dist/cli/model-picker.js.map +1 -0
  151. package/dist/cli/models.d.ts +11 -0
  152. package/dist/cli/models.d.ts.map +1 -0
  153. package/dist/cli/models.js +132 -0
  154. package/dist/cli/models.js.map +1 -0
  155. package/dist/cli/plan.d.ts +11 -0
  156. package/dist/cli/plan.d.ts.map +1 -0
  157. package/dist/cli/plan.js +94 -0
  158. package/dist/cli/plan.js.map +1 -0
  159. package/dist/cli/plugins.d.ts +15 -0
  160. package/dist/cli/plugins.d.ts.map +1 -0
  161. package/dist/cli/plugins.js +123 -0
  162. package/dist/cli/plugins.js.map +1 -0
  163. package/dist/cli/router.d.ts +20 -0
  164. package/dist/cli/router.d.ts.map +1 -0
  165. package/dist/cli/router.js +142 -0
  166. package/dist/cli/router.js.map +1 -0
  167. package/dist/cli/run.d.ts +22 -0
  168. package/dist/cli/run.d.ts.map +1 -0
  169. package/dist/cli/run.js +110 -0
  170. package/dist/cli/run.js.map +1 -0
  171. package/dist/cli/sandbox.d.ts +27 -0
  172. package/dist/cli/sandbox.d.ts.map +1 -0
  173. package/dist/cli/sandbox.js +264 -0
  174. package/dist/cli/sandbox.js.map +1 -0
  175. package/dist/cli/sdk.d.ts +27 -0
  176. package/dist/cli/sdk.d.ts.map +1 -0
  177. package/dist/cli/sdk.js +204 -0
  178. package/dist/cli/sdk.js.map +1 -0
  179. package/dist/cli/stats.d.ts +18 -0
  180. package/dist/cli/stats.d.ts.map +1 -0
  181. package/dist/cli/stats.js +78 -0
  182. package/dist/cli/stats.js.map +1 -0
  183. package/dist/cli/team.d.ts +42 -0
  184. package/dist/cli/team.d.ts.map +1 -0
  185. package/dist/cli/team.js +473 -0
  186. package/dist/cli/team.js.map +1 -0
  187. package/dist/cli/workflow.d.ts +27 -0
  188. package/dist/cli/workflow.d.ts.map +1 -0
  189. package/dist/cli/workflow.js +347 -0
  190. package/dist/cli/workflow.js.map +1 -0
  191. package/dist/config/manager.d.ts +37 -0
  192. package/dist/config/manager.d.ts.map +1 -0
  193. package/dist/config/manager.js +147 -0
  194. package/dist/config/manager.js.map +1 -0
  195. package/dist/config/types.d.ts +53 -0
  196. package/dist/config/types.d.ts.map +1 -0
  197. package/dist/config/types.js +2 -0
  198. package/dist/config/types.js.map +1 -0
  199. package/dist/context/cache.d.ts +27 -0
  200. package/dist/context/cache.d.ts.map +1 -0
  201. package/dist/context/cache.js +116 -0
  202. package/dist/context/cache.js.map +1 -0
  203. package/dist/context/history.d.ts +87 -0
  204. package/dist/context/history.d.ts.map +1 -0
  205. package/dist/context/history.js +249 -0
  206. package/dist/context/history.js.map +1 -0
  207. package/dist/context/parser.d.ts +61 -0
  208. package/dist/context/parser.d.ts.map +1 -0
  209. package/dist/context/parser.js +194 -0
  210. package/dist/context/parser.js.map +1 -0
  211. package/dist/federation/client.d.ts +49 -0
  212. package/dist/federation/client.d.ts.map +1 -0
  213. package/dist/federation/client.js +239 -0
  214. package/dist/federation/client.js.map +1 -0
  215. package/dist/federation/protocol.d.ts +155 -0
  216. package/dist/federation/protocol.d.ts.map +1 -0
  217. package/dist/federation/protocol.js +57 -0
  218. package/dist/federation/protocol.js.map +1 -0
  219. package/dist/federation/server.d.ts +25 -0
  220. package/dist/federation/server.d.ts.map +1 -0
  221. package/dist/federation/server.js +401 -0
  222. package/dist/federation/server.js.map +1 -0
  223. package/dist/index.d.ts +67 -0
  224. package/dist/index.d.ts.map +1 -0
  225. package/dist/index.js +93 -0
  226. package/dist/index.js.map +1 -0
  227. package/dist/inference/factory.d.ts +20 -0
  228. package/dist/inference/factory.d.ts.map +1 -0
  229. package/dist/inference/factory.js +46 -0
  230. package/dist/inference/factory.js.map +1 -0
  231. package/dist/inference/gemini-adapter.d.ts +17 -0
  232. package/dist/inference/gemini-adapter.d.ts.map +1 -0
  233. package/dist/inference/gemini-adapter.js +176 -0
  234. package/dist/inference/gemini-adapter.js.map +1 -0
  235. package/dist/inference/groq-adapter.d.ts +17 -0
  236. package/dist/inference/groq-adapter.d.ts.map +1 -0
  237. package/dist/inference/groq-adapter.js +103 -0
  238. package/dist/inference/groq-adapter.js.map +1 -0
  239. package/dist/inference/interface.d.ts +49 -0
  240. package/dist/inference/interface.d.ts.map +1 -0
  241. package/dist/inference/interface.js +2 -0
  242. package/dist/inference/interface.js.map +1 -0
  243. package/dist/inference/local-adapter.d.ts +35 -0
  244. package/dist/inference/local-adapter.d.ts.map +1 -0
  245. package/dist/inference/local-adapter.js +311 -0
  246. package/dist/inference/local-adapter.js.map +1 -0
  247. package/dist/inference/model-catalog.d.ts +53 -0
  248. package/dist/inference/model-catalog.d.ts.map +1 -0
  249. package/dist/inference/model-catalog.js +306 -0
  250. package/dist/inference/model-catalog.js.map +1 -0
  251. package/dist/inference/nim-adapter.d.ts +17 -0
  252. package/dist/inference/nim-adapter.d.ts.map +1 -0
  253. package/dist/inference/nim-adapter.js +103 -0
  254. package/dist/inference/nim-adapter.js.map +1 -0
  255. package/dist/inference/openrouter-adapter.d.ts +17 -0
  256. package/dist/inference/openrouter-adapter.d.ts.map +1 -0
  257. package/dist/inference/openrouter-adapter.js +105 -0
  258. package/dist/inference/openrouter-adapter.js.map +1 -0
  259. package/dist/inference/sse.d.ts +20 -0
  260. package/dist/inference/sse.d.ts.map +1 -0
  261. package/dist/inference/sse.js +91 -0
  262. package/dist/inference/sse.js.map +1 -0
  263. package/dist/learning/agent-stats.d.ts +109 -0
  264. package/dist/learning/agent-stats.d.ts.map +1 -0
  265. package/dist/learning/agent-stats.js +240 -0
  266. package/dist/learning/agent-stats.js.map +1 -0
  267. package/dist/learning/benchmark.d.ts +161 -0
  268. package/dist/learning/benchmark.d.ts.map +1 -0
  269. package/dist/learning/benchmark.js +589 -0
  270. package/dist/learning/benchmark.js.map +1 -0
  271. package/dist/learning/cost-tracker.d.ts +101 -0
  272. package/dist/learning/cost-tracker.d.ts.map +1 -0
  273. package/dist/learning/cost-tracker.js +224 -0
  274. package/dist/learning/cost-tracker.js.map +1 -0
  275. package/dist/learning/feedback.d.ts +88 -0
  276. package/dist/learning/feedback.d.ts.map +1 -0
  277. package/dist/learning/feedback.js +169 -0
  278. package/dist/learning/feedback.js.map +1 -0
  279. package/dist/learning/hybrid-router.d.ts +201 -0
  280. package/dist/learning/hybrid-router.d.ts.map +1 -0
  281. package/dist/learning/hybrid-router.js +450 -0
  282. package/dist/learning/hybrid-router.js.map +1 -0
  283. package/dist/learning/model-compare.d.ts +76 -0
  284. package/dist/learning/model-compare.d.ts.map +1 -0
  285. package/dist/learning/model-compare.js +252 -0
  286. package/dist/learning/model-compare.js.map +1 -0
  287. package/dist/learning/model-router.d.ts +68 -0
  288. package/dist/learning/model-router.d.ts.map +1 -0
  289. package/dist/learning/model-router.js +140 -0
  290. package/dist/learning/model-router.js.map +1 -0
  291. package/dist/learning/pattern-extractor.d.ts +99 -0
  292. package/dist/learning/pattern-extractor.d.ts.map +1 -0
  293. package/dist/learning/pattern-extractor.js +310 -0
  294. package/dist/learning/pattern-extractor.js.map +1 -0
  295. package/dist/learning/scorer.d.ts +51 -0
  296. package/dist/learning/scorer.d.ts.map +1 -0
  297. package/dist/learning/scorer.js +64 -0
  298. package/dist/learning/scorer.js.map +1 -0
  299. package/dist/learning/self-improver.d.ts +48 -0
  300. package/dist/learning/self-improver.d.ts.map +1 -0
  301. package/dist/learning/self-improver.js +161 -0
  302. package/dist/learning/self-improver.js.map +1 -0
  303. package/dist/memory/embedder.d.ts +65 -0
  304. package/dist/memory/embedder.d.ts.map +1 -0
  305. package/dist/memory/embedder.js +424 -0
  306. package/dist/memory/embedder.js.map +1 -0
  307. package/dist/memory/memory-integration.d.ts +56 -0
  308. package/dist/memory/memory-integration.d.ts.map +1 -0
  309. package/dist/memory/memory-integration.js +95 -0
  310. package/dist/memory/memory-integration.js.map +1 -0
  311. package/dist/memory/trajectory-store.d.ts +149 -0
  312. package/dist/memory/trajectory-store.d.ts.map +1 -0
  313. package/dist/memory/trajectory-store.js +476 -0
  314. package/dist/memory/trajectory-store.js.map +1 -0
  315. package/dist/memory/vector-store.d.ts +78 -0
  316. package/dist/memory/vector-store.d.ts.map +1 -0
  317. package/dist/memory/vector-store.js +186 -0
  318. package/dist/memory/vector-store.js.map +1 -0
  319. package/dist/plugins/agent-plugin.d.ts +73 -0
  320. package/dist/plugins/agent-plugin.d.ts.map +1 -0
  321. package/dist/plugins/agent-plugin.js +199 -0
  322. package/dist/plugins/agent-plugin.js.map +1 -0
  323. package/dist/plugins/registry.d.ts +61 -0
  324. package/dist/plugins/registry.d.ts.map +1 -0
  325. package/dist/plugins/registry.js +67 -0
  326. package/dist/plugins/registry.js.map +1 -0
  327. package/dist/sandbox/images.d.ts +31 -0
  328. package/dist/sandbox/images.d.ts.map +1 -0
  329. package/dist/sandbox/images.js +129 -0
  330. package/dist/sandbox/images.js.map +1 -0
  331. package/dist/sandbox/manager.d.ts +134 -0
  332. package/dist/sandbox/manager.d.ts.map +1 -0
  333. package/dist/sandbox/manager.js +470 -0
  334. package/dist/sandbox/manager.js.map +1 -0
  335. package/dist/sandbox/types.d.ts +113 -0
  336. package/dist/sandbox/types.d.ts.map +1 -0
  337. package/dist/sandbox/types.js +107 -0
  338. package/dist/sandbox/types.js.map +1 -0
  339. package/dist/security/scanner.d.ts +53 -0
  340. package/dist/security/scanner.d.ts.map +1 -0
  341. package/dist/security/scanner.js +271 -0
  342. package/dist/security/scanner.js.map +1 -0
  343. package/dist/team/config.d.ts +50 -0
  344. package/dist/team/config.d.ts.map +1 -0
  345. package/dist/team/config.js +108 -0
  346. package/dist/team/config.js.map +1 -0
  347. package/dist/team/memory.d.ts +63 -0
  348. package/dist/team/memory.d.ts.map +1 -0
  349. package/dist/team/memory.js +282 -0
  350. package/dist/team/memory.js.map +1 -0
  351. package/dist/team/review.d.ts +123 -0
  352. package/dist/team/review.d.ts.map +1 -0
  353. package/dist/team/review.js +293 -0
  354. package/dist/team/review.js.map +1 -0
  355. package/dist/utils/env.d.ts +19 -0
  356. package/dist/utils/env.d.ts.map +1 -0
  357. package/dist/utils/env.js +250 -0
  358. package/dist/utils/env.js.map +1 -0
  359. package/dist/utils/logger.d.ts +11 -0
  360. package/dist/utils/logger.d.ts.map +1 -0
  361. package/dist/utils/logger.js +45 -0
  362. package/dist/utils/logger.js.map +1 -0
  363. package/dist/web-dashboard/server.d.ts +59 -0
  364. package/dist/web-dashboard/server.d.ts.map +1 -0
  365. package/dist/web-dashboard/server.js +418 -0
  366. package/dist/web-dashboard/server.js.map +1 -0
  367. package/dist/workflow/registry.d.ts +127 -0
  368. package/dist/workflow/registry.d.ts.map +1 -0
  369. package/dist/workflow/registry.js +482 -0
  370. package/dist/workflow/registry.js.map +1 -0
  371. package/dist/workflow/templates.d.ts +93 -0
  372. package/dist/workflow/templates.d.ts.map +1 -0
  373. package/dist/workflow/templates.js +481 -0
  374. package/dist/workflow/templates.js.map +1 -0
  375. package/package.json +78 -0
  376. package/src/web-dashboard/public/assets/index-B08nDkSB.css +1 -0
  377. package/src/web-dashboard/public/assets/index-BKL8YOFD.js +135 -0
  378. package/src/web-dashboard/public/assets/index-BKL8YOFD.js.map +1 -0
  379. package/src/web-dashboard/public/index.html +13 -0
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Sandbox types — Configuration types for Docker-based sandbox isolation.
3
+ *
4
+ * The sandbox system provides process-level isolation for running generated
5
+ * code and tests inside Docker containers with configurable resource limits.
6
+ *
7
+ * Basic usage:
8
+ * ```ts
9
+ * const manager = new SandboxManager({ memoryLimit: '512m', cpuLimit: 1 });
10
+ * const id = await manager.createContainer();
11
+ * await manager.copyProject(id, '/path/to/project');
12
+ * const result = await manager.runCommand(id, 'npm test');
13
+ * await manager.destroyContainer(id);
14
+ * ```
15
+ */
16
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
17
+ import { join, dirname } from 'node:path';
18
+ // ─── Defaults ───────────────────────────────────────────────────────────────
19
+ export const DEFAULT_RESOURCE_LIMITS = {
20
+ memoryLimit: '1g',
21
+ cpuLimit: 1,
22
+ diskLimit: '2g',
23
+ pidsLimit: 100,
24
+ networkAccess: false,
25
+ timeoutMs: 600_000,
26
+ };
27
+ export const DEFAULT_SANDBOX_CONFIG = {
28
+ enabled: false,
29
+ limits: { ...DEFAULT_RESOURCE_LIMITS },
30
+ image: {
31
+ image: 'node:20-slim',
32
+ label: 'Node.js 20 (slim)',
33
+ runtimes: ['node'],
34
+ installCommand: 'npm install',
35
+ testCommand: 'npm test',
36
+ shell: '/bin/bash',
37
+ },
38
+ workDir: '/workspace',
39
+ containerUser: 'node',
40
+ stopTimeoutMs: 10_000,
41
+ };
42
+ // ─── Sandbox Configuration Manager ──────────────────────────────────────────
43
+ let SANDBOX_CONFIG_PATH = '/tmp/buff-sandbox-config.json';
44
+ let cachedConfig = null;
45
+ /**
46
+ * Get the current sandbox configuration.
47
+ * Reads from ~/.buff/sandbox-config.json (if exists), falls back to defaults.
48
+ */
49
+ export function getSandboxConfig() {
50
+ if (cachedConfig)
51
+ return { ...cachedConfig };
52
+ try {
53
+ // Lazy init path to avoid module-level side effects
54
+ if (SANDBOX_CONFIG_PATH === '/tmp/buff-sandbox-config.json' && process.env.HOME) {
55
+ SANDBOX_CONFIG_PATH = join(process.env.HOME, '.buff', 'sandbox-config.json');
56
+ }
57
+ if (existsSync(SANDBOX_CONFIG_PATH)) {
58
+ const raw = readFileSync(SANDBOX_CONFIG_PATH, 'utf-8');
59
+ const parsed = JSON.parse(raw);
60
+ cachedConfig = {
61
+ ...DEFAULT_SANDBOX_CONFIG,
62
+ ...parsed,
63
+ limits: { ...DEFAULT_RESOURCE_LIMITS, ...(parsed.limits || {}) },
64
+ image: { ...DEFAULT_SANDBOX_CONFIG.image, ...(parsed.image || {}) },
65
+ };
66
+ return { ...cachedConfig };
67
+ }
68
+ }
69
+ catch {
70
+ // Fall through to default
71
+ }
72
+ return { ...DEFAULT_SANDBOX_CONFIG };
73
+ }
74
+ /**
75
+ * Update the sandbox configuration and persist to disk.
76
+ */
77
+ /**
78
+ * Reset the sandbox config cache. Useful for testing.
79
+ */
80
+ export function resetSandboxConfigCache() {
81
+ cachedConfig = null;
82
+ }
83
+ /**
84
+ * Update the sandbox configuration and persist to disk.
85
+ */
86
+ export function setSandboxConfig(config) {
87
+ const current = getSandboxConfig();
88
+ const updated = {
89
+ ...current,
90
+ ...config,
91
+ limits: { ...current.limits, ...(config.limits || {}) },
92
+ image: { ...current.image, ...(config.image || {}) },
93
+ };
94
+ try {
95
+ const dir = dirname(SANDBOX_CONFIG_PATH);
96
+ if (!existsSync(dir)) {
97
+ mkdirSync(dir, { recursive: true });
98
+ }
99
+ writeFileSync(SANDBOX_CONFIG_PATH, JSON.stringify(updated, null, 2), 'utf-8');
100
+ }
101
+ catch {
102
+ // Non-critical: config stays in memory
103
+ }
104
+ cachedConfig = updated;
105
+ return { ...updated };
106
+ }
107
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Security Scanner — Reusable utilities for detecting security issues.
3
+ *
4
+ * Capabilities:
5
+ * - PII detection (emails, API keys, tokens, SSNs, etc.)
6
+ * - Prompt injection pattern detection
7
+ * - Dangerous code pattern detection (eval, exec, shell injection, etc.)
8
+ * - File permission checks
9
+ *
10
+ * Used by SecurityAgent and can be imported directly for custom use.
11
+ */
12
+ export interface SecurityFinding {
13
+ type: 'pii' | 'injection' | 'dangerous-code';
14
+ severity: 'info' | 'low' | 'medium' | 'high' | 'critical';
15
+ category: string;
16
+ match: string;
17
+ context?: string;
18
+ line?: number;
19
+ recommendation?: string;
20
+ }
21
+ export interface ScanResult {
22
+ passed: boolean;
23
+ findings: SecurityFinding[];
24
+ summary: string;
25
+ }
26
+ /**
27
+ * Scan text for PII (personally identifiable information).
28
+ */
29
+ export declare function scanForPII(text: string): SecurityFinding[];
30
+ /**
31
+ * Scan text for prompt injection attempts.
32
+ */
33
+ export declare function scanForInjections(text: string): SecurityFinding[];
34
+ /**
35
+ * Scan code for dangerous patterns.
36
+ */
37
+ export declare function scanForDangerousCode(code: string, contextInfo?: {
38
+ isGenerated?: boolean;
39
+ filename?: string;
40
+ }): SecurityFinding[];
41
+ /**
42
+ * Run all security scans on a given text.
43
+ * Convenience function that combines PII, injection, and code scans.
44
+ */
45
+ export declare function runAllScans(text: string, options?: {
46
+ isGenerated?: boolean;
47
+ filename?: string;
48
+ }): ScanResult;
49
+ /**
50
+ * Format findings as a readable report string.
51
+ */
52
+ export declare function formatScanReport(result: ScanResult): string;
53
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/security/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAuGH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,GAAG,WAAW,GAAG,gBAAgB,CAAC;IAC7C,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CA4E1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAiBjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACzD,eAAe,EAAE,CAqCnB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,UAAU,CA0BZ;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAkB3D"}
@@ -0,0 +1,271 @@
1
+ /**
2
+ * Security Scanner — Reusable utilities for detecting security issues.
3
+ *
4
+ * Capabilities:
5
+ * - PII detection (emails, API keys, tokens, SSNs, etc.)
6
+ * - Prompt injection pattern detection
7
+ * - Dangerous code pattern detection (eval, exec, shell injection, etc.)
8
+ * - File permission checks
9
+ *
10
+ * Used by SecurityAgent and can be imported directly for custom use.
11
+ */
12
+ // ─── PII Patterns ───────────────────────────────────────────────────────────
13
+ const EMAIL_PATTERN = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
14
+ const API_KEY_PATTERNS = [
15
+ /sk-[a-zA-Z0-9]{20,}/g, // OpenAI-style keys
16
+ /gsk_[a-zA-Z0-9]{20,}/g, // Groq-style keys
17
+ /ghp_[a-zA-Z0-9]{36,}/g, // GitHub PAT
18
+ /gho_[a-zA-Z0-9]{36,}/g, // GitHub OAuth
19
+ /ghu_[a-zA-Z0-9]{36,}/g, // GitHub user token
20
+ /xox[bpras]-[a-zA-Z0-9-]{24,}/g, // Slack tokens
21
+ /AKIA[0-9A-Z]{16}/g, // AWS access keys
22
+ /-----BEGIN (RSA |EC )?PRIVATE KEY-----/g, // Private keys
23
+ /eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/g, // JWT tokens
24
+ ];
25
+ const SSN_PATTERN = /\b\d{3}-\d{2}-\d{4}\b/g;
26
+ const CREDIT_CARD_PATTERN = /\b(?:\d{4}[ -]?){3}\d{4}\b/g;
27
+ const PHONE_PATTERN = /\b(?:\+1)?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}\b/g;
28
+ // ─── Injection Patterns ─────────────────────────────────────────────────────
29
+ const INJECTION_PATTERNS = [
30
+ // Ignore/Cancel system instructions
31
+ /\bignore\s+(all\s+)?(previous|above|prior)\s+(instructions|directions|prompts?)\b/i,
32
+ /\bdisregard\s+(all\s+)?(previous|above)\s+(instructions|directions)\b/i,
33
+ /\bforget\s+(all\s+)?(previous|prior)\s+(instructions|context)\b/i,
34
+ // Role-play jailbreaks
35
+ /\byou\s+are\s+(now|free|released|DAN|jailbroken)\b/i,
36
+ /\bpretend\s+(to\s+)?(be|you\s+are)\s+(a|an|the)\b/i,
37
+ /\bDAN\b/i, // "Do Anything Now"
38
+ // Prompt leaking
39
+ /\boutput\s+(the\s+)?(initial|original|first|above)\s+(prompt|instruction|system)\b/i,
40
+ /\breveal\s+(the\s+)?(prompt|instructions|system\s+message)\b/i,
41
+ /\bshow\s+(me\s+)?(the\s+)?(prompt|instructions)\b/i,
42
+ /\bprint\s+(the\s+)?(prompt|instructions|system\s+prompt)\b/i,
43
+ // Token smuggling
44
+ /\bbase64\s+(\d+\s+times|repeat)/i,
45
+ /\bleetspeak/i,
46
+ /\broT13/i,
47
+ ];
48
+ // ─── Dangerous Code Patterns ────────────────────────────────────────────────
49
+ const DANGEROUS_EXEC_PATTERNS = [
50
+ /\beval\s*\(/g,
51
+ /\bFunction\s*\(/g,
52
+ /\bsetTimeout\s*\(\s*["'`]/g,
53
+ /\bsetInterval\s*\(\s*["'`]/g,
54
+ /\bnew\s+Function\s*\(/g,
55
+ ];
56
+ const DANGEROUS_SHELL_PATTERNS = [
57
+ /\bexec(?:Sync)?\s*\(/g, // exec/execSync calls
58
+ /\bspawn(?:Sync)?\s*\(/g,
59
+ /\bfork\s*\(/g,
60
+ /\bexecFile(?:Sync)?\s*\(/g,
61
+ /`[^`]*\$\{[^}]*`/g, // Template literals with shell interpolation
62
+ ];
63
+ const DANGEROUS_FS_PATTERNS = [
64
+ /\b(?:un)?linkSync?\s*\(/g,
65
+ /\brm\s+-rf/g,
66
+ /\bchmod\s*(?:\s+-R)?\s*777/g,
67
+ /\bchown\b/g,
68
+ ];
69
+ const DANGEROUS_NETWORK_PATTERNS = [
70
+ /\bfetch\s*\(/g,
71
+ /\b(?:https?|axios|got|request)\s*\./gi,
72
+ /\bWebSocket\s*\(/g,
73
+ /\bnet\s*\.\s*connect\b/g,
74
+ ];
75
+ const DANGEROUS_SQL_PATTERNS = [
76
+ /\bDROP\s+TABLE\b/gi,
77
+ /\bDROP\s+DATABASE\b/gi,
78
+ /\bTRUNCATE\s+TABLE\b/gi,
79
+ /\bALTER\s+TABLE\b.*\bDROP\b/gi,
80
+ /'.*OR\s+1\s*=\s*1.*--/gi,
81
+ ];
82
+ /** Categories of dangerous code for grouping in results */
83
+ const DANGEROUS_PATTERN_CATEGORIES = [
84
+ { name: 'eval-dynamic-exec', severity: 'high', patterns: DANGEROUS_EXEC_PATTERNS, description: 'Dynamic code execution' },
85
+ { name: 'shell-commands', severity: 'critical', patterns: DANGEROUS_SHELL_PATTERNS, description: 'Shell command execution' },
86
+ { name: 'dangerous-fs', severity: 'medium', patterns: DANGEROUS_FS_PATTERNS, description: 'Dangerous filesystem operations' },
87
+ { name: 'network-calls', severity: 'low', patterns: DANGEROUS_NETWORK_PATTERNS, description: 'Network calls in generated code' },
88
+ { name: 'sql-injection', severity: 'critical', patterns: DANGEROUS_SQL_PATTERNS, description: 'SQL injection patterns' },
89
+ ];
90
+ // ─── Scanner Functions ──────────────────────────────────────────────────────
91
+ /**
92
+ * Scan text for PII (personally identifiable information).
93
+ */
94
+ export function scanForPII(text) {
95
+ const findings = [];
96
+ // Emails
97
+ const emails = text.match(EMAIL_PATTERN);
98
+ if (emails) {
99
+ for (const email of emails) {
100
+ findings.push({
101
+ type: 'pii',
102
+ severity: 'medium',
103
+ category: 'email',
104
+ match: email,
105
+ recommendation: 'Remove or obfuscate email address before sharing',
106
+ });
107
+ }
108
+ }
109
+ // API keys & secrets
110
+ for (const pattern of API_KEY_PATTERNS) {
111
+ const matches = text.match(pattern);
112
+ if (matches) {
113
+ for (const key of matches) {
114
+ findings.push({
115
+ type: 'pii',
116
+ severity: 'critical',
117
+ category: 'api-key',
118
+ match: key.slice(0, 12) + '...',
119
+ recommendation: 'Revoke this key immediately and generate a new one',
120
+ });
121
+ }
122
+ }
123
+ }
124
+ // SSNs
125
+ const ssns = text.match(SSN_PATTERN);
126
+ if (ssns) {
127
+ for (const ssn of ssns) {
128
+ findings.push({
129
+ type: 'pii',
130
+ severity: 'critical',
131
+ category: 'ssn',
132
+ match: ssn.replace(/\d{4}$/, 'XXXX'),
133
+ recommendation: 'Remove SSN — this is sensitive PII',
134
+ });
135
+ }
136
+ }
137
+ // Credit cards
138
+ const cards = text.match(CREDIT_CARD_PATTERN);
139
+ if (cards) {
140
+ for (const card of cards) {
141
+ findings.push({
142
+ type: 'pii',
143
+ severity: 'critical',
144
+ category: 'credit-card',
145
+ match: card.replace(/\d{4}$/, 'XXXX'),
146
+ recommendation: 'Remove credit card number — PCI violation',
147
+ });
148
+ }
149
+ }
150
+ // Phone numbers
151
+ const phones = text.match(PHONE_PATTERN);
152
+ if (phones) {
153
+ for (const phone of phones) {
154
+ findings.push({
155
+ type: 'pii',
156
+ severity: 'low',
157
+ category: 'phone',
158
+ match: phone,
159
+ recommendation: 'Consider obfuscating phone number',
160
+ });
161
+ }
162
+ }
163
+ return findings;
164
+ }
165
+ /**
166
+ * Scan text for prompt injection attempts.
167
+ */
168
+ export function scanForInjections(text) {
169
+ const findings = [];
170
+ for (const pattern of INJECTION_PATTERNS) {
171
+ const match = text.match(pattern);
172
+ if (match) {
173
+ findings.push({
174
+ type: 'injection',
175
+ severity: 'high',
176
+ category: 'prompt-injection',
177
+ match: match[0].slice(0, 80),
178
+ recommendation: 'Review the prompt for jailbreak or injection attempts',
179
+ });
180
+ }
181
+ }
182
+ return findings;
183
+ }
184
+ /**
185
+ * Scan code for dangerous patterns.
186
+ */
187
+ export function scanForDangerousCode(code, contextInfo) {
188
+ const findings = [];
189
+ for (const category of DANGEROUS_PATTERN_CATEGORIES) {
190
+ for (const pattern of category.patterns) {
191
+ const matches = code.matchAll(pattern);
192
+ for (const match of matches) {
193
+ // Find the line number
194
+ const beforeMatch = code.slice(0, match.index);
195
+ const line = (beforeMatch.match(/\n/g) || []).length + 1;
196
+ // Get surrounding context (20 chars before and after)
197
+ const start = Math.max(0, (match.index || 0) - 20);
198
+ const end = Math.min(code.length, (match.index || 0) + match[0].length + 20);
199
+ const context = code.slice(start, end).replace(/\n/g, ' ');
200
+ // For generated code, lower the severity of network calls and dynamic exec
201
+ let severity = category.severity;
202
+ if (contextInfo?.isGenerated) {
203
+ if (category.name === 'network-calls')
204
+ severity = 'low';
205
+ if (category.name === 'eval-dynamic-exec')
206
+ severity = 'medium';
207
+ }
208
+ findings.push({
209
+ type: 'dangerous-code',
210
+ severity,
211
+ category: category.name,
212
+ match: match[0].slice(0, 60),
213
+ context,
214
+ line,
215
+ recommendation: `Dangerous ${category.description} pattern detected. Review carefully.`,
216
+ });
217
+ }
218
+ }
219
+ }
220
+ return findings;
221
+ }
222
+ /**
223
+ * Run all security scans on a given text.
224
+ * Convenience function that combines PII, injection, and code scans.
225
+ */
226
+ export function runAllScans(text, options) {
227
+ const findings = [
228
+ ...scanForPII(text),
229
+ ...scanForInjections(text),
230
+ ...scanForDangerousCode(text, { isGenerated: options?.isGenerated }),
231
+ ];
232
+ const criticalCount = findings.filter((f) => f.severity === 'critical').length;
233
+ const highCount = findings.filter((f) => f.severity === 'high').length;
234
+ const mediumCount = findings.filter((f) => f.severity === 'medium').length;
235
+ const lowCount = findings.filter((f) => f.severity === 'low' || f.severity === 'info').length;
236
+ // Fail on critical or high severity findings
237
+ const passed = criticalCount === 0 && highCount === 0;
238
+ const summaryParts = [];
239
+ if (criticalCount > 0)
240
+ summaryParts.push(`${criticalCount} critical`);
241
+ if (highCount > 0)
242
+ summaryParts.push(`${highCount} high`);
243
+ if (mediumCount > 0)
244
+ summaryParts.push(`${mediumCount} medium`);
245
+ if (lowCount > 0)
246
+ summaryParts.push(`${lowCount} low`);
247
+ const summary = findings.length === 0
248
+ ? 'Security scan passed — no issues found'
249
+ : `Security scan found ${findings.length} issue(s): ${summaryParts.join(', ')} severity`;
250
+ return { passed, findings, summary };
251
+ }
252
+ /**
253
+ * Format findings as a readable report string.
254
+ */
255
+ export function formatScanReport(result) {
256
+ if (result.findings.length === 0) {
257
+ return ' ✅ Security scan: Clean';
258
+ }
259
+ const lines = [
260
+ ` ${result.passed ? '⚠️' : '❌'} Security scan: ${result.summary}`,
261
+ ];
262
+ for (const finding of result.findings) {
263
+ const icon = finding.severity === 'critical' ? '🔴' :
264
+ finding.severity === 'high' ? '🟠' :
265
+ finding.severity === 'medium' ? '🟡' : '🔵';
266
+ const lineStr = finding.line ? ` (line ${finding.line})` : '';
267
+ lines.push(` ${icon} [${finding.severity}] ${finding.category}${lineStr}: ${finding.match.slice(0, 60)}`);
268
+ }
269
+ return lines.join('\n');
270
+ }
271
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/security/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Team Config — Project-level configuration with config priority chain.
3
+ *
4
+ * Config priority (highest to lowest):
5
+ * 1. Project-level `.buffconfig.json` in working directory
6
+ * 2. User-level config at `~/.buff/buffconfig.json`
7
+ * 3. Built-in defaults
8
+ *
9
+ * This enables teams to commit a `.buffconfig.json` to their repo that
10
+ * defines shared provider defaults, team repository URL, and other
11
+ * project-wide settings while allowing individual overrides.
12
+ *
13
+ * The project-level config is read-only by default — CLI commands write
14
+ * to the user-level config. The `buff config init` command can generate
15
+ * a project-level config.
16
+ */
17
+ import type { BuffConfig, TeamConfig } from '../config/types.js';
18
+ /** Default team config values */
19
+ export declare const DEFAULT_TEAM_CONFIG: TeamConfig;
20
+ /**
21
+ * Find and load the project-level `.buffconfig.json`.
22
+ * Searches from the working directory upward for common filenames.
23
+ *
24
+ * @param cwd — Working directory to search from (default: process.cwd())
25
+ * @returns The parsed project config, or null if none found
26
+ */
27
+ export declare function findProjectConfig(cwd?: string): BuffConfig | null;
28
+ /**
29
+ * Get the team config from the project-level config.
30
+ * Falls back to user-level config if project config doesn't have team settings.
31
+ *
32
+ * @param cwd — Optional working directory
33
+ * @returns The resolved team config
34
+ */
35
+ export declare function getTeamConfig(cwd?: string): TeamConfig;
36
+ /**
37
+ * Check if a project-level `.buffconfig.json` exists.
38
+ */
39
+ export declare function hasProjectConfig(cwd?: string): boolean;
40
+ /**
41
+ * Get the path to the team data directory.
42
+ * Uses project-level config path, falling back to ~/.buff/team/.
43
+ *
44
+ * The team directory is a git repository that contains:
45
+ * - trajectories/ — Shared agent execution trajectories
46
+ * - patterns/ — Project-level coding patterns
47
+ * - templates/ — Team workflow templates
48
+ */
49
+ export declare function getTeamDataDir(cwd?: string): string;
50
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/team/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKjE,iCAAiC;AACjC,eAAO,MAAM,mBAAmB,EAAE,UAIjC,CAAC;AAWF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAkBjE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAmBtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAMnD"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Team Config — Project-level configuration with config priority chain.
3
+ *
4
+ * Config priority (highest to lowest):
5
+ * 1. Project-level `.buffconfig.json` in working directory
6
+ * 2. User-level config at `~/.buff/buffconfig.json`
7
+ * 3. Built-in defaults
8
+ *
9
+ * This enables teams to commit a `.buffconfig.json` to their repo that
10
+ * defines shared provider defaults, team repository URL, and other
11
+ * project-wide settings while allowing individual overrides.
12
+ *
13
+ * The project-level config is read-only by default — CLI commands write
14
+ * to the user-level config. The `buff config init` command can generate
15
+ * a project-level config.
16
+ */
17
+ import { readFileSync, existsSync } from 'node:fs';
18
+ import { join, resolve } from 'node:path';
19
+ import { homedir } from 'node:os';
20
+ import { ConfigManager } from '../config/manager.js';
21
+ // ─── Constants ──────────────────────────────────────────────────────────────
22
+ /** Default team config values */
23
+ export const DEFAULT_TEAM_CONFIG = {
24
+ branch: 'main',
25
+ autoSyncMinutes: 0,
26
+ shareTrajectories: true,
27
+ };
28
+ /** Priority config search paths (relative to working directory) */
29
+ const PROJECT_CONFIG_FILENAMES = [
30
+ '.buffconfig.json',
31
+ 'buffconfig.json',
32
+ '.buff/config.json',
33
+ ];
34
+ // ─── Config Priority Chain ──────────────────────────────────────────────────
35
+ /**
36
+ * Find and load the project-level `.buffconfig.json`.
37
+ * Searches from the working directory upward for common filenames.
38
+ *
39
+ * @param cwd — Working directory to search from (default: process.cwd())
40
+ * @returns The parsed project config, or null if none found
41
+ */
42
+ export function findProjectConfig(cwd) {
43
+ const dir = resolve(cwd || process.cwd());
44
+ for (const filename of PROJECT_CONFIG_FILENAMES) {
45
+ const filePath = join(dir, filename);
46
+ if (existsSync(filePath)) {
47
+ try {
48
+ const raw = readFileSync(filePath, 'utf-8');
49
+ const config = JSON.parse(raw);
50
+ return config;
51
+ }
52
+ catch {
53
+ // Try next filename
54
+ continue;
55
+ }
56
+ }
57
+ }
58
+ return null;
59
+ }
60
+ /**
61
+ * Get the team config from the project-level config.
62
+ * Falls back to user-level config if project config doesn't have team settings.
63
+ *
64
+ * @param cwd — Optional working directory
65
+ * @returns The resolved team config
66
+ */
67
+ export function getTeamConfig(cwd) {
68
+ // Check project-level config first
69
+ const projectConfig = findProjectConfig(cwd);
70
+ if (projectConfig?.team) {
71
+ return { ...DEFAULT_TEAM_CONFIG, ...projectConfig.team };
72
+ }
73
+ // Fall back to user-level config
74
+ try {
75
+ const configManager = new ConfigManager();
76
+ const userConfig = configManager.getAll();
77
+ if (userConfig.team) {
78
+ return { ...DEFAULT_TEAM_CONFIG, ...userConfig.team };
79
+ }
80
+ }
81
+ catch {
82
+ // Fall through to defaults
83
+ }
84
+ return { ...DEFAULT_TEAM_CONFIG };
85
+ }
86
+ /**
87
+ * Check if a project-level `.buffconfig.json` exists.
88
+ */
89
+ export function hasProjectConfig(cwd) {
90
+ return findProjectConfig(cwd) !== null;
91
+ }
92
+ /**
93
+ * Get the path to the team data directory.
94
+ * Uses project-level config path, falling back to ~/.buff/team/.
95
+ *
96
+ * The team directory is a git repository that contains:
97
+ * - trajectories/ — Shared agent execution trajectories
98
+ * - patterns/ — Project-level coding patterns
99
+ * - templates/ — Team workflow templates
100
+ */
101
+ export function getTeamDataDir(cwd) {
102
+ const teamConfig = getTeamConfig(cwd);
103
+ if (teamConfig.localPath)
104
+ return resolve(teamConfig.localPath);
105
+ // Default: ~/.buff/team/
106
+ return join(homedir(), '.buff', 'team');
107
+ }
108
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/team/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,+EAA+E;AAE/E,iCAAiC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,MAAM,EAAE,MAAM;IACd,eAAe,EAAE,CAAC;IAClB,iBAAiB,EAAE,IAAI;CACxB,CAAC;AAEF,mEAAmE;AACnE,MAAM,wBAAwB,GAAG;IAC/B,kBAAkB;IAClB,iBAAiB;IACjB,mBAAmB;CACpB,CAAC;AAEF,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE1C,KAAK,MAAM,QAAQ,IAAI,wBAAwB,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;gBAC7C,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACP,oBAAoB;gBACpB,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,mCAAmC;IACnC,MAAM,aAAa,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,aAAa,EAAE,IAAI,EAAE,CAAC;QACxB,OAAO,EAAE,GAAG,mBAAmB,EAAE,GAAG,aAAa,CAAC,IAAI,EAAgB,CAAC;IACzE,CAAC;IAED,iCAAiC;IACjC,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;QAC1C,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,EAAE,GAAG,mBAAmB,EAAE,GAAG,UAAU,CAAC,IAAI,EAAgB,CAAC;QACtE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2BAA2B;IAC7B,CAAC;IAED,OAAO,EAAE,GAAG,mBAAmB,EAAgB,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,iBAAiB,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AACzC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,UAAU,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAE/D,yBAAyB;IACzB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC"}