@bookedsolid/reagent 0.1.0 → 0.3.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 (177) hide show
  1. package/README.md +322 -50
  2. package/agents/ai-platforms/ai-agentic-systems-architect.md +85 -0
  3. package/agents/ai-platforms/ai-anthropic-specialist.md +84 -0
  4. package/agents/ai-platforms/ai-cost-optimizer.md +85 -0
  5. package/agents/ai-platforms/ai-evaluation-specialist.md +78 -0
  6. package/agents/ai-platforms/ai-fine-tuning-specialist.md +96 -0
  7. package/agents/ai-platforms/ai-gemini-specialist.md +88 -0
  8. package/agents/ai-platforms/ai-governance-officer.md +77 -0
  9. package/agents/ai-platforms/ai-knowledge-engineer.md +76 -0
  10. package/agents/ai-platforms/ai-mcp-developer.md +108 -0
  11. package/agents/ai-platforms/ai-multi-modal-specialist.md +208 -0
  12. package/agents/ai-platforms/ai-open-source-models-specialist.md +139 -0
  13. package/agents/ai-platforms/ai-openai-specialist.md +94 -0
  14. package/agents/ai-platforms/ai-platform-strategist.md +100 -0
  15. package/agents/ai-platforms/ai-prompt-engineer.md +94 -0
  16. package/agents/ai-platforms/ai-rag-architect.md +97 -0
  17. package/agents/ai-platforms/ai-rea.md +82 -0
  18. package/agents/ai-platforms/ai-research-scientist.md +77 -0
  19. package/agents/ai-platforms/ai-safety-reviewer.md +91 -0
  20. package/agents/ai-platforms/ai-security-red-teamer.md +80 -0
  21. package/agents/ai-platforms/ai-synthetic-data-engineer.md +76 -0
  22. package/agents/engineering/accessibility-engineer.md +97 -0
  23. package/agents/engineering/aws-architect.md +104 -0
  24. package/agents/engineering/backend-engineer-payments.md +274 -0
  25. package/agents/engineering/backend-engineering-manager.md +206 -0
  26. package/agents/engineering/code-reviewer.md +283 -0
  27. package/agents/engineering/css3-animation-purist.md +114 -0
  28. package/agents/engineering/data-engineer.md +88 -0
  29. package/agents/engineering/database-architect.md +224 -0
  30. package/agents/engineering/design-system-developer.md +74 -0
  31. package/agents/engineering/design-systems-animator.md +82 -0
  32. package/agents/engineering/devops-engineer.md +153 -0
  33. package/agents/engineering/drupal-integration-specialist.md +211 -0
  34. package/agents/engineering/drupal-specialist.md +128 -0
  35. package/agents/engineering/engineering-manager-frontend.md +118 -0
  36. package/agents/engineering/frontend-specialist.md +72 -0
  37. package/agents/engineering/infrastructure-engineer.md +67 -0
  38. package/agents/engineering/lit-specialist.md +75 -0
  39. package/agents/engineering/migration-specialist.md +122 -0
  40. package/agents/engineering/ml-engineer.md +99 -0
  41. package/agents/engineering/mobile-engineer.md +173 -0
  42. package/agents/engineering/motion-designer-interactive.md +100 -0
  43. package/agents/engineering/nextjs-specialist.md +140 -0
  44. package/agents/engineering/open-source-specialist.md +111 -0
  45. package/agents/engineering/performance-engineer.md +95 -0
  46. package/agents/engineering/performance-qa-engineer.md +99 -0
  47. package/agents/engineering/pr-maintainer.md +112 -0
  48. package/agents/engineering/principal-engineer.md +80 -0
  49. package/agents/engineering/privacy-engineer.md +93 -0
  50. package/agents/engineering/qa-engineer.md +158 -0
  51. package/agents/engineering/security-engineer.md +141 -0
  52. package/agents/engineering/security-qa-engineer.md +92 -0
  53. package/agents/engineering/senior-backend-engineer.md +300 -0
  54. package/agents/engineering/senior-database-engineer.md +52 -0
  55. package/agents/engineering/senior-frontend-engineer.md +115 -0
  56. package/agents/engineering/senior-product-manager-platform.md +29 -0
  57. package/agents/engineering/senior-technical-project-manager.md +51 -0
  58. package/agents/engineering/site-reliability-engineer-2.md +52 -0
  59. package/agents/engineering/solutions-architect.md +74 -0
  60. package/agents/engineering/sre-lead.md +123 -0
  61. package/agents/engineering/staff-engineer-platform.md +228 -0
  62. package/agents/engineering/staff-software-engineer.md +60 -0
  63. package/agents/engineering/storybook-specialist.md +142 -0
  64. package/agents/engineering/supabase-specialist.md +106 -0
  65. package/agents/engineering/technical-project-manager.md +50 -0
  66. package/agents/engineering/technical-writer.md +129 -0
  67. package/agents/engineering/test-architect.md +93 -0
  68. package/agents/engineering/typescript-specialist.md +101 -0
  69. package/agents/engineering/ux-researcher.md +35 -0
  70. package/agents/engineering/vp-engineering.md +72 -0
  71. package/agents/reagent-orchestrator.md +14 -15
  72. package/dist/cli/commands/check.d.ts +2 -0
  73. package/dist/cli/commands/check.d.ts.map +1 -0
  74. package/dist/cli/commands/check.js +87 -0
  75. package/dist/cli/commands/check.js.map +1 -0
  76. package/dist/cli/commands/freeze.d.ts +2 -0
  77. package/dist/cli/commands/freeze.d.ts.map +1 -0
  78. package/dist/cli/commands/freeze.js +24 -0
  79. package/dist/cli/commands/freeze.js.map +1 -0
  80. package/dist/cli/commands/init.d.ts +2 -0
  81. package/dist/cli/commands/init.d.ts.map +1 -0
  82. package/dist/cli/commands/init.js +511 -0
  83. package/dist/cli/commands/init.js.map +1 -0
  84. package/dist/cli/commands/serve.d.ts +2 -0
  85. package/dist/cli/commands/serve.d.ts.map +1 -0
  86. package/dist/cli/commands/serve.js +12 -0
  87. package/dist/cli/commands/serve.js.map +1 -0
  88. package/dist/cli/commands/unfreeze.d.ts +2 -0
  89. package/dist/cli/commands/unfreeze.d.ts.map +1 -0
  90. package/dist/cli/commands/unfreeze.js +14 -0
  91. package/dist/cli/commands/unfreeze.js.map +1 -0
  92. package/dist/cli/index.d.ts +3 -0
  93. package/dist/cli/index.d.ts.map +1 -0
  94. package/dist/cli/index.js +71 -0
  95. package/dist/cli/index.js.map +1 -0
  96. package/dist/cli/utils.d.ts +5 -0
  97. package/dist/cli/utils.d.ts.map +1 -0
  98. package/dist/cli/utils.js +34 -0
  99. package/dist/cli/utils.js.map +1 -0
  100. package/dist/config/gateway-config.d.ts +3 -0
  101. package/dist/config/gateway-config.d.ts.map +1 -0
  102. package/dist/config/gateway-config.js +60 -0
  103. package/dist/config/gateway-config.js.map +1 -0
  104. package/dist/config/policy-loader.d.ts +3 -0
  105. package/dist/config/policy-loader.d.ts.map +1 -0
  106. package/dist/config/policy-loader.js +38 -0
  107. package/dist/config/policy-loader.js.map +1 -0
  108. package/dist/config/tier-map.d.ts +12 -0
  109. package/dist/config/tier-map.d.ts.map +1 -0
  110. package/dist/config/tier-map.js +76 -0
  111. package/dist/config/tier-map.js.map +1 -0
  112. package/dist/gateway/client-manager.d.ts +26 -0
  113. package/dist/gateway/client-manager.d.ts.map +1 -0
  114. package/dist/gateway/client-manager.js +75 -0
  115. package/dist/gateway/client-manager.js.map +1 -0
  116. package/dist/gateway/middleware/audit.d.ts +12 -0
  117. package/dist/gateway/middleware/audit.d.ts.map +1 -0
  118. package/dist/gateway/middleware/audit.js +88 -0
  119. package/dist/gateway/middleware/audit.js.map +1 -0
  120. package/dist/gateway/middleware/chain.d.ts +27 -0
  121. package/dist/gateway/middleware/chain.d.ts.map +1 -0
  122. package/dist/gateway/middleware/chain.js +37 -0
  123. package/dist/gateway/middleware/chain.js.map +1 -0
  124. package/dist/gateway/middleware/kill-switch.d.ts +10 -0
  125. package/dist/gateway/middleware/kill-switch.d.ts.map +1 -0
  126. package/dist/gateway/middleware/kill-switch.js +61 -0
  127. package/dist/gateway/middleware/kill-switch.js.map +1 -0
  128. package/dist/gateway/middleware/policy.d.ts +10 -0
  129. package/dist/gateway/middleware/policy.d.ts.map +1 -0
  130. package/dist/gateway/middleware/policy.js +52 -0
  131. package/dist/gateway/middleware/policy.js.map +1 -0
  132. package/dist/gateway/middleware/redact.d.ts +17 -0
  133. package/dist/gateway/middleware/redact.d.ts.map +1 -0
  134. package/dist/gateway/middleware/redact.js +109 -0
  135. package/dist/gateway/middleware/redact.js.map +1 -0
  136. package/dist/gateway/middleware/session.d.ts +11 -0
  137. package/dist/gateway/middleware/session.d.ts.map +1 -0
  138. package/dist/gateway/middleware/session.js +19 -0
  139. package/dist/gateway/middleware/session.js.map +1 -0
  140. package/dist/gateway/middleware/tier.d.ts +7 -0
  141. package/dist/gateway/middleware/tier.d.ts.map +1 -0
  142. package/dist/gateway/middleware/tier.js +11 -0
  143. package/dist/gateway/middleware/tier.js.map +1 -0
  144. package/dist/gateway/server.d.ts +14 -0
  145. package/dist/gateway/server.d.ts.map +1 -0
  146. package/dist/gateway/server.js +79 -0
  147. package/dist/gateway/server.js.map +1 -0
  148. package/dist/gateway/tool-proxy.d.ts +21 -0
  149. package/dist/gateway/tool-proxy.d.ts.map +1 -0
  150. package/dist/gateway/tool-proxy.js +134 -0
  151. package/dist/gateway/tool-proxy.js.map +1 -0
  152. package/dist/types/audit.d.ts +16 -0
  153. package/dist/types/audit.d.ts.map +1 -0
  154. package/dist/types/audit.js +2 -0
  155. package/dist/types/audit.js.map +1 -0
  156. package/dist/types/enums.d.ts +21 -0
  157. package/dist/types/enums.d.ts.map +1 -0
  158. package/dist/types/enums.js +25 -0
  159. package/dist/types/enums.js.map +1 -0
  160. package/dist/types/gateway.d.ts +16 -0
  161. package/dist/types/gateway.d.ts.map +1 -0
  162. package/dist/types/gateway.js +2 -0
  163. package/dist/types/gateway.js.map +1 -0
  164. package/dist/types/index.d.ts +5 -0
  165. package/dist/types/index.d.ts.map +1 -0
  166. package/dist/types/index.js +2 -0
  167. package/dist/types/index.js.map +1 -0
  168. package/dist/types/policy.d.ts +14 -0
  169. package/dist/types/policy.d.ts.map +1 -0
  170. package/dist/types/policy.js +2 -0
  171. package/dist/types/policy.js.map +1 -0
  172. package/hooks/attribution-advisory.sh +78 -26
  173. package/husky/commit-msg.sh +102 -22
  174. package/package.json +24 -12
  175. package/profiles/bst-internal.json +3 -1
  176. package/profiles/client-engagement.json +3 -1
  177. package/bin/init.js +0 -818
