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.
- package/INSTALL.md +2 -0
- package/README.en.md +190 -6
- package/README.md +209 -8
- package/dist/api/agent-query-api.d.ts +27 -0
- package/dist/api/agent-query-api.js +31 -0
- package/dist/api/agent-query-api.js.map +1 -1
- package/dist/api/bill-query-api.d.ts +61 -0
- package/dist/api/bill-query-api.js +92 -0
- package/dist/api/bill-query-api.js.map +1 -0
- package/dist/api/managed-agent-resource-api.d.ts +19 -0
- package/dist/api/managed-agent-resource-api.js +63 -0
- package/dist/api/managed-agent-resource-api.js.map +1 -0
- package/dist/api/market-query-api.d.ts +74 -0
- package/dist/api/market-query-api.js +145 -0
- package/dist/api/market-query-api.js.map +1 -0
- package/dist/api/order-query-api.d.ts +47 -0
- package/dist/api/order-query-api.js +96 -0
- package/dist/api/order-query-api.js.map +1 -0
- package/dist/api/ppt-api.d.ts +258 -0
- package/dist/api/ppt-api.js +111 -0
- package/dist/api/ppt-api.js.map +1 -0
- package/dist/api/publish-api.d.ts +1 -0
- package/dist/api/publish-api.js +3 -0
- package/dist/api/publish-api.js.map +1 -1
- package/dist/api/security-review-api.d.ts +1 -1
- package/dist/api/security-review-api.js +15 -1
- package/dist/api/security-review-api.js.map +1 -1
- package/dist/api/site-analysis-api.d.ts +85 -0
- package/dist/api/site-analysis-api.js +165 -0
- package/dist/api/site-analysis-api.js.map +1 -0
- package/dist/auth/browser-login.d.ts +1 -0
- package/dist/auth/browser-login.js +25 -2
- package/dist/auth/browser-login.js.map +1 -1
- package/dist/auth/credential-status.d.ts +4 -0
- package/dist/auth/credential-status.js +19 -0
- package/dist/auth/credential-status.js.map +1 -0
- package/dist/auth/pat-store.js +14 -3
- package/dist/auth/pat-store.js.map +1 -1
- package/dist/auth/windows-credential-acl.d.ts +2 -0
- package/dist/auth/windows-credential-acl.js +68 -0
- package/dist/auth/windows-credential-acl.js.map +1 -0
- package/dist/commands/agent/index.d.ts +3 -0
- package/dist/commands/agent/index.js +68 -0
- package/dist/commands/agent/index.js.map +1 -0
- package/dist/commands/auth/login.js +8 -3
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/auth/status.d.ts +1 -1
- package/dist/commands/auth/status.js +7 -2
- package/dist/commands/auth/status.js.map +1 -1
- package/dist/commands/bill/index.d.ts +3 -0
- package/dist/commands/bill/index.js +106 -0
- package/dist/commands/bill/index.js.map +1 -0
- package/dist/commands/chat/create.js +1 -0
- package/dist/commands/chat/create.js.map +1 -1
- package/dist/commands/chat/interaction.js +39 -6
- package/dist/commands/chat/interaction.js.map +1 -1
- package/dist/commands/chat/message.js +56 -34
- package/dist/commands/chat/message.js.map +1 -1
- package/dist/commands/chat/publish.js +72 -11
- package/dist/commands/chat/publish.js.map +1 -1
- package/dist/commands/chat/security.d.ts +1 -1
- package/dist/commands/chat/security.js +73 -29
- package/dist/commands/chat/security.js.map +1 -1
- package/dist/commands/independent-creation.d.ts +6 -0
- package/dist/commands/independent-creation.js +140 -0
- package/dist/commands/independent-creation.js.map +1 -0
- package/dist/commands/market/index.d.ts +3 -0
- package/dist/commands/market/index.js +111 -0
- package/dist/commands/market/index.js.map +1 -0
- package/dist/commands/order/index.d.ts +3 -0
- package/dist/commands/order/index.js +41 -0
- package/dist/commands/order/index.js.map +1 -0
- package/dist/commands/ppt/index.d.ts +3 -0
- package/dist/commands/ppt/index.js +159 -0
- package/dist/commands/ppt/index.js.map +1 -0
- package/dist/commands/session/diff.d.ts +4 -0
- package/dist/commands/session/diff.js +12 -0
- package/dist/commands/session/diff.js.map +1 -0
- package/dist/commands/session/history.d.ts +3 -0
- package/dist/commands/session/history.js +50 -0
- package/dist/commands/session/history.js.map +1 -0
- package/dist/commands/session/index.js +4 -0
- package/dist/commands/session/index.js.map +1 -1
- package/dist/commands/shared.d.ts +2 -2
- package/dist/commands/shared.js +5 -4
- package/dist/commands/shared.js.map +1 -1
- package/dist/commands/site/index.d.ts +3 -0
- package/dist/commands/site/index.js +113 -0
- package/dist/commands/site/index.js.map +1 -0
- package/dist/commands/system/version.js +13 -2
- package/dist/commands/system/version.js.map +1 -1
- package/dist/conversation/managed-agent-create-only.d.ts +26 -0
- package/dist/conversation/managed-agent-create-only.js +287 -0
- package/dist/conversation/managed-agent-create-only.js.map +1 -0
- package/dist/conversation/managed-agent-entry.d.ts +8 -8
- package/dist/conversation/ppt-preflight.d.ts +13 -0
- package/dist/conversation/ppt-preflight.js +68 -0
- package/dist/conversation/ppt-preflight.js.map +1 -0
- package/dist/conversation/project-check-preflight.d.ts +22 -0
- package/dist/conversation/project-check-preflight.js +89 -0
- package/dist/conversation/project-check-preflight.js.map +1 -0
- package/dist/conversation/publish-preflight.d.ts +44 -0
- package/dist/conversation/publish-preflight.js +123 -0
- package/dist/conversation/publish-preflight.js.map +1 -0
- package/dist/conversation/security-entry.d.ts +14 -0
- package/dist/conversation/security-entry.js +49 -0
- package/dist/conversation/security-entry.js.map +1 -0
- package/dist/conversation/security-review.d.ts +1 -1
- package/dist/conversation/security-review.js +1 -1
- package/dist/conversation/security-review.js.map +1 -1
- package/dist/conversation/snapshot-diff.d.ts +44 -0
- package/dist/conversation/snapshot-diff.js +134 -0
- package/dist/conversation/snapshot-diff.js.map +1 -0
- package/dist/interactions/managed-agent-model.d.ts +3 -0
- package/dist/interactions/managed-agent-model.js +2 -0
- package/dist/interactions/managed-agent-model.js.map +1 -1
- package/dist/interactions/managed-agent-wizard.d.ts +1 -1
- package/dist/interactions/managed-agent-wizard.js +38 -6
- package/dist/interactions/managed-agent-wizard.js.map +1 -1
- package/dist/program.js +12 -0
- package/dist/program.js.map +1 -1
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.js +2 -2
- package/dist/runtime.js.map +1 -1
- package/dist/site-analysis/pagespeed-report.d.ts +48 -0
- package/dist/site-analysis/pagespeed-report.js +163 -0
- package/dist/site-analysis/pagespeed-report.js.map +1 -0
- package/dist/transport/http-client.js +17 -3
- package/dist/transport/http-client.js.map +1 -1
- 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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"}
|
|
@@ -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
|
-
|
|
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":"AAAA,iDAAiD;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
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"}
|
package/dist/auth/pat-store.js
CHANGED
|
@@ -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()
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,sCAAsC;AACtC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACvF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"pat-store.js","sourceRoot":"","sources":["../../src/auth/pat-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,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
|
-
/**
|
|
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({
|
|
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,
|
|
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
|
-
/**
|
|
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
|
-
.
|
|
7
|
-
|
|
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;
|
|
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"}
|