localant 1.0.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 (218) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +290 -0
  3. package/SECURITY.md +87 -0
  4. package/examples/skills/hello-world/CHANGELOG.md +4 -0
  5. package/examples/skills/hello-world/LICENSE +1 -0
  6. package/examples/skills/hello-world/README.md +20 -0
  7. package/examples/skills/hello-world/examples/example.json +1 -0
  8. package/examples/skills/hello-world/package.json +9 -0
  9. package/examples/skills/hello-world/skill.json +32 -0
  10. package/examples/skills/hello-world/src/index.ts +19 -0
  11. package/examples/skills/hello-world/tests/index.test.ts +19 -0
  12. package/package.json +63 -0
  13. package/packages/cli/dist/bin.d.ts +3 -0
  14. package/packages/cli/dist/bin.d.ts.map +1 -0
  15. package/packages/cli/dist/bin.js +261 -0
  16. package/packages/cli/dist/bin.js.map +1 -0
  17. package/packages/cli/dist/doctor.d.ts +3 -0
  18. package/packages/cli/dist/doctor.d.ts.map +1 -0
  19. package/packages/cli/dist/doctor.js +35 -0
  20. package/packages/cli/dist/doctor.js.map +1 -0
  21. package/packages/cli/dist/index.d.ts +3 -0
  22. package/packages/cli/dist/index.d.ts.map +1 -0
  23. package/packages/cli/dist/index.js +3 -0
  24. package/packages/cli/dist/index.js.map +1 -0
  25. package/packages/cli/dist/runtime.d.ts +11 -0
  26. package/packages/cli/dist/runtime.d.ts.map +1 -0
  27. package/packages/cli/dist/runtime.js +82 -0
  28. package/packages/cli/dist/runtime.js.map +1 -0
  29. package/packages/cli/dist/util.d.ts +18 -0
  30. package/packages/cli/dist/util.d.ts.map +1 -0
  31. package/packages/cli/dist/util.js +47 -0
  32. package/packages/cli/dist/util.js.map +1 -0
  33. package/packages/cli/package.json +19 -0
  34. package/packages/dashboard/dist/index.d.ts +10 -0
  35. package/packages/dashboard/dist/index.d.ts.map +1 -0
  36. package/packages/dashboard/dist/index.js +178 -0
  37. package/packages/dashboard/dist/index.js.map +1 -0
  38. package/packages/dashboard/package.json +10 -0
  39. package/packages/gateway/dist/gateway.d.ts +85 -0
  40. package/packages/gateway/dist/gateway.d.ts.map +1 -0
  41. package/packages/gateway/dist/gateway.js +234 -0
  42. package/packages/gateway/dist/gateway.js.map +1 -0
  43. package/packages/gateway/dist/index.d.ts +13 -0
  44. package/packages/gateway/dist/index.d.ts.map +1 -0
  45. package/packages/gateway/dist/index.js +16 -0
  46. package/packages/gateway/dist/index.js.map +1 -0
  47. package/packages/gateway/dist/managers/coding-agent-manager.d.ts +71 -0
  48. package/packages/gateway/dist/managers/coding-agent-manager.d.ts.map +1 -0
  49. package/packages/gateway/dist/managers/coding-agent-manager.js +179 -0
  50. package/packages/gateway/dist/managers/coding-agent-manager.js.map +1 -0
  51. package/packages/gateway/dist/managers/fs-manager.d.ts +63 -0
  52. package/packages/gateway/dist/managers/fs-manager.d.ts.map +1 -0
  53. package/packages/gateway/dist/managers/fs-manager.js +229 -0
  54. package/packages/gateway/dist/managers/fs-manager.js.map +1 -0
  55. package/packages/gateway/dist/managers/git-manager.d.ts +21 -0
  56. package/packages/gateway/dist/managers/git-manager.d.ts.map +1 -0
  57. package/packages/gateway/dist/managers/git-manager.js +67 -0
  58. package/packages/gateway/dist/managers/git-manager.js.map +1 -0
  59. package/packages/gateway/dist/managers/mcp-bridge.d.ts +26 -0
  60. package/packages/gateway/dist/managers/mcp-bridge.d.ts.map +1 -0
  61. package/packages/gateway/dist/managers/mcp-bridge.js +92 -0
  62. package/packages/gateway/dist/managers/mcp-bridge.js.map +1 -0
  63. package/packages/gateway/dist/managers/project-registry.d.ts +17 -0
  64. package/packages/gateway/dist/managers/project-registry.d.ts.map +1 -0
  65. package/packages/gateway/dist/managers/project-registry.js +90 -0
  66. package/packages/gateway/dist/managers/project-registry.js.map +1 -0
  67. package/packages/gateway/dist/managers/shell-manager.d.ts +48 -0
  68. package/packages/gateway/dist/managers/shell-manager.d.ts.map +1 -0
  69. package/packages/gateway/dist/managers/shell-manager.js +132 -0
  70. package/packages/gateway/dist/managers/shell-manager.js.map +1 -0
  71. package/packages/gateway/dist/managers/skill-runtime.d.ts +37 -0
  72. package/packages/gateway/dist/managers/skill-runtime.d.ts.map +1 -0
  73. package/packages/gateway/dist/managers/skill-runtime.js +310 -0
  74. package/packages/gateway/dist/managers/skill-runtime.js.map +1 -0
  75. package/packages/gateway/dist/managers/tunnel-manager.d.ts +23 -0
  76. package/packages/gateway/dist/managers/tunnel-manager.d.ts.map +1 -0
  77. package/packages/gateway/dist/managers/tunnel-manager.js +106 -0
  78. package/packages/gateway/dist/managers/tunnel-manager.js.map +1 -0
  79. package/packages/gateway/dist/registry.d.ts +28 -0
  80. package/packages/gateway/dist/registry.d.ts.map +1 -0
  81. package/packages/gateway/dist/registry.js +20 -0
  82. package/packages/gateway/dist/registry.js.map +1 -0
  83. package/packages/gateway/dist/security/command-guard.d.ts +35 -0
  84. package/packages/gateway/dist/security/command-guard.d.ts.map +1 -0
  85. package/packages/gateway/dist/security/command-guard.js +105 -0
  86. package/packages/gateway/dist/security/command-guard.js.map +1 -0
  87. package/packages/gateway/dist/security/path-guard.d.ts +31 -0
  88. package/packages/gateway/dist/security/path-guard.d.ts.map +1 -0
  89. package/packages/gateway/dist/security/path-guard.js +101 -0
  90. package/packages/gateway/dist/security/path-guard.js.map +1 -0
  91. package/packages/gateway/dist/skill-runner.d.ts +2 -0
  92. package/packages/gateway/dist/skill-runner.d.ts.map +1 -0
  93. package/packages/gateway/dist/skill-runner.js +38 -0
  94. package/packages/gateway/dist/skill-runner.js.map +1 -0
  95. package/packages/gateway/dist/stores/approval-store.d.ts +34 -0
  96. package/packages/gateway/dist/stores/approval-store.d.ts.map +1 -0
  97. package/packages/gateway/dist/stores/approval-store.js +108 -0
  98. package/packages/gateway/dist/stores/approval-store.js.map +1 -0
  99. package/packages/gateway/dist/stores/audit-log.d.ts +23 -0
  100. package/packages/gateway/dist/stores/audit-log.d.ts.map +1 -0
  101. package/packages/gateway/dist/stores/audit-log.js +70 -0
  102. package/packages/gateway/dist/stores/audit-log.js.map +1 -0
  103. package/packages/gateway/dist/stores/config-store.d.ts +14 -0
  104. package/packages/gateway/dist/stores/config-store.d.ts.map +1 -0
  105. package/packages/gateway/dist/stores/config-store.js +57 -0
  106. package/packages/gateway/dist/stores/config-store.js.map +1 -0
  107. package/packages/gateway/dist/stores/secret-vault.d.ts +23 -0
  108. package/packages/gateway/dist/stores/secret-vault.d.ts.map +1 -0
  109. package/packages/gateway/dist/stores/secret-vault.js +74 -0
  110. package/packages/gateway/dist/stores/secret-vault.js.map +1 -0
  111. package/packages/gateway/dist/tools/adapters.d.ts +8 -0
  112. package/packages/gateway/dist/tools/adapters.d.ts.map +1 -0
  113. package/packages/gateway/dist/tools/adapters.js +178 -0
  114. package/packages/gateway/dist/tools/adapters.js.map +1 -0
  115. package/packages/gateway/dist/tools/adb.d.ts +3 -0
  116. package/packages/gateway/dist/tools/adb.d.ts.map +1 -0
  117. package/packages/gateway/dist/tools/adb.js +60 -0
  118. package/packages/gateway/dist/tools/adb.js.map +1 -0
  119. package/packages/gateway/dist/tools/article.d.ts +3 -0
  120. package/packages/gateway/dist/tools/article.d.ts.map +1 -0
  121. package/packages/gateway/dist/tools/article.js +230 -0
  122. package/packages/gateway/dist/tools/article.js.map +1 -0
  123. package/packages/gateway/dist/tools/audit-approval.d.ts +4 -0
  124. package/packages/gateway/dist/tools/audit-approval.d.ts.map +1 -0
  125. package/packages/gateway/dist/tools/audit-approval.js +64 -0
  126. package/packages/gateway/dist/tools/audit-approval.js.map +1 -0
  127. package/packages/gateway/dist/tools/browser.d.ts +3 -0
  128. package/packages/gateway/dist/tools/browser.d.ts.map +1 -0
  129. package/packages/gateway/dist/tools/browser.js +55 -0
  130. package/packages/gateway/dist/tools/browser.js.map +1 -0
  131. package/packages/gateway/dist/tools/coding-agent.d.ts +3 -0
  132. package/packages/gateway/dist/tools/coding-agent.d.ts.map +1 -0
  133. package/packages/gateway/dist/tools/coding-agent.js +103 -0
  134. package/packages/gateway/dist/tools/coding-agent.js.map +1 -0
  135. package/packages/gateway/dist/tools/filesystem.d.ts +3 -0
  136. package/packages/gateway/dist/tools/filesystem.d.ts.map +1 -0
  137. package/packages/gateway/dist/tools/filesystem.js +141 -0
  138. package/packages/gateway/dist/tools/filesystem.js.map +1 -0
  139. package/packages/gateway/dist/tools/git.d.ts +3 -0
  140. package/packages/gateway/dist/tools/git.d.ts.map +1 -0
  141. package/packages/gateway/dist/tools/git.js +92 -0
  142. package/packages/gateway/dist/tools/git.js.map +1 -0
  143. package/packages/gateway/dist/tools/index.d.ts +4 -0
  144. package/packages/gateway/dist/tools/index.d.ts.map +1 -0
  145. package/packages/gateway/dist/tools/index.js +29 -0
  146. package/packages/gateway/dist/tools/index.js.map +1 -0
  147. package/packages/gateway/dist/tools/project.d.ts +3 -0
  148. package/packages/gateway/dist/tools/project.d.ts.map +1 -0
  149. package/packages/gateway/dist/tools/project.js +86 -0
  150. package/packages/gateway/dist/tools/project.js.map +1 -0
  151. package/packages/gateway/dist/tools/shell.d.ts +3 -0
  152. package/packages/gateway/dist/tools/shell.d.ts.map +1 -0
  153. package/packages/gateway/dist/tools/shell.js +98 -0
  154. package/packages/gateway/dist/tools/shell.js.map +1 -0
  155. package/packages/gateway/dist/tools/skill.d.ts +3 -0
  156. package/packages/gateway/dist/tools/skill.d.ts.map +1 -0
  157. package/packages/gateway/dist/tools/skill.js +231 -0
  158. package/packages/gateway/dist/tools/skill.js.map +1 -0
  159. package/packages/gateway/dist/tools/system.d.ts +3 -0
  160. package/packages/gateway/dist/tools/system.d.ts.map +1 -0
  161. package/packages/gateway/dist/tools/system.js +78 -0
  162. package/packages/gateway/dist/tools/system.js.map +1 -0
  163. package/packages/gateway/dist/util/exec.d.ts +21 -0
  164. package/packages/gateway/dist/util/exec.d.ts.map +1 -0
  165. package/packages/gateway/dist/util/exec.js +50 -0
  166. package/packages/gateway/dist/util/exec.js.map +1 -0
  167. package/packages/gateway/package.json +18 -0
  168. package/packages/mcp/dist/http-server.d.ts +16 -0
  169. package/packages/mcp/dist/http-server.d.ts.map +1 -0
  170. package/packages/mcp/dist/http-server.js +138 -0
  171. package/packages/mcp/dist/http-server.js.map +1 -0
  172. package/packages/mcp/dist/index.d.ts +4 -0
  173. package/packages/mcp/dist/index.d.ts.map +1 -0
  174. package/packages/mcp/dist/index.js +3 -0
  175. package/packages/mcp/dist/index.js.map +1 -0
  176. package/packages/mcp/dist/mcp-server.d.ts +9 -0
  177. package/packages/mcp/dist/mcp-server.d.ts.map +1 -0
  178. package/packages/mcp/dist/mcp-server.js +26 -0
  179. package/packages/mcp/dist/mcp-server.js.map +1 -0
  180. package/packages/mcp/package.json +18 -0
  181. package/packages/shared/dist/config.d.ts +314 -0
  182. package/packages/shared/dist/config.d.ts.map +1 -0
  183. package/packages/shared/dist/config.js +146 -0
  184. package/packages/shared/dist/config.js.map +1 -0
  185. package/packages/shared/dist/index.d.ts +8 -0
  186. package/packages/shared/dist/index.d.ts.map +1 -0
  187. package/packages/shared/dist/index.js +8 -0
  188. package/packages/shared/dist/index.js.map +1 -0
  189. package/packages/shared/dist/logger.d.ts +8 -0
  190. package/packages/shared/dist/logger.d.ts.map +1 -0
  191. package/packages/shared/dist/logger.js +26 -0
  192. package/packages/shared/dist/logger.js.map +1 -0
  193. package/packages/shared/dist/net.d.ts +10 -0
  194. package/packages/shared/dist/net.d.ts.map +1 -0
  195. package/packages/shared/dist/net.js +35 -0
  196. package/packages/shared/dist/net.js.map +1 -0
  197. package/packages/shared/dist/paths.d.ts +30 -0
  198. package/packages/shared/dist/paths.d.ts.map +1 -0
  199. package/packages/shared/dist/paths.js +70 -0
  200. package/packages/shared/dist/paths.js.map +1 -0
  201. package/packages/shared/dist/redaction.d.ts +15 -0
  202. package/packages/shared/dist/redaction.d.ts.map +1 -0
  203. package/packages/shared/dist/redaction.js +58 -0
  204. package/packages/shared/dist/redaction.js.map +1 -0
  205. package/packages/shared/dist/risk.d.ts +23 -0
  206. package/packages/shared/dist/risk.d.ts.map +1 -0
  207. package/packages/shared/dist/risk.js +28 -0
  208. package/packages/shared/dist/risk.js.map +1 -0
  209. package/packages/shared/dist/types.d.ts +94 -0
  210. package/packages/shared/dist/types.d.ts.map +1 -0
  211. package/packages/shared/dist/types.js +2 -0
  212. package/packages/shared/dist/types.js.map +1 -0
  213. package/packages/shared/package.json +13 -0
  214. package/packages/skill-sdk/dist/index.d.ts +36 -0
  215. package/packages/skill-sdk/dist/index.d.ts.map +1 -0
  216. package/packages/skill-sdk/dist/index.js +20 -0
  217. package/packages/skill-sdk/dist/index.js.map +1 -0
  218. package/packages/skill-sdk/package.json +14 -0
