@ansight/capacitor 1.3.0-preview.9 → 1.4.0-preview.3

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 (42) hide show
  1. package/AnsightCapacitor.podspec +1 -1
  2. package/Package.swift +1 -1
  3. package/README.md +116 -29
  4. package/android/build.gradle +2 -2
  5. package/android/src/main/kotlin/ai/ansight/capacitor/AnsightCapacitorPlugin.kt +75 -22
  6. package/dist/esm/definitions.d.ts +74 -10
  7. package/dist/esm/definitions.d.ts.map +1 -1
  8. package/dist/esm/dom.d.ts +11 -0
  9. package/dist/esm/dom.d.ts.map +1 -1
  10. package/dist/esm/dom.js +73 -23
  11. package/dist/esm/dom.js.map +1 -1
  12. package/dist/esm/index.d.ts +10 -1
  13. package/dist/esm/index.d.ts.map +1 -1
  14. package/dist/esm/index.js +113 -5
  15. package/dist/esm/index.js.map +1 -1
  16. package/dist/esm/network.d.ts +6 -0
  17. package/dist/esm/network.d.ts.map +1 -0
  18. package/dist/esm/network.js +742 -0
  19. package/dist/esm/network.js.map +1 -0
  20. package/dist/esm/options.d.ts +7 -1
  21. package/dist/esm/options.d.ts.map +1 -1
  22. package/dist/esm/options.js +44 -0
  23. package/dist/esm/options.js.map +1 -1
  24. package/dist/esm/session-properties.d.ts +16 -0
  25. package/dist/esm/session-properties.d.ts.map +1 -0
  26. package/dist/esm/session-properties.js +123 -0
  27. package/dist/esm/session-properties.js.map +1 -0
  28. package/dist/esm/standalone-options.d.ts +3 -0
  29. package/dist/esm/standalone-options.d.ts.map +1 -0
  30. package/dist/esm/standalone-options.js +15 -0
  31. package/dist/esm/standalone-options.js.map +1 -0
  32. package/dist/esm/standalone.d.ts.map +1 -1
  33. package/dist/esm/standalone.js +2 -11
  34. package/dist/esm/standalone.js.map +1 -1
  35. package/dist/plugin.cjs.js +1096 -28
  36. package/dist/plugin.cjs.js.map +1 -1
  37. package/dist/plugin.js +1096 -28
  38. package/dist/plugin.js.map +1 -1
  39. package/dist/standalone.js +1099 -31
  40. package/dist/standalone.js.map +1 -1
  41. package/ios/Sources/AnsightCapacitorPlugin/AnsightCapacitorPlugin.swift +77 -22
  42. package/package.json +1 -1
@@ -15,6 +15,7 @@ public final class AnsightCapacitorPlugin: CAPPlugin, CAPBridgedPlugin {
15
15
  CAPPluginMethod(name: "registerMetricChannel", returnType: CAPPluginReturnPromise),
16
16
  CAPPluginMethod(name: "recordMetric", returnType: CAPPluginReturnPromise),
17
17
  CAPPluginMethod(name: "recordEvent", returnType: CAPPluginReturnPromise),
18
+ CAPPluginMethod(name: "recordNetworkRequest", returnType: CAPPluginReturnPromise),
18
19
  CAPPluginMethod(name: "recordCrashCandidate", returnType: CAPPluginReturnPromise),
19
20
  CAPPluginMethod(name: "screenViewed", returnType: CAPPluginReturnPromise),
20
21
  CAPPluginMethod(name: "setAppLifecycleState", returnType: CAPPluginReturnPromise),
@@ -82,6 +83,44 @@ public final class AnsightCapacitorPlugin: CAPPlugin, CAPBridgedPlugin {
82
83
  }
83
84
  }
84
85
 
