superun-ai-cli 0.1.46 → 0.1.66

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 (130) hide show
  1. package/INSTALL.md +2 -0
  2. package/README.en.md +190 -6
  3. package/README.md +209 -8
  4. package/dist/api/agent-query-api.d.ts +27 -0
  5. package/dist/api/agent-query-api.js +31 -0
  6. package/dist/api/agent-query-api.js.map +1 -1
  7. package/dist/api/bill-query-api.d.ts +61 -0
  8. package/dist/api/bill-query-api.js +92 -0
  9. package/dist/api/bill-query-api.js.map +1 -0
  10. package/dist/api/managed-agent-resource-api.d.ts +19 -0
  11. package/dist/api/managed-agent-resource-api.js +63 -0
  12. package/dist/api/managed-agent-resource-api.js.map +1 -0
  13. package/dist/api/market-query-api.d.ts +74 -0
  14. package/dist/api/market-query-api.js +145 -0
  15. package/dist/api/market-query-api.js.map +1 -0
  16. package/dist/api/order-query-api.d.ts +47 -0
  17. package/dist/api/order-query-api.js +96 -0
  18. package/dist/api/order-query-api.js.map +1 -0
  19. package/dist/api/ppt-api.d.ts +258 -0
  20. package/dist/api/ppt-api.js +111 -0
  21. package/dist/api/ppt-api.js.map +1 -0
  22. package/dist/api/publish-api.d.ts +1 -0
  23. package/dist/api/publish-api.js +3 -0
  24. package/dist/api/publish-api.js.map +1 -1
  25. package/dist/api/security-review-api.d.ts +1 -1
  26. package/dist/api/security-review-api.js +15 -1
  27. package/dist/api/security-review-api.js.map +1 -1
  28. package/dist/api/site-analysis-api.d.ts +85 -0
  29. package/dist/api/site-analysis-api.js +165 -0
  30. package/dist/api/site-analysis-api.js.map +1 -0
  31. package/dist/auth/browser-login.d.ts +1 -0
  32. package/dist/auth/browser-login.js +25 -2
  33. package/dist/auth/browser-login.js.map +1 -1
  34. package/dist/auth/credential-status.d.ts +4 -0
  35. package/dist/auth/credential-status.js +19 -0
  36. package/dist/auth/credential-status.js.map +1 -0
  37. package/dist/auth/pat-store.js +14 -3
  38. package/dist/auth/pat-store.js.map +1 -1
  39. package/dist/auth/windows-credential-acl.d.ts +2 -0
  40. package/dist/auth/windows-credential-acl.js +68 -0
  41. package/dist/auth/windows-credential-acl.js.map +1 -0
  42. package/dist/commands/agent/index.d.ts +3 -0
  43. package/dist/commands/agent/index.js +68 -0
  44. package/dist/commands/agent/index.js.map +1 -0
  45. package/dist/commands/auth/login.js +8 -3
  46. package/dist/commands/auth/login.js.map +1 -1
  47. package/dist/commands/auth/status.d.ts +1 -1
  48. package/dist/commands/auth/status.js +7 -2
  49. package/dist/commands/auth/status.js.map +1 -1
  50. package/dist/commands/bill/index.d.ts +3 -0
  51. package/dist/commands/bill/index.js +106 -0
  52. package/dist/commands/bill/index.js.map +1 -0
  53. package/dist/commands/chat/create.js +1 -0
  54. package/dist/commands/chat/create.js.map +1 -1
  55. package/dist/commands/chat/interaction.js +39 -6
  56. package/dist/commands/chat/interaction.js.map +1 -1
  57. package/dist/commands/chat/message.js +56 -34
  58. package/dist/commands/chat/message.js.map +1 -1
  59. package/dist/commands/chat/publish.js +72 -11
  60. package/dist/commands/chat/publish.js.map +1 -1
  61. package/dist/commands/chat/security.d.ts +1 -1
  62. package/dist/commands/chat/security.js +73 -29
  63. package/dist/commands/chat/security.js.map +1 -1
  64. package/dist/commands/independent-creation.d.ts +6 -0
  65. package/dist/commands/independent-creation.js +140 -0
  66. package/dist/commands/independent-creation.js.map +1 -0
  67. package/dist/commands/market/index.d.ts +3 -0
  68. package/dist/commands/market/index.js +111 -0
  69. package/dist/commands/market/index.js.map +1 -0
  70. package/dist/commands/order/index.d.ts +3 -0
  71. package/dist/commands/order/index.js +41 -0
  72. package/dist/commands/order/index.js.map +1 -0
  73. package/dist/commands/ppt/index.d.ts +3 -0
  74. package/dist/commands/ppt/index.js +159 -0
  75. package/dist/commands/ppt/index.js.map +1 -0
  76. package/dist/commands/session/diff.d.ts +4 -0
  77. package/dist/commands/session/diff.js +12 -0
  78. package/dist/commands/session/diff.js.map +1 -0
  79. package/dist/commands/session/history.d.ts +3 -0
  80. package/dist/commands/session/history.js +50 -0
  81. package/dist/commands/session/history.js.map +1 -0
  82. package/dist/commands/session/index.js +4 -0
  83. package/dist/commands/session/index.js.map +1 -1
  84. package/dist/commands/shared.d.ts +2 -2
  85. package/dist/commands/shared.js +5 -4
  86. package/dist/commands/shared.js.map +1 -1
  87. package/dist/commands/site/index.d.ts +3 -0
  88. package/dist/commands/site/index.js +113 -0
  89. package/dist/commands/site/index.js.map +1 -0
  90. package/dist/commands/system/version.js +13 -2
  91. package/dist/commands/system/version.js.map +1 -1
  92. package/dist/conversation/managed-agent-create-only.d.ts +26 -0
  93. package/dist/conversation/managed-agent-create-only.js +287 -0
  94. package/dist/conversation/managed-agent-create-only.js.map +1 -0
  95. package/dist/conversation/managed-agent-entry.d.ts +8 -8
  96. package/dist/conversation/ppt-preflight.d.ts +13 -0
  97. package/dist/conversation/ppt-preflight.js +68 -0
  98. package/dist/conversation/ppt-preflight.js.map +1 -0
  99. package/dist/conversation/project-check-preflight.d.ts +22 -0
  100. package/dist/conversation/project-check-preflight.js +89 -0
  101. package/dist/conversation/project-check-preflight.js.map +1 -0
  102. package/dist/conversation/publish-preflight.d.ts +44 -0
  103. package/dist/conversation/publish-preflight.js +123 -0
  104. package/dist/conversation/publish-preflight.js.map +1 -0
  105. package/dist/conversation/security-entry.d.ts +14 -0
  106. package/dist/conversation/security-entry.js +49 -0
  107. package/dist/conversation/security-entry.js.map +1 -0
  108. package/dist/conversation/security-review.d.ts +1 -1
  109. package/dist/conversation/security-review.js +1 -1
  110. package/dist/conversation/security-review.js.map +1 -1
  111. package/dist/conversation/snapshot-diff.d.ts +44 -0
  112. package/dist/conversation/snapshot-diff.js +134 -0
  113. package/dist/conversation/snapshot-diff.js.map +1 -0
  114. package/dist/interactions/managed-agent-model.d.ts +3 -0
  115. package/dist/interactions/managed-agent-model.js +2 -0
  116. package/dist/interactions/managed-agent-model.js.map +1 -1
  117. package/dist/interactions/managed-agent-wizard.d.ts +1 -1
  118. package/dist/interactions/managed-agent-wizard.js +38 -6
  119. package/dist/interactions/managed-agent-wizard.js.map +1 -1
  120. package/dist/program.js +12 -0
  121. package/dist/program.js.map +1 -1
  122. package/dist/runtime.d.ts +1 -1
  123. package/dist/runtime.js +2 -2
  124. package/dist/runtime.js.map +1 -1
  125. package/dist/site-analysis/pagespeed-report.d.ts +48 -0
  126. package/dist/site-analysis/pagespeed-report.js +163 -0
  127. package/dist/site-analysis/pagespeed-report.js.map +1 -0
  128. package/dist/transport/http-client.js +17 -3
  129. package/dist/transport/http-client.js.map +1 -1
  130. package/package.json +1 -1