@@ -0,0 +1,9 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { Gateway } from "@localant/gateway";
3
+ /**
4
+ * Build an McpServer that exposes every registered gateway tool. Each MCP tool
5
+ * call is routed through gateway.executeTool, applying the full safety
6
+ * pipeline (validation → approval → redaction → audit).
7
+ */
8
+ export declare function buildMcpServer(gw: Gateway): McpServer;
9
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAIjD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,SAAS,CAuBrD"}
@@ -0,0 +1,26 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ const SESSION_ID = "chatgpt";
3
+ /**
4
+ * Build an McpServer that exposes every registered gateway tool. Each MCP tool
5
+ * call is routed through gateway.executeTool, applying the full safety
6
+ * pipeline (validation → approval → redaction → audit).
7
+ */
8
+ export function buildMcpServer(gw) {
9
+ const server = new McpServer({ name: "LocalAnt", version: "1.0.0" });
10
+ for (const tool of gw.registry.list()) {
11
+ const shape = tool.inputSchema.shape ?? {};
12
+ server.registerTool(tool.name, {
13
+ description: `[risk ${tool.risk}] ${tool.description}`,
14
+ inputSchema: shape,
15
+ }, async (args) => {
16
+ const result = await gw.executeTool(tool.name, args, { caller: "chatgpt", sessionId: SESSION_ID });
17
+ const text = JSON.stringify(result, null, 2);
18
+ return {
19
+ content: [{ type: "text", text }],
20
+ isError: !result.ok && !result.approvalRequired,
21
+ };
22
+ });
23
+ }
24
+ return server;
25
+ }
26
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,MAAM,UAAU,GAAG,SAAS,CAAC;AAE7B;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,EAAW;IACxC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAErE,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAI,IAAI,CAAC,WAAmE,CAAC,KAAK,IAAI,EAAE,CAAC;QACpG,MAAM,CAAC,YAAY,CACjB,IAAI,CAAC,IAAI,EACT;YACE,WAAW,EAAE,SAAS,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE;YACtD,WAAW,EAAE,KAAK;SACnB,EACD,KAAK,EAAE,IAAa,EAAE,EAAE;YACtB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;YACnG,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;gBAC1C,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB;aAChD,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "@localant/mcp",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": "./dist/index.js"
9
+ },
10
+ "dependencies": {
11
+ "@localant/gateway": "workspace:*",
12
+ "@localant/dashboard": "workspace:*",
13
+ "@localant/shared": "workspace:*",
14
+ "@modelcontextprotocol/sdk": "^1.12.0",
15
+ "express": "^5.0.1",
16
+ "zod": "^3.24.1"
17
+ }
18
+ }
@@ -0,0 +1,314 @@
1
+ import { z } from "zod";
2
+ /** Default command allowlist — safe, read-mostly developer commands. */
3
+ export declare const DEFAULT_ALLOWED_COMMANDS: string[];
4
+ /**
5
+ * Blocked command tokens. Matched against tokenized command words (after
6
+ * splitting on shell metacharacters), so `rm -rf` and `rm -rf` and
7
+ * `a && rm -rf` are all caught regardless of spacing.
8
+ */
9
+ export declare const BLOCKED_COMMAND_TOKENS: string[];
10
+ export declare const SkillPermissionsSchema: z.ZodObject<{
11
+ filesystem: z.ZodDefault<z.ZodObject<{
12
+ mode: z.ZodDefault<z.ZodEnum<["none", "read", "write"]>>;
13
+ allowedDirectories: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
14
+ }, "strip", z.ZodTypeAny, {
15
+ mode: "none" | "read" | "write";
16
+ allowedDirectories: string[];
17
+ }, {
18
+ mode?: "none" | "read" | "write" | undefined;
19
+ allowedDirectories?: string[] | undefined;
20
+ }>>;
21
+ shell: z.ZodDefault<z.ZodObject<{
22
+ mode: z.ZodDefault<z.ZodEnum<["none", "allowed", "custom"]>>;
23
+ allowedCommands: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
24
+ }, "strip", z.ZodTypeAny, {
25
+ mode: "none" | "allowed" | "custom";
26
+ allowedCommands: string[];
27
+ }, {
28
+ mode?: "none" | "allowed" | "custom" | undefined;
29
+ allowedCommands?: string[] | undefined;
30
+ }>>;
31
+ network: z.ZodDefault<z.ZodObject<{
32
+ mode: z.ZodDefault<z.ZodEnum<["none", "allowlist", "all"]>>;
33
+ allowedHosts: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
34
+ }, "strip", z.ZodTypeAny, {
35
+ mode: "none" | "allowlist" | "all";
36
+ allowedHosts: string[];
37
+ }, {
38
+ mode?: "none" | "allowlist" | "all" | undefined;
39
+ allowedHosts?: string[] | undefined;
40
+ }>>;
41
+ secrets: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
42
+ browser: z.ZodDefault<z.ZodEnum<["none", "read", "control"]>>;
43
+ adb: z.ZodDefault<z.ZodEnum<["none", "read", "control"]>>;
44
+ git: z.ZodDefault<z.ZodEnum<["none", "read", "write"]>>;
45
+ agent: z.ZodDefault<z.ZodEnum<["none", "plan", "execute"]>>;
46
+ }, "strip", z.ZodTypeAny, {
47
+ filesystem: {
48
+ mode: "none" | "read" | "write";
49
+ allowedDirectories: string[];
50
+ };
51
+ shell: {
52
+ mode: "none" | "allowed" | "custom";
53
+ allowedCommands: string[];
54
+ };
55
+ network: {
56
+ mode: "none" | "allowlist" | "all";
57
+ allowedHosts: string[];
58
+ };
59
+ secrets: string[];
60
+ browser: "none" | "read" | "control";
61
+ adb: "none" | "read" | "control";
62
+ git: "none" | "read" | "write";
63
+ agent: "none" | "plan" | "execute";
64
+ }, {
65
+ filesystem?: {
66
+ mode?: "none" | "read" | "write" | undefined;
67
+ allowedDirectories?: string[] | undefined;
68
+ } | undefined;
69
+ shell?: {
70
+ mode?: "none" | "allowed" | "custom" | undefined;
71
+ allowedCommands?: string[] | undefined;
72
+ } | undefined;
73
+ network?: {
74
+ mode?: "none" | "allowlist" | "all" | undefined;
75
+ allowedHosts?: string[] | undefined;
76
+ } | undefined;
77
+ secrets?: string[] | undefined;
78
+ browser?: "none" | "read" | "control" | undefined;
79
+ adb?: "none" | "read" | "control" | undefined;
80
+ git?: "none" | "read" | "write" | undefined;
81
+ agent?: "none" | "plan" | "execute" | undefined;
82
+ }>;
83
+ export type SkillPermissions = z.infer<typeof SkillPermissionsSchema>;
84
+ declare const CodingAgentConfig: z.ZodObject<{
85
+ enabled: z.ZodDefault<z.ZodBoolean>;
86
+ command: z.ZodString;
87
+ args: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
88
+ planArgs: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
89
+ executeArgs: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
90
+ defaultPermissionMode: z.ZodDefault<z.ZodEnum<["plan", "execute"]>>;
91
+ maxTurns: z.ZodDefault<z.ZodNumber>;
92
+ timeoutMs: z.ZodDefault<z.ZodNumber>;
93
+ }, "strip", z.ZodTypeAny, {
94
+ enabled: boolean;
95
+ command: string;
96
+ args: string[];
97
+ planArgs: string[];
98
+ executeArgs: string[];
99
+ defaultPermissionMode: "plan" | "execute";
100
+ maxTurns: number;
101
+ timeoutMs: number;
102
+ }, {
103
+ command: string;
104
+ enabled?: boolean | undefined;
105
+ args?: string[] | undefined;
106
+ planArgs?: string[] | undefined;
107
+ executeArgs?: string[] | undefined;
108
+ defaultPermissionMode?: "plan" | "execute" | undefined;
109
+ maxTurns?: number | undefined;
110
+ timeoutMs?: number | undefined;
111
+ }>;
112
+ export type CodingAgentConfig = z.infer<typeof CodingAgentConfig>;
113
+ export declare const ConfigSchema: z.ZodObject<{
114
+ version: z.ZodDefault<z.ZodLiteral<1>>;
115
+ gateway: z.ZodDefault<z.ZodObject<{
116
+ host: z.ZodDefault<z.ZodString>;
117
+ port: z.ZodDefault<z.ZodNumber>;
118
+ }, "strip", z.ZodTypeAny, {
119
+ host: string;
120
+ port: number;
121
+ }, {
122
+ host?: string | undefined;
123
+ port?: number | undefined;
124
+ }>>;
125
+ dashboard: z.ZodDefault<z.ZodObject<{
126
+ enabled: z.ZodDefault<z.ZodBoolean>;
127
+ port: z.ZodDefault<z.ZodNumber>;
128
+ }, "strip", z.ZodTypeAny, {
129
+ port: number;
130
+ enabled: boolean;
131
+ }, {
132
+ port?: number | undefined;
133
+ enabled?: boolean | undefined;
134
+ }>>;
135
+ tunnel: z.ZodDefault<z.ZodObject<{
136
+ provider: z.ZodDefault<z.ZodEnum<["cloudflared", "ngrok", "none"]>>;
137
+ publicUrl: z.ZodOptional<z.ZodString>;
138
+ }, "strip", z.ZodTypeAny, {
139
+ provider: "none" | "cloudflared" | "ngrok";
140
+ publicUrl?: string | undefined;
141
+ }, {
142
+ provider?: "none" | "cloudflared" | "ngrok" | undefined;
143
+ publicUrl?: string | undefined;
144
+ }>>;
145
+ security: z.ZodDefault<z.ZodObject<{
146
+ allowedDirectories: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
147
+ allowedCommands: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
148
+ blockedCommandTokens: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
149
+ approveRisk1: z.ZodDefault<z.ZodBoolean>;
150
+ maxFileSizeBytes: z.ZodDefault<z.ZodNumber>;
151
+ maxOutputBytes: z.ZodDefault<z.ZodNumber>;
152
+ commandTimeoutMs: z.ZodDefault<z.ZodNumber>;
153
+ logRetentionDays: z.ZodDefault<z.ZodNumber>;
154
+ }, "strip", z.ZodTypeAny, {
155
+ allowedDirectories: string[];
156
+ allowedCommands: string[];
157
+ blockedCommandTokens: string[];
158
+ approveRisk1: boolean;
159
+ maxFileSizeBytes: number;
160
+ maxOutputBytes: number;
161
+ commandTimeoutMs: number;
162
+ logRetentionDays: number;
163
+ }, {
164
+ allowedDirectories?: string[] | undefined;
165
+ allowedCommands?: string[] | undefined;
166
+ blockedCommandTokens?: string[] | undefined;
167
+ approveRisk1?: boolean | undefined;
168
+ maxFileSizeBytes?: number | undefined;
169
+ maxOutputBytes?: number | undefined;
170
+ commandTimeoutMs?: number | undefined;
171
+ logRetentionDays?: number | undefined;
172
+ }>>;
173
+ codingAgents: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
174
+ enabled: z.ZodDefault<z.ZodBoolean>;
175
+ command: z.ZodString;
176
+ args: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
177
+ planArgs: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
178
+ executeArgs: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
179
+ defaultPermissionMode: z.ZodDefault<z.ZodEnum<["plan", "execute"]>>;
180
+ maxTurns: z.ZodDefault<z.ZodNumber>;
181
+ timeoutMs: z.ZodDefault<z.ZodNumber>;
182
+ }, "strip", z.ZodTypeAny, {
183
+ enabled: boolean;
184
+ command: string;
185
+ args: string[];
186
+ planArgs: string[];
187
+ executeArgs: string[];
188
+ defaultPermissionMode: "plan" | "execute";
189
+ maxTurns: number;
190
+ timeoutMs: number;
191
+ }, {
192
+ command: string;
193
+ enabled?: boolean | undefined;
194
+ args?: string[] | undefined;
195
+ planArgs?: string[] | undefined;
196
+ executeArgs?: string[] | undefined;
197
+ defaultPermissionMode?: "plan" | "execute" | undefined;
198
+ maxTurns?: number | undefined;
199
+ timeoutMs?: number | undefined;
200
+ }>>>;
201
+ mcpServers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
202
+ command: z.ZodString;
203
+ args: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
204
+ transport: z.ZodDefault<z.ZodEnum<["stdio"]>>;
205
+ enabled: z.ZodDefault<z.ZodBoolean>;
206
+ }, "strip", z.ZodTypeAny, {
207
+ enabled: boolean;
208
+ command: string;
209
+ args: string[];
210
+ transport: "stdio";
211
+ }, {
212
+ command: string;
213
+ enabled?: boolean | undefined;
214
+ args?: string[] | undefined;
215
+ transport?: "stdio" | undefined;
216
+ }>>>;
217
+ skillRegistry: z.ZodDefault<z.ZodObject<{
218
+ sources: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
219
+ }, "strip", z.ZodTypeAny, {
220
+ sources: string[];
221
+ }, {
222
+ sources?: string[] | undefined;
223
+ }>>;
224
+ }, "strip", z.ZodTypeAny, {
225
+ version: 1;
226
+ gateway: {
227
+ host: string;
228
+ port: number;
229
+ };
230
+ dashboard: {
231
+ port: number;
232
+ enabled: boolean;
233
+ };
234
+ tunnel: {
235
+ provider: "none" | "cloudflared" | "ngrok";
236
+ publicUrl?: string | undefined;
237
+ };
238
+ security: {
239
+ allowedDirectories: string[];
240
+ allowedCommands: string[];
241
+ blockedCommandTokens: string[];
242
+ approveRisk1: boolean;
243
+ maxFileSizeBytes: number;
244
+ maxOutputBytes: number;
245
+ commandTimeoutMs: number;
246
+ logRetentionDays: number;
247
+ };
248
+ codingAgents: Record<string, {
249
+ enabled: boolean;
250
+ command: string;
251
+ args: string[];
252
+ planArgs: string[];
253
+ executeArgs: string[];
254
+ defaultPermissionMode: "plan" | "execute";
255
+ maxTurns: number;
256
+ timeoutMs: number;
257
+ }>;
258
+ mcpServers: Record<string, {
259
+ enabled: boolean;
260
+ command: string;
261
+ args: string[];
262
+ transport: "stdio";
263
+ }>;
264
+ skillRegistry: {
265
+ sources: string[];
266
+ };
267
+ }, {
268
+ version?: 1 | undefined;
269
+ gateway?: {
270
+ host?: string | undefined;
271
+ port?: number | undefined;
272
+ } | undefined;
273
+ dashboard?: {
274
+ port?: number | undefined;
275
+ enabled?: boolean | undefined;
276
+ } | undefined;
277
+ tunnel?: {
278
+ provider?: "none" | "cloudflared" | "ngrok" | undefined;
279
+ publicUrl?: string | undefined;
280
+ } | undefined;
281
+ security?: {
282
+ allowedDirectories?: string[] | undefined;
283
+ allowedCommands?: string[] | undefined;
284
+ blockedCommandTokens?: string[] | undefined;
285
+ approveRisk1?: boolean | undefined;
286
+ maxFileSizeBytes?: number | undefined;
287
+ maxOutputBytes?: number | undefined;
288
+ commandTimeoutMs?: number | undefined;
289
+ logRetentionDays?: number | undefined;
290
+ } | undefined;
291
+ codingAgents?: Record<string, {
292
+ command: string;
293
+ enabled?: boolean | undefined;
294
+ args?: string[] | undefined;
295
+ planArgs?: string[] | undefined;
296
+ executeArgs?: string[] | undefined;
297
+ defaultPermissionMode?: "plan" | "execute" | undefined;
298
+ maxTurns?: number | undefined;
299
+ timeoutMs?: number | undefined;
300
+ }> | undefined;
301
+ mcpServers?: Record<string, {
302
+ command: string;
303
+ enabled?: boolean | undefined;
304
+ args?: string[] | undefined;
305
+ transport?: "stdio" | undefined;
306
+ }> | undefined;
307
+ skillRegistry?: {
308
+ sources?: string[] | undefined;
309
+ } | undefined;
310
+ }>;
311
+ export type Config = z.infer<typeof ConfigSchema>;
312
+ export declare function defaultConfig(): Config;
313
+ export {};
314
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,EAAE,MAAM,EAe5C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAgB1C,CAAC;AAiBF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;EASrB,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AASlE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8DvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,146 @@
1
+ import { z } from "zod";
2
+ import { defaultAllowedDirectories } from "./paths.js";
3
+ /** Default command allowlist — safe, read-mostly developer commands. */
4
+ export const DEFAULT_ALLOWED_COMMANDS = [
5
+ "pwd",
6
+ "ls",
7
+ "cat",
8
+ "git status",
9
+ "git diff",
10
+ "git log",
11
+ "git branch",
12
+ "pnpm test",
13
+ "pnpm build",
14
+ "pnpm lint",
15
+ "pnpm validate",
16
+ "npm test",
17
+ "npm run build",
18
+ "npm run lint",
19
+ ];
20
+ /**
21
+ * Blocked command tokens. Matched against tokenized command words (after
22
+ * splitting on shell metacharacters), so `rm -rf` and `rm -rf` and
23
+ * `a && rm -rf` are all caught regardless of spacing.
24
+ */
25
+ export const BLOCKED_COMMAND_TOKENS = [
26
+ "sudo",
27
+ "su",
28
+ "mkfs",
29
+ "dd",
30
+ "chown",
31
+ "ssh",
32
+ "scp",
33
+ "rsync",
34
+ "diskutil",
35
+ "format",
36
+ "shutdown",
37
+ "reboot",
38
+ "killall",
39
+ "mkfs.ext4",
40
+ "fdisk",
41
+ ];
42
+ const FilesystemPermission = z.object({
43
+ mode: z.enum(["none", "read", "write"]).default("read"),
44
+ allowedDirectories: z.array(z.string()).default([]),
45
+ });
46
+ const ShellPermission = z.object({
47
+ mode: z.enum(["none", "allowed", "custom"]).default("none"),
48
+ allowedCommands: z.array(z.string()).default([]),
49
+ });
50
+ const NetworkPermission = z.object({
51
+ mode: z.enum(["none", "allowlist", "all"]).default("none"),
52
+ allowedHosts: z.array(z.string()).default([]),
53
+ });
54
+ export const SkillPermissionsSchema = z.object({
55
+ filesystem: FilesystemPermission.default({ mode: "read", allowedDirectories: [] }),
56
+ shell: ShellPermission.default({ mode: "none", allowedCommands: [] }),
57
+ network: NetworkPermission.default({ mode: "none", allowedHosts: [] }),
58
+ secrets: z.array(z.string()).default([]),
59
+ browser: z.enum(["none", "read", "control"]).default("none"),
60
+ adb: z.enum(["none", "read", "control"]).default("none"),
61
+ git: z.enum(["none", "read", "write"]).default("none"),
62
+ agent: z.enum(["none", "plan", "execute"]).default("none"),
63
+ });
64
+ const CodingAgentConfig = z.object({
65
+ enabled: z.boolean().default(false),
66
+ command: z.string(),
67
+ args: z.array(z.string()).default([]),
68
+ planArgs: z.array(z.string()).default([]),
69
+ executeArgs: z.array(z.string()).default([]),
70
+ defaultPermissionMode: z.enum(["plan", "execute"]).default("plan"),
71
+ maxTurns: z.number().int().positive().default(10),
72
+ timeoutMs: z.number().int().positive().default(600_000),
73
+ });
74
+ const McpServerConfig = z.object({
75
+ command: z.string(),
76
+ args: z.array(z.string()).default([]),
77
+ transport: z.enum(["stdio"]).default("stdio"),
78
+ enabled: z.boolean().default(false),
79
+ });
80
+ export const ConfigSchema = z.object({
81
+ version: z.literal(1).default(1),
82
+ gateway: z
83
+ .object({
84
+ host: z.string().default("127.0.0.1"),
85
+ port: z.number().int().min(1).max(65535).default(8787),
86
+ })
87
+ .default({ host: "127.0.0.1", port: 8787 }),
88
+ dashboard: z
89
+ .object({
90
+ enabled: z.boolean().default(true),
91
+ port: z.number().int().min(1).max(65535).default(8788),
92
+ })
93
+ .default({ enabled: true, port: 8788 }),
94
+ tunnel: z
95
+ .object({
96
+ provider: z.enum(["cloudflared", "ngrok", "none"]).default("cloudflared"),
97
+ publicUrl: z.string().optional(),
98
+ })
99
+ .default({ provider: "cloudflared" }),
100
+ security: z
101
+ .object({
102
+ allowedDirectories: z.array(z.string()).default(defaultAllowedDirectories()),
103
+ allowedCommands: z.array(z.string()).default(DEFAULT_ALLOWED_COMMANDS),
104
+ blockedCommandTokens: z.array(z.string()).default(BLOCKED_COMMAND_TOKENS),
105
+ approveRisk1: z.boolean().default(false),
106
+ maxFileSizeBytes: z.number().int().positive().default(5_000_000),
107
+ maxOutputBytes: z.number().int().positive().default(100_000),
108
+ commandTimeoutMs: z.number().int().positive().default(120_000),
109
+ logRetentionDays: z.number().int().positive().default(30),
110
+ })
111
+ .default({}),
112
+ codingAgents: z
113
+ .record(z.string(), CodingAgentConfig)
114
+ .default({
115
+ "claude-code": {
116
+ enabled: false,
117
+ command: "claude",
118
+ args: [],
119
+ planArgs: ["-p"],
120
+ executeArgs: ["-p"],
121
+ defaultPermissionMode: "plan",
122
+ maxTurns: 10,
123
+ timeoutMs: 600_000,
124
+ },
125
+ codex: {
126
+ enabled: false,
127
+ command: "codex",
128
+ args: [],
129
+ planArgs: [],
130
+ executeArgs: [],
131
+ defaultPermissionMode: "plan",
132
+ maxTurns: 10,
133
+ timeoutMs: 600_000,
134
+ },
135
+ }),
136
+ mcpServers: z.record(z.string(), McpServerConfig).default({}),
137
+ skillRegistry: z
138
+ .object({
139
+ sources: z.array(z.string()).default([]),
140
+ })
141
+ .default({ sources: [] }),
142
+ });
143
+ export function defaultConfig() {
144
+ return ConfigSchema.parse({});
145
+ }
146
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from "./paths.js";
2
+ export * from "./net.js";
3
+ export * from "./risk.js";
4
+ export * from "./redaction.js";
5
+ export * from "./config.js";
6
+ export * from "./types.js";
7
+ export * from "./logger.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from "./paths.js";
2
+ export * from "./net.js";
3
+ export * from "./risk.js";
4
+ export * from "./redaction.js";
5
+ export * from "./config.js";
6
+ export * from "./types.js";
7
+ export * from "./logger.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function createLogger(scope: string): {
2
+ debug: (msg: string, extra?: unknown) => void;
3
+ info: (msg: string, extra?: unknown) => void;
4
+ warn: (msg: string, extra?: unknown) => void;
5
+ error: (msg: string, extra?: unknown) => void;
6
+ };
7
+ export type Logger = ReturnType<typeof createLogger>;
8
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAqBA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM;iBAEzB,MAAM,UAAU,OAAO;gBACxB,MAAM,UAAU,OAAO;gBACvB,MAAM,UAAU,OAAO;iBACtB,MAAM,UAAU,OAAO;EAEvC;AAED,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ const order = { debug: 0, info: 1, warn: 2, error: 3 };
2
+ function currentLevel() {
3
+ const env = (process.env.CLA_LOG_LEVEL ?? "info").toLowerCase();
4
+ return (["debug", "info", "warn", "error"].includes(env) ? env : "info");
5
+ }
6
+ function log(level, scope, msg, extra) {
7
+ if (order[level] < order[currentLevel()])
8
+ return;
9
+ const ts = new Date().toISOString();
10
+ const prefix = `${ts} ${level.toUpperCase().padEnd(5)} [${scope}]`;
11
+ if (extra !== undefined) {
12
+ console.error(prefix, msg, extra);
13
+ }
14
+ else {
15
+ console.error(prefix, msg);
16
+ }
17
+ }
18
+ export function createLogger(scope) {
19
+ return {
20
+ debug: (msg, extra) => log("debug", scope, msg, extra),
21
+ info: (msg, extra) => log("info", scope, msg, extra),
22
+ warn: (msg, extra) => log("warn", scope, msg, extra),
23
+ error: (msg, extra) => log("error", scope, msg, extra),
24
+ };
25
+ }
26
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAGA,MAAM,KAAK,GAA0B,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAE9E,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAU,CAAC;AACpF,CAAC;AAED,SAAS,GAAG,CAAC,KAAY,EAAE,KAAa,EAAE,GAAW,EAAE,KAAe;IACpE,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QAAE,OAAO;IACjD,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC;IACnE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO;QACL,KAAK,EAAE,CAAC,GAAW,EAAE,KAAe,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC;QACxE,IAAI,EAAE,CAAC,GAAW,EAAE,KAAe,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC;QACtE,IAAI,EAAE,CAAC,GAAW,EAAE,KAAe,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC;QACtE,KAAK,EAAE,CAAC,GAAW,EAAE,KAAe,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC;KACzE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Find an available TCP port, starting at `preferred` and scanning upward.
3
+ * Ports listed in `skip` are treated as taken (used to avoid the gateway and
4
+ * dashboard colliding with each other). Throws if none is free within range.
5
+ *
6
+ * This is what lets setup survive a busy default port — e.g. Cloudflare's
7
+ * `workerd`/`wrangler dev`, which also defaults to 8787.
8
+ */
9
+ export declare function findAvailablePort(preferred: number, host?: string, skip?: number[], attempts?: number): Promise<number>;
10
+ //# sourceMappingURL=net.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"net.d.ts","sourceRoot":"","sources":["../src/net.ts"],"names":[],"mappings":"AAcA;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,IAAI,SAAc,EAClB,IAAI,GAAE,MAAM,EAAO,EACnB,QAAQ,SAAK,GACZ,OAAO,CAAC,MAAM,CAAC,CAYjB"}
@@ -0,0 +1,35 @@
1
+ import net from "node:net";
2
+ /** Resolve true if a TCP port can be bound on the given host. */
3
+ function isPortFree(port, host) {
4
+ return new Promise((resolve) => {
5
+ const server = net.createServer();
6
+ server.once("error", () => resolve(false));
7
+ server.once("listening", () => {
8
+ server.close(() => resolve(true));
9
+ });
10
+ server.listen(port, host);
11
+ });
12
+ }
13
+ /**
14
+ * Find an available TCP port, starting at `preferred` and scanning upward.
15
+ * Ports listed in `skip` are treated as taken (used to avoid the gateway and
16
+ * dashboard colliding with each other). Throws if none is free within range.
17
+ *
18
+ * This is what lets setup survive a busy default port — e.g. Cloudflare's
19
+ * `workerd`/`wrangler dev`, which also defaults to 8787.
20
+ */
21
+ export async function findAvailablePort(preferred, host = "127.0.0.1", skip = [], attempts = 50) {
22
+ const taken = new Set(skip);
23
+ for (let i = 0; i < attempts; i++) {
24
+ const port = preferred + i;
25
+ if (port > 65535)
26
+ break;
27
+ if (taken.has(port))
28
+ continue;
29
+ if (await isPortFree(port, host))
30
+ return port;
31
+ }
32
+ throw new Error(`No free port found near ${preferred} on ${host} (tried ${attempts}). ` +
33
+ `Set gateway.port to a free port in config.json.`);
34
+ }
35
+ //# sourceMappingURL=net.js.map