zapret2-mcp 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 (76) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/LICENSE +21 -0
  3. package/README.md +238 -0
  4. package/build/executor/docker.d.ts +7 -0
  5. package/build/executor/docker.js +22 -0
  6. package/build/executor/docker.js.map +1 -0
  7. package/build/executor/factory.d.ts +2 -0
  8. package/build/executor/factory.js +27 -0
  9. package/build/executor/factory.js.map +1 -0
  10. package/build/executor/index.d.ts +6 -0
  11. package/build/executor/index.js +5 -0
  12. package/build/executor/index.js.map +1 -0
  13. package/build/executor/local.d.ts +5 -0
  14. package/build/executor/local.js +17 -0
  15. package/build/executor/local.js.map +1 -0
  16. package/build/executor/ssh.d.ts +13 -0
  17. package/build/executor/ssh.js +33 -0
  18. package/build/executor/ssh.js.map +1 -0
  19. package/build/executor/types.d.ts +8 -0
  20. package/build/executor/types.js +2 -0
  21. package/build/executor/types.js.map +1 -0
  22. package/build/executorInstance.d.ts +3 -0
  23. package/build/executorInstance.js +11 -0
  24. package/build/executorInstance.js.map +1 -0
  25. package/build/index.d.ts +2 -0
  26. package/build/index.js +75 -0
  27. package/build/index.js.map +1 -0
  28. package/build/logStore.d.ts +12 -0
  29. package/build/logStore.js +76 -0
  30. package/build/logStore.js.map +1 -0
  31. package/build/prompts.d.ts +2 -0
  32. package/build/prompts.js +156 -0
  33. package/build/prompts.js.map +1 -0
  34. package/build/resources.d.ts +2 -0
  35. package/build/resources.js +41 -0
  36. package/build/resources.js.map +1 -0
  37. package/build/tools/checkPrerequisites.d.ts +19 -0
  38. package/build/tools/checkPrerequisites.js +116 -0
  39. package/build/tools/checkPrerequisites.js.map +1 -0
  40. package/build/tools/configureDns.d.ts +35 -0
  41. package/build/tools/configureDns.js +106 -0
  42. package/build/tools/configureDns.js.map +1 -0
  43. package/build/tools/createSystemdService.d.ts +27 -0
  44. package/build/tools/createSystemdService.js +74 -0
  45. package/build/tools/createSystemdService.js.map +1 -0
  46. package/build/tools/detectSystem.d.ts +19 -0
  47. package/build/tools/detectSystem.js +89 -0
  48. package/build/tools/detectSystem.js.map +1 -0
  49. package/build/tools/getConfig.d.ts +27 -0
  50. package/build/tools/getConfig.js +30 -0
  51. package/build/tools/getConfig.js.map +1 -0
  52. package/build/tools/getStatus.d.ts +19 -0
  53. package/build/tools/getStatus.js +35 -0
  54. package/build/tools/getStatus.js.map +1 -0
  55. package/build/tools/installZapret.d.ts +31 -0
  56. package/build/tools/installZapret.js +84 -0
  57. package/build/tools/installZapret.js.map +1 -0
  58. package/build/tools/restartService.d.ts +19 -0
  59. package/build/tools/restartService.js +24 -0
  60. package/build/tools/restartService.js.map +1 -0
  61. package/build/tools/runBlockcheck.d.ts +31 -0
  62. package/build/tools/runBlockcheck.js +44 -0
  63. package/build/tools/runBlockcheck.js.map +1 -0
  64. package/build/tools/startService.d.ts +19 -0
  65. package/build/tools/startService.js +24 -0
  66. package/build/tools/startService.js.map +1 -0
  67. package/build/tools/stopService.d.ts +19 -0
  68. package/build/tools/stopService.js +24 -0
  69. package/build/tools/stopService.js.map +1 -0
  70. package/build/tools/updateConfig.d.ts +31 -0
  71. package/build/tools/updateConfig.js +50 -0
  72. package/build/tools/updateConfig.js.map +1 -0
  73. package/build/tools/verifyBypass.d.ts +31 -0
  74. package/build/tools/verifyBypass.js +62 -0
  75. package/build/tools/verifyBypass.js.map +1 -0
  76. package/package.json +64 -0