86
+ private final class CapacitorVisualTreeProvider: AnsightVisualTreeProvider, AnsightVisualTreeInteractionProvider, @unchecked Sendable {
87
+ let source = "dom"
88
+ let displayName = "Capacitor DOM"
89
+ private weak var plugin: AnsightCapacitorPlugin?
90
+ private let timeoutMilliseconds: Int
91
+
92
+ init(plugin: AnsightCapacitorPlugin, timeoutMilliseconds: Int) {
93
+ self.plugin = plugin
94
+ self.timeoutMilliseconds = timeoutMilliseconds
95
+ }
96
+
97
+ func getVisualTree(arguments: [String: String]) -> AnsightToolExecutionResult {
98
+ plugin?.executeJavaScriptTool(
99
+ toolId: "dom.get_document",
100
+ arguments: arguments,
101
+ timeoutMilliseconds: timeoutMilliseconds
102
+ ) ?? .failure("Capacitor bridge is unavailable.", errorCode: "javascript_bridge_unavailable")
103
+ }
104
+
105
+ func inspectNode(arguments: [String: String]) -> AnsightToolExecutionResult {
106
+ plugin?.executeJavaScriptTool(
107
+ toolId: "dom.inspect_node",
108
+ arguments: arguments,
109
+ timeoutMilliseconds: timeoutMilliseconds
110
+ ) ?? .failure("Capacitor bridge is unavailable.", errorCode: "javascript_bridge_unavailable")
111
+ }
112
+
113
+ func performAction(_ request: AnsightVisualTreeActionRequest) -> AnsightToolExecutionResult {
114
+ var arguments = ["nodeId": request.nodeId, "action": request.action]
115
+ if let value = request.value?.stringValue { arguments["value"] = value }
116
+ return plugin?.executeJavaScriptTool(
117
+ toolId: "dom.invoke_action",
118
+ arguments: arguments,
119
+ timeoutMilliseconds: timeoutMilliseconds
120
+ ) ?? .failure("Capacitor bridge is unavailable.", errorCode: "javascript_bridge_unavailable")
121
+ }
122
+ }
123
+
85
124
  private let lock = NSLock()
86
125
  private var activeCustomToolIds: Set<String> = []
87
126
  private var pendingToolCalls: [String: PendingToolCall] = [:]
@@ -96,13 +135,21 @@ public final class AnsightCapacitorPlugin: CAPPlugin, CAPBridgedPlugin {
96
135
  }
97
136
  self?.notifyListeners("ansightLog", data: data)
98
137
  }
138
+ private var hostConnectionStatusSubscription: HostConnectionStatusSubscription?
99
139
 
100
140
  public override func load() {
101
141
  AnsightLogger.registerCallback(logCallback)
142
+ hostConnectionStatusSubscription = AnsightRuntime.shared.addHostConnectionStatusListener { [weak self] status, _ in
143
+ self?.notifyListeners(
144
+ "ansightHostConnectionStatus",
145
+ data: self?.hostConnectionStatusDictionary(status) ?? [:]
146
+ )
147
+ }
102
148
  }
103
149
 
104
150
  deinit {
105
151
  AnsightLogger.removeCallback(logCallback)
152
+ hostConnectionStatusSubscription?.remove()
106
153
  }
107
154
 
108
155
  @objc func initialize(_ call: CAPPluginCall) {
@@ -195,6 +242,25 @@ public final class AnsightCapacitorPlugin: CAPPlugin, CAPBridgedPlugin {
195
242
  }
196
243
  }
197
244
 