@@ -0,0 +1,165 @@
1
+ /** 网站分析只读接口与结果投影。@author xiuyu.yi */
2
+ import { z } from 'zod';
3
+ import { parseWire } from '../contracts/node-wire.js';
4
+ import { object } from '../contracts/value.js';
5
+ import { CliError } from '../output/exit-codes.js';
6
+ import { REPORT_CATEGORIES, readPageSpeedReport } from '../site-analysis/pagespeed-report.js';
7
+ const optionalText = z.string().nullish();
8
+ const integer = z.number().int().safe();
9
+ const timestamp = integer.nullish();
10
+ const pagespeedSchema = z
11
+ .object({
12
+ sessionId: z.string().min(1),
13
+ strategy: optionalText,
14
+ status: integer.min(0).max(15),
15
+ updatedAt: timestamp,
16
+ accessibility: optionalText,
17
+ bestPractices: optionalText,
18
+ performance: optionalText,
19
+ seo: optionalText,
20
+ })
21
+ .nullish();
22
+ const monitorSchema = z.object({
23
+ sessionId: z.string().min(1),
24
+ published: z.boolean(),
25
+ currentPublishedSnapshotId: integer.nullish(),
26
+ currentPublishedVersion: optionalText,
27
+ planId: optionalText,
28
+ status: optionalText,
29
+ frequency: optionalText,
30
+ outdated: z.boolean().nullish(),
31
+ lastRunAt: timestamp,
32
+ nextRunAt: timestamp,
33
+ selectedEndpointIds: z.array(z.string()),
34
+ candidates: z.array(z.object({
35
+ id: z.string().min(1),
36
+ displayName: optionalText,
37
+ targetType: optionalText,
38
+ method: optionalText,
39
+ path: optionalText,
40
+ monitorable: z.boolean().nullish(),
41
+ blockedReasonCode: optionalText,
42
+ })),
43
+ latestResults: z.array(z.object({
44
+ endpointId: z.string().min(1),
45
+ status: z.string().min(1),
46
+ httpStatus: integer.nullish(),
47
+ latencyMs: integer.nonnegative().nullish(),
48
+ checkedAt: timestamp,
49
+ })),
50
+ notice: optionalText,
51
+ });
52
+ const reportsSchema = z.array(z.object({
53
+ id: z.string().min(1),
54
+ weekStart: integer,
55
+ weekEnd: integer,
56
+ summary: z.string(),
57
+ createdAt: integer,
58
+ }));
59
+ const trafficRowsSchema = z
60
+ .array(z.object({
61
+ date: z.string().min(1),
62
+ visits: z.number().finite().nonnegative(),
63
+ pageviews: z.number().finite().nonnegative(),
64
+ }))
65
+ .min(1);
66
+ const listRowsSchema = z
67
+ .array(z.object({ label: z.string(), value: z.number().finite().nonnegative() }))
68
+ .min(1);
69
+ const RESULT_EXPLANATIONS = {
70
+ SUCCESS: '该监测项在记录时间检查成功,不代表整个网站当前健康',
71
+ HTTP_ERROR: '该监测项返回了异常 HTTP 状态',
72
+ AUTH_FAILED: '该监测项认证失败',
73
+ TIMEOUT: '该监测项检查超时',
74
+ NETWORK_BLOCKED: '该监测项网络访问受限',
75
+ INCONCLUSIVE: '该监测项结果无法确定',
76
+ PAUSED: '该监测项已暂停',
77
+ };
78
+ export const TRAFFIC_RANGE_DESCRIPTIONS = {
79
+ today: '服务端当天零点至今;时区由服务端决定',
80
+ yesterday: '服务端昨天零点至今天零点前;时区由服务端决定',
81
+ last7Days: '服务端7天前零点至今,并非固定最近168小时;时区由服务端决定',
82
+ };
83
+ function available(conditions) {
84
+ return conditions.every(Boolean) ? 'AVAILABLE' : conditions.some(Boolean) ? 'PARTIAL' : 'UNKNOWN';
85
+ }
86
+ export class SiteAnalysisApi {
87
+ client;
88
+ constructor(client) {
89
+ this.client = client;
90
+ }
91
+ async traffic(sessionId, range) {
92
+ const params = new URLSearchParams({ timeRange: range, sessionId });
93
+ const raw = parseWire(z.record(z.unknown()), (await this.client.request(`/web-api/analysis?${params}`, undefined, { method: 'GET' })).data);
94
+ const currentAvailable = typeof raw.currentVisitors === 'number' &&
95
+ Number.isFinite(raw.currentVisitors) &&
96
+ raw.currentVisitors > 0;
97
+ const rows = trafficRowsSchema.safeParse(object(object(raw.timeSeries).result).data);
98
+ const rawLists = Array.isArray(raw.lists) ? raw.lists.map(object) : [];
99
+ const labels = { source: 'Source', page: 'Page', country: 'Country', device: 'Device' };
100
+ const lists = Object.fromEntries(Object.entries(labels).map(([key, label]) => {
101
+ const matches = rawLists.filter((entry) => entry.label === label);
102
+ const parsed = listRowsSchema.safeParse(matches.length === 1 ? matches[0]?.data : undefined);
103
+ return [
104
+ key,
105
+ {
106
+ availability: parsed.success ? 'AVAILABLE' : 'UNKNOWN',
107
+ items: parsed.success ? parsed.data.slice(0, 5) : [],
108
+ },
109
+ ];
110
+ }));
111
+ return {
112
+ availability: available([
113
+ currentAvailable,
114
+ rows.success,
115
+ ...Object.values(lists).map((entry) => entry.availability === 'AVAILABLE'),
116
+ ]),
117
+ traffic: {
118
+ currentVisitors: {
119
+ availability: currentAvailable ? 'AVAILABLE' : 'UNKNOWN',
120
+ value: currentAvailable ? raw.currentVisitors : null,
121
+ },
122
+ series: {
123
+ availability: rows.success ? 'AVAILABLE' : 'UNKNOWN',
124
+ items: rows.success ? rows.data : [],
125
+ },
126
+ lists,
127
+ },
128
+ };
129
+ }
130
+ async performance(sessionId) {
131
+ const record = parseWire(pagespeedSchema, await this.client.call('/api/uxa-center/agent/AgentQuery/querySessionPagespeed', { sessionId }));
132
+ if (!record)
133
+ return { availability: 'NO_REPORT', reports: [] };
134
+ if (record.sessionId !== sessionId)
135
+ throw new CliError('PROTOCOL_ERROR', '性能报告目标与本次作品不一致');
136
+ const reports = await Promise.all(REPORT_CATEGORIES.map((category) => readPageSpeedReport(sessionId, category, record[category.field], record.status, this.client.signal)));
137
+ return {
138
+ availability: available(reports.map((report) => report.availability === 'AVAILABLE')),
139
+ recordedAt: record.updatedAt ?? null,
140
+ strategy: record.strategy ?? null,
141
+ statusMask: record.status,
142
+ reports,
143
+ };
144
+ }
145
+ async overview(sessionId) {
146
+ const monitor = parseWire(monitorSchema, await this.client.call('/api/uxa-center/agent/RuntimeMonitor/overview', { sessionId }));
147
+ if (monitor.sessionId !== sessionId)
148
+ throw new CliError('PROTOCOL_ERROR', '巡检结果目标与本次作品不一致');
149
+ return {
150
+ ...monitor,
151
+ latestResults: monitor.latestResults.map((result) => ({
152
+ ...result,
153
+ selected: monitor.selectedEndpointIds.includes(result.endpointId),
154
+ statusExplanation: RESULT_EXPLANATIONS[result.status] ?? '未知监测状态,不能判断是否健康',
155
+ })),
156
+ };
157
+ }
158
+ async reports(sessionId, page, pageSize) {
159
+ const items = parseWire(reportsSchema, await this.client.call('/api/uxa-center/agent/RuntimeMonitor/reports', { sessionId, page, pageSize }));
160
+ if (items.length > pageSize)
161
+ throw new CliError('PROTOCOL_ERROR', '巡检周报返回数量超过请求页大小');
162
+ return items;
163
+ }
164
+ }
165
+ //# sourceMappingURL=site-analysis-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-analysis-api.js","sourceRoot":"","sources":["../../src/api/site-analysis-api.ts"],"names":[],"mappings":"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"}
@@ -8,5 +8,6 @@ export declare function ensurePat(options: {
8
8
  output: OutputWriter;
9
9
  signal: AbortSignal;
10
10
  allowBrowser: boolean;
11
+ verifyExisting?: boolean;
11
12
  name: string;
12
13
  }): Promise<PatCredential>;