@@ -0,0 +1,74 @@
1
+ import { z } from "zod";
2
+ import { getExecutor } from "../executorInstance.js";
3
+ import { saveLog } from "../logStore.js";
4
+ export const createSystemdServiceTool = {
5
+ name: "createSystemdService",
6
+ description: "Create a systemd service unit for zapret2 on Linux desktop systems. Generates /etc/systemd/system/zapret2.service, runs daemon-reload, and optionally enables the service for autostart. Requires systemd — use detectSystem first to verify.",
7
+ schema: z.object({
8
+ enable: z.boolean().default(true).describe("Enable service for autostart (default: true)"),
9
+ }),
10
+ handler: async (args) => {
11
+ const enable = args.enable !== false;
12
+ const unitContent = `[Unit]
13
+ Description=zapret2 network packet processing service
14
+ After=network-online.target
15
+ Wants=network-online.target
16
+
17
+ [Service]
18
+ Type=forking
19
+ ExecStart=/opt/zapret2/init.d/sysv/zapret2 start
20
+ ExecStop=/opt/zapret2/init.d/sysv/zapret2 stop
21
+ ExecReload=/opt/zapret2/init.d/sysv/zapret2 restart
22
+ RemainAfterExit=yes
23
+ Restart=on-failure
24
+ RestartSec=5
25
+
26
+ [Install]
27
+ WantedBy=multi-user.target`;
28
+ const b64Unit = Buffer.from(unitContent).toString("base64");
29
+ const script = `
30
+ set -e
31
+
32
+ if ! command -v systemctl >/dev/null 2>&1; then
33
+ echo "ERROR: systemctl not found. This tool requires systemd."
34
+ exit 1
35
+ fi
36
+
37
+ if ! systemctl --version >/dev/null 2>&1; then
38
+ echo "ERROR: systemd is not running."
39
+ exit 1
40
+ fi
41
+
42
+ if [ ! -d /opt/zapret2 ]; then
43
+ echo "ERROR: /opt/zapret2 not found. Run installZapret first."
44
+ exit 1
45
+ fi
46
+
47
+ # Write unit file
48
+ printf '%s' '${b64Unit}' | base64 -d > /etc/systemd/system/zapret2.service
49
+
50
+ systemctl daemon-reload
51
+
52
+ ${enable ? 'systemctl enable zapret2.service' : 'echo "Service not enabled (enable=false)"'}
53
+
54
+ echo "UNIT_CREATED"
55
+ echo "Path: /etc/systemd/system/zapret2.service"
56
+ echo "Enabled: ${enable}"
57
+ systemctl status zapret2.service --no-pager 2>&1 || true
58
+ `;
59
+ try {
60
+ const { stdout, stderr } = await getExecutor().exec(script, 30000);
61
+ const output = (stdout + stderr).trim();
62
+ saveLog("service", output, { action: "createSystemdService", enable: String(enable) });
63
+ return { content: [{ type: "text", text: output }] };
64
+ }
65
+ catch (err) {
66
+ const e = err;
67
+ return {
68
+ content: [{ type: "text", text: `Error: ${e.stderr || e.stdout || e.error?.message || "unknown error"}` }],
69
+ isError: true,
70
+ };
71
+ }
72
+ },
73
+ };
74
+ //# sourceMappingURL=createSystemdService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSystemdService.js","sourceRoot":"","sources":["../../src/tools/createSystemdService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,+OAA+O;IAC5P,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KAC3F,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAA0B,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC;QAErC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;2BAeG,CAAC;QAExB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;qBAmBE,OAAO;;;;QAIpB,MAAM,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,2CAA2C;;;;uBAI1E,MAAM;;KAExB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAExC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAEvF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBACnH,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ export declare const detectSystemTool: {
3
+ name: string;
4
+ description: string;
5
+ schema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
6
+ handler: () => Promise<{
7
+ content: {
8
+ type: "text";
9
+ text: string;
10
+ }[];
11
+ isError?: undefined;
12
+ } | {
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ }[];
17
+ isError: boolean;
18
+ }>;
19
+ };
@@ -0,0 +1,89 @@
1
+ import { z } from "zod";
2
+ import { getExecutor } from "../executorInstance.js";
3
+ export const detectSystemTool = {
4
+ name: "detectSystem",
5
+ description: "Detect the target system environment: OS (id, version, pretty name), CPU architecture, init system (systemd/procd/sysv), default WAN interface, DNS resolvers, NFQUEUE kernel module availability, and whether running inside a container. Use this as a first step to determine which workflow (router vs desktop) to follow.",
6
+ schema: z.object({}),
7
+ handler: async () => {
8
+ const script = `
9
+ # OS detection
10
+ OS_ID="unknown"
11
+ OS_VERSION=""
12
+ OS_PRETTY=""
13
+ if [ -f /etc/os-release ]; then
14
+ OS_ID=$(. /etc/os-release && echo "\${ID:-unknown}")
15
+ OS_VERSION=$(. /etc/os-release && echo "\${VERSION_ID:-}")
16
+ OS_PRETTY=$(. /etc/os-release && echo "\${PRETTY_NAME:-}")
17
+ fi
18
+
19
+ ARCH=$(uname -m)
20
+
21
+ # Init system
22
+ INIT_SYSTEM="unknown"
23
+ if command -v systemctl >/dev/null 2>&1 && systemctl --version >/dev/null 2>&1; then
24
+ INIT_SYSTEM="systemd"
25
+ elif [ -d /etc/rc.d ] || [ -f /etc/init.d/boot ]; then
26
+ INIT_SYSTEM="procd"
27
+ else
28
+ INIT_SYSTEM="sysv"
29
+ fi
30
+
31
+ # WAN interface
32
+ WAN_IFACE=$(ip route get 8.8.8.8 2>/dev/null | awk '/dev/{for(i=1;i<=NF;i++){if($i=="dev"){print $(i+1);exit}}}')
33
+ WAN_IFACE=\${WAN_IFACE:-""}
34
+
35
+ # DNS resolvers
36
+ DNS_RESOLVERS=""
37
+ if [ -f /etc/resolv.conf ]; then
38
+ DNS_RESOLVERS=$(awk '/^nameserver/{printf "%s,", $2}' /etc/resolv.conf | sed 's/,$//')
39
+ fi
40
+
41
+ # NFQUEUE kernel module
42
+ NFQUEUE_MODULE="false"
43
+ if modinfo xt_NFQUEUE >/dev/null 2>&1 || modinfo nfnetlink_queue >/dev/null 2>&1; then
44
+ NFQUEUE_MODULE="true"
45
+ fi
46
+
47
+ # Container detection
48
+ IN_CONTAINER="false"
49
+ if [ -f /.dockerenv ] || grep -q 'docker\\|lxc\\|containerd' /proc/1/cgroup 2>/dev/null; then
50
+ IN_CONTAINER="true"
51
+ fi
52
+
53
+ # systemd-resolved detection
54
+ RESOLVED_ACTIVE="false"
55
+ if command -v systemctl >/dev/null 2>&1 && systemctl is-active systemd-resolved >/dev/null 2>&1; then
56
+ RESOLVED_ACTIVE="true"
57
+ fi
58
+
59
+ cat <<EOJSON
60
+ {
61
+ "os": {
62
+ "id": "$OS_ID",
63
+ "version": "$OS_VERSION",
64
+ "pretty": "$OS_PRETTY"
65
+ },
66
+ "arch": "$ARCH",
67
+ "initSystem": "$INIT_SYSTEM",
68
+ "wanInterface": "$WAN_IFACE",
69
+ "dnsResolvers": "$DNS_RESOLVERS",
70
+ "nfqueueModule": $NFQUEUE_MODULE,
71
+ "inContainer": $IN_CONTAINER,
72
+ "systemdResolved": $RESOLVED_ACTIVE
73
+ }
74
+ EOJSON
75
+ `;
76
+ try {
77
+ const { stdout } = await getExecutor().exec(script, 10000);
78
+ return { content: [{ type: "text", text: stdout.trim() }] };
79
+ }
80
+ catch (err) {
81
+ const e = err;
82
+ return {
83
+ content: [{ type: "text", text: `Error: ${e.stderr || e.error?.message || "unknown error"}` }],
84
+ isError: true,
85
+ };
86
+ }
87
+ },
88
+ };
89
+ //# sourceMappingURL=detectSystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectSystem.js","sourceRoot":"","sources":["../../src/tools/detectSystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,gUAAgU;IAC7U,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmEd,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QACvE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBACvG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ export declare const getConfigTool: {
3
+ name: string;
4
+ description: string;
5
+ schema: z.ZodObject<{
6
+ key: z.ZodOptional<z.ZodString>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ key?: string | undefined;
9
+ }, {
10
+ key?: string | undefined;
11
+ }>;
12
+ handler: (args: {
13
+ key?: string;
14
+ }) => Promise<{
15
+ content: {
16
+ type: "text";
17
+ text: string;
18
+ }[];
19
+ isError?: undefined;
20
+ } | {
21
+ content: {
22
+ type: "text";
23
+ text: string;
24
+ }[];
25
+ isError: boolean;
26
+ }>;
27
+ };
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ import { getExecutor } from "../executorInstance.js";
3
+ export const getConfigTool = {
4
+ name: "getConfig",
5
+ description: "Read zapret2 configuration from /opt/zapret2/config. Optionally filter by a specific key. Common keys: NFQWS2_ENABLE, NFQWS2_OPT, MODE, FWTYPE.",
6
+ schema: z.object({
7
+ key: z.string().optional().describe("Optional config key to read (e.g. NFQWS2_ENABLE, NFQWS2_OPT). If omitted, returns full config."),
8
+ }),
9
+ handler: async (args) => {
10
+ try {
11
+ let command;
12
+ if (args.key) {
13
+ command = `grep -E '^${args.key}=' /opt/zapret2/config || echo "Key '${args.key}' not found"`;
14
+ }
15
+ else {
16
+ command = "cat /opt/zapret2/config";
17
+ }
18
+ const { stdout } = await getExecutor().exec(command);
19
+ return { content: [{ type: "text", text: stdout.trim() }] };
20
+ }
21
+ catch (err) {
22
+ const e = err;
23
+ return {
24
+ content: [{ type: "text", text: `Error: ${e.stderr || e.error?.message || "unknown error"}` }],
25
+ isError: true,
26
+ };
27
+ }
28
+ },
29
+ };
30
+ //# sourceMappingURL=getConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getConfig.js","sourceRoot":"","sources":["../../src/tools/getConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,iJAAiJ;IAC9J,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gGAAgG,CAAC;KACtI,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAsB,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,IAAI,OAAe,CAAC;YACpB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,OAAO,GAAG,aAAa,IAAI,CAAC,GAAG,wCAAwC,IAAI,CAAC,GAAG,cAAc,CAAC;YAChG,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,yBAAyB,CAAC;YACtC,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QACvE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBACvG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ export declare const getStatusTool: {
3
+ name: string;
4
+ description: string;
5
+ schema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
6
+ handler: () => Promise<{
7
+ content: {
8
+ type: "text";
9
+ text: string;
10
+ }[];
11
+ isError?: undefined;
12
+ } | {
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ }[];
17
+ isError: boolean;
18
+ }>;
19
+ };
@@ -0,0 +1,35 @@
1
+ import { z } from "zod";
2
+ import { getExecutor } from "../executorInstance.js";
3
+ export const getStatusTool = {
4
+ name: "getStatus",
5
+ description: "Get zapret2 service status: running state, PID, nftables rules count, nfqws2 enabled flag. Use this first to check if zapret2 is running before making changes.",
6
+ schema: z.object({}),
7
+ handler: async () => {
8
+ const script = `
9
+ PID=$(pgrep -x nfqws2 2>/dev/null || echo "")
10
+ RUNNING=false
11
+ if [ -n "$PID" ]; then RUNNING=true; fi
12
+
13
+ NFT_COUNT=0
14
+ if command -v nft >/dev/null 2>&1; then
15
+ NFT_COUNT=$(nft list ruleset 2>/dev/null | grep -c zapret 2>/dev/null || echo 0)
16
+ fi
17
+
18
+ ENABLED=$(grep -E '^NFQWS2_ENABLE=' /opt/zapret2/config 2>/dev/null | cut -d= -f2 || echo "unknown")
19
+
20
+ echo "{\\"running\\": $RUNNING, \\"pid\\": \\"$PID\\", \\"nftRulesCount\\": $NFT_COUNT, \\"nfqws2Enabled\\": \\"$ENABLED\\"}"
21
+ `;
22
+ try {
23
+ const { stdout } = await getExecutor().exec(script);
24
+ return { content: [{ type: "text", text: stdout.trim() }] };
25
+ }
26
+ catch (err) {
27
+ const e = err;
28
+ return {
29
+ content: [{ type: "text", text: `Error: ${e.stderr || e.error?.message || "unknown error"}` }],
30
+ isError: true,
31
+ };
32
+ }
33
+ },
34
+ };
35
+ //# sourceMappingURL=getStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getStatus.js","sourceRoot":"","sources":["../../src/tools/getStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,iKAAiK;IAC9K,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,MAAM,GAAG;;;;;;;;;;;;;KAad,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QACvE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBACvG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ export declare const installZapretTool: {
3
+ name: string;
4
+ description: string;
5
+ schema: z.ZodObject<{
6
+ version: z.ZodDefault<z.ZodString>;
7
+ force: z.ZodDefault<z.ZodBoolean>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ version: string;
10
+ force: boolean;
11
+ }, {
12
+ version?: string | undefined;
13
+ force?: boolean | undefined;
14
+ }>;
15
+ handler: (args: {
16
+ version?: string;
17
+ force?: boolean;
18
+ }) => Promise<{
19
+ content: {
20
+ type: "text";
21
+ text: string;
22
+ }[];
23
+ isError?: undefined;
24
+ } | {
25
+ content: {
26
+ type: "text";
27
+ text: string;
28
+ }[];
29
+ isError: boolean;
30
+ }>;
31
+ };
@@ -0,0 +1,84 @@
1
+ import { z } from "zod";
2
+ import { getExecutor } from "../executorInstance.js";
3
+ import { saveLog } from "../logStore.js";
4
+ export const installZapretTool = {
5
+ name: "installZapret",
6
+ description: "Install zapret2 from scratch: clone repo, download binaries from GitHub releases, run install_bin.sh, create base config. Skips interactive install_easy.sh. Run checkPrerequisites first. After install, configure with updateConfig and startService.",
7
+ schema: z.object({
8
+ version: z.string().default("v0.9.4.1").describe("zapret2 release version (default: v0.9.4.1)"),
9
+ force: z.boolean().default(false).describe("Force reinstall even if /opt/zapret2 already exists"),
10
+ }),
11
+ handler: async (args) => {
12
+ const version = args.version || "v0.9.4.1";
13
+ const force = args.force || false;
14
+ const script = `
15
+ set -e
16
+
17
+ if [ -d "/opt/zapret2/.git" ] && [ "${force}" != "true" ]; then
18
+ echo "ALREADY_INSTALLED"
19
+ exit 0
20
+ fi
21
+
22
+ # Clone repo
23
+ if [ ! -d "/opt/zapret2/.git" ]; then
24
+ rm -rf /opt/zapret2/*
25
+ cd /opt && git clone --depth 1 https://github.com/bol-van/zapret2.git zapret2
26
+ fi
27
+
28
+ # Download and extract binaries
29
+ ARCHIVE="zapret2-${version}.tar.gz"
30
+ cd /tmp
31
+ curl -sLO "https://github.com/bol-van/zapret2/releases/download/${version}/$ARCHIVE"
32
+ tar xzf "$ARCHIVE"
33
+ EXTRACT_DIR=$(echo "$ARCHIVE" | sed 's/.tar.gz//')
34
+ cp -r "$EXTRACT_DIR/binaries/"* /opt/zapret2/binaries/
35
+ rm -rf "$EXTRACT_DIR" "$ARCHIVE"
36
+
37
+ # Install binaries
38
+ cd /opt/zapret2 && sh install_bin.sh
39
+
40
+ # Create base config if missing
41
+ if [ ! -f /opt/zapret2/config ]; then
42
+ WAN_IFACE=$(ip route get 8.8.8.8 2>/dev/null | awk '/dev/{for(i=1;i<=NF;i++){if($i=="dev"){print $(i+1);exit}}}')
43
+ WAN_IFACE=\${WAN_IFACE:-}
44
+ printf '%s\\n' \
45
+ "FWTYPE=nftables" \
46
+ "MODE=nfqws2" \
47
+ "NFQWS2_ENABLE=0" \
48
+ 'NFQWS2_OPT="--payload=http_req --lua-desync=fake"' \
49
+ "FLOWOFFLOAD=none" \
50
+ "IFACE_WAN=$WAN_IFACE" \
51
+ "IFACE_LAN=" \
52
+ "DISABLE_IPV6=1" \
53
+ > /opt/zapret2/config
54
+ fi
55
+
56
+ echo "INSTALL_OK"
57
+ echo "Version: ${version}"
58
+ echo "Binary: $(ls -la /opt/zapret2/nfqws2 2>/dev/null || echo 'not found')"
59
+ `;
60
+ try {
61
+ const { stdout, stderr } = await getExecutor().exec(script, 120000);
62
+ const output = (stdout + stderr).trim();
63
+ if (output.startsWith("ALREADY_INSTALLED")) {
64
+ return {
65
+ content: [{ type: "text", text: "zapret2 is already installed at /opt/zapret2. Use force=true to reinstall." }],
66
+ };
67
+ }
68
+ saveLog("service", output, { action: "install", version });
69
+ return { content: [{ type: "text", text: output }] };
70
+ }
71
+ catch (err) {
72
+ const e = err;
73
+ const output = (e.stdout || "") + (e.stderr || "");
74
+ if (output) {
75
+ saveLog("service", output, { action: "install", version, error: "true" });
76
+ }
77
+ return {
78
+ content: [{ type: "text", text: `Error installing zapret2: ${output || e.error?.message || "unknown error"}` }],
79
+ isError: true,
80
+ };
81
+ }
82
+ },
83
+ };
84
+ //# sourceMappingURL=installZapret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installZapret.js","sourceRoot":"","sources":["../../src/tools/installZapret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,yPAAyP;IACtQ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QAC/F,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,qDAAqD,CAAC;KAClG,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAA2C,EAAE,EAAE;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;QAElC,MAAM,MAAM,GAAG;;;4CAGyB,KAAK;;;;;;;;;;;;yBAYxB,OAAO;;wEAEwC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;uBA0BxD,OAAO;;KAEzB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAExC,IAAI,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC3C,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,4EAA4E,EAAE,CAAC;iBACzH,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YACnD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,6BAA6B,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBACxH,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ export declare const restartServiceTool: {
3
+ name: string;
4
+ description: string;
5
+ schema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
6
+ handler: () => Promise<{
7
+ content: {
8
+ type: "text";
9
+ text: string;
10
+ }[];
11
+ isError?: undefined;
12
+ } | {
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ }[];
17
+ isError: boolean;
18
+ }>;
19
+ };
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ import { getExecutor } from "../executorInstance.js";
3
+ import { saveLog } from "../logStore.js";
4
+ export const restartServiceTool = {
5
+ name: "restartService",
6
+ description: "Restart zapret2 service (nfqws2 daemon). Logs saved to resources. Use after updateConfig to apply changes.",
7
+ schema: z.object({}),
8
+ handler: async () => {
9
+ try {
10
+ const { stdout, stderr } = await getExecutor().exec("/opt/zapret2/init.d/sysv/zapret2 restart");
11
+ const output = (stdout + stderr).trim() || "Service restarted";
12
+ saveLog("service", output, { action: "restart" });
13
+ return { content: [{ type: "text", text: output }] };
14
+ }
15
+ catch (err) {
16
+ const e = err;
17
+ return {
18
+ content: [{ type: "text", text: `Error: ${(e.stdout || "") + (e.stderr || "") || e.error?.message || "unknown error"}` }],
19
+ isError: true,
20
+ };
21
+ }
22
+ },
23
+ };
24
+ //# sourceMappingURL=restartService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restartService.js","sourceRoot":"","sources":["../../src/tools/restartService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,4GAA4G;IACzH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YAChG,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,mBAAmB,CAAC;YAC/D,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAClD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBAClI,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ export declare const runBlockcheckTool: {
3
+ name: string;
4
+ description: string;
5
+ schema: z.ZodObject<{
6
+ domain: z.ZodDefault<z.ZodString>;
7
+ scanLevel: z.ZodDefault<z.ZodEnum<["quick", "standard"]>>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ domain: string;
10
+ scanLevel: "quick" | "standard";
11
+ }, {
12
+ domain?: string | undefined;
13
+ scanLevel?: "quick" | "standard" | undefined;
14
+ }>;
15
+ handler: (args: {
16
+ domain?: string;
17
+ scanLevel?: "quick" | "standard";
18
+ }) => Promise<{
19
+ content: {
20
+ type: "text";
21
+ text: string;
22
+ }[];
23
+ isError?: undefined;
24
+ } | {
25
+ content: {
26
+ type: "text";
27
+ text: string;
28
+ }[];
29
+ isError: boolean;
30
+ }>;
31
+ };
@@ -0,0 +1,44 @@
1
+ import { z } from "zod";
2
+ import { getExecutor } from "../executorInstance.js";
3
+ import { saveLog } from "../logStore.js";
4
+ export const runBlockcheckTool = {
5
+ name: "runBlockcheck",
6
+ description: "Run blockcheck2.sh to find working network strategies for a domain. Stops zapret2 before running, collects AVAILABLE results. Heavy operation (~5 min). Full log saved to resources. Apply results via updateConfig NFQWS2_OPT.",
7
+ schema: z.object({
8
+ domain: z.string().default("example.com").describe("Domain to test against (default: example.com)"),
9
+ scanLevel: z.enum(["quick", "standard"]).default("quick").describe("Scan depth: quick or standard (default: quick)"),
10
+ }),
11
+ handler: async (args) => {
12
+ const domain = args.domain || "example.com";
13
+ const scanLevel = args.scanLevel || "quick";
14
+ const scanNum = scanLevel === "quick" ? "1" : "2";
15
+ const script = `
16
+ /opt/zapret2/init.d/sysv/zapret2 stop 2>/dev/null || true
17
+
18
+ printf '%s\\n' "${domain}" "${scanNum}" "Y" | /opt/zapret2/blockcheck2.sh 2>&1
19
+ `;
20
+ try {
21
+ const { stdout } = await getExecutor().exec(script, 300000);
22
+ const fullOutput = stdout.trim();
23
+ const ts = saveLog("blockcheck", fullOutput, { domain, scanLevel });
24
+ const filtered = fullOutput
25
+ .split("\n")
26
+ .filter((line) => /AVAILABLE|summary|strategy|nfqws2/i.test(line))
27
+ .join("\n") || "No AVAILABLE strategies found";
28
+ const response = `${filtered}\n\nFull log: zapret2://logs/blockcheck/${ts}`;
29
+ return { content: [{ type: "text", text: response }] };
30
+ }
31
+ catch (err) {
32
+ const e = err;
33
+ const output = (e.stdout || "") + (e.stderr || "");
34
+ if (output) {
35
+ saveLog("blockcheck", output, { domain, scanLevel, error: "true" });
36
+ }
37
+ return {
38
+ content: [{ type: "text", text: `Error running blockcheck2: ${output || e.error?.message || "unknown error"}` }],
39
+ isError: true,
40
+ };
41
+ }
42
+ },
43
+ };
44
+ //# sourceMappingURL=runBlockcheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runBlockcheck.js","sourceRoot":"","sources":["../../src/tools/runBlockcheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,iOAAiO;IAC9O,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QACnG,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,gDAAgD,CAAC;KACrH,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAA2D,EAAE,EAAE;QAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;QAE5C,MAAM,OAAO,GAAG,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAElD,MAAM,MAAM,GAAG;;;wBAGK,MAAM,MAAM,OAAO;KACtC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAEjC,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAEpE,MAAM,QAAQ,GAAG,UAAU;iBACxB,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACjE,IAAI,CAAC,IAAI,CAAC,IAAI,+BAA+B,CAAC;YAEjD,MAAM,QAAQ,GAAG,GAAG,QAAQ,2CAA2C,EAAE,EAAE,CAAC;YAC5E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAClE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YAEnD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACtE,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,8BAA8B,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBACzH,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ export declare const startServiceTool: {
3
+ name: string;
4
+ description: string;
5
+ schema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
6
+ handler: () => Promise<{
7
+ content: {
8
+ type: "text";
9
+ text: string;
10
+ }[];
11
+ isError?: undefined;
12
+ } | {
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ }[];
17
+ isError: boolean;
18
+ }>;
19
+ };
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ import { getExecutor } from "../executorInstance.js";
3
+ import { saveLog } from "../logStore.js";
4
+ export const startServiceTool = {
5
+ name: "startService",
6
+ description: "Start zapret2 service (nfqws2 daemon). Logs saved to resources. After starting, use verifyBypass to confirm.",
7
+ schema: z.object({}),
8
+ handler: async () => {
9
+ try {
10
+ const { stdout, stderr } = await getExecutor().exec("/opt/zapret2/init.d/sysv/zapret2 start");
11
+ const output = (stdout + stderr).trim() || "Service started";
12
+ saveLog("service", output, { action: "start" });
13
+ return { content: [{ type: "text", text: output }] };
14
+ }
15
+ catch (err) {
16
+ const e = err;
17
+ return {
18
+ content: [{ type: "text", text: `Error: ${(e.stdout || "") + (e.stderr || "") || e.error?.message || "unknown error"}` }],
19
+ isError: true,
20
+ };
21
+ }
22
+ },
23
+ };
24
+ //# sourceMappingURL=startService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startService.js","sourceRoot":"","sources":["../../src/tools/startService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,8GAA8G;IAC3H,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YAC9F,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,iBAAiB,CAAC;YAC7D,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAChD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBAClI,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ export declare const stopServiceTool: {
3
+ name: string;
4
+ description: string;
5
+ schema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
6
+ handler: () => Promise<{
7
+ content: {
8
+ type: "text";
9
+ text: string;
10
+ }[];
11
+ isError?: undefined;
12
+ } | {
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ }[];
17
+ isError: boolean;
18
+ }>;
19
+ };