@@ -0,0 +1,37 @@
1
+ import { InvocationStatus } from '../../types/index.js';
2
+ /**
3
+ * Execute a middleware chain in onion (koa-style) order.
4
+ * Each middleware calls `next()` to pass control to the next one.
5
+ * The innermost middleware is the actual tool execution.
6
+ *
7
+ * SECURITY: Once status is set to Denied, it is locked for the remainder
8
+ * of the chain. No middleware can revert a denial.
9
+ */
10
+ export function executeChain(middlewares, ctx) {
11
+ let index = -1;
12
+ let deniedOnce = false;
13
+ let savedError;
14
+ function dispatch(i) {
15
+ if (i <= index) {
16
+ return Promise.reject(new Error('next() called multiple times'));
17
+ }
18
+ index = i;
19
+ const mw = middlewares[i];
20
+ if (!mw) {
21
+ return Promise.resolve();
22
+ }
23
+ return Promise.resolve(mw(ctx, () => dispatch(i + 1))).then(() => {
24
+ // SECURITY: If any middleware ever set Denied, lock it permanently
25
+ if (ctx.status === InvocationStatus.Denied && !deniedOnce) {
26
+ deniedOnce = true;
27
+ savedError = ctx.error;
28
+ }
29
+ if (deniedOnce && ctx.status !== InvocationStatus.Denied) {
30
+ ctx.status = InvocationStatus.Denied;
31
+ ctx.error = savedError || 'Denial status was tampered with — re-locked';
32
+ }
33
+ });
34
+ }
35
+ return dispatch(0);
36
+ }
37
+ //# sourceMappingURL=chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.js","sourceRoot":"","sources":["../../../src/gateway/middleware/chain.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAmBxD;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,WAAyB,EAAE,GAAsB;IAC5E,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACf,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,UAA8B,CAAC;IAEnC,SAAS,QAAQ,CAAC,CAAS;QACzB,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,KAAK,GAAG,CAAC,CAAC;QAEV,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YAC/D,mEAAmE;YACnE,IAAI,GAAG,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC1D,UAAU,GAAG,IAAI,CAAC;gBAClB,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;YAED,IAAI,UAAU,IAAI,GAAG,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,EAAE,CAAC;gBACzD,GAAG,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;gBACrC,GAAG,CAAC,KAAK,GAAG,UAAU,IAAI,6CAA6C,CAAC;YAC1E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Middleware } from './chain.js';
2
+ /**
3
+ * Checks for `.reagent/HALT` file. If present, denies the invocation.
4
+ *
5
+ * SECURITY: Validates HALT is a regular file (not directory/symlink to sensitive file).
6
+ * SECURITY: Caps read size to prevent oversized error strings.
7
+ * PERFORMANCE: All fs operations are async to avoid blocking the event loop.
8
+ */
9
+ export declare function createKillSwitchMiddleware(baseDir: string): Middleware;
10
+ //# sourceMappingURL=kill-switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kill-switch.d.ts","sourceRoot":"","sources":["../../../src/gateway/middleware/kill-switch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAiDtE"}
@@ -0,0 +1,61 @@
1
+ import fs from 'node:fs/promises';
2
+ import { constants as fsConstants } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { InvocationStatus } from '../../types/index.js';
5
+ const MAX_HALT_READ_BYTES = 1024; // Cap HALT file reads to prevent oversized error strings
6
+ /**
7
+ * Checks for `.reagent/HALT` file. If present, denies the invocation.
8
+ *
9
+ * SECURITY: Validates HALT is a regular file (not directory/symlink to sensitive file).
10
+ * SECURITY: Caps read size to prevent oversized error strings.
11
+ * PERFORMANCE: All fs operations are async to avoid blocking the event loop.
12
+ */
13
+ export function createKillSwitchMiddleware(baseDir) {
14
+ return async (ctx, next) => {
15
+ const haltPath = path.join(baseDir, '.reagent', 'HALT');
16
+ try {
17
+ const stat = await fs.stat(haltPath);
18
+ // SECURITY: Only read regular files — reject directories, symlinks to sensitive files
19
+ if (!stat.isFile()) {
20
+ ctx.status = InvocationStatus.Denied;
21
+ ctx.error = 'Kill switch active: HALT exists (non-file)';
22
+ return;
23
+ }
24
+ // SECURITY: Use lstat to detect symlinks — resolve target path must be within .reagent/
25
+ const lstat = await fs.lstat(haltPath);
26
+ if (lstat.isSymbolicLink()) {
27
+ const target = await fs.realpath(haltPath);
28
+ const reagentDir = path.join(baseDir, '.reagent');
29
+ if (!target.startsWith(reagentDir)) {
30
+ ctx.status = InvocationStatus.Denied;
31
+ ctx.error = 'Kill switch active: HALT is a symlink outside .reagent/';
32
+ return;
33
+ }
34
+ }
35
+ // Read with size cap using async file handle
36
+ const fh = await fs.open(haltPath, fsConstants.O_RDONLY);
37
+ try {
38
+ const buf = Buffer.alloc(MAX_HALT_READ_BYTES);
39
+ const { bytesRead } = await fh.read(buf, 0, MAX_HALT_READ_BYTES, 0);
40
+ const reason = buf.subarray(0, bytesRead).toString('utf8').trim();
41
+ ctx.status = InvocationStatus.Denied;
42
+ ctx.error = `Kill switch active: ${reason}`;
43
+ }
44
+ finally {
45
+ await fh.close();
46
+ }
47
+ return; // Do not call next — short-circuit
48
+ }
49
+ catch (err) {
50
+ // ENOENT = file doesn't exist = no kill switch = proceed
51
+ if (err.code === 'ENOENT') {
52
+ await next();
53
+ return;
54
+ }
55
+ // Other errors (permission denied, etc.) — fail-closed
56
+ ctx.status = InvocationStatus.Denied;
57
+ ctx.error = `Kill switch check failed: ${err.message}`;
58
+ }
59
+ };
60
+ }
61
+ //# sourceMappingURL=kill-switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kill-switch.js","sourceRoot":"","sources":["../../../src/gateway/middleware/kill-switch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,MAAM,mBAAmB,GAAG,IAAI,CAAC,CAAC,yDAAyD;AAE3F;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAe;IACxD,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAExD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAErC,sFAAsF;YACtF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACnB,GAAG,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;gBACrC,GAAG,CAAC,KAAK,GAAG,4CAA4C,CAAC;gBACzD,OAAO;YACT,CAAC;YAED,wFAAwF;YACxF,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBAClD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBACnC,GAAG,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;oBACrC,GAAG,CAAC,KAAK,GAAG,yDAAyD,CAAC;oBACtE,OAAO;gBACT,CAAC;YACH,CAAC;YAED,6CAA6C;YAC7C,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;gBACpE,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBAClE,GAAG,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;gBACrC,GAAG,CAAC,KAAK,GAAG,uBAAuB,MAAM,EAAE,CAAC;YAC9C,CAAC;oBAAS,CAAC;gBACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;YACD,OAAO,CAAC,mCAAmC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,yDAAyD;YACzD,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,MAAM,IAAI,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YACD,uDAAuD;YACvD,GAAG,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;YACrC,GAAG,CAAC,KAAK,GAAG,6BAA8B,GAAa,CAAC,OAAO,EAAE,CAAC;QACpE,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Policy, GatewayConfig } from '../../types/index.js';
2
+ import type { Middleware } from './chain.js';
3
+ /**
4
+ * Checks autonomy level against tool tier, and checks blocked tools.
5
+ *
6
+ * SECURITY: Re-derives tier from tool_name independently — never trusts ctx.tier.
7
+ * SECURITY: Undefined/unknown tier defaults to DENY (fail-closed).
8
+ */
9
+ export declare function createPolicyMiddleware(policy: Policy, gatewayConfig?: GatewayConfig): Middleware;
10
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/gateway/middleware/policy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAgB7C;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,UAAU,CAkChG"}
@@ -0,0 +1,52 @@
1
+ import { AutonomyLevel, InvocationStatus, Tier } from '../../types/index.js';
2
+ import { classifyTool, isToolBlocked } from '../../config/tier-map.js';
3
+ /**
4
+ * Autonomy level tier permissions:
5
+ * - L0: Read only
6
+ * - L1: Read + Write (no destructive)
7
+ * - L2: Read + Write (no destructive)
8
+ * - L3: All tiers allowed
9
+ */
10
+ const TIER_ALLOWED = {
11
+ [AutonomyLevel.L0]: new Set([Tier.Read]),
12
+ [AutonomyLevel.L1]: new Set([Tier.Read, Tier.Write]),
13
+ [AutonomyLevel.L2]: new Set([Tier.Read, Tier.Write]),
14
+ [AutonomyLevel.L3]: new Set([Tier.Read, Tier.Write, Tier.Destructive]),
15
+ };
16
+ /**
17
+ * Checks autonomy level against tool tier, and checks blocked tools.
18
+ *
19
+ * SECURITY: Re-derives tier from tool_name independently — never trusts ctx.tier.
20
+ * SECURITY: Undefined/unknown tier defaults to DENY (fail-closed).
21
+ */
22
+ export function createPolicyMiddleware(policy, gatewayConfig) {
23
+ return async (ctx, next) => {
24
+ // Check if tool is explicitly blocked
25
+ if (isToolBlocked(ctx.tool_name, ctx.server_name, gatewayConfig)) {
26
+ ctx.status = InvocationStatus.Denied;
27
+ ctx.error = `Tool "${ctx.tool_name}" is explicitly blocked in gateway config`;
28
+ return;
29
+ }
30
+ // SECURITY: Re-derive tier from tool_name — do NOT trust ctx.tier from prior middleware.
31
+ // This prevents a rogue middleware from downgrading a destructive tool to read-tier.
32
+ const tier = classifyTool(ctx.tool_name, ctx.server_name, gatewayConfig);
33
+ ctx.tier = tier; // Overwrite with authoritative classification
34
+ // Validate autonomy level is known
35
+ const allowed = TIER_ALLOWED[policy.autonomy_level];
36
+ if (!allowed) {
37
+ ctx.status = InvocationStatus.Denied;
38
+ ctx.error = `Unknown autonomy level: ${policy.autonomy_level}. Denying by default.`;
39
+ return;
40
+ }
41
+ // Check autonomy level vs tier (fail-closed: deny if tier unknown)
42
+ if (!allowed.has(tier)) {
43
+ ctx.status = InvocationStatus.Denied;
44
+ ctx.error = `Autonomy level ${policy.autonomy_level} does not allow ${tier}-tier tools. Tool: ${ctx.tool_name}`;
45
+ return;
46
+ }
47
+ await next();
48
+ // SECURITY: Re-assert denial status cannot be undone by downstream middleware.
49
+ // Once denied, status is locked.
50
+ };
51
+ }
52
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/gateway/middleware/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAIvE;;;;;;GAMG;AACH,MAAM,YAAY,GAAqC;IACrD,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;CACvE,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,aAA6B;IAClF,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,sCAAsC;QACtC,IAAI,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;YACrC,GAAG,CAAC,KAAK,GAAG,SAAS,GAAG,CAAC,SAAS,2CAA2C,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,yFAAyF;QACzF,qFAAqF;QACrF,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QACzE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,8CAA8C;QAE/D,mCAAmC;QACnC,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;YACrC,GAAG,CAAC,KAAK,GAAG,2BAA2B,MAAM,CAAC,cAAc,uBAAuB,CAAC;YACpF,OAAO;QACT,CAAC;QAED,mEAAmE;QACnE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;YACrC,GAAG,CAAC,KAAK,GAAG,kBAAkB,MAAM,CAAC,cAAc,mBAAmB,IAAI,sBAAsB,GAAG,CAAC,SAAS,EAAE,CAAC;YAChH,OAAO;QACT,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;QAEb,+EAA+E;QAC/E,iCAAiC;IACnC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Middleware } from './chain.js';
2
+ /**
3
+ * Redact secrets from a string, returning the redacted string and list of redacted field names.
4
+ */
5
+ export declare function redactSecrets(input: string): {
6
+ output: string;
7
+ redacted: string[];
8
+ };
9
+ /**
10
+ * Post-execution middleware: scans tool output for secret patterns and redacts them.
11
+ *
12
+ * SECURITY: For non-string results, redaction operates on individual string values
13
+ * within the object structure rather than JSON.stringify→replace→JSON.parse, which
14
+ * could corrupt the result if a replacement changes JSON structure.
15
+ */
16
+ export declare const redactMiddleware: Middleware;
17
+ //# sourceMappingURL=redact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../../src/gateway/middleware/redact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkC7C;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAenF;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,UAoB9B,CAAC"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Patterns that match common secret formats.
3
+ * Each pattern has a name (for audit logging) and a regex.
4
+ *
5
+ * SECURITY: Patterns use case-insensitive flag where applicable.
6
+ * SECURITY: Input is sanitized (null bytes stripped) before matching.
7
+ */
8
+ const SECRET_PATTERNS = [
9
+ { name: 'AWS Access Key', pattern: /AKIA[0-9A-Z]{16}/gi },
10
+ {
11
+ name: 'AWS Secret Key',
12
+ pattern: /(?:aws_secret_access_key|secret_key)\s*[:=]\s*[A-Za-z0-9/+=]{40}/gi,
13
+ },
14
+ { name: 'GitHub Token', pattern: /gh[pousr]_[A-Za-z0-9_]{36,}/g },
15
+ {
16
+ name: 'Generic API Key',
17
+ pattern: /(?:api[_-]?key|apikey)\s*[:=]\s*["']?[A-Za-z0-9\-_.]{20,}["']?/gi,
18
+ },
19
+ { name: 'Bearer Token', pattern: /bearer\s+[A-Za-z0-9\-_.~+/]+=*/gi },
20
+ { name: 'Private Key', pattern: /-----BEGIN\s+(?:RSA\s+|EC\s+|DSA\s+)?PRIVATE\s+KEY-----/gi },
21
+ { name: 'Discord Token', pattern: /[MN][A-Za-z\d]{23,}\.[\w-]{6}\.[\w-]{27,}/g },
22
+ // Base64-encoded AWS access key (AKIA... in base64 starts with QUTJQ)
23
+ { name: 'Base64 AWS Key', pattern: /QUtJQ[A-Za-z0-9+/]{17,}={0,2}/g },
24
+ ];
25
+ /**
26
+ * Strip null bytes and other control characters that could break regex matching.
27
+ */
28
+ function sanitizeInput(input) {
29
+ return input.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f]/g, '');
30
+ }
31
+ /**
32
+ * Redact secrets from a string, returning the redacted string and list of redacted field names.
33
+ */
34
+ export function redactSecrets(input) {
35
+ let output = sanitizeInput(input);
36
+ const redacted = [];
37
+ for (const { name, pattern } of SECRET_PATTERNS) {
38
+ // Reset lastIndex for global regexes
39
+ pattern.lastIndex = 0;
40
+ if (pattern.test(output)) {
41
+ pattern.lastIndex = 0;
42
+ output = output.replace(pattern, '[REDACTED]');
43
+ redacted.push(name);
44
+ }
45
+ }
46
+ return { output, redacted };
47
+ }
48
+ /**
49
+ * Post-execution middleware: scans tool output for secret patterns and redacts them.
50
+ *
51
+ * SECURITY: For non-string results, redaction operates on individual string values
52
+ * within the object structure rather than JSON.stringify→replace→JSON.parse, which
53
+ * could corrupt the result if a replacement changes JSON structure.
54
+ */
55
+ export const redactMiddleware = async (ctx, next) => {
56
+ await next();
57
+ if (ctx.result == null)
58
+ return;
59
+ if (typeof ctx.result === 'string') {
60
+ const { output, redacted } = redactSecrets(ctx.result);
61
+ if (redacted.length > 0) {
62
+ ctx.result = output;
63
+ ctx.redacted_fields = redacted;
64
+ }
65
+ return;
66
+ }
67
+ // For objects, deeply redact all string values in-place
68
+ const allRedacted = [];
69
+ redactDeep(ctx.result, allRedacted);
70
+ if (allRedacted.length > 0) {
71
+ ctx.redacted_fields = [...new Set(allRedacted)];
72
+ }
73
+ };
74
+ /**
75
+ * Recursively walk an object/array and redact string values in-place.
76
+ */
77
+ function redactDeep(obj, redacted) {
78
+ if (obj == null || typeof obj !== 'object')
79
+ return;
80
+ if (Array.isArray(obj)) {
81
+ for (let i = 0; i < obj.length; i++) {
82
+ if (typeof obj[i] === 'string') {
83
+ const { output, redacted: r } = redactSecrets(obj[i]);
84
+ if (r.length > 0) {
85
+ obj[i] = output;
86
+ redacted.push(...r);
87
+ }
88
+ }
89
+ else {
90
+ redactDeep(obj[i], redacted);
91
+ }
92
+ }
93
+ return;
94
+ }
95
+ const record = obj;
96
+ for (const key of Object.keys(record)) {
97
+ if (typeof record[key] === 'string') {
98
+ const { output, redacted: r } = redactSecrets(record[key]);
99
+ if (r.length > 0) {
100
+ record[key] = output;
101
+ redacted.push(...r);
102
+ }
103
+ }
104
+ else {
105
+ redactDeep(record[key], redacted);
106
+ }
107
+ }
108
+ }
109
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../../src/gateway/middleware/redact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Middleware } from './chain.js';
2
+ /**
3
+ * Creates a session middleware instance with its own session ID.
4
+ * Each gateway instance gets its own session — no module-level singletons.
5
+ */
6
+ export declare function createSessionMiddleware(): Middleware;
7
+ /**
8
+ * Utility to get the session ID from a session middleware instance.
9
+ */
10
+ export declare function getSessionId(middleware: Middleware): string;
11
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/gateway/middleware/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,UAAU,CAYpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAE3D"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Creates a session middleware instance with its own session ID.
3
+ * Each gateway instance gets its own session — no module-level singletons.
4
+ */
5
+ export function createSessionMiddleware() {
6
+ const sessionId = crypto.randomUUID();
7
+ const middleware = Object.assign(async (ctx, next) => {
8
+ ctx.session_id = sessionId;
9
+ await next();
10
+ }, { sessionId });
11
+ return middleware;
12
+ }
13
+ /**
14
+ * Utility to get the session ID from a session middleware instance.
15
+ */
16
+ export function getSessionId(middleware) {
17
+ return middleware.sessionId;
18
+ }
19
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/gateway/middleware/session.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAEtC,MAAM,UAAU,GAAuC,MAAM,CAAC,MAAM,CAClE,KAAK,EAAE,GAA8B,EAAE,IAA+B,EAAE,EAAE;QACxE,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;QAC3B,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,EACD,EAAE,SAAS,EAAE,CACd,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAAsB;IACjD,OAAQ,UAAiD,CAAC,SAAS,CAAC;AACtE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { GatewayConfig } from '../../types/index.js';
2
+ import type { Middleware } from './chain.js';
3
+ /**
4
+ * Classifies the tool's tier and attaches it to the context.
5
+ */
6
+ export declare function createTierMiddleware(gatewayConfig?: GatewayConfig): Middleware;
7
+ //# sourceMappingURL=tier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier.d.ts","sourceRoot":"","sources":["../../../src/gateway/middleware/tier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,UAAU,CAK9E"}
@@ -0,0 +1,11 @@
1
+ import { classifyTool } from '../../config/tier-map.js';
2
+ /**
3
+ * Classifies the tool's tier and attaches it to the context.
4
+ */
5
+ export function createTierMiddleware(gatewayConfig) {
6
+ return async (ctx, next) => {
7
+ ctx.tier = classifyTool(ctx.tool_name, ctx.server_name, gatewayConfig);
8
+ await next();
9
+ };
10
+ }
11
+ //# sourceMappingURL=tier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier.js","sourceRoot":"","sources":["../../../src/gateway/middleware/tier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIxD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,aAA6B;IAChE,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,GAAG,CAAC,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QACvE,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface ServeOptions {
2
+ baseDir: string;
3
+ }
4
+ /**
5
+ * Starts the MCP gateway server.
6
+ *
7
+ * 1. Loads policy and gateway config
8
+ * 2. Connects to all downstream MCP servers
9
+ * 3. Discovers their tools
10
+ * 4. Re-registers tools on the gateway with middleware-wrapped handlers
11
+ * 5. Listens on stdio for incoming MCP requests
12
+ */
13
+ export declare function startGateway(options: ServeOptions): Promise<void>;
14
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/gateway/server.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA0EvE"}
@@ -0,0 +1,79 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { loadPolicy } from '../config/policy-loader.js';
4
+ import { loadGatewayConfig } from '../config/gateway-config.js';
5
+ import { getPkgVersion } from '../cli/utils.js';
6
+ import { ClientManager } from './client-manager.js';
7
+ import { ToolProxy } from './tool-proxy.js';
8
+ import { createSessionMiddleware } from './middleware/session.js';
9
+ import { createKillSwitchMiddleware } from './middleware/kill-switch.js';
10
+ import { createTierMiddleware } from './middleware/tier.js';
11
+ import { createPolicyMiddleware } from './middleware/policy.js';
12
+ import { redactMiddleware } from './middleware/redact.js';
13
+ import { createAuditMiddleware } from './middleware/audit.js';
14
+ /**
15
+ * Starts the MCP gateway server.
16
+ *
17
+ * 1. Loads policy and gateway config
18
+ * 2. Connects to all downstream MCP servers
19
+ * 3. Discovers their tools
20
+ * 4. Re-registers tools on the gateway with middleware-wrapped handlers
21
+ * 5. Listens on stdio for incoming MCP requests
22
+ */
23
+ export async function startGateway(options) {
24
+ const { baseDir } = options;
25
+ // Load configuration
26
+ console.error('[reagent] Loading configuration...');
27
+ const policy = loadPolicy(baseDir);
28
+ const gatewayConfig = loadGatewayConfig(baseDir);
29
+ console.error(`[reagent] Policy: autonomy=${policy.autonomy_level}, profile=${policy.profile}`);
30
+ console.error(`[reagent] Gateway: ${Object.keys(gatewayConfig.servers).length} downstream server(s)`);
31
+ // Build middleware chain
32
+ // SECURITY: Audit is outermost so it records ALL invocations, including kill-switch denials.
33
+ // Order (onion): audit → session → kill-switch → tier → policy → redact → [execute]
34
+ const middlewares = [
35
+ createAuditMiddleware(baseDir),
36
+ createSessionMiddleware(),
37
+ createKillSwitchMiddleware(baseDir),
38
+ createTierMiddleware(gatewayConfig),
39
+ createPolicyMiddleware(policy, gatewayConfig),
40
+ redactMiddleware,
41
+ ];
42
+ // Create gateway MCP server
43
+ const gateway = new McpServer({ name: 'reagent', version: getPkgVersion() }, { capabilities: { tools: {} } });
44
+ // Connect to downstream servers
45
+ const clientManager = new ClientManager();
46
+ await clientManager.connectAll(gatewayConfig);
47
+ // Discover and register tools
48
+ const toolProxy = new ToolProxy();
49
+ const toolCount = await toolProxy.discoverAndRegister(gateway, clientManager, middlewares);
50
+ console.error(`[reagent] Gateway ready: ${toolCount} tools registered`);
51
+ // Listen on stdio
52
+ const transport = new StdioServerTransport();
53
+ await gateway.connect(transport);
54
+ console.error('[reagent] Listening on stdio...');
55
+ // Graceful shutdown — guard against double-invocation
56
+ let shuttingDown = false;
57
+ const shutdown = async () => {
58
+ if (shuttingDown)
59
+ return;
60
+ shuttingDown = true;
61
+ console.error('[reagent] Shutting down...');
62
+ try {
63
+ await clientManager.disconnectAll();
64
+ }
65
+ catch (err) {
66
+ console.error('[reagent] Error during client disconnect:', err instanceof Error ? err.message : err);
67
+ }
68
+ try {
69
+ await gateway.close();
70
+ }
71
+ catch (err) {
72
+ console.error('[reagent] Error during gateway close:', err instanceof Error ? err.message : err);
73
+ }
74
+ process.exit(0);
75
+ };
76
+ process.on('SIGINT', shutdown);
77
+ process.on('SIGTERM', shutdown);
78
+ }
79
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/gateway/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ClientManager, ManagedClient } from './client-manager.js';
3
+ import type { Middleware } from './middleware/chain.js';
4
+ interface DiscoveredTool {
5
+ name: string;
6
+ description: string;
7
+ inputSchema: Record<string, unknown>;
8
+ serverName: string;
9
+ client: ManagedClient;
10
+ }
11
+ /**
12
+ * Discovers tools from all downstream clients and registers them on the gateway McpServer.
13
+ * Tool names are namespaced as `servername__toolname` to avoid collisions.
14
+ */
15
+ export declare class ToolProxy {
16
+ private tools;
17
+ discoverAndRegister(gateway: McpServer, clientManager: ClientManager, middlewares: Middleware[]): Promise<number>;
18
+ getTools(): DiscoveredTool[];
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=tool-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-proxy.d.ts","sourceRoot":"","sources":["../../src/gateway/tool-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,uBAAuB,CAAC;AAI3E,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;CACvB;AA0BD;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAwB;IAE/B,mBAAmB,CACvB,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,UAAU,EAAE,GACxB,OAAO,CAAC,MAAM,CAAC;IAoHlB,QAAQ,IAAI,cAAc,EAAE;CAG7B"}