capacitor-mobile-claw 1.5.4 → 1.5.5

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 (122) hide show
  1. package/README.md +32 -15
  2. package/dist/esm/mcp/tools/app-state.tools.d.ts +3 -0
  3. package/dist/esm/mcp/tools/app-state.tools.d.ts.map +1 -0
  4. package/dist/esm/mcp/tools/app-state.tools.js +22 -0
  5. package/dist/esm/mcp/tools/app-state.tools.js.map +1 -0
  6. package/dist/esm/mcp/tools/barcode.tools.d.ts +3 -0
  7. package/dist/esm/mcp/tools/barcode.tools.d.ts.map +1 -0
  8. package/dist/esm/mcp/tools/barcode.tools.js +29 -0
  9. package/dist/esm/mcp/tools/barcode.tools.js.map +1 -0
  10. package/dist/esm/mcp/tools/biometric.tools.d.ts +3 -0
  11. package/dist/esm/mcp/tools/biometric.tools.d.ts.map +1 -0
  12. package/dist/esm/mcp/tools/biometric.tools.js +33 -0
  13. package/dist/esm/mcp/tools/biometric.tools.js.map +1 -0
  14. package/dist/esm/mcp/tools/bluetooth.tools.d.ts +3 -0
  15. package/dist/esm/mcp/tools/bluetooth.tools.d.ts.map +1 -0
  16. package/dist/esm/mcp/tools/bluetooth.tools.js +95 -0
  17. package/dist/esm/mcp/tools/bluetooth.tools.js.map +1 -0
  18. package/dist/esm/mcp/tools/camera.tools.d.ts +3 -0
  19. package/dist/esm/mcp/tools/camera.tools.d.ts.map +1 -0
  20. package/dist/esm/mcp/tools/camera.tools.js +36 -0
  21. package/dist/esm/mcp/tools/camera.tools.js.map +1 -0
  22. package/dist/esm/mcp/tools/categories.d.ts +22 -0
  23. package/dist/esm/mcp/tools/categories.d.ts.map +1 -0
  24. package/dist/esm/mcp/tools/categories.js +242 -0
  25. package/dist/esm/mcp/tools/categories.js.map +1 -0
  26. package/dist/esm/mcp/tools/clipboard.tools.d.ts +3 -0
  27. package/dist/esm/mcp/tools/clipboard.tools.d.ts.map +1 -0
  28. package/dist/esm/mcp/tools/clipboard.tools.js +22 -0
  29. package/dist/esm/mcp/tools/clipboard.tools.js.map +1 -0
  30. package/dist/esm/mcp/tools/contacts.tools.d.ts +3 -0
  31. package/dist/esm/mcp/tools/contacts.tools.d.ts.map +1 -0
  32. package/dist/esm/mcp/tools/contacts.tools.js +58 -0
  33. package/dist/esm/mcp/tools/contacts.tools.js.map +1 -0
  34. package/dist/esm/mcp/tools/device-info.tools.d.ts +3 -0
  35. package/dist/esm/mcp/tools/device-info.tools.d.ts.map +1 -0
  36. package/dist/esm/mcp/tools/device-info.tools.js +39 -0
  37. package/dist/esm/mcp/tools/device-info.tools.js.map +1 -0
  38. package/dist/esm/mcp/tools/discovery.tools.d.ts +3 -0
  39. package/dist/esm/mcp/tools/discovery.tools.d.ts.map +1 -0
  40. package/dist/esm/mcp/tools/discovery.tools.js +41 -0
  41. package/dist/esm/mcp/tools/discovery.tools.js.map +1 -0
  42. package/dist/esm/mcp/tools/geolocation.tools.d.ts +3 -0
  43. package/dist/esm/mcp/tools/geolocation.tools.d.ts.map +1 -0
  44. package/dist/esm/mcp/tools/geolocation.tools.js +25 -0
  45. package/dist/esm/mcp/tools/geolocation.tools.js.map +1 -0
  46. package/dist/esm/mcp/tools/haptics.tools.d.ts +3 -0
  47. package/dist/esm/mcp/tools/haptics.tools.d.ts.map +1 -0
  48. package/dist/esm/mcp/tools/haptics.tools.js +41 -0
  49. package/dist/esm/mcp/tools/haptics.tools.js.map +1 -0
  50. package/dist/esm/mcp/tools/health.tools.d.ts +3 -0
  51. package/dist/esm/mcp/tools/health.tools.d.ts.map +1 -0
  52. package/dist/esm/mcp/tools/health.tools.js +38 -0
  53. package/dist/esm/mcp/tools/health.tools.js.map +1 -0
  54. package/dist/esm/mcp/tools/http.tools.d.ts +3 -0
  55. package/dist/esm/mcp/tools/http.tools.d.ts.map +1 -0
  56. package/dist/esm/mcp/tools/http.tools.js +24 -0
  57. package/dist/esm/mcp/tools/http.tools.js.map +1 -0
  58. package/dist/esm/mcp/tools/index.d.ts +10 -0
  59. package/dist/esm/mcp/tools/index.d.ts.map +1 -0
  60. package/dist/esm/mcp/tools/index.js +70 -0
  61. package/dist/esm/mcp/tools/index.js.map +1 -0
  62. package/dist/esm/mcp/tools/keep-awake.tools.d.ts +3 -0
  63. package/dist/esm/mcp/tools/keep-awake.tools.d.ts.map +1 -0
  64. package/dist/esm/mcp/tools/keep-awake.tools.js +23 -0
  65. package/dist/esm/mcp/tools/keep-awake.tools.js.map +1 -0
  66. package/dist/esm/mcp/tools/motion-sensors.tools.d.ts +3 -0
  67. package/dist/esm/mcp/tools/motion-sensors.tools.d.ts.map +1 -0
  68. package/dist/esm/mcp/tools/motion-sensors.tools.js +60 -0
  69. package/dist/esm/mcp/tools/motion-sensors.tools.js.map +1 -0
  70. package/dist/esm/mcp/tools/network-status.tools.d.ts +3 -0
  71. package/dist/esm/mcp/tools/network-status.tools.d.ts.map +1 -0
  72. package/dist/esm/mcp/tools/network-status.tools.js +16 -0
  73. package/dist/esm/mcp/tools/network-status.tools.js.map +1 -0
  74. package/dist/esm/mcp/tools/nfc.tools.d.ts +3 -0
  75. package/dist/esm/mcp/tools/nfc.tools.d.ts.map +1 -0
  76. package/dist/esm/mcp/tools/nfc.tools.js +52 -0
  77. package/dist/esm/mcp/tools/nfc.tools.js.map +1 -0
  78. package/dist/esm/mcp/tools/notifications.tools.d.ts +3 -0
  79. package/dist/esm/mcp/tools/notifications.tools.d.ts.map +1 -0
  80. package/dist/esm/mcp/tools/notifications.tools.js +30 -0
  81. package/dist/esm/mcp/tools/notifications.tools.js.map +1 -0
  82. package/dist/esm/mcp/tools/push-notifications.tools.d.ts +3 -0
  83. package/dist/esm/mcp/tools/push-notifications.tools.d.ts.map +1 -0
  84. package/dist/esm/mcp/tools/push-notifications.tools.js +43 -0
  85. package/dist/esm/mcp/tools/push-notifications.tools.js.map +1 -0
  86. package/dist/esm/mcp/tools/secure-storage.tools.d.ts +3 -0
  87. package/dist/esm/mcp/tools/secure-storage.tools.d.ts.map +1 -0
  88. package/dist/esm/mcp/tools/secure-storage.tools.js +31 -0
  89. package/dist/esm/mcp/tools/secure-storage.tools.js.map +1 -0
  90. package/dist/esm/mcp/tools/sftp.tools.d.ts +3 -0
  91. package/dist/esm/mcp/tools/sftp.tools.d.ts.map +1 -0
  92. package/dist/esm/mcp/tools/sftp.tools.js +41 -0
  93. package/dist/esm/mcp/tools/sftp.tools.js.map +1 -0
  94. package/dist/esm/mcp/tools/share.tools.d.ts +3 -0
  95. package/dist/esm/mcp/tools/share.tools.d.ts.map +1 -0
  96. package/dist/esm/mcp/tools/share.tools.js +18 -0
  97. package/dist/esm/mcp/tools/share.tools.js.map +1 -0
  98. package/dist/esm/mcp/tools/speech.tools.d.ts +3 -0
  99. package/dist/esm/mcp/tools/speech.tools.d.ts.map +1 -0
  100. package/dist/esm/mcp/tools/speech.tools.js +38 -0
  101. package/dist/esm/mcp/tools/speech.tools.js.map +1 -0
  102. package/dist/esm/mcp/tools/ssh.tools.d.ts +3 -0
  103. package/dist/esm/mcp/tools/ssh.tools.d.ts.map +1 -0
  104. package/dist/esm/mcp/tools/ssh.tools.js +41 -0
  105. package/dist/esm/mcp/tools/ssh.tools.js.map +1 -0
  106. package/dist/esm/mcp/tools/tcp.tools.d.ts +3 -0
  107. package/dist/esm/mcp/tools/tcp.tools.d.ts.map +1 -0
  108. package/dist/esm/mcp/tools/tcp.tools.js +47 -0
  109. package/dist/esm/mcp/tools/tcp.tools.js.map +1 -0
  110. package/dist/esm/mcp/tools/tts.tools.d.ts +3 -0
  111. package/dist/esm/mcp/tools/tts.tools.d.ts.map +1 -0
  112. package/dist/esm/mcp/tools/tts.tools.js +29 -0
  113. package/dist/esm/mcp/tools/tts.tools.js.map +1 -0
  114. package/dist/esm/mcp/tools/udp.tools.d.ts +3 -0
  115. package/dist/esm/mcp/tools/udp.tools.d.ts.map +1 -0
  116. package/dist/esm/mcp/tools/udp.tools.js +22 -0
  117. package/dist/esm/mcp/tools/udp.tools.js.map +1 -0
  118. package/dist/esm/mcp/tools/wol.tools.d.ts +3 -0
  119. package/dist/esm/mcp/tools/wol.tools.d.ts.map +1 -0
  120. package/dist/esm/mcp/tools/wol.tools.js +16 -0
  121. package/dist/esm/mcp/tools/wol.tools.js.map +1 -0
  122. package/package.json +1 -1