@@ -7,6 +7,7 @@ import { object, text } from '../contracts/value.js';
7
7
  import { CliError } from '../output/exit-codes.js';
8
8
  import { ApiClient } from '../transport/api-client.js';
9
9
  import { PatStore, validatePat } from './pat-store.js';
10
+ import { isCredentialRejected, verifyCredential } from './credential-status.js';
10
11
  async function openBrowser(url, signal) {
11
12
  const [command, args] = process.platform === 'darwin'
12
13
  ? ['open', [url]]
@@ -27,8 +28,30 @@ async function openBrowser(url, signal) {
27
28
  export async function ensurePat(options) {
28
29
  const { store, config, output, signal: commandSignal, allowBrowser, name } = options;
29
30
  const existing = await store.readIfPresent();
30
- if (existing)
31
- return existing;
31
+ if (existing) {
32
+ output.registerSecret(existing.pat);
33
+ if (!options.verifyExisting)
34
+ return existing;
35
+ try {
36
+ await verifyCredential(new ApiClient(config, existing.pat, undefined, commandSignal));
37
+ return existing;
38
+ }
39
+ catch (error) {
40
+ if (!isCredentialRejected(error))
41
+ throw error;
42
+ if (existing.source === 'env')
43
+ throw new CliError('AUTH_REQUIRED', 'SUPERUN_PAT 已被拒绝,请更新或移除该环境变量后重新登录', {
44
+ authFailure: 'CREDENTIAL_REJECTED',
45
+ credentialSource: 'env',
46
+ });
47
+ if (config.endpoint !== DEFAULT_ENDPOINT)
48
+ throw new CliError('AUTH_REQUIRED', '目标环境拒绝了当前 PAT,请核对 endpoint 与对应环境的凭据', {
49
+ authFailure: 'CREDENTIAL_REJECTED',
50
+ credentialSource: 'file',
51
+ });
52
+ // 旧凭据先保留,只有完整网页登录成功后才原子替换。
53
+ }
54
+ }
32
55
  if (!allowBrowser)
33
56
  throw new CliError('AUTH_REQUIRED', '未配置 PAT,请执行 superun-ai auth login;脚本中请设置 SUPERUN_PAT 或使用 auth login --stdin');
34
57
  // 认证统一使用 superun 站点,业务地址不影响登录与凭据签发。
@@ -1 +1 @@
1
- {"version":3,"file":"browser-login.js","sourceRoot":"","sources":["../../src/auth/browser-login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser-login.js","sourceRoot":"","sources":["../../src/auth/browser-login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { CliError } from '../output/exit-codes.js';
2
+ import type { ApiClient } from '../transport/api-client.js';
3
+ export declare function isCredentialRejected(error: unknown): error is CliError;
4
+ export declare function verifyCredential(client: ApiClient): Promise<void>;
@@ -0,0 +1,19 @@
1
+ /** 在线核对 PAT,不读取或选择具体作品。@author xiuyu.yi */
2
+ import { object } from '../contracts/value.js';
3
+ import { CliError } from '../output/exit-codes.js';
4
+ export function isCredentialRejected(error) {
5
+ return (error instanceof CliError &&
6
+ error.code === 'AUTH_REQUIRED' &&
7
+ (error.details.httpStatus === 401 || String(error.details.businessCode) === '1000011'));
8
+ }
9
+ export async function verifyCredential(client) {
10
+ const response = object(await client.call('/api/uxa-center/agent/AgentQuery/pageQuerySessionByLastId', {
11
+ pageSize: 1,
12
+ modes: [6],
13
+ scopes: ['mine'],
14
+ }));
15
+ // 空列表同样是有效登录;只校验结构,不输出列表或改变项目绑定。
16
+ if (![response.data, response.items, response.list].some(Array.isArray))
17
+ throw new CliError('PROTOCOL_ERROR', '登录校验未返回有效分页结构,请稍后重试');
18
+ }
19
+ //# sourceMappingURL=credential-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-status.js","sourceRoot":"","sources":["../../src/auth/credential-status.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGnD,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,CACL,KAAK,YAAY,QAAQ;QACzB,KAAK,CAAC,IAAI,KAAK,eAAe;QAC9B,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,SAAS,CAAC,CACvF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAiB;IACtD,MAAM,QAAQ,GAAG,MAAM,CACrB,MAAM,MAAM,CAAC,IAAI,CAAC,2DAA2D,EAAE;QAC7E,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,CAAC,CAAC,CAAC;QACV,MAAM,EAAE,CAAC,MAAM,CAAC;KACjB,CAAC,CACH,CAAC;IACF,iCAAiC;IACjC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACrE,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CAAC;AAChE,CAAC"}
@@ -6,6 +6,7 @@ import { randomUUID } from 'node:crypto';
6
6
  import { PACKAGE_NAME, PAT_PREFIX } from '../config/constants.js';
7
7
  import { CliError } from '../output/exit-codes.js';
8
8
  import { object, text } from '../contracts/value.js';
9
+ import { protectWindowsCredential, verifyWindowsCredential } from './windows-credential-acl.js';
9
10
  export const CREDENTIAL_DIRECTORY = join(homedir(), '.config', PACKAGE_NAME);
10
11
  export function validatePat(value) {
11
12
  const pat = value.trim();
@@ -31,7 +32,12 @@ export class PatStore {
31
32
  const path = join(this.directory, 'credentials.json');
32
33
  try {
33
34
  const stat = await lstat(path);
34
- if (!stat.isFile() || stat.isSymbolicLink() || (stat.mode & 0o077) !== 0) {
35
+ if (!stat.isFile() || stat.isSymbolicLink()) {
36
+ throw new CliError('AUTH_REQUIRED', '本地凭据必须为普通文件,不能使用符号链接');
37
+ }
38
+ if (process.platform === 'win32')
39
+ await verifyWindowsCredential(path);
40
+ else if ((stat.mode & 0o077) !== 0) {
35
41
  throw new CliError('AUTH_REQUIRED', '本地凭据必须为权限 0600 的普通文件,请重新执行 auth login');
36
42
  }
37
43
  const value = JSON.parse(await readFile(path, 'utf8'));
@@ -46,12 +52,17 @@ export class PatStore {
46
52
  }
47
53
  }
48
54
  async save(pat) {
55
+ const validPat = validatePat(pat);
49
56
  await mkdir(this.directory, { recursive: true, mode: 0o700 });
50
- await chmod(this.directory, 0o700);
57
+ if (process.platform !== 'win32')
58
+ await chmod(this.directory, 0o700);
51
59
  const temporary = join(this.directory, `.credentials-${randomUUID()}.tmp`);
52
60
  const handle = await open(temporary, 'wx', 0o600);
53
61
  try {
54
- await handle.writeFile(JSON.stringify({ pat: validatePat(pat), createdAt: new Date().toISOString() }));
62
+ // Windows 先收紧空临时文件的 ACL 并读回校验,成功后才写入秘密。
63
+ if (process.platform === 'win32')
64
+ await protectWindowsCredential(temporary);
65
+ await handle.writeFile(JSON.stringify({ pat: validPat, createdAt: new Date().toISOString() }));
55
66
  await handle.sync();
56
67
  await handle.close();
57
68
  await rename(temporary, join(this.directory, 'credentials.json'));
@@ -1 +1 @@
1
- {"version":3,"file":"pat-store.js","sourceRoot":"","sources":["../../src/auth/pat-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pat-store.js","sourceRoot":"","sources":["../../src/auth/pat-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const protectWindowsCredential: (path: string) => Promise<void>;
2
+ export declare const verifyWindowsCredential: (path: string) => Promise<void>;
@@ -0,0 +1,68 @@
1
+ /** Windows 凭据使用系统 ACL,不把 POSIX mode 当作权限依据。@author xiuyu.yi */
2
+ import { execFile } from 'node:child_process';
3
+ import { win32 } from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ import { CliError } from '../output/exit-codes.js';
6
+ const execute = promisify(execFile);
7
+ // 只传文件路径,不向 PowerShell 传递 PAT、用户配置或业务环境变量。
8
+ async function credentialAcl(path, protect) {
9
+ const systemRoot = process.env.SystemRoot ?? process.env.SYSTEMROOT;
10
+ if (!systemRoot || !win32.isAbsolute(systemRoot))
11
+ throw new CliError('AUTH_REQUIRED', '无法定位 Windows 系统权限工具,不能安全读写本地 PAT');
12
+ const script = `
13
+ $ErrorActionPreference = 'Stop'
14
+ try {
15
+ $path = $env:SUPERUN_CREDENTIAL_ACL_PATH
16
+ $user = [System.Security.Principal.WindowsIdentity]::GetCurrent().User
17
+ $sidType = [System.Security.Principal.SecurityIdentifier]
18
+ ${protect
19
+ ? `
20
+ $acl = [System.Security.AccessControl.FileSecurity]::new()
21
+ $acl.SetOwner($user)
22
+ $acl.SetAccessRuleProtection($true, $false)
23
+ $rule = [System.Security.AccessControl.FileSystemAccessRule]::new(
24
+ $user, [System.Security.AccessControl.FileSystemRights]::FullControl,
25
+ [System.Security.AccessControl.AccessControlType]::Allow)
26
+ $acl.AddAccessRule($rule)
27
+ Microsoft.PowerShell.Security\\Set-Acl -LiteralPath $path -AclObject $acl
28
+ `
29
+ : ''}
30
+ $acl = Microsoft.PowerShell.Security\\Get-Acl -LiteralPath $path
31
+ if ($acl.GetOwner($sidType).Value -ne $user.Value) { exit 2 }
32
+ $allowed = @($user.Value, 'S-1-5-18', 'S-1-5-32-544')
33
+ $hasUser = $false
34
+ foreach ($rule in $acl.GetAccessRules($true, $true, $sidType)) {
35
+ if ($rule.AccessControlType -ne [System.Security.AccessControl.AccessControlType]::Allow) { continue }
36
+ if ($allowed -notcontains $rule.IdentityReference.Value) { exit 2 }
37
+ if ($rule.IdentityReference.Value -eq $user.Value) { $hasUser = $true }
38
+ }
39
+ if (-not $hasUser) { exit 2 }
40
+ [Console]::Out.Write('SUPERUN_ACL_OK')
41
+ } catch { exit 1 }
42
+ `;
43
+ try {
44
+ const { stdout } = await execute(win32.join(systemRoot, 'System32', 'WindowsPowerShell', 'v1.0', 'powershell.exe'), [
45
+ '-NoLogo',
46
+ '-NoProfile',
47
+ '-NonInteractive',
48
+ '-EncodedCommand',
49
+ Buffer.from(script, 'utf16le').toString('base64'),
50
+ ], {
51
+ shell: false,
52
+ windowsHide: true,
53
+ timeout: 15_000,
54
+ maxBuffer: 4096,
55
+ env: { SystemRoot: systemRoot, WINDIR: systemRoot, SUPERUN_CREDENTIAL_ACL_PATH: path },
56
+ });
57
+ if (stdout.trim() !== 'SUPERUN_ACL_OK')
58
+ throw new Error('ACL_CHECK_FAILED');
59
+ }
60
+ catch {
61
+ throw new CliError('AUTH_REQUIRED', protect
62
+ ? '无法安全设置 Windows 凭据 ACL,未保存 PAT;请检查当前用户的文件权限'
63
+ : 'Windows 凭据 ACL 校验未通过;仅允许当前用户、SYSTEM 和本机管理员访问,请核对权限或重新导入凭据', { authFailure: 'CREDENTIAL_PERMISSION_DENIED' });
64
+ }
65
+ }
66
+ export const protectWindowsCredential = (path) => credentialAcl(path, true);
67
+ export const verifyWindowsCredential = (path) => credentialAcl(path, false);
68
+ //# sourceMappingURL=windows-credential-acl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-credential-acl.js","sourceRoot":"","sources":["../../src/auth/windows-credential-acl.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEpC,2CAA2C;AAC3C,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,OAAgB;IACzD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACpE,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;QAC9C,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,kCAAkC,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG;;;;;;IAOb,OAAO;QACL,CAAC,CAAC;;;;;;;;;GASL;QACG,CAAC,CAAC,EACN;;;;;;;;;;;;;CAaD,CAAC;IACA,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,OAAO,CAC9B,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,EAAE,gBAAgB,CAAC,EACjF;YACE,SAAS;YACT,YAAY;YACZ,iBAAiB;YACjB,iBAAiB;YACjB,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;SAClD,EACD;YACE,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,IAAI;YACf,GAAG,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,2BAA2B,EAAE,IAAI,EAAE;SACvF,CACF,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,gBAAgB;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAChB,eAAe,EACf,OAAO;YACL,CAAC,CAAC,4CAA4C;YAC9C,CAAC,CAAC,2DAA2D,EAC/D,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAChD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAAY,EAAiB,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACnG,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,IAAY,EAAiB,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import type { CommandContext } from '../shared.js';
3
+ export declare function registerAgent(program: Command, context: CommandContext): void;
@@ -0,0 +1,68 @@
1
+ /** 只搭建托管智能体配置,复用官方入口和既有向导。@author xiuyu.yi */
2
+ import { InvalidArgumentError } from 'commander';
3
+ import { z } from 'zod';
4
+ import { runtime, readInput, businessWrite } from '../shared.js';
5
+ import { object } from '../../contracts/value.js';
6
+ import { CliError } from '../../output/exit-codes.js';
7
+ import { startAgentCreation } from '../../conversation/managed-agent-create-only.js';
8
+ import { ManagedAgentResourceApi, validateManagedAgentId } from '../../api/managed-agent-resource-api.js';
9
+ import { registerIndependentCreation } from '../independent-creation.js';
10
+ function sessionValue(value) {
11
+ if (!value || /[\s,\/\\?#]/.test(value))
12
+ throw new InvalidArgumentError('请明确一个主项目sessionId,不能传分支链接或多个目标');
13
+ return value;
14
+ }
15
+ export function registerAgent(program, context) {
16
+ const agent = program.command('agent').description('搭建托管智能体配置并读回资源,不运行或部署');
17
+ registerIndependentCreation(agent.command('app').description('从需求独立搭建智能体应用'), context, 'agent-app');
18
+ agent
19
+ .command('create')
20
+ .argument('<sessionId>', '本次明确的主项目资源域', sessionValue)
21
+ .description('提交官方智能体创建入口,只创建资源;后续用chat state查看向导')
22
+ .option('--message <text>', '本次智能体工作说明,最多4000字符')
23
+ .option('--input <file>', '仅含content或message的JSON,-表示标准输入')
24
+ .action(async (sessionId, _options, command) => {
25
+ const options = command.opts();
26
+ if ((options.message !== undefined) === (options.input !== undefined))
27
+ throw new CliError('INVALID_ARGUMENT', '--message和--input必须且只能选一个');
28
+ const input = z
29
+ .object({ content: z.string().optional(), message: z.string().optional() })
30
+ .strict()
31
+ .safeParse(options.input !== undefined ? await readInput(options.input) : { message: options.message });
32
+ if (!input.success || (input.data.content !== undefined && input.data.message !== undefined))
33
+ throw new CliError('INVALID_ARGUMENT', '工作说明JSON只能包含content或message之一');
34
+ const description = (input.data.content ?? input.data.message ?? '').trim();
35
+ if (!description || description.length > 4000)
36
+ throw new CliError('INVALID_ARGUMENT', '智能体工作说明须为1至4000字符');
37
+ const service = await runtime(context, command);
38
+ const response = object(await businessWrite(context, service, sessionId, () => startAgentCreation(service, sessionId, description)));
39
+ const result = await service.accepted(response, sessionId, false, {});
40
+ context.output.write({
41
+ ...result,
42
+ managedAgentEntry: {
43
+ createOnly: true,
44
+ sessionId,
45
+ sourceMessageId: response.sourceMessageId ?? response.messageId ?? null,
46
+ reused: response.reused === true,
47
+ phase: response.entryPending ? 'ENTRY_PENDING' : 'SUBMITTED',
48
+ },
49
+ });
50
+ });
51
+ agent
52
+ .command('get')
53
+ .argument('<sessionId>', '资源所属的同一主项目', sessionValue)
54
+ .argument('<agentId>', '平台返回的公开uxagent_智能体ID', validateManagedAgentId)
55
+ .description('在指定项目资源域只读核验已创建智能体,不创建测试运行会话')
56
+ .action(async (sessionId, agentId, _options, command) => {
57
+ const service = await runtime(context, command);
58
+ const resource = await new ManagedAgentResourceApi(service.client).getAgent(sessionId, agentId);
59
+ context.output.write({
60
+ state: 'COMPLETED',
61
+ resourceSessionId: sessionId,
62
+ agentId,
63
+ verified: true,
64
+ agent: resource,
65
+ });
66
+ });
67
+ }
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/agent/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** 复用已有 PAT,缺失时通过网页登录领取;支持手动导入。@author xiuyu.yi */
1
+ /** 校验并复用已有 PAT,缺失或失效时通过网页登录领取;支持手动导入。@author xiuyu.yi */
2
2
  import { Option } from 'commander';
3
3
  import { readPatFromStdin } from '../../auth/pat-store.js';
4
4
  import { requireCredentials } from '../shared.js';
@@ -10,8 +10,13 @@ export function registerLogin(auth, context) {
10
10
  .option('--stdin', '从标准输入读取 PAT')
11
11
  .action(async (options, command) => {
12
12
  if (!options.pat && !options.stdin) {
13
- const { credentialSource } = await requireCredentials(context, command, true);
14
- context.output.write({ state: 'CONFIGURED', credentialSource });
13
+ const { credentialSource } = await requireCredentials(context, command, true, true);
14
+ context.output.write({
15
+ state: 'CONFIGURED',
16
+ credentialSource,
17
+ authenticated: true,
18
+ checkedOnline: true,
19
+ });
15
20
  return;
16
21
  }
17
22
  const pat = await readPatFromStdin(!options.stdin);
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,UAAU,aAAa,CAAC,IAAa,EAAE,OAAuB;IAClE,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,oBAAoB,CAAC;SACjC,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;SAClE,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,OAA2C,EAAE,OAAgB,EAAE,EAAE;QAC9E,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,UAAU,aAAa,CAAC,IAAa,EAAE,OAAuB;IAClE,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,oBAAoB,CAAC;SACjC,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;SAClE,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,OAA2C,EAAE,OAAgB,EAAE,EAAE;QAC9E,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACpF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;gBACnB,KAAK,EAAE,YAAY;gBACnB,gBAAgB;gBAChB,aAAa,EAAE,IAAI;gBACnB,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,4 +1,4 @@
1
- /** 查看本地 PAT 配置状态,不额外请求业务接口。@author xiuyu.yi */
1
+ /** 默认查看本地配置,可显式在线核对已有 PAT。@author xiuyu.yi */
2
2
  import type { Command } from 'commander';
3
3
  import type { CommandContext } from '../shared.js';
4
4
  export declare function registerStatus(auth: Command, context: CommandContext): void;
@@ -1,13 +1,18 @@
1
1
  import { requireCredentials } from '../shared.js';
2
+ import { verifyCredential } from '../../auth/credential-status.js';
2
3
  export function registerStatus(auth, context) {
3
4
  auth
4
5
  .command('status')
5
6
  .description('查看本地 PAT 配置状态')
6
- .action(async (_options, command) => {
7
- const { credentialSource } = await requireCredentials(context, command);
7
+ .option('--online', '只读验证当前 PAT 是否仍有效,不打开浏览器')
8
+ .action(async (options, command) => {
9
+ const { credentialSource, service } = await requireCredentials(context, command);
10
+ if (options.online)
11
+ await verifyCredential(service.client);
8
12
  context.output.write({
9
13
  state: 'CONFIGURED',
10
14
  credentialSource,
15
+ ...(options.online ? { authenticated: true, checkedOnline: true } : {}),
11
16
  });
12
17
  });
13
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,UAAU,cAAc,CAAC,IAAa,EAAE,OAAuB;IACnE,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,KAAK,EAAE,QAAiB,EAAE,OAAgB,EAAE,EAAE;QACpD,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YACnB,KAAK,EAAE,YAAY;YACnB,gBAAgB;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,MAAM,UAAU,cAAc,CAAC,IAAa,EAAE,OAAuB;IACnE,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,UAAU,EAAE,yBAAyB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,OAA6B,EAAE,OAAgB,EAAE,EAAE;QAChE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjF,IAAI,OAAO,CAAC,MAAM;YAAE,MAAM,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YACnB,KAAK,EAAE,YAAY;YACnB,gBAAgB;YAChB,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import type { CommandContext } from '../shared.js';
3
+ export declare function registerBill(program: Command, context: CommandContext): void;