245
+ @objc func recordNetworkRequest(_ call: CAPPluginCall) {
246
+ let input = dictionary(call)
247
+ guard JSONSerialization.isValidJSONObject(input),
248
+ let data = try? JSONSerialization.data(withJSONObject: input),
249
+ let request = try? JSONDecoder().decode(AnsightNetworkRequest.self, from: data),
250
+ request.schema == AnsightNetworkRequest.schemaName
251
+ else {
252
+ call.resolve(operationResultDictionary(
253
+ .failure("Network request must use the ansight.network-request.v1 schema.")
254
+ ))
255
+ return
256
+ }
257
+ call.keepAlive = true
258
+ Task {
259
+ call.resolve(operationResultDictionary(await AnsightRuntime.shared.recordNetworkRequest(request)))
260
+ call.keepAlive = false
261
+ }
262
+ }
263
+
198
264
  @objc func recordCrashCandidate(_ call: CAPPluginCall) {
199
265
  let metadata: [String: String]
200
266
  if let metadataJson = call.getString("metadata"),
@@ -460,6 +526,12 @@ public final class AnsightCapacitorPlugin: CAPPlugin, CAPBridgedPlugin {
460
526
  CapacitorTool(descriptor: descriptor, plugin: self, timeoutMilliseconds: timeout),
461
527
  replaceExisting: true
462
528
  )
529
+ if descriptor.id == "dom.get_document" {
530
+ try AnsightVisualTreeProviderRegistry.register(
531
+ CapacitorVisualTreeProvider(plugin: self, timeoutMilliseconds: timeout),
532
+ replaceExisting: true
533
+ )
534
+ }
463
535
  call.resolve(["success": true, "message": "Tool registered.", "id": descriptor.id])
464
536
  } catch {
465
537
  call.reject(error.localizedDescription, "ansight_error", error)
@@ -772,11 +844,11 @@ public final class AnsightCapacitorPlugin: CAPPlugin, CAPBridgedPlugin {
772
844
  name: stringValue(dictionary, "name") ?? stringValue(dictionary, "id") ?? "",
773
845
  description: stringValue(dictionary, "description") ?? "",
774
846
  category: stringValue(dictionary, "category") ?? "custom",
775
- scope: toolScope(stringValue(dictionary, "scope")).rawValue,
847
+ policy: toolPolicy(stringValue(dictionary, "policy")),
776
848
  keywords: keywords(dictionary?["keywords"]),
777
- security: toolSecurity(dictionary?["security"] as? NSDictionary),
778
849
  argumentsSchema: AnsightToolSchema(json: jsonValue(dictionary?["argumentsSchema"]) ?? .object([:])),
779
- resultSchema: AnsightToolSchema(json: jsonValue(dictionary?["resultSchema"]) ?? .object([:]))
850
+ resultSchema: AnsightToolSchema(json: jsonValue(dictionary?["resultSchema"]) ?? .object([:])),
851
+ prerequisiteToolIds: stringArray(dictionary, "prerequisiteToolIds")
780
852
  )
781
853
  }
782
854
 
@@ -1138,31 +1210,14 @@ private func toolGuardName(_ value: AnsightToolGuard) -> String {
1138
1210
  return "custom"
1139
1211
  }
1140
1212
 
1141
- private func toolScope(_ value: String?) -> AnsightToolScope {
1213
+ private func toolPolicy(_ value: String?) -> AnsightToolPolicy {
1142
1214
  switch value?.lowercased() {
1143
1215
  case "write": return .write
1144
- case "delete": return .delete
1216
+ case "critical", "delete": return .critical
1145
1217
  default: return .read
1146
1218
  }
1147
1219
  }
1148
1220
 
1149
- private func toolSecurity(_ dictionary: NSDictionary?) -> AnsightToolSecurity {
1150
- guard let dictionary else { return .unspecified }
1151
- let level: AnsightToolSecurityLevel
1152
- switch stringValue(dictionary, "level")?.lowercased() {
1153
- case "low": level = .low
1154
- case "medium", "moderate": level = .moderate
1155
- case "high": level = .high
1156
- case "critical": level = .critical
1157
- default: level = .unspecified
1158
- }
1159
- return AnsightToolSecurity(
1160
- level: level,
1161
- summary: stringValue(dictionary, "summary") ?? "",
1162
- implications: (dictionary["implications"] as? [Any])?.compactMap { $0 as? String } ?? []
1163
- )
1164
- }
1165
-
1166
1221
  private func keywords(_ value: Any?) -> String {
1167
1222
  if let value = value as? String { return value }
1168
1223
  if let value = value as? [Any] { return value.compactMap { $0 as? String }.joined(separator: " ") }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ansight/capacitor",
3
- "version": "1.3.0-preview.9",
3
+ "version": "1.4.0-preview.3",
4
4
  "description": "Capacitor bridge for the Ansight mobile observability and remote inspection SDK.",
5
5
  "main": "dist/plugin.cjs.js",
6
6
  "module": "dist/esm/index.js",