@testin-official/xagent 0.3.7

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 (212) hide show
  1. package/README.md +157 -0
  2. package/dist/action/client.d.ts +13 -0
  3. package/dist/action/client.d.ts.map +1 -0
  4. package/dist/action/client.js +28 -0
  5. package/dist/action/client.js.map +1 -0
  6. package/dist/action/mcp-content.d.ts +2 -0
  7. package/dist/action/mcp-content.d.ts.map +1 -0
  8. package/dist/action/mcp-content.js +116 -0
  9. package/dist/action/mcp-content.js.map +1 -0
  10. package/dist/action/protocol.d.ts +36 -0
  11. package/dist/action/protocol.d.ts.map +1 -0
  12. package/dist/action/protocol.js +29 -0
  13. package/dist/action/protocol.js.map +1 -0
  14. package/dist/assets/contracts/app-list.schema.json +31 -0
  15. package/dist/assets/contracts/app-upload.schema.json +45 -0
  16. package/dist/assets/contracts/app.schema.json +18 -0
  17. package/dist/assets/contracts/authoring-attempt-create.schema.json +12 -0
  18. package/dist/assets/contracts/authoring-attempt.schema.json +56 -0
  19. package/dist/assets/contracts/authoring-complete.schema.json +13 -0
  20. package/dist/assets/contracts/authoring-draft-attempt-create.schema.json +12 -0
  21. package/dist/assets/contracts/authoring-observation.schema.json +28 -0
  22. package/dist/assets/contracts/authoring-revision-create.schema.json +13 -0
  23. package/dist/assets/contracts/authoring-revision.schema.json +19 -0
  24. package/dist/assets/contracts/authoring-session-create.schema.json +11 -0
  25. package/dist/assets/contracts/authoring-session.schema.json +54 -0
  26. package/dist/assets/contracts/canonical-script.schema.json +219 -0
  27. package/dist/assets/contracts/compat-script.schema.json +380 -0
  28. package/dist/assets/contracts/device-list.schema.json +19 -0
  29. package/dist/assets/contracts/error.schema.json +47 -0
  30. package/dist/assets/contracts/execution-target.schema.json +55 -0
  31. package/dist/assets/contracts/fixtures/authoring-attempt-create.valid.json +4 -0
  32. package/dist/assets/contracts/fixtures/authoring-attempt.passed.json +16 -0
  33. package/dist/assets/contracts/fixtures/authoring-draft-attempt-create.valid.json +10 -0
  34. package/dist/assets/contracts/fixtures/authoring-observation.valid.json +7 -0
  35. package/dist/assets/contracts/fixtures/authoring-revision.valid.json +16 -0
  36. package/dist/assets/contracts/fixtures/authoring-session.active.json +12 -0
  37. package/dist/assets/contracts/fixtures/canonical-script.valid.json +17 -0
  38. package/dist/assets/contracts/fixtures/ci-exit-status-cases.json +44 -0
  39. package/dist/assets/contracts/fixtures/command-mutual-exclusion-cases.json +20 -0
  40. package/dist/assets/contracts/fixtures/compat-script.all-platform-actions.yaml +227 -0
  41. package/dist/assets/contracts/fixtures/execution-target.both.invalid.json +7 -0
  42. package/dist/assets/contracts/fixtures/execution-target.concurrency-two.invalid.json +4 -0
  43. package/dist/assets/contracts/fixtures/execution-target.count-two.invalid.json +6 -0
  44. package/dist/assets/contracts/fixtures/execution-target.dynamic.valid.json +12 -0
  45. package/dist/assets/contracts/fixtures/execution-target.fixed.valid.json +4 -0
  46. package/dist/assets/contracts/fixtures/execution-target.multiple-devices.invalid.json +4 -0
  47. package/dist/assets/contracts/fixtures/execution-target.multiple-filters.invalid.json +7 -0
  48. package/dist/assets/contracts/fixtures/execution-target.strategy-all.invalid.json +6 -0
  49. package/dist/assets/contracts/fixtures/idempotency.conflict.json +26 -0
  50. package/dist/assets/contracts/fixtures/idempotency.same-request.json +26 -0
  51. package/dist/assets/contracts/fixtures/principal.personal.json +23 -0
  52. package/dist/assets/contracts/fixtures/principal.project-ci.json +20 -0
  53. package/dist/assets/contracts/fixtures/project-config.no-default.valid.json +9 -0
  54. package/dist/assets/contracts/fixtures/project-config.secret.invalid.json +10 -0
  55. package/dist/assets/contracts/fixtures/project-config.target-name.invalid.json +10 -0
  56. package/dist/assets/contracts/fixtures/project-config.valid.json +22 -0
  57. package/dist/assets/contracts/fixtures/public-script.all-cli-actions.yaml +39 -0
  58. package/dist/assets/contracts/fixtures/public-script.invalid.json +8 -0
  59. package/dist/assets/contracts/fixtures/public-script.valid.json +17 -0
  60. package/dist/assets/contracts/fixtures/run-create-v2.device-id.invalid.json +16 -0
  61. package/dist/assets/contracts/fixtures/run-create.personal-upload.valid.json +20 -0
  62. package/dist/assets/contracts/fixtures/run-create.single-device.json +19 -0
  63. package/dist/assets/contracts/fixtures/run-create.target.valid.json +22 -0
  64. package/dist/assets/contracts/fixtures/run.queued.json +19 -0
  65. package/dist/assets/contracts/fixtures/run.target.queued.json +38 -0
  66. package/dist/assets/contracts/fixtures/skill-catalog.valid.json +19 -0
  67. package/dist/assets/contracts/fixtures/skill-reference.valid.json +9 -0
  68. package/dist/assets/contracts/fixtures/skill.valid.json +10 -0
  69. package/dist/assets/contracts/fixtures/target-hash-cases.json +30 -0
  70. package/dist/assets/contracts/fixtures/target-preview.hash-mismatch.error.json +8 -0
  71. package/dist/assets/contracts/fixtures/target-preview.no-match.error.json +9 -0
  72. package/dist/assets/contracts/fixtures/target-preview.request.valid.json +9 -0
  73. package/dist/assets/contracts/fixtures/target-preview.success.json +18 -0
  74. package/dist/assets/contracts/fixtures/target-preview.unavailable.json +18 -0
  75. package/dist/assets/contracts/principal.schema.json +72 -0
  76. package/dist/assets/contracts/project-config.schema.json +23 -0
  77. package/dist/assets/contracts/public-script.schema.json +397 -0
  78. package/dist/assets/contracts/run-create-v2.schema.json +78 -0
  79. package/dist/assets/contracts/run-create.schema.json +70 -0
  80. package/dist/assets/contracts/run.schema.json +137 -0
  81. package/dist/assets/contracts/skill-catalog.schema.json +15 -0
  82. package/dist/assets/contracts/skill-reference.schema.json +17 -0
  83. package/dist/assets/contracts/skill-summary.schema.json +28 -0
  84. package/dist/assets/contracts/skill.schema.json +30 -0
  85. package/dist/assets/contracts/target-preview.schema.json +75 -0
  86. package/dist/assets/integrations/manifest.json +17 -0
  87. package/dist/assets/integrations/xagent-skill/SKILL.md +28 -0
  88. package/dist/assets/integrations/xagent-skill/agents/openai.yaml +4 -0
  89. package/dist/assets/integrations/xagent-skill/references/cli-mcp-interop.md +10 -0
  90. package/dist/assets/integrations/xagent-skill/references/host-adapters.md +9 -0
  91. package/dist/assets/integrations/xagent-skill/references/installation.md +10 -0
  92. package/dist/assets/integrations/xagent-skill/references/privacy.md +3 -0
  93. package/dist/assets/integrations/xagent-skill/references/routing.md +32 -0
  94. package/dist/assets/integrations/xagent-skill/scripts/install-cli.ps1 +5 -0
  95. package/dist/assets/integrations/xagent-skill/scripts/install-cli.sh +6 -0
  96. package/dist/assets/skills/xagent-analyze-failure/SKILL.md +13 -0
  97. package/dist/assets/skills/xagent-analyze-failure/agents/openai.yaml +4 -0
  98. package/dist/assets/skills/xagent-analyze-failure/references/failure-classification.md +20 -0
  99. package/dist/assets/skills/xagent-author-test/SKILL.md +19 -0
  100. package/dist/assets/skills/xagent-author-test/agents/openai.yaml +4 -0
  101. package/dist/assets/skills/xagent-author-test/references/authoring-workflow.md +41 -0
  102. package/dist/assets/skills/xagent-author-test/references/host-interaction-adapters.md +81 -0
  103. package/dist/assets/skills/xagent-author-test/references/interaction-modes.md +97 -0
  104. package/dist/assets/skills/xagent-author-test/references/interactive-steering.md +57 -0
  105. package/dist/assets/skills/xagent-author-test/references/script-actions.md +34 -0
  106. package/dist/assets/skills/xagent-author-test/references/script-format.md +100 -0
  107. package/dist/assets/skills/xagent-cli/SKILL.md +31 -0
  108. package/dist/assets/skills/xagent-cli/agents/openai.yaml +4 -0
  109. package/dist/assets/skills/xagent-cli/references/capability-routing.md +36 -0
  110. package/dist/assets/skills/xagent-cli/references/cli-commands.md +23 -0
  111. package/dist/assets/skills/xagent-cli/references/failure-routing.md +18 -0
  112. package/dist/assets/skills/xagent-cli/references/host-modes.md +21 -0
  113. package/dist/assets/skills/xagent-cli/references/mcp-tools.md +26 -0
  114. package/dist/assets/skills/xagent-cli/references/permissions.md +17 -0
  115. package/dist/assets/skills/xagent-explore-device/SKILL.md +26 -0
  116. package/dist/assets/skills/xagent-explore-device/agents/openai.yaml +4 -0
  117. package/dist/assets/skills/xagent-explore-device/references/actions.md +24 -0
  118. package/dist/assets/skills/xagent-explore-device/references/single-action-protocol.md +59 -0
  119. package/dist/assets/skills/xagent-explore-device/references/tool-adapters.md +32 -0
  120. package/dist/assets/skills/xagent-repair-test/SKILL.md +16 -0
  121. package/dist/assets/skills/xagent-repair-test/agents/openai.yaml +4 -0
  122. package/dist/assets/skills/xagent-repair-test/references/repair-workflow.md +21 -0
  123. package/dist/assets/skills/xagent-run-test/SKILL.md +16 -0
  124. package/dist/assets/skills/xagent-run-test/agents/openai.yaml +4 -0
  125. package/dist/assets/skills/xagent-run-test/references/execution-modes.md +23 -0
  126. package/dist/assets/skills/xagent-run-test/references/result-status.md +13 -0
  127. package/dist/assets/skills/xagent-test-report/SKILL.md +20 -0
  128. package/dist/assets/skills/xagent-test-report/agents/openai.yaml +4 -0
  129. package/dist/assets/skills/xagent-test-report/references/evidence-policy.md +20 -0
  130. package/dist/assets/skills/xagent-test-report/references/report-template.md +41 -0
  131. package/dist/assets/skills/xagent-test-report/references/result-classification.md +13 -0
  132. package/dist/authoring/draft-store.d.ts +19 -0
  133. package/dist/authoring/draft-store.d.ts.map +1 -0
  134. package/dist/authoring/draft-store.js +104 -0
  135. package/dist/authoring/draft-store.js.map +1 -0
  136. package/dist/authoring/session-lease.d.ts +64 -0
  137. package/dist/authoring/session-lease.d.ts.map +1 -0
  138. package/dist/authoring/session-lease.js +190 -0
  139. package/dist/authoring/session-lease.js.map +1 -0
  140. package/dist/cli.d.ts +3 -0
  141. package/dist/cli.d.ts.map +1 -0
  142. package/dist/cli.js +529 -0
  143. package/dist/cli.js.map +1 -0
  144. package/dist/config/credentials.d.ts +16 -0
  145. package/dist/config/credentials.d.ts.map +1 -0
  146. package/dist/config/credentials.js +93 -0
  147. package/dist/config/credentials.js.map +1 -0
  148. package/dist/config/store.d.ts +37 -0
  149. package/dist/config/store.d.ts.map +1 -0
  150. package/dist/config/store.js +142 -0
  151. package/dist/config/store.js.map +1 -0
  152. package/dist/core/assets.d.ts +5 -0
  153. package/dist/core/assets.d.ts.map +1 -0
  154. package/dist/core/assets.js +46 -0
  155. package/dist/core/assets.js.map +1 -0
  156. package/dist/core/errors.d.ts +19 -0
  157. package/dist/core/errors.d.ts.map +1 -0
  158. package/dist/core/errors.js +36 -0
  159. package/dist/core/errors.js.map +1 -0
  160. package/dist/core/interrupt.d.ts +8 -0
  161. package/dist/core/interrupt.d.ts.map +1 -0
  162. package/dist/core/interrupt.js +54 -0
  163. package/dist/core/interrupt.js.map +1 -0
  164. package/dist/core/json.d.ts +5 -0
  165. package/dist/core/json.d.ts.map +1 -0
  166. package/dist/core/json.js +21 -0
  167. package/dist/core/json.js.map +1 -0
  168. package/dist/core/version.d.ts +8 -0
  169. package/dist/core/version.d.ts.map +1 -0
  170. package/dist/core/version.js +8 -0
  171. package/dist/core/version.js.map +1 -0
  172. package/dist/integrations/manager.d.ts +12 -0
  173. package/dist/integrations/manager.d.ts.map +1 -0
  174. package/dist/integrations/manager.js +218 -0
  175. package/dist/integrations/manager.js.map +1 -0
  176. package/dist/integrations/routing.d.ts +105 -0
  177. package/dist/integrations/routing.d.ts.map +1 -0
  178. package/dist/integrations/routing.js +85 -0
  179. package/dist/integrations/routing.js.map +1 -0
  180. package/dist/mcp/server.d.ts +4 -0
  181. package/dist/mcp/server.d.ts.map +1 -0
  182. package/dist/mcp/server.js +69 -0
  183. package/dist/mcp/server.js.map +1 -0
  184. package/dist/mcp/tools.d.ts +30 -0
  185. package/dist/mcp/tools.d.ts.map +1 -0
  186. package/dist/mcp/tools.js +345 -0
  187. package/dist/mcp/tools.js.map +1 -0
  188. package/dist/project/config.d.ts +15 -0
  189. package/dist/project/config.d.ts.map +1 -0
  190. package/dist/project/config.js +46 -0
  191. package/dist/project/config.js.map +1 -0
  192. package/dist/run/progress.d.ts +5 -0
  193. package/dist/run/progress.d.ts.map +1 -0
  194. package/dist/run/progress.js +29 -0
  195. package/dist/run/progress.js.map +1 -0
  196. package/dist/script/service.d.ts +42 -0
  197. package/dist/script/service.d.ts.map +1 -0
  198. package/dist/script/service.js +457 -0
  199. package/dist/script/service.js.map +1 -0
  200. package/dist/sdk/authoring.d.ts +19 -0
  201. package/dist/sdk/authoring.d.ts.map +1 -0
  202. package/dist/sdk/authoring.js +43 -0
  203. package/dist/sdk/authoring.js.map +1 -0
  204. package/dist/sdk/client.d.ts +49 -0
  205. package/dist/sdk/client.d.ts.map +1 -0
  206. package/dist/sdk/client.js +241 -0
  207. package/dist/sdk/client.js.map +1 -0
  208. package/dist/skills/catalog.d.ts +7 -0
  209. package/dist/skills/catalog.d.ts.map +1 -0
  210. package/dist/skills/catalog.js +59 -0
  211. package/dist/skills/catalog.js.map +1 -0
  212. package/package.json +45 -0