package/README.md CHANGED
@@ -35,43 +35,60 @@ git clone https://github.com/rogelioRuiz/capacitor-mobile-claw.git
35
35
  cd capacitor-mobile-claw
36
36
 
37
37
  # Install deps and build the plugin
38
- npm install
39
- npm run build
38
+ npm install && npm run build
40
39
 
41
- # Set up the reference app (postinstall auto-copies Node.js worker)
40
+ # Set up the reference app
42
41
  cd examples/reference-app
43
42
  npm install
44
43
 
45
- # Build web app + sync native project
46
- npm run cap:build
44
+ # Add Android platform + apply patches (first time only, idempotent)
45
+ npm run setup:android
47
46
 
48
- # First time onlyadd platform
49
- npx cap add android
47
+ # Build APK from CLI no IDE needed
48
+ npm run build:android
50
49
 
51
- # Open in Android Studio — build & run
52
- npx cap open android
50
+ # Install on connected device
51
+ adb install -r android/app/build/outputs/apk/debug/app-debug.apk
53
52
  ```
54
53
 
54
+ > **Requires**: JDK 21+, Android SDK. Set `ANDROID_HOME` and `JAVA_HOME` if not auto-detected.
55
+
55
56
  ### Run on iOS
56
57
 
57
58
  ```bash
