openxiangda-devkit-core 2.0.0-alpha.12 → 2.0.0-alpha.121

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 (188) hide show
  1. package/README.md +3 -8
  2. package/dist/app-spec.d.ts +228 -0
  3. package/dist/app-spec.d.ts.map +1 -0
  4. package/dist/app-spec.js +1443 -0
  5. package/dist/app-spec.js.map +1 -0
  6. package/dist/application-services.d.ts +996 -49
  7. package/dist/application-services.d.ts.map +1 -1
  8. package/dist/application-services.js +1348 -197
  9. package/dist/application-services.js.map +1 -1
  10. package/dist/application-ui-contract.d.ts +5 -0
  11. package/dist/application-ui-contract.d.ts.map +1 -0
  12. package/dist/application-ui-contract.js +149 -0
  13. package/dist/application-ui-contract.js.map +1 -0
  14. package/dist/backend-image-build.d.ts +23 -0
  15. package/dist/backend-image-build.d.ts.map +1 -0
  16. package/dist/backend-image-build.js +204 -0
  17. package/dist/backend-image-build.js.map +1 -0
  18. package/dist/command-process.d.ts +14 -0
  19. package/dist/command-process.d.ts.map +1 -0
  20. package/dist/command-process.js +51 -0
  21. package/dist/command-process.js.map +1 -0
  22. package/dist/command-registry.d.ts +123 -366
  23. package/dist/command-registry.d.ts.map +1 -1
  24. package/dist/command-registry.js +26 -266
  25. package/dist/command-registry.js.map +1 -1
  26. package/dist/compiler/ai-catalog.d.ts +4 -0
  27. package/dist/compiler/ai-catalog.d.ts.map +1 -0
  28. package/dist/compiler/ai-catalog.js +354 -0
  29. package/dist/compiler/ai-catalog.js.map +1 -0
  30. package/dist/compiler/application-model.d.ts +60 -0
  31. package/dist/compiler/application-model.d.ts.map +1 -0
  32. package/dist/compiler/application-model.js +141 -0
  33. package/dist/compiler/application-model.js.map +1 -0
  34. package/dist/compiler/authorization-transition.d.ts +7 -0
  35. package/dist/compiler/authorization-transition.d.ts.map +1 -0
  36. package/dist/compiler/authorization-transition.js +27 -0
  37. package/dist/compiler/authorization-transition.js.map +1 -0
  38. package/dist/compiler/bundle.d.ts +34 -0
  39. package/dist/compiler/bundle.d.ts.map +1 -0
  40. package/dist/compiler/bundle.js +1910 -0
  41. package/dist/compiler/bundle.js.map +1 -0
  42. package/dist/compiler/config.d.ts +882 -0
  43. package/dist/compiler/config.d.ts.map +1 -0
  44. package/dist/compiler/config.js +4118 -0
  45. package/dist/compiler/config.js.map +1 -0
  46. package/dist/compiler/data-policy-expression.d.ts +12 -0
  47. package/dist/compiler/data-policy-expression.d.ts.map +1 -0
  48. package/dist/compiler/data-policy-expression.js +43 -0
  49. package/dist/compiler/data-policy-expression.js.map +1 -0
  50. package/dist/compiler/field-codec.d.ts +14 -0
  51. package/dist/compiler/field-codec.d.ts.map +1 -0
  52. package/dist/compiler/field-codec.js +131 -0
  53. package/dist/compiler/field-codec.js.map +1 -0
  54. package/dist/compiler/field-physical-plan.d.ts +10 -0
  55. package/dist/compiler/field-physical-plan.d.ts.map +1 -0
  56. package/dist/compiler/field-physical-plan.js +66 -0
  57. package/dist/compiler/field-physical-plan.js.map +1 -0
  58. package/dist/compiler/field-policy-path.d.ts +10 -0
  59. package/dist/compiler/field-policy-path.d.ts.map +1 -0
  60. package/dist/compiler/field-policy-path.js +283 -0
  61. package/dist/compiler/field-policy-path.js.map +1 -0
  62. package/dist/compiler/field-query-plan.d.ts +13 -0
  63. package/dist/compiler/field-query-plan.d.ts.map +1 -0
  64. package/dist/compiler/field-query-plan.js +122 -0
  65. package/dist/compiler/field-query-plan.js.map +1 -0
  66. package/dist/compiler/field-surface.d.ts +15 -0
  67. package/dist/compiler/field-surface.d.ts.map +1 -0
  68. package/dist/compiler/field-surface.js +51 -0
  69. package/dist/compiler/field-surface.js.map +1 -0
  70. package/dist/compiler/index.d.ts +6 -0
  71. package/dist/compiler/index.d.ts.map +1 -0
  72. package/dist/compiler/index.js +6 -0
  73. package/dist/compiler/index.js.map +1 -0
  74. package/dist/compiler/package-compiler.d.ts +22 -0
  75. package/dist/compiler/package-compiler.d.ts.map +1 -0
  76. package/dist/compiler/package-compiler.js +257 -0
  77. package/dist/compiler/package-compiler.js.map +1 -0
  78. package/dist/compiler/permission-review.d.ts +139 -0
  79. package/dist/compiler/permission-review.d.ts.map +1 -0
  80. package/dist/compiler/permission-review.js +131 -0
  81. package/dist/compiler/permission-review.js.map +1 -0
  82. package/dist/compiler/schema-composition.d.ts +21 -0
  83. package/dist/compiler/schema-composition.d.ts.map +1 -0
  84. package/dist/compiler/schema-composition.js +193 -0
  85. package/dist/compiler/schema-composition.js.map +1 -0
  86. package/dist/config.d.ts +1 -1
  87. package/dist/config.js +1 -1
  88. package/dist/configuration-preflight.d.ts +7 -0
  89. package/dist/configuration-preflight.d.ts.map +1 -0
  90. package/dist/configuration-preflight.js +13 -0
  91. package/dist/configuration-preflight.js.map +1 -0
  92. package/dist/connected-development.d.ts +62 -0
  93. package/dist/connected-development.d.ts.map +1 -0
  94. package/dist/connected-development.js +393 -0
  95. package/dist/connected-development.js.map +1 -0
  96. package/dist/control-plane-client.d.ts +353 -123
  97. package/dist/control-plane-client.d.ts.map +1 -1
  98. package/dist/control-plane-client.js +420 -141
  99. package/dist/control-plane-client.js.map +1 -1
  100. package/dist/delivery-cache.d.ts +34 -0
  101. package/dist/delivery-cache.d.ts.map +1 -0
  102. package/dist/delivery-cache.js +186 -0
  103. package/dist/delivery-cache.js.map +1 -0
  104. package/dist/delivery-source.d.ts +17 -0
  105. package/dist/delivery-source.d.ts.map +1 -0
  106. package/dist/delivery-source.js +85 -0
  107. package/dist/delivery-source.js.map +1 -0
  108. package/dist/deployment-observer.d.ts +14 -0
  109. package/dist/deployment-observer.d.ts.map +1 -0
  110. package/dist/deployment-observer.js +68 -0
  111. package/dist/deployment-observer.js.map +1 -0
  112. package/dist/deployment.d.ts +55 -3
  113. package/dist/deployment.d.ts.map +1 -1
  114. package/dist/deployment.js +182 -21
  115. package/dist/deployment.js.map +1 -1
  116. package/dist/design-readiness.d.ts +24 -0
  117. package/dist/design-readiness.d.ts.map +1 -0
  118. package/dist/design-readiness.js +102 -0
  119. package/dist/design-readiness.js.map +1 -0
  120. package/dist/developer-errors.d.ts +11 -0
  121. package/dist/developer-errors.d.ts.map +1 -0
  122. package/dist/developer-errors.js +16 -0
  123. package/dist/developer-errors.js.map +1 -0
  124. package/dist/developer-operations.d.ts +188 -0
  125. package/dist/developer-operations.d.ts.map +1 -0
  126. package/dist/developer-operations.js +58 -0
  127. package/dist/developer-operations.js.map +1 -0
  128. package/dist/development-lifecycle.d.ts +75 -0
  129. package/dist/development-lifecycle.d.ts.map +1 -0
  130. package/dist/development-lifecycle.js +189 -0
  131. package/dist/development-lifecycle.js.map +1 -0
  132. package/dist/documentation.d.ts +111 -0
  133. package/dist/documentation.d.ts.map +1 -0
  134. package/dist/documentation.js +112 -0
  135. package/dist/documentation.js.map +1 -0
  136. package/dist/index.d.ts +16 -0
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +16 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/internal/workflow.d.ts +83 -0
  141. package/dist/internal/workflow.d.ts.map +1 -0
  142. package/dist/internal/workflow.js +419 -0
  143. package/dist/internal/workflow.js.map +1 -0
  144. package/dist/nest-injection-contract.d.ts +4 -0
  145. package/dist/nest-injection-contract.d.ts.map +1 -0
  146. package/dist/nest-injection-contract.js +116 -0
  147. package/dist/nest-injection-contract.js.map +1 -0
  148. package/dist/operation-progress.d.ts +26 -0
  149. package/dist/operation-progress.d.ts.map +1 -0
  150. package/dist/operation-progress.js +92 -0
  151. package/dist/operation-progress.js.map +1 -0
  152. package/dist/optional-backend.d.ts +14 -0
  153. package/dist/optional-backend.d.ts.map +1 -0
  154. package/dist/optional-backend.js +145 -0
  155. package/dist/optional-backend.js.map +1 -0
  156. package/dist/package-compiler.d.ts +1 -1
  157. package/dist/package-compiler.d.ts.map +1 -1
  158. package/dist/package-compiler.js +1 -1
  159. package/dist/package-compiler.js.map +1 -1
  160. package/dist/session.d.ts +149 -4
  161. package/dist/session.d.ts.map +1 -1
  162. package/dist/session.js +362 -23
  163. package/dist/session.js.map +1 -1
  164. package/dist/testing.d.ts +77 -0
  165. package/dist/testing.d.ts.map +1 -0
  166. package/dist/testing.js +213 -0
  167. package/dist/testing.js.map +1 -0
  168. package/dist/toolchain-capsule.d.ts +45 -0
  169. package/dist/toolchain-capsule.d.ts.map +1 -0
  170. package/dist/toolchain-capsule.js +165 -0
  171. package/dist/toolchain-capsule.js.map +1 -0
  172. package/dist/workspace-loader.d.ts +1 -1
  173. package/dist/workspace-loader.d.ts.map +1 -1
  174. package/dist/workspace-loader.js +35 -3
  175. package/dist/workspace-loader.js.map +1 -1
  176. package/dist/workspace-operation.d.ts +3 -0
  177. package/dist/workspace-operation.d.ts.map +1 -0
  178. package/dist/workspace-operation.js +45 -0
  179. package/dist/workspace-operation.js.map +1 -0
  180. package/dist/workspace.d.ts.map +1 -1
  181. package/dist/workspace.js +37 -1
  182. package/dist/workspace.js.map +1 -1
  183. package/package.json +16 -4
  184. package/templates/backend/Dockerfile +20 -0
  185. package/templates/backend/package.json +27 -0
  186. package/templates/backend/src/app.module.ts +23 -0
  187. package/templates/backend/src/main.ts +5 -0
  188. package/templates/backend/tsconfig.json +9 -0
