@sireai/optimus 0.1.44 → 0.1.46
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/dist/cli/feedback-delivery.js +13 -8
- package/dist/cli/feedback-delivery.js.map +1 -1
- package/dist/cli/optimus.js +370 -63
- package/dist/cli/optimus.js.map +1 -1
- package/dist/integrations/feishu/feishu-client.d.ts +13 -0
- package/dist/integrations/feishu/feishu-client.js +111 -6
- package/dist/integrations/feishu/feishu-client.js.map +1 -1
- package/dist/integrations/feishu/feishu-reference-material-downloader.d.ts +34 -0
- package/dist/integrations/feishu/feishu-reference-material-downloader.js +572 -0
- package/dist/integrations/feishu/feishu-reference-material-downloader.js.map +1 -0
- package/dist/integrations/feishu/feishu-token-store.d.ts +25 -1
- package/dist/integrations/feishu/feishu-token-store.js +148 -4
- package/dist/integrations/feishu/feishu-token-store.js.map +1 -1
- package/dist/integrations/feishu/feishu-user-auth-service.d.ts +39 -0
- package/dist/integrations/feishu/feishu-user-auth-service.js +228 -0
- package/dist/integrations/feishu/feishu-user-auth-service.js.map +1 -0
- package/dist/integrations/jira/jira-cli.js +127 -19
- package/dist/integrations/jira/jira-cli.js.map +1 -1
- package/dist/task-environment/delivery/commit-message/coder-commit-message-template.d.ts +12 -0
- package/dist/task-environment/delivery/commit-message/coder-commit-message-template.js +105 -0
- package/dist/task-environment/delivery/commit-message/coder-commit-message-template.js.map +1 -0
- package/dist/task-environment/delivery/commit-message/commit-message-builder.js +2 -1
- package/dist/task-environment/delivery/commit-message/commit-message-builder.js.map +1 -1
- package/dist/task-environment/delivery/feishu-analysis-doc-service.d.ts +6 -0
- package/dist/task-environment/delivery/feishu-analysis-doc-service.js +106 -34
- package/dist/task-environment/delivery/feishu-analysis-doc-service.js.map +1 -1
- package/dist/task-environment/delivery/feishu-content/feishu-content-renderer.js +16 -1
- package/dist/task-environment/delivery/feishu-content/feishu-content-renderer.js.map +1 -1
- package/dist/task-environment/delivery/feishu-content/feishu-copy-config.d.ts +6 -0
- package/dist/task-environment/delivery/feishu-content/feishu-copy-config.js +19 -0
- package/dist/task-environment/delivery/feishu-content/feishu-copy-config.js.map +1 -1
- package/dist/task-environment/delivery/feishu-notifier.js +13 -11
- package/dist/task-environment/delivery/feishu-notifier.js.map +1 -1
- package/dist/task-environment/delivery/feishu-templates/coder-message-template.d.ts +6 -0
- package/dist/task-environment/delivery/feishu-templates/coder-message-template.js +58 -0
- package/dist/task-environment/delivery/feishu-templates/coder-message-template.js.map +1 -0
- package/dist/task-environment/delivery/feishu-templates/template-registry.js +2 -0
- package/dist/task-environment/delivery/feishu-templates/template-registry.js.map +1 -1
- package/dist/task-environment/delivery/task-delivery-dispatcher.js +6 -0
- package/dist/task-environment/delivery/task-delivery-dispatcher.js.map +1 -1
- package/dist/task-environment/delivery/task-delivery-service.d.ts +1 -0
- package/dist/task-environment/delivery/task-delivery-service.js +124 -8
- package/dist/task-environment/delivery/task-delivery-service.js.map +1 -1
- package/dist/task-environment/delivery/task-publication-service.js +9 -6
- package/dist/task-environment/delivery/task-publication-service.js.map +1 -1
- package/dist/task-environment/document-input/document-structure.d.ts +13 -0
- package/dist/task-environment/document-input/document-structure.js +438 -0
- package/dist/task-environment/document-input/document-structure.js.map +1 -0
- package/dist/task-environment/intake/manual-problem-intake.js +36 -0
- package/dist/task-environment/intake/manual-problem-intake.js.map +1 -1
- package/dist/task-environment/observability/logger.d.ts +1 -0
- package/dist/task-environment/observability/logger.js +26 -0
- package/dist/task-environment/observability/logger.js.map +1 -1
- package/dist/task-environment/observability/runtime-panel.js +10 -1
- package/dist/task-environment/observability/runtime-panel.js.map +1 -1
- package/dist/task-environment/orchestration/reference-material-relocator.d.ts +2 -0
- package/dist/task-environment/orchestration/reference-material-relocator.js +69 -0
- package/dist/task-environment/orchestration/reference-material-relocator.js.map +1 -0
- package/dist/task-environment/orchestration/task-orchestrator.d.ts +3 -0
- package/dist/task-environment/orchestration/task-orchestrator.js +182 -8
- package/dist/task-environment/orchestration/task-orchestrator.js.map +1 -1
- package/dist/task-environment/orchestration/task-package-inputs.js +7 -1
- package/dist/task-environment/orchestration/task-package-inputs.js.map +1 -1
- package/dist/task-environment/orchestration/task-runtime-policy.js +11 -0
- package/dist/task-environment/orchestration/task-runtime-policy.js.map +1 -1
- package/dist/task-environment/orchestration/triage-runner.js +3 -0
- package/dist/task-environment/orchestration/triage-runner.js.map +1 -1
- package/dist/task-environment/runtime/optimus-runtime.js +3 -0
- package/dist/task-environment/runtime/optimus-runtime.js.map +1 -1
- package/dist/task-environment/storage/sqlite-task-store.d.ts +4 -0
- package/dist/task-environment/storage/sqlite-task-store.js +70 -1
- package/dist/task-environment/storage/sqlite-task-store.js.map +1 -1
- package/dist/task-environment/task-handler-descriptor.d.ts +5 -0
- package/dist/task-environment/task-handler-descriptor.js +15 -0
- package/dist/task-environment/task-handler-descriptor.js.map +1 -0
- package/dist/types.d.ts +47 -1
- package/embedded-skills/shared/feishu-task-inputs/SKILL.md +56 -0
- package/embedded-skills/shared/feishu-task-inputs/scripts/fetch-feishu-doc.mjs +756 -0
- package/embedded-skills/shared/feishu-task-inputs/skill.json +5 -0
- package/package.json +4 -1
- package/task-harnesses/coder/ACCEPT.md +73 -0
- package/task-harnesses/coder/CONSTRAINTS.md +72 -0
- package/task-harnesses/coder/CONTEXT.md +36 -0
- package/task-harnesses/coder/EVOLUTION.md +83 -0
- package/task-harnesses/coder/ROLE.md +39 -0
- package/task-harnesses/coder/STANDARD.md +258 -0
- package/task-harnesses/coder/manifest.json +13 -0
- package/task-harnesses/pm/ACCEPT.md +7 -0
- package/task-harnesses/pm/CONSTRAINTS.md +5 -0
- package/task-harnesses/pm/ROLE.md +5 -8
- package/task-harnesses/pm/STANDARD.md +83 -124
- package/task-harnesses/registry.json +4 -0
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
2
3
|
import { dirname, join } from "node:path";
|
|
3
4
|
import { resolveDefaultDataRootDir } from "../../config/optimus-paths.js";
|
|
4
5
|
export function resolveDefaultFeishuTokenPath() {
|
|
5
6
|
return join(resolveDefaultDataRootDir(), "feishu-token.json");
|
|
6
7
|
}
|
|
8
|
+
export function resolveLegacyFeishuCliTokenPath() {
|
|
9
|
+
return join(homedir(), ".feishu", "auth.json");
|
|
10
|
+
}
|
|
7
11
|
export class FileFeishuTokenStore {
|
|
8
12
|
path;
|
|
9
|
-
|
|
13
|
+
legacyCliPath;
|
|
14
|
+
static LEGACY_IMPORT_DISABLED_FLAG = "legacyImportDisabled";
|
|
15
|
+
constructor(path = resolveDefaultFeishuTokenPath(), legacyCliPath = resolveLegacyFeishuCliTokenPath()) {
|
|
10
16
|
this.path = path;
|
|
17
|
+
this.legacyCliPath = legacyCliPath;
|
|
11
18
|
}
|
|
12
19
|
async readTenantToken() {
|
|
13
20
|
try {
|
|
@@ -24,11 +31,148 @@ export class FileFeishuTokenStore {
|
|
|
24
31
|
}
|
|
25
32
|
}
|
|
26
33
|
async writeTenantToken(record) {
|
|
27
|
-
await
|
|
28
|
-
await
|
|
34
|
+
const current = await this.readRaw();
|
|
35
|
+
await this.writeRaw({
|
|
36
|
+
...current,
|
|
37
|
+
tenantAccessToken: record.tenantAccessToken,
|
|
38
|
+
expireAtMs: record.expireAtMs
|
|
39
|
+
});
|
|
29
40
|
}
|
|
30
41
|
async clearTenantToken() {
|
|
31
|
-
await this.
|
|
42
|
+
const current = await this.readRaw();
|
|
43
|
+
await this.writeRaw({
|
|
44
|
+
...current,
|
|
45
|
+
tenantAccessToken: "",
|
|
46
|
+
expireAtMs: 0
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async readUserToken() {
|
|
50
|
+
try {
|
|
51
|
+
const parsed = await this.readRaw();
|
|
52
|
+
const record = normalizeStoredUserTokenRecord(parsed);
|
|
53
|
+
if (record) {
|
|
54
|
+
return record;
|
|
55
|
+
}
|
|
56
|
+
if (parsed[FileFeishuTokenStore.LEGACY_IMPORT_DISABLED_FLAG] === "true") {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const imported = await this.readLegacyCliUserToken();
|
|
60
|
+
if (imported) {
|
|
61
|
+
await this.writeUserToken(imported).catch(() => undefined);
|
|
62
|
+
return imported;
|
|
63
|
+
}
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async writeUserToken(record) {
|
|
71
|
+
const current = await this.readRaw();
|
|
72
|
+
await this.writeRaw({
|
|
73
|
+
...current,
|
|
74
|
+
userAccessToken: record.userAccessToken,
|
|
75
|
+
refreshToken: record.refreshToken,
|
|
76
|
+
userExpireAtMs: record.expireAtMs,
|
|
77
|
+
refreshExpireAtMs: record.refreshExpireAtMs,
|
|
78
|
+
...(record.openId ? { openId: record.openId } : {}),
|
|
79
|
+
...(record.tenantKey ? { tenantKey: record.tenantKey } : {}),
|
|
80
|
+
...(record.userId ? { userId: record.userId } : {}),
|
|
81
|
+
source: record.source ?? "optimus",
|
|
82
|
+
[FileFeishuTokenStore.LEGACY_IMPORT_DISABLED_FLAG]: "false"
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async clearUserToken() {
|
|
86
|
+
const current = await this.readRaw();
|
|
87
|
+
delete current.userAccessToken;
|
|
88
|
+
delete current.refreshToken;
|
|
89
|
+
delete current.userExpireAtMs;
|
|
90
|
+
delete current.refreshExpireAtMs;
|
|
91
|
+
delete current.openId;
|
|
92
|
+
delete current.tenantKey;
|
|
93
|
+
delete current.userId;
|
|
94
|
+
delete current.source;
|
|
95
|
+
current[FileFeishuTokenStore.LEGACY_IMPORT_DISABLED_FLAG] = "true";
|
|
96
|
+
await this.writeRaw(current);
|
|
97
|
+
}
|
|
98
|
+
async adoptLegacyUserToken() {
|
|
99
|
+
const current = await this.readRaw();
|
|
100
|
+
if (current[FileFeishuTokenStore.LEGACY_IMPORT_DISABLED_FLAG] === "true") {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
const imported = await this.readLegacyCliUserToken();
|
|
104
|
+
if (!imported) {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
await this.writeUserToken(imported).catch(() => undefined);
|
|
108
|
+
return imported;
|
|
109
|
+
}
|
|
110
|
+
async readRaw() {
|
|
111
|
+
try {
|
|
112
|
+
return JSON.parse(await readFile(this.path, "utf8"));
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return {};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async readLegacyCliUserToken() {
|
|
119
|
+
try {
|
|
120
|
+
const parsed = JSON.parse(await readFile(this.legacyCliPath, "utf8"));
|
|
121
|
+
const userAccessToken = readTrimmedString(parsed.access_token);
|
|
122
|
+
const refreshToken = readTrimmedString(parsed.refresh_token);
|
|
123
|
+
const expireAtMs = normalizeLegacyEpochMs(parsed.expires_at);
|
|
124
|
+
const refreshExpireAtMs = normalizeLegacyEpochMs(parsed.refresh_expires_at);
|
|
125
|
+
if (!userAccessToken || !refreshToken || !Number.isFinite(expireAtMs) || !Number.isFinite(refreshExpireAtMs)) {
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
userAccessToken,
|
|
130
|
+
refreshToken,
|
|
131
|
+
expireAtMs,
|
|
132
|
+
refreshExpireAtMs,
|
|
133
|
+
...(readTrimmedString(parsed.open_id) ? { openId: readTrimmedString(parsed.open_id) } : {}),
|
|
134
|
+
...(readTrimmedString(parsed.tenant_key) ? { tenantKey: readTrimmedString(parsed.tenant_key) } : {}),
|
|
135
|
+
...(readTrimmedString(parsed.user_id) ? { userId: readTrimmedString(parsed.user_id) } : {}),
|
|
136
|
+
source: "feishu_cli"
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async writeRaw(payload) {
|
|
144
|
+
await mkdir(dirname(this.path), { recursive: true });
|
|
145
|
+
await writeFile(this.path, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function readTrimmedString(value) {
|
|
149
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
150
|
+
}
|
|
151
|
+
function normalizeStoredUserTokenRecord(parsed) {
|
|
152
|
+
const userAccessToken = readTrimmedString(parsed.userAccessToken);
|
|
153
|
+
const refreshToken = readTrimmedString(parsed.refreshToken);
|
|
154
|
+
const expireAtMs = Number(parsed.userExpireAtMs ?? parsed.expireAtMs);
|
|
155
|
+
const refreshExpireAtMs = Number(parsed.refreshExpireAtMs);
|
|
156
|
+
if (!userAccessToken || !refreshToken || !Number.isFinite(expireAtMs) || !Number.isFinite(refreshExpireAtMs)) {
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
const source = readTrimmedString(parsed.source);
|
|
160
|
+
return {
|
|
161
|
+
userAccessToken,
|
|
162
|
+
refreshToken,
|
|
163
|
+
expireAtMs,
|
|
164
|
+
refreshExpireAtMs,
|
|
165
|
+
...(readTrimmedString(parsed.openId) ? { openId: readTrimmedString(parsed.openId) } : {}),
|
|
166
|
+
...(readTrimmedString(parsed.tenantKey) ? { tenantKey: readTrimmedString(parsed.tenantKey) } : {}),
|
|
167
|
+
...(readTrimmedString(parsed.userId) ? { userId: readTrimmedString(parsed.userId) } : {}),
|
|
168
|
+
...(source === "optimus" || source === "feishu_cli" ? { source } : {})
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function normalizeLegacyEpochMs(value) {
|
|
172
|
+
const numeric = Number(value);
|
|
173
|
+
if (!Number.isFinite(numeric)) {
|
|
174
|
+
return Number.NaN;
|
|
32
175
|
}
|
|
176
|
+
return numeric > 1e12 ? numeric : numeric * 1000;
|
|
33
177
|
}
|
|
34
178
|
//# sourceMappingURL=feishu-token-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feishu-token-store.js","sourceRoot":"","sources":["../../../src/integrations/feishu/feishu-token-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"feishu-token-store.js","sourceRoot":"","sources":["../../../src/integrations/feishu/feishu-token-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { OptimusConfig } from "../../types.js";
|
|
2
|
+
import { type FeishuTokenStore, type FeishuUserTokenRecord } from "./feishu-token-store.js";
|
|
3
|
+
export interface FeishuUserAuthServiceOptions {
|
|
4
|
+
config?: Pick<OptimusConfig, "delivery">;
|
|
5
|
+
baseUrl?: string;
|
|
6
|
+
env?: NodeJS.ProcessEnv;
|
|
7
|
+
fetchImpl?: typeof globalThis.fetch;
|
|
8
|
+
tokenStore?: FeishuTokenStore;
|
|
9
|
+
openBrowserImpl?: (url: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export interface FeishuDeviceAuthorizationResult {
|
|
12
|
+
verificationUriComplete: string;
|
|
13
|
+
expiresIn: number;
|
|
14
|
+
openId?: string;
|
|
15
|
+
tenantKey?: string;
|
|
16
|
+
userId?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class FeishuUserAuthService {
|
|
19
|
+
private readonly env;
|
|
20
|
+
private readonly fetchImpl;
|
|
21
|
+
private readonly tokenStore;
|
|
22
|
+
private readonly appConfig;
|
|
23
|
+
private readonly openBrowserImpl;
|
|
24
|
+
constructor(options?: FeishuUserAuthServiceOptions);
|
|
25
|
+
hasAuthorizedUser(): Promise<boolean>;
|
|
26
|
+
readAuthorizedUser(): Promise<FeishuUserTokenRecord | undefined>;
|
|
27
|
+
clearAuthorizedUser(): Promise<void>;
|
|
28
|
+
adoptLegacyCliSession(): Promise<FeishuUserTokenRecord | undefined>;
|
|
29
|
+
loginDeviceCode(options?: {
|
|
30
|
+
openBrowser?: boolean;
|
|
31
|
+
onVerificationUri?: (url: string, expiresIn: number) => void;
|
|
32
|
+
}): Promise<FeishuDeviceAuthorizationResult>;
|
|
33
|
+
private requestDeviceAuthorization;
|
|
34
|
+
private pollDeviceToken;
|
|
35
|
+
refreshUserToken(record: FeishuUserTokenRecord): Promise<FeishuUserTokenRecord>;
|
|
36
|
+
private postOauthToken;
|
|
37
|
+
private tryReadUserInfo;
|
|
38
|
+
private readJsonResponse;
|
|
39
|
+
}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { platform } from "node:os";
|
|
3
|
+
import { resolveFeishuAuthAppConfig } from "./feishu-auth-config.js";
|
|
4
|
+
import { FileFeishuTokenStore } from "./feishu-token-store.js";
|
|
5
|
+
const FEISHU_USER_AUTH_SCOPES = [
|
|
6
|
+
"docs:doc",
|
|
7
|
+
"docs:doc:readonly",
|
|
8
|
+
"docs:document.media:download",
|
|
9
|
+
"docx:document",
|
|
10
|
+
"docx:document:readonly",
|
|
11
|
+
"wiki:node:read",
|
|
12
|
+
"wiki:wiki",
|
|
13
|
+
"wiki:wiki:readonly",
|
|
14
|
+
"drive:file:readonly",
|
|
15
|
+
"offline_access"
|
|
16
|
+
].join(" ");
|
|
17
|
+
export class FeishuUserAuthService {
|
|
18
|
+
env;
|
|
19
|
+
fetchImpl;
|
|
20
|
+
tokenStore;
|
|
21
|
+
appConfig;
|
|
22
|
+
openBrowserImpl;
|
|
23
|
+
constructor(options = {}) {
|
|
24
|
+
this.env = options.env ?? process.env;
|
|
25
|
+
this.fetchImpl = options.fetchImpl ?? globalThis.fetch?.bind(globalThis);
|
|
26
|
+
this.tokenStore = options.tokenStore ?? new FileFeishuTokenStore();
|
|
27
|
+
this.appConfig = resolveFeishuAuthAppConfig(this.env, options.baseUrl
|
|
28
|
+
? { baseUrl: options.baseUrl }
|
|
29
|
+
: options.config?.delivery.feishu?.baseUrl
|
|
30
|
+
? { baseUrl: options.config.delivery.feishu.baseUrl }
|
|
31
|
+
: undefined);
|
|
32
|
+
this.openBrowserImpl = options.openBrowserImpl ?? openBrowser;
|
|
33
|
+
}
|
|
34
|
+
async hasAuthorizedUser() {
|
|
35
|
+
return Boolean((await this.tokenStore.readUserToken())?.userAccessToken);
|
|
36
|
+
}
|
|
37
|
+
async readAuthorizedUser() {
|
|
38
|
+
return await this.tokenStore.readUserToken();
|
|
39
|
+
}
|
|
40
|
+
async clearAuthorizedUser() {
|
|
41
|
+
await this.tokenStore.clearUserToken();
|
|
42
|
+
}
|
|
43
|
+
async adoptLegacyCliSession() {
|
|
44
|
+
if (typeof this.tokenStore.adoptLegacyUserToken !== "function") {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
return await this.tokenStore.adoptLegacyUserToken();
|
|
48
|
+
}
|
|
49
|
+
async loginDeviceCode(options = {}) {
|
|
50
|
+
if (!this.fetchImpl) {
|
|
51
|
+
throw new Error("Feishu user authorization requires global fetch.");
|
|
52
|
+
}
|
|
53
|
+
const deviceAuth = await this.requestDeviceAuthorization();
|
|
54
|
+
options.onVerificationUri?.(deviceAuth.verificationUriComplete, deviceAuth.expiresIn);
|
|
55
|
+
if (options.openBrowser !== false) {
|
|
56
|
+
this.openBrowserImpl(deviceAuth.verificationUriComplete);
|
|
57
|
+
}
|
|
58
|
+
const tokenData = await this.pollDeviceToken(deviceAuth.deviceCode, deviceAuth.interval, deviceAuth.expiresIn);
|
|
59
|
+
await this.tokenStore.writeUserToken(tokenData);
|
|
60
|
+
return {
|
|
61
|
+
verificationUriComplete: deviceAuth.verificationUriComplete,
|
|
62
|
+
expiresIn: deviceAuth.expiresIn,
|
|
63
|
+
...(tokenData.openId ? { openId: tokenData.openId } : {}),
|
|
64
|
+
...(tokenData.tenantKey ? { tenantKey: tokenData.tenantKey } : {}),
|
|
65
|
+
...(tokenData.userId ? { userId: tokenData.userId } : {})
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async requestDeviceAuthorization() {
|
|
69
|
+
const url = `${this.appConfig.accountsBaseUrl}/oauth/v1/device_authorization`;
|
|
70
|
+
const basicAuth = Buffer.from(`${this.appConfig.appId}:${this.appConfig.appSecret}`).toString("base64");
|
|
71
|
+
const body = new URLSearchParams({
|
|
72
|
+
client_id: this.appConfig.appId,
|
|
73
|
+
scope: FEISHU_USER_AUTH_SCOPES
|
|
74
|
+
}).toString();
|
|
75
|
+
const response = await this.fetchImpl(url, {
|
|
76
|
+
method: "POST",
|
|
77
|
+
headers: {
|
|
78
|
+
"content-type": "application/x-www-form-urlencoded",
|
|
79
|
+
authorization: `Basic ${basicAuth}`
|
|
80
|
+
},
|
|
81
|
+
body
|
|
82
|
+
});
|
|
83
|
+
const payload = await this.readJsonResponse(response);
|
|
84
|
+
if (response.status >= 400 || typeof payload.error === "string") {
|
|
85
|
+
throw new Error(`Feishu device authorization failed: ${payload.error_description || payload.error || "unknown_error"}`);
|
|
86
|
+
}
|
|
87
|
+
if (!payload.device_code || !payload.verification_uri_complete) {
|
|
88
|
+
throw new Error("Feishu device authorization returned an incomplete response.");
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
deviceCode: String(payload.device_code),
|
|
92
|
+
verificationUriComplete: String(payload.verification_uri_complete),
|
|
93
|
+
expiresIn: Number(payload.expires_in ?? 600),
|
|
94
|
+
interval: Number(payload.interval ?? 5)
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
async pollDeviceToken(deviceCode, intervalSeconds, expiresInSeconds) {
|
|
98
|
+
const deadline = Date.now() + expiresInSeconds * 1000;
|
|
99
|
+
let pollInterval = intervalSeconds;
|
|
100
|
+
while (Date.now() < deadline) {
|
|
101
|
+
await sleep(Math.max(1, pollInterval) * 1000);
|
|
102
|
+
const payload = await this.postOauthToken({
|
|
103
|
+
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
104
|
+
device_code: deviceCode,
|
|
105
|
+
client_id: this.appConfig.appId,
|
|
106
|
+
client_secret: this.appConfig.appSecret
|
|
107
|
+
});
|
|
108
|
+
if (!payload.error && payload.access_token) {
|
|
109
|
+
const now = Date.now();
|
|
110
|
+
const tokenRecord = {
|
|
111
|
+
userAccessToken: String(payload.access_token),
|
|
112
|
+
refreshToken: String(payload.refresh_token ?? ""),
|
|
113
|
+
expireAtMs: now + Math.max(60, Number(payload.expires_in ?? 7200)) * 1000,
|
|
114
|
+
refreshExpireAtMs: now + Math.max(60, Number(payload.refresh_token_expires_in ?? 2592000)) * 1000
|
|
115
|
+
};
|
|
116
|
+
const userInfo = await this.tryReadUserInfo(tokenRecord.userAccessToken);
|
|
117
|
+
return {
|
|
118
|
+
...tokenRecord,
|
|
119
|
+
...(userInfo.openId ? { openId: userInfo.openId } : {}),
|
|
120
|
+
...(userInfo.tenantKey ? { tenantKey: userInfo.tenantKey } : {}),
|
|
121
|
+
...(userInfo.userId ? { userId: userInfo.userId } : {})
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
switch (payload.error) {
|
|
125
|
+
case "authorization_pending":
|
|
126
|
+
break;
|
|
127
|
+
case "slow_down":
|
|
128
|
+
pollInterval += 5;
|
|
129
|
+
break;
|
|
130
|
+
case "access_denied":
|
|
131
|
+
throw new Error(readErrorText(payload.error_description) || "Feishu authorization denied by user.");
|
|
132
|
+
case "expired_token":
|
|
133
|
+
case "invalid_grant":
|
|
134
|
+
throw new Error(readErrorText(payload.error_description) || "Feishu device code expired. Please try again.");
|
|
135
|
+
default:
|
|
136
|
+
throw new Error(readErrorText(payload.error_description) || readErrorText(payload.error) || "Feishu authorization failed.");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
throw new Error("Feishu user authorization timed out.");
|
|
140
|
+
}
|
|
141
|
+
async refreshUserToken(record) {
|
|
142
|
+
const payload = await this.postOauthToken({
|
|
143
|
+
grant_type: "refresh_token",
|
|
144
|
+
refresh_token: record.refreshToken,
|
|
145
|
+
client_id: this.appConfig.appId,
|
|
146
|
+
client_secret: this.appConfig.appSecret
|
|
147
|
+
});
|
|
148
|
+
if (!payload.access_token) {
|
|
149
|
+
throw new Error("Feishu user token refresh failed. Run `optimus feishu auth` again.");
|
|
150
|
+
}
|
|
151
|
+
const now = Date.now();
|
|
152
|
+
const refreshed = {
|
|
153
|
+
userAccessToken: String(payload.access_token),
|
|
154
|
+
refreshToken: String(payload.refresh_token ?? record.refreshToken),
|
|
155
|
+
expireAtMs: now + Math.max(60, Number(payload.expires_in ?? 7200)) * 1000,
|
|
156
|
+
refreshExpireAtMs: now + Math.max(60, Number(payload.refresh_token_expires_in ?? 2592000)) * 1000,
|
|
157
|
+
...(record.openId ? { openId: record.openId } : {}),
|
|
158
|
+
...(record.tenantKey ? { tenantKey: record.tenantKey } : {}),
|
|
159
|
+
...(record.userId ? { userId: record.userId } : {})
|
|
160
|
+
};
|
|
161
|
+
await this.tokenStore.writeUserToken(refreshed);
|
|
162
|
+
return refreshed;
|
|
163
|
+
}
|
|
164
|
+
async postOauthToken(body) {
|
|
165
|
+
const response = await this.fetchImpl(`${this.appConfig.baseUrl}/open-apis/authen/v2/oauth/token`, {
|
|
166
|
+
method: "POST",
|
|
167
|
+
headers: {
|
|
168
|
+
"content-type": "application/x-www-form-urlencoded"
|
|
169
|
+
},
|
|
170
|
+
body: new URLSearchParams(body).toString()
|
|
171
|
+
});
|
|
172
|
+
return await this.readJsonResponse(response);
|
|
173
|
+
}
|
|
174
|
+
async tryReadUserInfo(userAccessToken) {
|
|
175
|
+
try {
|
|
176
|
+
const response = await this.fetchImpl(`${this.appConfig.baseUrl}/open-apis/authen/v1/user_info`, {
|
|
177
|
+
method: "GET",
|
|
178
|
+
headers: {
|
|
179
|
+
authorization: `Bearer ${userAccessToken}`
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
const payload = await this.readJsonResponse(response);
|
|
183
|
+
const data = (payload.data && typeof payload.data === "object") ? payload.data : {};
|
|
184
|
+
return {
|
|
185
|
+
...(typeof data.open_id === "string" && data.open_id.trim() ? { openId: data.open_id.trim() } : {}),
|
|
186
|
+
...(typeof data.tenant_key === "string" && data.tenant_key.trim() ? { tenantKey: data.tenant_key.trim() } : {}),
|
|
187
|
+
...(typeof data.user_id === "string" && data.user_id.trim() ? { userId: data.user_id.trim() } : {})
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return {};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
async readJsonResponse(response) {
|
|
195
|
+
const text = await response.text();
|
|
196
|
+
if (!text.trim()) {
|
|
197
|
+
return {};
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
return JSON.parse(text);
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return { raw: text };
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
function openBrowser(url) {
|
|
208
|
+
try {
|
|
209
|
+
const os = platform();
|
|
210
|
+
const child = os === "darwin"
|
|
211
|
+
? spawn("open", [url], { detached: true, stdio: "ignore" })
|
|
212
|
+
: os === "win32"
|
|
213
|
+
? spawn(`start "" "${url}"`, { shell: true, detached: true, stdio: "ignore" })
|
|
214
|
+
: spawn("xdg-open", [url], { detached: true, stdio: "ignore" });
|
|
215
|
+
child.on("error", () => undefined);
|
|
216
|
+
child.unref();
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
// noop
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function sleep(ms) {
|
|
223
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
224
|
+
}
|
|
225
|
+
function readErrorText(value) {
|
|
226
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=feishu-user-auth-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feishu-user-auth-service.js","sourceRoot":"","sources":["../../../src/integrations/feishu/feishu-user-auth-service.ts"],"names":[],"mappings":"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"}
|