@@ -0,0 +1,241 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createReadStream } from "node:fs";
3
+ import { open, stat } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { XAgentApiError } from "../core/errors.js";
6
+ import { DeviceActionClient } from "../action/client.js";
7
+ import { AuthoringClient } from "./authoring.js";
8
+ const TERMINAL = new Set(["passed", "failed", "infrastructure_failed", "cancelled", "timed_out"]);
9
+ export class XAgentClient {
10
+ baseUrl;
11
+ token;
12
+ uploadBaseUrl;
13
+ timeoutMs;
14
+ uploadTimeoutMs;
15
+ authoring = new AuthoringClient(this);
16
+ action = new DeviceActionClient(this);
17
+ constructor(baseUrl, token, uploadBaseUrl, timeoutMs = 30_000, uploadTimeoutMs = 900_000) {
18
+ this.baseUrl = baseUrl;
19
+ this.token = token;
20
+ this.uploadBaseUrl = uploadBaseUrl;
21
+ this.timeoutMs = timeoutMs;
22
+ this.uploadTimeoutMs = uploadTimeoutMs;
23
+ if (!baseUrl.trim())
24
+ throw new XAgentApiError("invalid_configuration", "service URL is required");
25
+ if (!token.trim())
26
+ throw new XAgentApiError("authentication_required", "Developer Token is required");
27
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
28
+ this.uploadBaseUrl = uploadBaseUrl?.replace(/\/+$/, "");
29
+ this.token = token.trim();
30
+ }
31
+ getPrincipal() { return this.request("GET", "/agent/api/developer/v1/principal"); }
32
+ listEffectiveSkills() { return this.request("GET", "/agent/api/developer/v1/skills"); }
33
+ getEffectiveSkill(name) { return this.request("GET", `/agent/api/developer/v1/skills/${encodeURIComponent(name)}`); }
34
+ getEffectiveSkillReference(name, referencePath) { return this.request("GET", `/agent/api/developer/v1/skills/${encodeURIComponent(name)}/references/${referencePath.split("/").map(encodeURIComponent).join("/")}`); }
35
+ createRun(request, idempotencyKey) { return this.request("POST", "/agent/api/developer/v1/runs", { json: request, idempotencyKey }); }
36
+ previewTarget(request) { return this.request("POST", "/agent/api/developer/v1/targets/preview", { json: request }); }
37
+ getRun(runId) { return this.request("GET", `/agent/api/developer/v1/runs/${encodeURIComponent(runId)}`); }
38
+ cancelRun(runId) { return this.request("POST", `/agent/api/developer/v1/runs/${encodeURIComponent(runId)}/cancel`); }
39
+ listApps(query = {}) {
40
+ const params = new URLSearchParams();
41
+ for (const [key, value] of Object.entries(query))
42
+ if (value !== undefined)
43
+ params.set(key, String(value));
44
+ const suffix = params.toString() ? `?${params.toString()}` : "";
45
+ return this.request("GET", `/agent/api/developer/v1/apps${suffix}`);
46
+ }
47
+ getApp(packageId) {
48
+ if (!Number.isInteger(packageId) || packageId < 1)
49
+ throw new XAgentApiError("invalid_request", "package_id must be a positive integer");
50
+ return this.request("GET", `/agent/api/developer/v1/apps/${packageId}`);
51
+ }
52
+ releaseApp(uploadId) { return this.request("POST", `/agent/api/developer/v1/apps/uploads/${encodeURIComponent(uploadId)}/release`); }
53
+ /** `signal` aborts the wait itself; the Run keeps going server-side unless the caller also cancels it. */
54
+ async waitRun(runId, timeoutSeconds = 600, pollInterval = 2, onUpdate, signal) {
55
+ const deadline = Date.now() + timeoutSeconds * 1000;
56
+ const aborted = () => new XAgentApiError("cancelled", "wait for Run was cancelled");
57
+ for (;;) {
58
+ if (signal?.aborted)
59
+ throw aborted();
60
+ try {
61
+ const run = await this.getRun(runId);
62
+ onUpdate?.(run);
63
+ if (TERMINAL.has(run.status))
64
+ return run;
65
+ }
66
+ catch (error) {
67
+ if (!isTransient(error))
68
+ throw error;
69
+ }
70
+ if (signal?.aborted)
71
+ throw aborted();
72
+ const remaining = deadline - Date.now();
73
+ if (remaining <= 0)
74
+ throw new XAgentApiError("timeout", "timed out while waiting for Run");
75
+ // The sleep dominates the loop, so an abort has to interrupt it rather than
76
+ // wait out a full poll interval before being noticed.
77
+ await new Promise((resolve) => {
78
+ const timer = setTimeout(finish, Math.min(Math.max(0, pollInterval * 1000), remaining));
79
+ function finish() { clearTimeout(timer); signal?.removeEventListener("abort", finish); resolve(); }
80
+ signal?.addEventListener("abort", finish, { once: true });
81
+ });
82
+ }
83
+ }
84
+ async request(method, route, options = {}) {
85
+ const headers = { Authorization: `Bearer ${this.token}`, Accept: "application/json", ...options.headers };
86
+ if (options.idempotencyKey)
87
+ headers["Idempotency-Key"] = options.idempotencyKey;
88
+ let body = options.body;
89
+ if (options.json !== undefined) {
90
+ headers["Content-Type"] = "application/json";
91
+ body = JSON.stringify(options.json);
92
+ }
93
+ const response = await this.fetchRequest(`${this.baseUrl}${route}`, { method, headers, body }, options.timeoutMs ?? this.timeoutMs, false);
94
+ const payload = await parseJsonResponse(response, "server returned a non-JSON response");
95
+ if (!response.ok || (payload && typeof payload === "object" && "error" in payload)) {
96
+ const error = payload?.error ?? {};
97
+ throw new XAgentApiError(String(error.code ?? "infrastructure_failed"), String(error.message ?? "XAgent request failed"), { statusCode: response.status, details: typeof error.details === "object" ? error.details : undefined });
98
+ }
99
+ if (!payload || typeof payload.data !== "object" || Array.isArray(payload.data))
100
+ throw new XAgentApiError("invalid_response", "server returned an invalid response envelope", { statusCode: response.status });
101
+ return payload.data;
102
+ }
103
+ async uploadApp(apkPath, progress) {
104
+ if (!this.uploadBaseUrl)
105
+ throw new XAgentApiError("invalid_configuration", "file service URL is required for apps upload");
106
+ const file = await stat(apkPath);
107
+ const [md5, sha256] = await Promise.all([hashFile(apkPath, "md5"), hashFile(apkPath, "sha256")]);
108
+ const init = await this.directRequest("POST", `${this.uploadBaseUrl}/app/ci/init`, { json: { filename: path.basename(apkPath), size: file.size, md5, sha256 }, headers: { Authorization: `Bearer ${this.token}` } });
109
+ const ticket = String(init.ticket);
110
+ const chunkSize = Number(init.chunk_size ?? 5 * 1024 * 1024);
111
+ const total = Math.ceil(file.size / chunkSize);
112
+ const handle = await open(apkPath, "r");
113
+ try {
114
+ for (let chunk = 0; chunk < total; chunk += 1) {
115
+ const length = Math.min(chunkSize, file.size - chunk * chunkSize);
116
+ const buffer = Buffer.allocUnsafe(length);
117
+ await handle.read(buffer, 0, length, chunk * chunkSize);
118
+ const common = { fileMd5: md5, chunk: String(chunk), chunkSize: String(length) };
119
+ const checked = await retryTransient(() => this.directRequest("POST", `${this.uploadBaseUrl}/app/ci/checkChunk`, { form: common, headers: { "X-XAgent-Upload-Ticket": ticket } }), { chunk, total, step: "checkChunk" });
120
+ if (Number(checked.data?.ifExist ?? 0) !== 1) {
121
+ // The form is rebuilt per attempt: a FormData/Blob body cannot be replayed once consumed.
122
+ const uploaded = await retryTransient(() => {
123
+ const form = new FormData();
124
+ form.set("fileMd5", md5);
125
+ form.set("chunk", String(chunk));
126
+ form.set("UPLOAD-JSON", JSON.stringify({ suffix: "apk", eid: init.eid ?? 0, projectId: init.project_id ?? 0, uid: init.user_id ?? "", uname: "XAgent CI", originalFilename: path.basename(apkPath) }));
127
+ form.set("file", new Blob([buffer], { type: "application/vnd.android.package-archive" }), path.basename(apkPath));
128
+ return this.directRequest("POST", `${this.uploadBaseUrl}/app/ci/upload`, { body: form, headers: { "X-XAgent-Upload-Ticket": ticket } });
129
+ }, { chunk, total, step: "upload" });
130
+ const uploadedCode = Number(uploaded.code ?? -1);
131
+ // 20002 means the file service already had this content (dedup) —
132
+ // that is a success, same as the outer envelope check in directRequest.
133
+ if (![0, 20002].includes(uploadedCode)) {
134
+ throw new XAgentApiError("infrastructure_failed", `APK chunk upload failed: ${String(uploaded.msg ?? "unknown file service error")}`, { details: { chunk, total, chunk_code: uploadedCode } });
135
+ }
136
+ }
137
+ progress?.(chunk + 1, total);
138
+ }
139
+ }
140
+ finally {
141
+ await handle.close();
142
+ }
143
+ const merged = await this.directRequest("POST", `${this.uploadBaseUrl}/app/ci/mergeChunk`, { form: { fileMd5: md5, chunksTotal: String(total), ext: "apk", biz: "public", storageType: "1" }, headers: { "X-XAgent-Upload-Ticket": ticket } });
144
+ if (!merged.uploadReceipt)
145
+ throw new XAgentApiError("invalid_response", "file service did not return an upload receipt");
146
+ return this.request("POST", `/agent/api/developer/v1/apps/uploads/${encodeURIComponent(String(init.upload_id))}/complete`, { json: { upload_id: init.upload_id, ticket, receipt: merged.uploadReceipt }, timeoutMs: this.uploadTimeoutMs });
147
+ }
148
+ async directRequest(method, url, options) {
149
+ const headers = { Accept: "application/json", ...options.headers };
150
+ let body = options.body;
151
+ if (options.json !== undefined) {
152
+ headers["Content-Type"] = "application/json";
153
+ body = JSON.stringify(options.json);
154
+ }
155
+ if (options.form) {
156
+ headers["Content-Type"] = "application/x-www-form-urlencoded";
157
+ body = new URLSearchParams(options.form);
158
+ }
159
+ const response = await this.fetchRequest(url, { method, headers, body }, options.timeoutMs ?? this.uploadTimeoutMs, true);
160
+ const payload = await parseJsonResponse(response, "file service upload request failed");
161
+ const code = Number(payload?.code ?? 0);
162
+ if (!response.ok || ![0, 20002].includes(code)) {
163
+ const message = String(payload?.msg ?? "file service upload failed");
164
+ const errorCode = code === 2402 && message.includes("Bearer") ? "authentication_required" : code === 2402 ? "permission_denied" : "infrastructure_failed";
165
+ throw new XAgentApiError(errorCode, message, { statusCode: response.status });
166
+ }
167
+ return payload;
168
+ }
169
+ async fetchRequest(url, init, timeoutMs, upload) {
170
+ try {
171
+ return await fetch(url, { ...init, signal: AbortSignal.timeout(timeoutMs) });
172
+ }
173
+ catch (error) {
174
+ // Carry the underlying reason through. A reset socket, a DNS failure and
175
+ // a refused connection all used to surface as the same opaque sentence.
176
+ const reason = String(error?.cause?.message ?? error?.message ?? "").trim();
177
+ const syscode = error?.cause?.code ?? error?.code;
178
+ const details = { url, ...(syscode ? { cause_code: String(syscode) } : {}), ...(reason ? { cause: reason } : {}) };
179
+ if (error?.name === "TimeoutError" || error?.name === "AbortError") {
180
+ throw new XAgentApiError("timeout", `${upload ? "file service upload request" : "request"} timed out after ${timeoutMs}ms`, { details });
181
+ }
182
+ const base = upload ? "file service upload request failed" : "unable to reach XAgent service";
183
+ throw new XAgentApiError("infrastructure_failed", reason ? `${base}: ${reason}` : base, { details });
184
+ }
185
+ }
186
+ }
187
+ async function parseJsonResponse(response, message) {
188
+ try {
189
+ return await response.json();
190
+ }
191
+ catch {
192
+ throw new XAgentApiError("invalid_response", message, { statusCode: response.status });
193
+ }
194
+ }
195
+ /** A transport failure or a server-side 5xx is worth another attempt; a business
196
+ * rejection answered with HTTP 200 (bad md5, expired ticket) never is. */
197
+ function isTransient(error) {
198
+ if (!(error instanceof XAgentApiError))
199
+ return false;
200
+ if (error.code !== "timeout" && error.code !== "infrastructure_failed")
201
+ return false;
202
+ return error.statusCode === undefined || error.statusCode >= 500;
203
+ }
204
+ /** Retries one chunk-level upload step on transient transport failures.
205
+ * A ~300MB APK ships as ~60 chunks, so a single dropped socket used to throw
206
+ * away the whole transfer. checkChunk is read-only and re-uploading the same
207
+ * chunk overwrites identical bytes, so both steps are safe to repeat.
208
+ * mergeChunk is deliberately NOT retried — it is not idempotent. */
209
+ async function retryTransient(attempt, context, attempts = 3) {
210
+ let last;
211
+ let tried = 0;
212
+ for (let tries = 1; tries <= attempts; tries += 1) {
213
+ tried = tries;
214
+ try {
215
+ return await attempt();
216
+ }
217
+ catch (error) {
218
+ last = error;
219
+ if (!isTransient(error) || tries === attempts)
220
+ break;
221
+ await new Promise((resolve) => setTimeout(resolve, 1000 * tries));
222
+ }
223
+ }
224
+ if (last instanceof XAgentApiError) {
225
+ // Only claim retries that actually happened — annotating a fail-fast
226
+ // rejection with an attempt count sends readers after a phantom flake.
227
+ const retried = tried > 1;
228
+ throw new XAgentApiError(last.code, retried ? `${last.message} (after ${tried} attempts)` : last.message, {
229
+ statusCode: last.statusCode,
230
+ details: { ...last.details, ...context, ...(retried ? { attempts: tried } : {}) },
231
+ });
232
+ }
233
+ throw last;
234
+ }
235
+ async function hashFile(filePath, algorithm) {
236
+ return new Promise((resolve, reject) => {
237
+ const hash = createHash(algorithm);
238
+ createReadStream(filePath).on("error", reject).on("data", (chunk) => hash.update(chunk)).on("end", () => resolve(hash.digest("hex")));
239
+ });
240
+ }
241
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/sdk/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAYlG,MAAM,OAAO,YAAY;IAGF;IAAkC;IAAwB;IAAiC;IAA6B;IAFpI,SAAS,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC/C,YAAqB,OAAe,EAAmB,KAAa,EAAW,aAAsB,EAAW,YAAY,MAAM,EAAW,kBAAkB,OAAO;QAAjJ,YAAO,GAAP,OAAO,CAAQ;QAAmB,UAAK,GAAL,KAAK,CAAQ;QAAW,kBAAa,GAAb,aAAa,CAAS;QAAW,cAAS,GAAT,SAAS,CAAS;QAAW,oBAAe,GAAf,eAAe,CAAU;QACpK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,cAAc,CAAC,uBAAuB,EAAE,yBAAyB,CAAC,CAAC;QAClG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,cAAc,CAAC,yBAAyB,EAAE,6BAA6B,CAAC,CAAC;QACtG,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,aAAa,GAAG,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,YAAY,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,mCAAmC,CAAuB,CAAC,CAAC,CAAC;IACzG,mBAAmB,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,gCAAgC,CAAC,CAAC,CAAC,CAAC;IACvF,iBAAiB,CAAC,IAAY,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,kCAAkC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7H,0BAA0B,CAAC,IAAY,EAAE,aAAqB,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,kCAAkC,kBAAkB,CAAC,IAAI,CAAC,eAAe,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtO,SAAS,CAAC,OAAgC,EAAE,cAAuB,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,8BAA8B,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;IACxK,aAAa,CAAC,OAAgC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,yCAAyC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9I,MAAM,CAAC,KAAa,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,gCAAgC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClH,SAAS,CAAC,KAAa,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,gCAAgC,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7H,QAAQ,CAAC,QAAqD,EAAE;QAC9D,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1G,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,+BAA+B,MAAM,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,CAAC,SAAiB;QACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC;YAAE,MAAM,IAAI,cAAc,CAAC,iBAAiB,EAAE,uCAAuC,CAAC,CAAC;QACxI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,gCAAgC,SAAS,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,UAAU,CAAC,QAAgB,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,wCAAwC,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAE7I,0GAA0G;IAC1G,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,cAAc,GAAG,GAAG,EAAE,YAAY,GAAG,CAAC,EAAE,QAA6C,EAAE,MAAoB;QACtI,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,GAAG,IAAI,CAAC;QACpD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,cAAc,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;QACpF,SAAS,CAAC;YACR,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM,OAAO,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAwB,CAAC;gBAC5D,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;gBAChB,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;oBAAE,OAAO,GAAG,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;oBAAE,MAAM,KAAK,CAAC;YACvC,CAAC;YACD,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM,OAAO,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACxC,IAAI,SAAS,IAAI,CAAC;gBAAE,MAAM,IAAI,cAAc,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;YAC3F,4EAA4E;YAC5E,sDAAsD;YACtD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;gBACxF,SAAS,MAAM,KAAK,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACnG,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,KAAa,EAAE,UAA0B,EAAE;QACvE,MAAM,OAAO,GAAG,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1G,IAAI,OAAO,CAAC,cAAc;YAAE,OAAO,CAAC,iBAAyC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;QACxG,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACxB,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,CAAC,cAAsC,CAAC,GAAG,kBAAkB,CAAC;YACrE,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC3I,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,qCAAqC,CAAC,CAAC;QACzF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC;YACnF,MAAM,KAAK,GAAI,OAAe,EAAE,KAAK,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,uBAAuB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACrO,CAAC;QACD,IAAI,CAAC,OAAO,IAAI,OAAQ,OAAe,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,OAAe,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,cAAc,CAAC,kBAAkB,EAAE,8CAA8C,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACjO,OAAQ,OAAe,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,QAAmD;QAClF,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,cAAc,CAAC,uBAAuB,EAAE,8CAA8C,CAAC,CAAC;QAC3H,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACjG,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,cAAc,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACrN,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,SAAS,CAAC,CAAC;gBAClE,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;gBACxD,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjF,MAAM,OAAO,GAAG,MAAM,cAAc,CAClC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,oBAAoB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,wBAAwB,EAAE,MAAM,EAAE,EAAE,CAAC,EAC5I,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,CACrC,CAAC;gBACF,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7C,0FAA0F;oBAC1F,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE;wBACzC,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;wBAC5B,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;wBAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;wBAC3D,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;wBACvM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,yCAAyC,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;wBAClH,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,wBAAwB,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;oBAC1I,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACrC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;oBACjD,kEAAkE;oBAClE,wEAAwE;oBACxE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;wBACvC,MAAM,IAAI,cAAc,CAAC,uBAAuB,EAAE,4BAA4B,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,4BAA4B,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;oBACjM,CAAC;gBACH,CAAC;gBACD,QAAQ,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;gBAAS,CAAC;YAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,oBAAoB,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,wBAAwB,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/O,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE,MAAM,IAAI,cAAc,CAAC,kBAAkB,EAAE,+CAA+C,CAAC,CAAC;QACzH,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,wCAAwC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IAC9O,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,GAAW,EAAE,OAA2D;QAClH,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QACnE,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACxB,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAAC,OAAO,CAAC,cAAsC,CAAC,GAAG,kBAAkB,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAC9I,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YAAC,OAAO,CAAC,cAAsC,CAAC,GAAG,mCAAmC,CAAC;YAAC,IAAI,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QACtJ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAC1H,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,oCAAoC,CAAC,CAAC;QACxF,MAAM,IAAI,GAAG,MAAM,CAAE,OAAe,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,MAAM,CAAE,OAAe,EAAE,GAAG,IAAI,4BAA4B,CAAC,CAAC;YAC9E,MAAM,SAAS,GAAG,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,uBAAuB,CAAC;YAC1J,MAAM,IAAI,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,OAA8B,CAAC;IACxC,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,GAAW,EAAE,IAAiB,EAAE,SAAiB,EAAE,MAAe;QAC3F,IAAI,CAAC;YAAC,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;QACrF,OAAO,KAAU,EAAE,CAAC;YAClB,yEAAyE;YACzE,wEAAwE;YACxE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5E,MAAM,OAAO,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC;YAClD,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACnH,IAAI,KAAK,EAAE,IAAI,KAAK,cAAc,IAAI,KAAK,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;gBACnE,MAAM,IAAI,cAAc,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,SAAS,oBAAoB,SAAS,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3I,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,gCAAgC,CAAC;YAC9F,MAAM,IAAI,cAAc,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;CACF;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAkB,EAAE,OAAe;IAClE,IAAI,CAAC;QAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAAC,CAAC;IACrC,MAAM,CAAC;QAAC,MAAM,IAAI,cAAc,CAAC,kBAAkB,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAAC,CAAC;AACnG,CAAC;AAED;2EAC2E;AAC3E,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,CAAC,CAAC,KAAK,YAAY,cAAc,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB;QAAE,OAAO,KAAK,CAAC;IACrF,OAAO,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC;AACnE,CAAC;AAED;;;;qEAIqE;AACrE,KAAK,UAAU,cAAc,CAAI,OAAyB,EAAE,OAAgC,EAAE,QAAQ,GAAG,CAAC;IACxG,IAAI,IAAa,CAAC;IAClB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAClD,KAAK,GAAG,KAAK,CAAC;QACd,IAAI,CAAC;YAAC,OAAO,MAAM,OAAO,EAAE,CAAC;QAAC,CAAC;QAC/B,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,GAAG,KAAK,CAAC;YACb,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,QAAQ;gBAAE,MAAM;YACrD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IACD,IAAI,IAAI,YAAY,cAAc,EAAE,CAAC;QACnC,qEAAqE;QACrE,uEAAuE;QACvE,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC;QAC1B,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE;YACxG,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;SAClF,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,CAAC;AACb,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,QAAgB,EAAE,SAA2B;IACnE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACnC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxI,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const SKILL_NAMES: readonly ["xagent-cli", "xagent-explore-device", "xagent-author-test", "xagent-run-test", "xagent-analyze-failure", "xagent-repair-test", "xagent-test-report"];
2
+ export declare function listSkills(): string[];
3
+ export declare function readSkill(name: string): Promise<string>;
4
+ export declare function listSkillReferences(name: string): Promise<string[]>;
5
+ export declare function readSkillReference(name: string, reference: string): Promise<string>;
6
+ export declare function exportSkills(directory: string, overwrite?: boolean): Promise<string[]>;
7
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/skills/catalog.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,iKAAkK,CAAC;AAU3L,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAA6B;AACnE,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG7D;AACD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKzE;AACD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIzF;AACD,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiB1F"}
@@ -0,0 +1,59 @@
1
+ import { cp, mkdir, readFile, readdir, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { skillRoot } from "../core/assets.js";
4
+ export const SKILL_NAMES = ["xagent-cli", "xagent-explore-device", "xagent-author-test", "xagent-run-test", "xagent-analyze-failure", "xagent-repair-test", "xagent-test-report"];
5
+ function requireSkill(name) { if (!SKILL_NAMES.includes(name))
6
+ throw new Error("skill_not_found"); }
7
+ function normalizeReference(reference) {
8
+ const value = String(reference ?? "").replaceAll("\\", "/").replace(/^\/+|\/+$/g, "");
9
+ const parts = value.split("/");
10
+ if (!value || parts.includes(".."))
11
+ throw new Error("reference_not_found");
12
+ return parts[0] === "references" ? parts.join("/") : ["references", ...parts].join("/");
13
+ }
14
+ export function listSkills() { return [...SKILL_NAMES]; }
15
+ export async function readSkill(name) {
16
+ requireSkill(name);
17
+ return readFile(path.join(await skillRoot(), name, "SKILL.md"), "utf8");
18
+ }
19
+ export async function listSkillReferences(name) {
20
+ requireSkill(name);
21
+ const root = path.join(await skillRoot(), name, "references");
22
+ try {
23
+ return (await readdir(root, { withFileTypes: true })).filter((entry) => entry.isFile() && entry.name.endsWith(".md")).map((entry) => `references/${entry.name}`).sort();
24
+ }
25
+ catch {
26
+ return [];
27
+ }
28
+ }
29
+ export async function readSkillReference(name, reference) {
30
+ const normalized = normalizeReference(reference);
31
+ if (!(await listSkillReferences(name)).includes(normalized))
32
+ throw new Error("reference_not_found");
33
+ return readFile(path.join(await skillRoot(), name, ...normalized.split("/")), "utf8");
34
+ }
35
+ export async function exportSkills(directory, overwrite = false) {
36
+ const root = await skillRoot();
37
+ const written = [];
38
+ for (const name of SKILL_NAMES) {
39
+ const relatives = ["SKILL.md", ...(await listSkillReferences(name)), "agents/openai.yaml"];
40
+ for (const relative of relatives) {
41
+ const destination = path.join(directory, name, ...relative.split("/"));
42
+ if (!overwrite) {
43
+ try {
44
+ await stat(destination);
45
+ throw new Error(`destination_exists:${destination}`);
46
+ }
47
+ catch (error) {
48
+ if (String(error?.message).startsWith("destination_exists:"))
49
+ throw error;
50
+ }
51
+ }
52
+ await mkdir(path.dirname(destination), { recursive: true });
53
+ await cp(path.join(root, name, ...relative.split("/")), destination);
54
+ written.push(destination);
55
+ }
56
+ }
57
+ return written;
58
+ }
59
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/skills/catalog.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@testin-official/xagent",
3
+ "version": "0.3.7",
4
+ "description": "Cross-platform XAgent Developer CLI and MCP server",
5
+ "private": false,
6
+ "type": "module",
7
+ "bin": {
8
+ "xagent": "dist/cli.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "engines": {
15
+ "node": ">=20.9"
16
+ },
17
+ "publishConfig": {
18
+ "access": "public",
19
+ "registry": "https://registry.npmjs.org/"
20
+ },
21
+ "scripts": {
22
+ "clean": "node scripts/clean-build.mjs",
23
+ "build": "npm run clean && tsc -p tsconfig.json && node scripts/copy-assets.mjs",
24
+ "test": "node --import tsx --test tests/device-action.test.ts tests/cli-entry.test.ts tests/cli-errors.test.ts tests/cli-routing.test.ts tests/config-draft.test.ts tests/integrations.test.ts tests/interrupt.test.ts tests/mcp-skills.test.ts tests/mcp-stdio.test.ts tests/run-progress.test.ts tests/script.test.ts tests/sdk.test.ts tests/sdk-upload.test.ts tests/session-lease.test.ts tests/version-package.test.ts",
25
+ "check": "npm test && npm run build",
26
+ "package:integrations": "node scripts/package-integrations.mjs",
27
+ "package:skill": "node scripts/package-integrations.mjs"
28
+ },
29
+ "dependencies": {
30
+ "@modelcontextprotocol/sdk": "^1.17.5",
31
+ "@napi-rs/keyring": "^1.3.0",
32
+ "ajv": "^8.17.1",
33
+ "commander": "^12.1.0",
34
+ "sharp": "^0.35.3",
35
+ "yaml": "^2.8.1"
36
+ },
37
+ "optionalDependencies": {
38
+ "keytar": "^7.9.0"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^22.18.3",
42
+ "tsx": "^4.20.5",
43
+ "typescript": "^5.9.2"
44
+ }
45
+ }