package/dist/session.js CHANGED
@@ -1,48 +1,387 @@
1
- import { chmod, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
2
- import { homedir } from 'node:os';
3
- import { dirname, join } from 'node:path';
1
+ import { chmod, mkdir, readFile, rename, rm, writeFile, } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { randomUUID } from "node:crypto";
5
+ export class DeveloperSessionError extends Error {
6
+ code;
7
+ status;
8
+ data;
9
+ constructor(code, message, status, data) {
10
+ super(message);
11
+ this.code = code;
12
+ this.status = status;
13
+ this.data = data;
14
+ this.name = "DeveloperSessionError";
15
+ }
16
+ }
4
17
  export function defaultSessionPath() {
5
- return join(homedir(), '.config', 'openxiangda-v2', 'session.json');
18
+ return join(homedir(), ".config", "openxiangda-v2", "session.json");
19
+ }
20
+ export function normalizePlatformBaseUrl(value) {
21
+ const text = String(value || "").trim();
22
+ let url;
23
+ try {
24
+ url = new URL(text);
25
+ }
26
+ catch {
27
+ throw new DeveloperSessionError("OPENXIANGDA_PLATFORM_URL_INVALID", "平台地址不是有效 URL");
28
+ }
29
+ if (!/^https?:$/.test(url.protocol) || url.username || url.password) {
30
+ throw new DeveloperSessionError("OPENXIANGDA_PLATFORM_URL_INVALID", "平台地址只允许不含用户凭据的 HTTP(S) URL");
31
+ }
32
+ const path = url.pathname.replace(/\/+$/, "");
33
+ if (!path ||
34
+ path === "/platform" ||
35
+ path.startsWith("/platform/") ||
36
+ path === "/view" ||
37
+ path.startsWith("/view/")) {
38
+ return `${url.origin}/service`;
39
+ }
40
+ return `${url.origin}${path}`;
6
41
  }
7
42
  export async function loadSession(path = defaultSessionPath()) {
8
- const baseUrl = String(process.env.OPENXIANGDA_BASE_URL || '').trim();
9
- const token = String(process.env.OPENXIANGDA_TOKEN || '').trim();
10
- if (baseUrl && token) {
11
- return { schemaVersion: 2, baseUrl, token, savedAt: 'environment' };
43
+ const baseUrl = String(process.env.OPENXIANGDA_BASE_URL || "").trim();
44
+ const token = String(process.env.OPENXIANGDA_TOKEN || "").trim();
45
+ if (baseUrl || token) {
46
+ if (!baseUrl || !token) {
47
+ throw new DeveloperSessionError("OPENXIANGDA_ENV_AUTH_INCOMPLETE", "CI 身份必须同时提供 OPENXIANGDA_BASE_URL 和 OPENXIANGDA_TOKEN");
48
+ }
49
+ return {
50
+ schemaVersion: 2,
51
+ baseUrl: normalizePlatformBaseUrl(baseUrl),
52
+ accessToken: token,
53
+ savedAt: "environment",
54
+ source: "environment",
55
+ };
12
56
  }
13
57
  try {
14
- const value = JSON.parse(await readFile(path, 'utf8'));
15
- if (value.schemaVersion !== 2 || !value.baseUrl || !value.token)
58
+ const raw = JSON.parse(await readFile(path, "utf8"));
59
+ const accessToken = String(raw.accessToken || raw.token || "").trim();
60
+ if (raw.schemaVersion !== 2 || !raw.baseUrl || !accessToken)
16
61
  return null;
17
- return value;
62
+ return {
63
+ schemaVersion: 2,
64
+ baseUrl: normalizePlatformBaseUrl(raw.baseUrl),
65
+ accessToken,
66
+ ...(raw.refreshToken ? { refreshToken: raw.refreshToken } : {}),
67
+ ...(raw.accessTokenExpiresAt
68
+ ? { accessTokenExpiresAt: raw.accessTokenExpiresAt }
69
+ : {}),
70
+ ...(raw.refreshTokenExpiresAt
71
+ ? { refreshTokenExpiresAt: raw.refreshTokenExpiresAt }
72
+ : {}),
73
+ savedAt: raw.savedAt || "unknown",
74
+ source: "file",
75
+ };
18
76
  }
19
77
  catch (error) {
20
- if (error.code === 'ENOENT')
78
+ if (error.code === "ENOENT")
21
79
  return null;
22
80
  throw error;
23
81
  }
24
82
  }
25
83
  export async function saveSession(input, path = defaultSessionPath()) {
26
- const session = {
84
+ const accessToken = String(input.accessToken || input.token || "").trim();
85
+ if (!accessToken) {
86
+ throw new DeveloperSessionError("OPENXIANGDA_ACCESS_TOKEN_REQUIRED", "缺少 OpenXiangda access token");
87
+ }
88
+ const persisted = {
27
89
  schemaVersion: 2,
28
- baseUrl: input.baseUrl.replace(/\/+$/, ''),
29
- token: input.token,
90
+ baseUrl: normalizePlatformBaseUrl(input.baseUrl),
91
+ accessToken,
92
+ ...(input.refreshToken ? { refreshToken: input.refreshToken } : {}),
93
+ ...(input.accessTokenExpiresAt
94
+ ? { accessTokenExpiresAt: input.accessTokenExpiresAt }
95
+ : {}),
96
+ ...(input.refreshTokenExpiresAt
97
+ ? { refreshTokenExpiresAt: input.refreshTokenExpiresAt }
98
+ : {}),
30
99
  savedAt: new Date().toISOString(),
31
100
  };
32
- await mkdir(dirname(path), { recursive: true, mode: 0o700 });
33
- await writeFile(path, `${JSON.stringify(session, null, 2)}\n`, {
34
- encoding: 'utf8',
35
- mode: 0o600,
36
- });
37
- await chmod(path, 0o600);
38
- return { ...session, token: redactToken(session.token) };
101
+ const directory = dirname(path);
102
+ const temporaryPath = join(directory, `.session-${randomUUID()}.tmp`);
103
+ await mkdir(directory, { recursive: true, mode: 0o700 });
104
+ await chmod(directory, 0o700);
105
+ try {
106
+ await writeFile(temporaryPath, `${JSON.stringify(persisted, null, 2)}\n`, {
107
+ encoding: "utf8",
108
+ mode: 0o600,
109
+ });
110
+ await rename(temporaryPath, path);
111
+ await chmod(path, 0o600);
112
+ }
113
+ finally {
114
+ await rm(temporaryPath, { force: true });
115
+ }
116
+ return sessionSummary({ ...persisted, source: "file" });
39
117
  }
40
118
  export async function clearSession(path = defaultSessionPath()) {
41
119
  await rm(path, { force: true });
42
120
  }
121
+ /** Read-only snapshot: never refresh, persist, redirect, or initiate authorization. */
122
+ export async function developerAuthorizationStatus(input) {
123
+ const baseUrl = normalizePlatformBaseUrl(input.baseUrl);
124
+ const observedAt = new Date((input.now || Date.now)()).toISOString();
125
+ const result = (state) => ({
126
+ ok: true, operation: 'auth.status',
127
+ workspace: { appCode: 'global', root: process.cwd() },
128
+ data: { baseUrl, observedAt, state, authorized: state === 'authorized' },
129
+ diagnostics: [], nextActions: [],
130
+ });
131
+ try {
132
+ const session = await loadSession(input.sessionPath);
133
+ if (!session)
134
+ return result('missing');
135
+ if (session.baseUrl !== baseUrl)
136
+ return result('platform_mismatch');
137
+ if (session.accessTokenExpiresAt && session.accessTokenExpiresAt <= (input.now || Date.now)()) {
138
+ return result('refresh_required');
139
+ }
140
+ const response = await (input.fetch || globalThis.fetch.bind(globalThis))(`${baseUrl}/openxiangda-api/v2/auth/whoami`, { method: 'GET', redirect: 'error', signal: AbortSignal.timeout(10_000),
141
+ headers: { Accept: 'application/json', Authorization: `Bearer ${session.accessToken}` } });
142
+ if (response.status === 401 || response.status === 403)
143
+ return result('unauthorized');
144
+ if (!response.ok)
145
+ return result('unavailable');
146
+ const envelope = await response.json();
147
+ if (envelope.code === 401 || envelope.code === 403)
148
+ return result('unauthorized');
149
+ if (envelope.code !== 200 || !envelope.data?.user || !envelope.data?.tenant)
150
+ return result('unavailable');
151
+ return result('authorized');
152
+ }
153
+ catch {
154
+ return result('unavailable');
155
+ }
156
+ }
43
157
  export function redactToken(token) {
44
158
  if (token.length <= 8)
45
- return '********';
159
+ return "********";
46
160
  return `${token.slice(0, 4)}…${token.slice(-4)}`;
47
161
  }
162
+ export function sessionSummary(session) {
163
+ return {
164
+ schemaVersion: session.schemaVersion,
165
+ baseUrl: session.baseUrl,
166
+ accessToken: redactToken(session.accessToken),
167
+ refreshTokenConfigured: Boolean(session.refreshToken),
168
+ accessTokenExpiresAt: session.accessTokenExpiresAt,
169
+ refreshTokenExpiresAt: session.refreshTokenExpiresAt,
170
+ savedAt: session.savedAt,
171
+ source: session.source,
172
+ };
173
+ }
174
+ export class OpenXiangdaDeveloperSession {
175
+ session;
176
+ options;
177
+ refreshInFlight;
178
+ validated = false;
179
+ constructor(session, options = {}) {
180
+ this.session = session;
181
+ this.options = options;
182
+ }
183
+ static async load(options = {}) {
184
+ const session = await loadSession(options.sessionPath);
185
+ return session ? new OpenXiangdaDeveloperSession(session, options) : null;
186
+ }
187
+ get baseUrl() {
188
+ return this.session.baseUrl;
189
+ }
190
+ summary() {
191
+ return sessionSummary(this.session);
192
+ }
193
+ assertPlatform(linkedBaseUrl) {
194
+ const linked = normalizePlatformBaseUrl(linkedBaseUrl);
195
+ if (linked !== this.session.baseUrl) {
196
+ throw new DeveloperSessionError("OPENXIANGDA_PLATFORM_SESSION_MISMATCH", `工作区绑定平台 ${linked} 与当前登录平台 ${this.session.baseUrl} 不一致;为防止凭据跨平台发送,请切换登录会话或重新绑定工作区`);
197
+ }
198
+ }
199
+ async getAccessToken(input = {}) {
200
+ if (input.forceRefresh || this.shouldRefresh()) {
201
+ await this.refresh();
202
+ }
203
+ if (!this.validated) {
204
+ try {
205
+ await this.requestWhoami(this.session.accessToken);
206
+ }
207
+ catch (error) {
208
+ if (!this.isUnauthorized(error) || !this.session.refreshToken)
209
+ throw error;
210
+ await this.refresh();
211
+ await this.requestWhoami(this.session.accessToken);
212
+ }
213
+ this.validated = true;
214
+ }
215
+ return this.session.accessToken;
216
+ }
217
+ async whoami() {
218
+ if (this.shouldRefresh())
219
+ await this.refresh();
220
+ try {
221
+ const identity = await this.requestWhoami(this.session.accessToken);
222
+ this.validated = true;
223
+ return identity;
224
+ }
225
+ catch (error) {
226
+ if (!this.isUnauthorized(error) || !this.session.refreshToken)
227
+ throw error;
228
+ await this.refresh();
229
+ const identity = await this.requestWhoami(this.session.accessToken);
230
+ this.validated = true;
231
+ return identity;
232
+ }
233
+ }
234
+ async logout() {
235
+ let serverRevoked = false;
236
+ let serverError;
237
+ try {
238
+ const token = await this.getAccessToken();
239
+ await this.request("/openxiangda-api/v2/auth/logout", {
240
+ method: "POST",
241
+ token,
242
+ body: "{}",
243
+ });
244
+ serverRevoked = true;
245
+ }
246
+ catch (error) {
247
+ serverError = error instanceof Error ? error.message : String(error);
248
+ }
249
+ finally {
250
+ if (this.session.source === "file") {
251
+ await clearSession(this.options.sessionPath);
252
+ }
253
+ }
254
+ return { loggedOut: true, serverRevoked, ...(serverError ? { serverError } : {}) };
255
+ }
256
+ shouldRefresh() {
257
+ return Boolean(this.session.refreshToken &&
258
+ this.session.accessTokenExpiresAt &&
259
+ this.session.accessTokenExpiresAt <= this.now() + 30_000);
260
+ }
261
+ async refresh() {
262
+ if (this.refreshInFlight)
263
+ return await this.refreshInFlight;
264
+ if (!this.session.refreshToken || this.session.source === "environment") {
265
+ throw new DeveloperSessionError("OPENXIANGDA_AUTH_REFRESH_UNAVAILABLE", "当前身份不能自动刷新,请重新登录或更新 CI token");
266
+ }
267
+ const pending = this.performRefresh();
268
+ this.refreshInFlight = pending;
269
+ try {
270
+ return await pending;
271
+ }
272
+ finally {
273
+ if (this.refreshInFlight === pending)
274
+ this.refreshInFlight = undefined;
275
+ }
276
+ }
277
+ async performRefresh() {
278
+ const pair = await this.request("/openxiangda-api/v2/auth/refresh", {
279
+ method: "POST",
280
+ body: JSON.stringify({ refreshToken: this.session.refreshToken }),
281
+ });
282
+ if (!pair.accessToken || !pair.refreshToken) {
283
+ throw new DeveloperSessionError("OPENXIANGDA_AUTH_REFRESH_INVALID", "平台返回了无效的刷新结果");
284
+ }
285
+ await saveSession({ baseUrl: this.session.baseUrl, ...pair }, this.options.sessionPath);
286
+ this.session = {
287
+ schemaVersion: 2,
288
+ baseUrl: this.session.baseUrl,
289
+ ...pair,
290
+ savedAt: new Date(this.now()).toISOString(),
291
+ source: "file",
292
+ };
293
+ this.validated = false;
294
+ return this.session;
295
+ }
296
+ async requestWhoami(token) {
297
+ return await this.request("/openxiangda-api/v2/auth/whoami", { token });
298
+ }
299
+ async request(path, input = {}) {
300
+ const response = await this.fetch(`${this.session.baseUrl}${path}`, {
301
+ method: input.method || "GET",
302
+ headers: {
303
+ Accept: "application/json",
304
+ ...(input.body ? { "Content-Type": "application/json" } : {}),
305
+ ...(input.token ? { Authorization: `Bearer ${input.token}` } : {}),
306
+ },
307
+ ...(input.body ? { body: input.body } : {}),
308
+ });
309
+ return await parseEnvelope(response);
310
+ }
311
+ isUnauthorized(error) {
312
+ return (error instanceof DeveloperSessionError &&
313
+ (error.status === 401 || error.code === "OPENXIANGDA_AUTH_REQUIRED"));
314
+ }
315
+ get fetch() {
316
+ return this.options.fetch || globalThis.fetch.bind(globalThis);
317
+ }
318
+ now() {
319
+ return (this.options.now || Date.now)();
320
+ }
321
+ }
322
+ export async function authorizeDeveloperSession(input) {
323
+ const baseUrl = normalizePlatformBaseUrl(input.baseUrl);
324
+ const fetcher = input.fetch || globalThis.fetch.bind(globalThis);
325
+ const startResponse = await fetcher(`${baseUrl}/openxiangda-api/v2/auth/cli-sessions`, {
326
+ method: "POST",
327
+ headers: { Accept: "application/json", "Content-Type": "application/json" },
328
+ body: JSON.stringify({ baseUrl }),
329
+ });
330
+ const authorization = await parseEnvelope(startResponse);
331
+ await input.onAuthorization?.(authorization);
332
+ const deadline = Date.now() + authorization.expireIn * 1000;
333
+ while (Date.now() < deadline) {
334
+ await delay(Math.max(250, input.pollIntervalMs || 1500));
335
+ const pollResponse = await fetcher(`${baseUrl}/openxiangda-api/v2/auth/cli-sessions/${encodeURIComponent(authorization.sessionId)}`, {
336
+ headers: {
337
+ Accept: "application/json",
338
+ "X-OpenXiangda-CLI-Poll-Secret": authorization.pollSecret,
339
+ },
340
+ });
341
+ const poll = await parseEnvelope(pollResponse);
342
+ if (poll.status === "pending")
343
+ continue;
344
+ if (poll.status !== "authorized" || !poll.accessToken) {
345
+ throw new DeveloperSessionError("OPENXIANGDA_CLI_AUTH_NOT_AUTHORIZED", poll.status === "expired" ? "CLI 授权会话已过期" : "CLI 授权会话未获批准");
346
+ }
347
+ const transient = {
348
+ schemaVersion: 2,
349
+ baseUrl,
350
+ accessToken: poll.accessToken,
351
+ ...(poll.refreshToken ? { refreshToken: poll.refreshToken } : {}),
352
+ ...(poll.accessTokenExpiresAt
353
+ ? { accessTokenExpiresAt: poll.accessTokenExpiresAt }
354
+ : {}),
355
+ ...(poll.refreshTokenExpiresAt
356
+ ? { refreshTokenExpiresAt: poll.refreshTokenExpiresAt }
357
+ : {}),
358
+ savedAt: "validation",
359
+ source: "file",
360
+ };
361
+ const manager = new OpenXiangdaDeveloperSession(transient, { fetch: fetcher });
362
+ const identity = await manager.whoami();
363
+ const summary = await saveSession(transient, input.sessionPath);
364
+ return { session: summary, identity };
365
+ }
366
+ throw new DeveloperSessionError("OPENXIANGDA_CLI_AUTH_EXPIRED", "CLI 授权会话已过期");
367
+ }
368
+ async function parseEnvelope(response) {
369
+ let envelope;
370
+ try {
371
+ envelope = (await response.json());
372
+ }
373
+ catch {
374
+ throw new DeveloperSessionError("OPENXIANGDA_AUTH_RESPONSE_INVALID", "平台身份接口返回的不是有效 JSON", response.status);
375
+ }
376
+ if (!response.ok || Number(envelope.code) >= 400) {
377
+ throw new DeveloperSessionError(envelope.errorCode ||
378
+ (Number(envelope.code) === 401
379
+ ? "OPENXIANGDA_AUTH_REQUIRED"
380
+ : "OPENXIANGDA_AUTH_REQUEST_FAILED"), envelope.message || `平台身份请求失败: ${response.status}`, response.status === 200 ? Number(envelope.code) : response.status, envelope.data);
381
+ }
382
+ return envelope.data;
383
+ }
384
+ async function delay(milliseconds) {
385
+ await new Promise((resolve) => setTimeout(resolve, milliseconds));
386
+ }
48
387
  //# sourceMappingURL=session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ export interface CurrentUserFixtureOptions {
2
+ userId?: string;
3
+ appCode?: string;
4
+ environmentKey?: "preproduction" | "production";
5
+ roleCodes?: string[];
6
+ capabilityCodes?: string[];
7
+ isAppSuperAdmin?: boolean;
8
+ }
9
+ export interface CurrentUserFixture {
10
+ userId: string;
11
+ appCode: string;
12
+ environmentKey: "preproduction" | "production";
13
+ roleCodes: string[];
14
+ capabilityCodes: string[];
15
+ isAppSuperAdmin: boolean;
16
+ }
17
+ export interface PermissionMatrixCase<TData = Record<string, unknown>> {
18
+ name: string;
19
+ currentUser: CurrentUserFixture;
20
+ operation: "list" | "read" | "create" | "update" | "delete";
21
+ data?: TData;
22
+ expected: "allow" | "deny";
23
+ }
24
+ export interface PermissionMatrixResult {
25
+ name: string;
26
+ expected: "allow" | "deny";
27
+ actual: "allow" | "deny";
28
+ passed: boolean;
29
+ }
30
+ export interface DataRecordEventFixtureOptions {
31
+ eventId?: string;
32
+ eventType?: DataEventTypeV2;
33
+ tenantId?: string;
34
+ appCode?: string;
35
+ environmentKey?: "preproduction" | "production";
36
+ resourceCode?: string;
37
+ recordId?: string;
38
+ revision?: number;
39
+ changedFields?: string[];
40
+ changes?: DataRecordEventData["changes"];
41
+ projection?: DataRecordEventData["projection"];
42
+ time?: string;
43
+ }
44
+ export interface EventSimulationResult {
45
+ matched: boolean;
46
+ event: CloudEvent<DataRecordEventData> | null;
47
+ }
48
+ export interface SignedEventDeliveryFixture {
49
+ rawBody: string;
50
+ headers: Record<string, string>;
51
+ handlerManifestDigest: string;
52
+ }
53
+ export type PermissionAuthorizer<TData = Record<string, unknown>> = (testCase: PermissionMatrixCase<TData>) => Promise<boolean> | boolean;
54
+ export declare class PermissionMatrixError extends Error {
55
+ readonly results: PermissionMatrixResult[];
56
+ constructor(results: PermissionMatrixResult[]);
57
+ }
58
+ export declare function currentUserFixture(options?: CurrentUserFixtureOptions): CurrentUserFixture;
59
+ export declare function dataRecordEventFixture(options?: DataRecordEventFixtureOptions): CloudEvent<DataRecordEventData>;
60
+ export declare function signedEventDeliveryFixture(input: {
61
+ event: CloudEvent;
62
+ subscriptionCode: string;
63
+ deliveryId: string;
64
+ signingSecret: string;
65
+ signingKeyVersion?: number;
66
+ handlerManifest: EventHandlerManifest;
67
+ timestamp?: number;
68
+ }): SignedEventDeliveryFixture;
69
+ export declare function eventMatchesSubscription(event: CloudEvent<DataRecordEventData>, filter?: EventSubscriptionFilter): boolean;
70
+ export declare function simulateEventSubscription(event: CloudEvent<DataRecordEventData>, input: {
71
+ filter?: EventSubscriptionFilter;
72
+ payload?: Partial<EventSubscriptionPayload>;
73
+ }): EventSimulationResult;
74
+ export declare function runPermissionMatrix<TData>(cases: PermissionMatrixCase<TData>[], authorize: PermissionAuthorizer<TData>): Promise<PermissionMatrixResult[]>;
75
+ export declare function assertPermissionMatrix<TData>(cases: PermissionMatrixCase<TData>[], authorize: PermissionAuthorizer<TData>): Promise<PermissionMatrixResult[]>;
76
+ import { type CloudEvent, type DataEventTypeV2, type DataRecordEventData, type EventSubscriptionFilter, type EventSubscriptionPayload, type EventHandlerManifest } from "openxiangda-contracts";
77
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}