58
59
  git clone https://github.com/rogelioRuiz/capacitor-mobile-claw.git
59
60
  cd capacitor-mobile-claw
60
61
 
61
- npm install
62
- npm run build
62
+ npm install && npm run build
63
63
 
64
64
  cd examples/reference-app
65
65
  npm install
66
- npm run cap:build
67
66
 
68
- # First time only — add platform
69
- npx cap add ios
67
+ # Add iOS platform + sync (first time only, idempotent)
68
+ npm run setup:ios
70
69
 
71
- # Open in Xcodebuild & run
70
+ # Build for Simulator from CLI no Xcode interaction needed
71
+ npm run build:ios
72
+
73
+ # Or open in Xcode for device builds
72
74
  npx cap open ios
73
75
  ```
74
76
 
77
+ > **Requires**: Xcode 15+ with iOS SDK. The SQLite SPM patch is applied automatically on `npm install`.
78
+
79
+ ### Running Tests
80
+
81
+ ```bash
82
+ # Android E2E (100 tests, requires ADB device)
83
+ npm run test:android
84
+
85
+ # iOS E2E (104 tests, requires booted Simulator)
86
+ npm run test:ios
87
+
88
+ # Full suite: node + Android + iOS (skips unavailable platforms)
89
+ npm run test:full
90
+ ```
91
+
75
92
  Once the app launches, enter your Anthropic API key in settings and start chatting. The agent can read/write files, run code, use git, and call any registered MCP device tools — all on-device.
76
93
 
77
94
  ## How It Works
@@ -0,0 +1,3 @@
1
+ import type { DeviceTool } from './types';
2
+ export declare const appStateTools: DeviceTool[];
3
+ //# sourceMappingURL=app-state.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-state.tools.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/app-state.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,eAAO,MAAM,aAAa,EAAE,UAAU,EAmBrC,CAAA"}
@@ -0,0 +1,22 @@
1
+ import { App } from '@capacitor/app';
2
+ export const appStateTools = [
3
+ {
4
+ name: 'app_get_info',
5
+ description: 'Get the application name, version, and build number.',
6
+ inputSchema: { "type": "object", "properties": {}, "additionalProperties": false },
7
+ execute: async () => {
8
+ const info = await App.getInfo();
9
+ return { name: info.name, id: info.id, version: info.version, build: info.build };
10
+ },
11
+ },
12
+ {
13
+ name: 'app_get_state',
14
+ description: 'Check whether the app is currently active (foreground) or in the background.',
15
+ inputSchema: { "type": "object", "properties": {}, "additionalProperties": false },
16
+ execute: async () => {
17
+ const state = await App.getState();
18
+ return { isActive: state.isActive };
19
+ },
20
+ },
21
+ ];
22
+ //# sourceMappingURL=app-state.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-state.tools.js","sourceRoot":"","sources":["../../../../src/mcp/tools/app-state.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAGpC,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,sDAAsD;QACnE,WAAW,EAAE,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,EAAE,EAAC,sBAAsB,EAAC,KAAK,EAAC;QAC3E,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAA;YAChC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;QACnF,CAAC;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,8EAA8E;QAC3F,WAAW,EAAE,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,EAAE,EAAC,sBAAsB,EAAC,KAAK,EAAC;QAC3E,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAA;YAClC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAA;QACrC,CAAC;KACF;CACF,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { DeviceTool } from './types';
2
+ export declare const barcodeTools: DeviceTool[];
3
+ //# sourceMappingURL=barcode.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"barcode.tools.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/barcode.tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,eAAO,MAAM,YAAY,EAAE,UAAU,EA2BpC,CAAA"}
@@ -0,0 +1,29 @@
1
+ export const barcodeTools = [
2
+ {
3
+ name: 'barcode_scan',
4
+ description: 'Scan a barcode or QR code using the device camera. Returns the decoded barcode value and format.',
5
+ inputSchema: { "type": "object", "properties": {}, "additionalProperties": false },
6
+ execute: async () => {
7
+ const { BarcodeScanner } = await import('@capacitor-mlkit/barcode-scanning');
8
+ const result = await BarcodeScanner.scan();
9
+ return {
10
+ barcodes: result.barcodes.map(b => ({
11
+ rawValue: b.rawValue,
12
+ format: b.format,
13
+ displayValue: b.displayValue,
14
+ })),
15
+ };
16
+ },
17
+ },
18
+ {
19
+ name: 'barcode_is_supported',
20
+ description: 'Check if barcode scanning is supported on this device.',
21
+ inputSchema: { "type": "object", "properties": {}, "additionalProperties": false },
22
+ execute: async () => {
23
+ const { BarcodeScanner } = await import('@capacitor-mlkit/barcode-scanning');
24
+ const result = await BarcodeScanner.isSupported();
25
+ return { supported: result.supported };
26
+ },
27
+ },
28
+ ];
29
+ //# sourceMappingURL=barcode.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"barcode.tools.js","sourceRoot":"","sources":["../../../../src/mcp/tools/barcode.tools.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,kGAAkG;QAC/G,WAAW,EAAE,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,EAAE,EAAC,sBAAsB,EAAC,KAAK,EAAC;QAC3E,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAA;YAC5E,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAA;YAC1C,OAAO;gBACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAClC,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,YAAY,EAAE,CAAC,CAAC,YAAY;iBAC7B,CAAC,CAAC;aACJ,CAAA;QACH,CAAC;KACF;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,EAAE,EAAC,sBAAsB,EAAC,KAAK,EAAC;QAC3E,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAA;YAC5E,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,CAAA;YACjD,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAA;QACxC,CAAC;KACF;CACF,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { DeviceTool } from './types';
2
+ export declare const biometricTools: DeviceTool[];
3
+ //# sourceMappingURL=biometric.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biometric.tools.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/biometric.tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,eAAO,MAAM,cAAc,EAAE,UAAU,EA+BtC,CAAA"}
@@ -0,0 +1,33 @@
1
+ export const biometricTools = [
2
+ {
3
+ name: 'biometric_authenticate',
4
+ description: 'Prompt the user for biometric authentication (fingerprint, face ID, etc.). Returns success or throws on failure/cancel.',
5
+ inputSchema: { "type": "object", "properties": { "reason": { "description": "Reason shown to the user (e.g. \"Confirm your identity\")", "type": "string" }, "allowDeviceCredential": { "description": "Allow PIN/password fallback (default true)", "type": "boolean" } }, "additionalProperties": false },
6
+ execute: async (args) => {
7
+ const { BiometricAuth } = await import('@aparajita/capacitor-biometric-auth');
8
+ await BiometricAuth.authenticate({
9
+ reason: args.reason ?? 'Please authenticate',
10
+ allowDeviceCredential: args.allowDeviceCredential ?? true,
11
+ });
12
+ return { authenticated: true };
13
+ },
14
+ },
15
+ {
16
+ name: 'biometric_is_available',
17
+ description: 'Check if biometric authentication is available on this device and what type (fingerprint, face ID, etc.).',
18
+ inputSchema: { "type": "object", "properties": {}, "additionalProperties": false },
19
+ execute: async () => {
20
+ const { BiometricAuth } = await import('@aparajita/capacitor-biometric-auth');
21
+ const result = await BiometricAuth.checkBiometry();
22
+ return {
23
+ isAvailable: result.isAvailable,
24
+ biometryType: result.biometryType,
25
+ biometryTypes: result.biometryTypes,
26
+ deviceIsSecure: result.deviceIsSecure,
27
+ reason: result.reason,
28
+ strongBiometryIsAvailable: result.strongBiometryIsAvailable,
29
+ };
30
+ },
31
+ },
32
+ ];
33
+ //# sourceMappingURL=biometric.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biometric.tools.js","sourceRoot":"","sources":["../../../../src/mcp/tools/biometric.tools.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,yHAAyH;QACtI,WAAW,EAAE,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,EAAC,QAAQ,EAAC,EAAC,aAAa,EAAC,2DAA2D,EAAC,MAAM,EAAC,QAAQ,EAAC,EAAC,uBAAuB,EAAC,EAAC,aAAa,EAAC,4CAA4C,EAAC,MAAM,EAAC,SAAS,EAAC,EAAC,EAAC,sBAAsB,EAAC,KAAK,EAAC;QACrR,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,qCAAqC,CAAC,CAAA;YAC7E,MAAM,aAAa,CAAC,YAAY,CAAC;gBAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,qBAAqB;gBAC5C,qBAAqB,EAAE,IAAI,CAAC,qBAAqB,IAAI,IAAI;aAC1D,CAAC,CAAA;YACF,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAA;QAChC,CAAC;KACF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,2GAA2G;QACxH,WAAW,EAAE,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,EAAE,EAAC,sBAAsB,EAAC,KAAK,EAAC;QAC3E,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,qCAAqC,CAAC,CAAA;YAC7E,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,aAAa,EAAE,CAAA;YAClD,OAAO;gBACL,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,yBAAyB,EAAE,MAAM,CAAC,yBAAyB;aAC5D,CAAA;QACH,CAAC;KACF;CACF,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { DeviceTool } from './types';
2
+ export declare const bluetoothTools: DeviceTool[];
3
+ //# sourceMappingURL=bluetooth.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bluetooth.tools.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/bluetooth.tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAYzC,eAAO,MAAM,cAAc,EAAE,UAAU,EA2FtC,CAAA"}
@@ -0,0 +1,95 @@
1
+ let bleInitialized = false;
2
+ async function ensureBleInit() {
3
+ if (!bleInitialized) {
4
+ const { BleClient } = await import('@capacitor-community/bluetooth-le');
5
+ await BleClient.initialize();
6
+ bleInitialized = true;
7
+ }
8
+ }
9
+ export const bluetoothTools = [
10
+ {
11
+ name: 'ble_scan',
12
+ description: 'Scan for nearby Bluetooth Low Energy (BLE) devices. Returns a list of discovered devices with names and signal strength.',
13
+ inputSchema: { "type": "object", "properties": { "services": { "description": "Filter by service UUIDs (e.g. [\"180d\"] for heart rate)", "type": "array", "items": { "type": "string" } }, "timeout": { "description": "Scan duration in milliseconds (default 5000)", "type": "number" } }, "additionalProperties": false },
14
+ execute: async (args) => {
15
+ const { BleClient } = await import('@capacitor-community/bluetooth-le');
16
+ await ensureBleInit();
17
+ const devices = [];
18
+ const scanDuration = args.timeout ?? 5000;
19
+ await BleClient.requestLEScan({ services: args.services }, (result) => {
20
+ devices.push({
21
+ deviceId: result.device.deviceId,
22
+ name: result.device.name,
23
+ rssi: result.rssi,
24
+ localName: result.localName,
25
+ });
26
+ });
27
+ await new Promise(resolve => setTimeout(resolve, scanDuration));
28
+ await BleClient.stopLEScan();
29
+ // Deduplicate by deviceId, keeping strongest signal
30
+ const seen = new Map();
31
+ for (const d of devices) {
32
+ const existing = seen.get(d.deviceId);
33
+ if (!existing || (d.rssi && d.rssi > existing.rssi)) {
34
+ seen.set(d.deviceId, d);
35
+ }
36
+ }
37
+ return { devices: [...seen.values()] };
38
+ },
39
+ },
40
+ {
41
+ name: 'ble_connect',
42
+ description: 'Connect to a BLE device by its device ID.',
43
+ inputSchema: { "type": "object", "properties": { "deviceId": { "type": "string", "description": "Device ID from ble_scan results" } }, "required": ["deviceId"], "additionalProperties": false },
44
+ execute: async (args) => {
45
+ const { BleClient } = await import('@capacitor-community/bluetooth-le');
46
+ await ensureBleInit();
47
+ await BleClient.connect(args.deviceId);
48
+ const services = await BleClient.getServices(args.deviceId);
49
+ return {
50
+ connected: true,
51
+ services: services.map(s => ({
52
+ uuid: s.uuid,
53
+ characteristics: s.characteristics?.map(c => ({
54
+ uuid: c.uuid,
55
+ properties: c.properties,
56
+ })),
57
+ })),
58
+ };
59
+ },
60
+ },
61
+ {
62
+ name: 'ble_read',
63
+ description: 'Read a value from a BLE characteristic.',
64
+ inputSchema: { "type": "object", "properties": { "deviceId": { "type": "string", "description": "Device ID" }, "service": { "type": "string", "description": "Service UUID" }, "characteristic": { "type": "string", "description": "Characteristic UUID" } }, "required": ["deviceId", "service", "characteristic"], "additionalProperties": false },
65
+ execute: async (args) => {
66
+ const { BleClient } = await import('@capacitor-community/bluetooth-le');
67
+ const result = await BleClient.read(args.deviceId, args.service, args.characteristic);
68
+ // Convert DataView to hex string
69
+ const bytes = new Uint8Array(result.buffer);
70
+ const hex = Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');
71
+ return { hex, bytes: Array.from(bytes) };
72
+ },
73
+ },
74
+ {
75
+ name: 'ble_write',
76
+ description: 'Write a value to a BLE characteristic.',
77
+ inputSchema: { "type": "object", "properties": { "deviceId": { "type": "string", "description": "Device ID" }, "service": { "type": "string", "description": "Service UUID" }, "characteristic": { "type": "string", "description": "Characteristic UUID" }, "value": { "type": "string", "description": "Hex string to write (e.g. \"01ff\")" } }, "required": ["deviceId", "service", "characteristic", "value"], "additionalProperties": false },
78
+ execute: async (args) => {
79
+ const { BleClient, hexStringToDataView } = await import('@capacitor-community/bluetooth-le');
80
+ await BleClient.write(args.deviceId, args.service, args.characteristic, hexStringToDataView(args.value));
81
+ return { success: true };
82
+ },
83
+ },
84
+ {
85
+ name: 'ble_disconnect',
86
+ description: 'Disconnect from a BLE device.',
87
+ inputSchema: { "type": "object", "properties": { "deviceId": { "type": "string", "description": "Device ID" } }, "required": ["deviceId"], "additionalProperties": false },
88
+ execute: async (args) => {
89
+ const { BleClient } = await import('@capacitor-community/bluetooth-le');
90
+ await BleClient.disconnect(args.deviceId);
91
+ return { disconnected: true };
92
+ },
93
+ },
94
+ ];
95
+ //# sourceMappingURL=bluetooth.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bluetooth.tools.js","sourceRoot":"","sources":["../../../../src/mcp/tools/bluetooth.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DeviceTool } from './types';
2
+ export declare const cameraTools: DeviceTool[];
3
+ //# sourceMappingURL=camera.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera.tools.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/camera.tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,eAAO,MAAM,WAAW,EAAE,UAAU,EAkCnC,CAAA"}
@@ -0,0 +1,36 @@
1
+ export const cameraTools = [
2
+ {
3
+ name: 'camera_take_photo',
4
+ description: 'Take a photo using the device camera. Returns base64-encoded image data.',
5
+ inputSchema: { "type": "object", "properties": { "quality": { "description": "Image quality 1-100 (default 90)", "type": "number", "minimum": 1, "maximum": 100 }, "direction": { "description": "Camera direction (default rear)", "type": "string", "enum": ["front", "rear"] }, "width": { "description": "Maximum width in pixels", "type": "number" }, "height": { "description": "Maximum height in pixels", "type": "number" } }, "additionalProperties": false },
6
+ execute: async (args) => {
7
+ const { Camera, CameraResultType, CameraSource, CameraDirection } = await import('@capacitor/camera');
8
+ const result = await Camera.getPhoto({
9
+ quality: args.quality ?? 90,
10
+ resultType: CameraResultType.Base64,
11
+ source: CameraSource.Camera,
12
+ direction: args.direction === 'front' ? CameraDirection.Front : CameraDirection.Rear,
13
+ width: args.width,
14
+ height: args.height,
15
+ });
16
+ return { format: result.format, base64: result.base64String };
17
+ },
18
+ },
19
+ {
20
+ name: 'camera_pick_image',
21
+ description: 'Pick an image from the device photo gallery. Returns base64-encoded image data.',
22
+ inputSchema: { "type": "object", "properties": { "quality": { "description": "Image quality 1-100 (default 90)", "type": "number", "minimum": 1, "maximum": 100 }, "width": { "description": "Maximum width in pixels", "type": "number" }, "height": { "description": "Maximum height in pixels", "type": "number" } }, "additionalProperties": false },
23
+ execute: async (args) => {
24
+ const { Camera, CameraResultType, CameraSource } = await import('@capacitor/camera');
25
+ const result = await Camera.getPhoto({
26
+ quality: args.quality ?? 90,
27
+ resultType: CameraResultType.Base64,
28
+ source: CameraSource.Photos,
29
+ width: args.width,
30
+ height: args.height,
31
+ });
32
+ return { format: result.format, base64: result.base64String };
33
+ },
34
+ },
35
+ ];
36
+ //# sourceMappingURL=camera.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera.tools.js","sourceRoot":"","sources":["../../../../src/mcp/tools/camera.tools.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,0EAA0E;QACvF,WAAW,EAAE,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,EAAC,SAAS,EAAC,EAAC,aAAa,EAAC,kCAAkC,EAAC,MAAM,EAAC,QAAQ,EAAC,SAAS,EAAC,CAAC,EAAC,SAAS,EAAC,GAAG,EAAC,EAAC,WAAW,EAAC,EAAC,aAAa,EAAC,iCAAiC,EAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,EAAC,CAAC,OAAO,EAAC,MAAM,CAAC,EAAC,EAAC,OAAO,EAAC,EAAC,aAAa,EAAC,yBAAyB,EAAC,MAAM,EAAC,QAAQ,EAAC,EAAC,QAAQ,EAAC,EAAC,aAAa,EAAC,0BAA0B,EAAC,MAAM,EAAC,QAAQ,EAAC,EAAC,EAAC,sBAAsB,EAAC,KAAK,EAAC;QAC7Z,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;YACrG,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;gBACnC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;gBAC3B,UAAU,EAAE,gBAAgB,CAAC,MAAM;gBACnC,MAAM,EAAE,YAAY,CAAC,MAAM;gBAC3B,SAAS,EAAE,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI;gBACpF,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAA;YACF,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,CAAA;QAC/D,CAAC;KACF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,iFAAiF;QAC9F,WAAW,EAAE,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,EAAC,SAAS,EAAC,EAAC,aAAa,EAAC,kCAAkC,EAAC,MAAM,EAAC,QAAQ,EAAC,SAAS,EAAC,CAAC,EAAC,SAAS,EAAC,GAAG,EAAC,EAAC,OAAO,EAAC,EAAC,aAAa,EAAC,yBAAyB,EAAC,MAAM,EAAC,QAAQ,EAAC,EAAC,QAAQ,EAAC,EAAC,aAAa,EAAC,0BAA0B,EAAC,MAAM,EAAC,QAAQ,EAAC,EAAC,EAAC,sBAAsB,EAAC,KAAK,EAAC;QACvT,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;YACpF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;gBACnC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;gBAC3B,UAAU,EAAE,gBAAgB,CAAC,MAAM;gBACnC,MAAM,EAAE,YAAY,CAAC,MAAM;gBAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAA;YACF,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,CAAA;QAC/D,CAAC;KACF;CACF,CAAA"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Static registry of MCP tool categories for the Settings UI.
3
+ *
4
+ * Maps tool names to human-readable categories with descriptions
5
+ * and privacy implications for each capability group.
6
+ */
7
+ export interface McpToolCategory {
8
+ id: string;
9
+ labelKey: string;
10
+ descriptionKey: string;
11
+ privacyKey: string;
12
+ toolNames: string[];
13
+ }
14
+ export interface McpCategorySection {
15
+ id: string;
16
+ labelKey: string;
17
+ iconColor: string;
18
+ categoryIds: string[];
19
+ }
20
+ export declare const mcpToolCategories: McpToolCategory[];
21
+ export declare const mcpCategorySections: McpCategorySection[];
22
+ //# sourceMappingURL=categories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/categories.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,eAAO,MAAM,iBAAiB,EAAE,eAAe,EA0M9C,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,kBAAkB,EA+BnD,CAAA"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Static registry of MCP tool categories for the Settings UI.
3
+ *
4
+ * Maps tool names to human-readable categories with descriptions
5
+ * and privacy implications for each capability group.
6
+ */
7
+ export const mcpToolCategories = [
8
+ // --- Network & Remote Access ---
9
+ {
10
+ id: 'ssh',
11
+ labelKey: 'settings.mcp.categories.ssh.label',
12
+ descriptionKey: 'settings.mcp.categories.ssh.description',
13
+ privacyKey: 'settings.mcp.categories.ssh.privacy',
14
+ toolNames: ['ssh_connect', 'ssh_exec', 'ssh_disconnect'],
15
+ },
16
+ {
17
+ id: 'sftp',
18
+ labelKey: 'settings.mcp.categories.sftp.label',
19
+ descriptionKey: 'settings.mcp.categories.sftp.description',
20
+ privacyKey: 'settings.mcp.categories.sftp.privacy',
21
+ toolNames: ['sftp_list', 'sftp_download', 'sftp_upload'],
22
+ },
23
+ {
24
+ id: 'http',
25
+ labelKey: 'settings.mcp.categories.http.label',
26
+ descriptionKey: 'settings.mcp.categories.http.description',
27
+ privacyKey: 'settings.mcp.categories.http.privacy',
28
+ toolNames: ['http_request'],
29
+ },
30
+ {
31
+ id: 'tcp',
32
+ labelKey: 'settings.mcp.categories.tcp.label',
33
+ descriptionKey: 'settings.mcp.categories.tcp.description',
34
+ privacyKey: 'settings.mcp.categories.tcp.privacy',
35
+ toolNames: ['tcp_connect', 'tcp_send', 'tcp_read', 'tcp_disconnect'],
36
+ },
37
+ {
38
+ id: 'udp',
39
+ labelKey: 'settings.mcp.categories.udp.label',
40
+ descriptionKey: 'settings.mcp.categories.udp.description',
41
+ privacyKey: 'settings.mcp.categories.udp.privacy',
42
+ toolNames: ['udp_send', 'udp_broadcast'],
43
+ },
44
+ {
45
+ id: 'discovery',
46
+ labelKey: 'settings.mcp.categories.discovery.label',
47
+ descriptionKey: 'settings.mcp.categories.discovery.description',
48
+ privacyKey: 'settings.mcp.categories.discovery.privacy',
49
+ toolNames: ['ping', 'network_scan', 'mdns_discover'],
50
+ },
51
+ {
52
+ id: 'wol',
53
+ labelKey: 'settings.mcp.categories.wol.label',
54
+ descriptionKey: 'settings.mcp.categories.wol.description',
55
+ privacyKey: 'settings.mcp.categories.wol.privacy',
56
+ toolNames: ['wol_send'],
57
+ },
58
+ // --- Sensors & Camera ---
59
+ {
60
+ id: 'camera',
61
+ labelKey: 'settings.mcp.categories.camera.label',
62
+ descriptionKey: 'settings.mcp.categories.camera.description',
63
+ privacyKey: 'settings.mcp.categories.camera.privacy',
64
+ toolNames: ['camera_take_photo', 'camera_pick_image'],
65
+ },
66
+ {
67
+ id: 'barcode',
68
+ labelKey: 'settings.mcp.categories.barcode.label',
69
+ descriptionKey: 'settings.mcp.categories.barcode.description',
70
+ privacyKey: 'settings.mcp.categories.barcode.privacy',
71
+ toolNames: ['barcode_scan', 'barcode_is_supported'],
72
+ },
73
+ {
74
+ id: 'motion-sensors',
75
+ labelKey: 'settings.mcp.categories.motionSensors.label',
76
+ descriptionKey: 'settings.mcp.categories.motionSensors.description',
77
+ privacyKey: 'settings.mcp.categories.motionSensors.privacy',
78
+ toolNames: ['motion_get_acceleration', 'motion_get_orientation'],
79
+ },
80
+ {
81
+ id: 'geolocation',
82
+ labelKey: 'settings.mcp.categories.geolocation.label',
83
+ descriptionKey: 'settings.mcp.categories.geolocation.description',
84
+ privacyKey: 'settings.mcp.categories.geolocation.privacy',
85
+ toolNames: ['geolocation_get_current'],
86
+ },
87
+ // --- Communication ---
88
+ {
89
+ id: 'speech',
90
+ labelKey: 'settings.mcp.categories.speech.label',
91
+ descriptionKey: 'settings.mcp.categories.speech.description',
92
+ privacyKey: 'settings.mcp.categories.speech.privacy',
93
+ toolNames: ['speech_listen', 'speech_is_available', 'speech_get_languages'],
94
+ },
95
+ {
96
+ id: 'tts',
97
+ labelKey: 'settings.mcp.categories.tts.label',
98
+ descriptionKey: 'settings.mcp.categories.tts.description',
99
+ privacyKey: 'settings.mcp.categories.tts.privacy',
100
+ toolNames: ['tts_speak', 'tts_get_languages'],
101
+ },
102
+ {
103
+ id: 'bluetooth',
104
+ labelKey: 'settings.mcp.categories.bluetooth.label',
105
+ descriptionKey: 'settings.mcp.categories.bluetooth.description',
106
+ privacyKey: 'settings.mcp.categories.bluetooth.privacy',
107
+ toolNames: ['ble_scan', 'ble_connect', 'ble_read', 'ble_write', 'ble_disconnect'],
108
+ },
109
+ {
110
+ id: 'nfc',
111
+ labelKey: 'settings.mcp.categories.nfc.label',
112
+ descriptionKey: 'settings.mcp.categories.nfc.description',
113
+ privacyKey: 'settings.mcp.categories.nfc.privacy',
114
+ toolNames: ['nfc_read', 'nfc_write', 'nfc_is_supported'],
115
+ },
116
+ // --- Personal Data ---
117
+ {
118
+ id: 'contacts',
119
+ labelKey: 'settings.mcp.categories.contacts.label',
120
+ descriptionKey: 'settings.mcp.categories.contacts.description',
121
+ privacyKey: 'settings.mcp.categories.contacts.privacy',
122
+ toolNames: ['contacts_list', 'contacts_search'],
123
+ },
124
+ {
125
+ id: 'health',
126
+ labelKey: 'settings.mcp.categories.health.label',
127
+ descriptionKey: 'settings.mcp.categories.health.description',
128
+ privacyKey: 'settings.mcp.categories.health.privacy',
129
+ toolNames: ['health_is_available', 'health_request_auth', 'health_query'],
130
+ },
131
+ {
132
+ id: 'biometric',
133
+ labelKey: 'settings.mcp.categories.biometric.label',
134
+ descriptionKey: 'settings.mcp.categories.biometric.description',
135
+ privacyKey: 'settings.mcp.categories.biometric.privacy',
136
+ toolNames: ['biometric_authenticate', 'biometric_is_available'],
137
+ },
138
+ // --- Device Controls ---
139
+ {
140
+ id: 'device-info',
141
+ labelKey: 'settings.mcp.categories.deviceInfo.label',
142
+ descriptionKey: 'settings.mcp.categories.deviceInfo.description',
143
+ privacyKey: 'settings.mcp.categories.deviceInfo.privacy',
144
+ toolNames: ['device_get_info', 'device_get_battery'],
145
+ },
146
+ {
147
+ id: 'clipboard',
148
+ labelKey: 'settings.mcp.categories.clipboard.label',
149
+ descriptionKey: 'settings.mcp.categories.clipboard.description',
150
+ privacyKey: 'settings.mcp.categories.clipboard.privacy',
151
+ toolNames: ['clipboard_read', 'clipboard_write'],
152
+ },
153
+ {
154
+ id: 'haptics',
155
+ labelKey: 'settings.mcp.categories.haptics.label',
156
+ descriptionKey: 'settings.mcp.categories.haptics.description',
157
+ privacyKey: 'settings.mcp.categories.haptics.privacy',
158
+ toolNames: ['haptics_impact', 'haptics_notification', 'haptics_vibrate'],
159
+ },
160
+ {
161
+ id: 'notifications',
162
+ labelKey: 'settings.mcp.categories.notifications.label',
163
+ descriptionKey: 'settings.mcp.categories.notifications.description',
164
+ privacyKey: 'settings.mcp.categories.notifications.privacy',
165
+ toolNames: ['notification_schedule', 'notification_cancel'],
166
+ },
167
+ {
168
+ id: 'push-notifications',
169
+ labelKey: 'settings.mcp.categories.pushNotifications.label',
170
+ descriptionKey: 'settings.mcp.categories.pushNotifications.description',
171
+ privacyKey: 'settings.mcp.categories.pushNotifications.privacy',
172
+ toolNames: ['push_get_token', 'push_get_delivered'],
173
+ },
174
+ {
175
+ id: 'network-status',
176
+ labelKey: 'settings.mcp.categories.networkStatus.label',
177
+ descriptionKey: 'settings.mcp.categories.networkStatus.description',
178
+ privacyKey: 'settings.mcp.categories.networkStatus.privacy',
179
+ toolNames: ['network_status'],
180
+ },
181
+ {
182
+ id: 'share',
183
+ labelKey: 'settings.mcp.categories.share.label',
184
+ descriptionKey: 'settings.mcp.categories.share.description',
185
+ privacyKey: 'settings.mcp.categories.share.privacy',
186
+ toolNames: ['share_content'],
187
+ },
188
+ {
189
+ id: 'secure-storage',
190
+ labelKey: 'settings.mcp.categories.secureStorage.label',
191
+ descriptionKey: 'settings.mcp.categories.secureStorage.description',
192
+ privacyKey: 'settings.mcp.categories.secureStorage.privacy',
193
+ toolNames: ['secure_storage_get', 'secure_storage_set', 'secure_storage_remove'],
194
+ },
195
+ {
196
+ id: 'keep-awake',
197
+ labelKey: 'settings.mcp.categories.keepAwake.label',
198
+ descriptionKey: 'settings.mcp.categories.keepAwake.description',
199
+ privacyKey: 'settings.mcp.categories.keepAwake.privacy',
200
+ toolNames: ['screen_keep_awake', 'screen_allow_sleep'],
201
+ },
202
+ {
203
+ id: 'app-state',
204
+ labelKey: 'settings.mcp.categories.appState.label',
205
+ descriptionKey: 'settings.mcp.categories.appState.description',
206
+ privacyKey: 'settings.mcp.categories.appState.privacy',
207
+ toolNames: ['app_get_info', 'app_get_state'],
208
+ },
209
+ ];
210
+ export const mcpCategorySections = [
211
+ {
212
+ id: 'network',
213
+ labelKey: 'settings.mcp.sections.network',
214
+ iconColor: 'bg-blue-500/15 text-blue-400',
215
+ categoryIds: ['ssh', 'sftp', 'http', 'tcp', 'udp', 'discovery', 'wol'],
216
+ },
217
+ {
218
+ id: 'sensors',
219
+ labelKey: 'settings.mcp.sections.sensors',
220
+ iconColor: 'bg-emerald-500/15 text-emerald-400',
221
+ categoryIds: ['camera', 'barcode', 'motion-sensors', 'geolocation'],
222
+ },
223
+ {
224
+ id: 'communication',
225
+ labelKey: 'settings.mcp.sections.communication',
226
+ iconColor: 'bg-amber-500/15 text-amber-400',
227
+ categoryIds: ['speech', 'tts', 'bluetooth', 'nfc'],
228
+ },
229
+ {
230
+ id: 'personal-data',
231
+ labelKey: 'settings.mcp.sections.personalData',
232
+ iconColor: 'bg-red-500/15 text-red-400',
233
+ categoryIds: ['contacts', 'health', 'biometric'],
234
+ },
235
+ {
236
+ id: 'device',
237
+ labelKey: 'settings.mcp.sections.device',
238
+ iconColor: 'bg-purple-500/15 text-purple-400',
239
+ categoryIds: ['device-info', 'clipboard', 'haptics', 'notifications', 'push-notifications', 'network-status', 'share', 'secure-storage', 'keep-awake', 'app-state'],
240
+ },
241
+ ];
242
+ //# sourceMappingURL=categories.js.map