@sireai/optimus 0.1.8 → 0.1.10

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 (106) hide show
  1. package/README.md +2 -1
  2. package/dist/cli/optimus.js +145 -81
  3. package/dist/cli/optimus.js.map +1 -1
  4. package/dist/cli/self-update.js +21 -2
  5. package/dist/cli/self-update.js.map +1 -1
  6. package/dist/config/load-config.js +3 -0
  7. package/dist/config/load-config.js.map +1 -1
  8. package/dist/integrations/feishu/feishu-auth-config.d.ts +7 -0
  9. package/dist/integrations/feishu/feishu-auth-config.js +37 -0
  10. package/dist/integrations/feishu/feishu-auth-config.js.map +1 -0
  11. package/dist/integrations/feishu/feishu-auth-service.d.ts +71 -0
  12. package/dist/integrations/feishu/feishu-auth-service.js +399 -0
  13. package/dist/integrations/feishu/feishu-auth-service.js.map +1 -0
  14. package/dist/integrations/feishu/feishu-auth-store.d.ts +29 -0
  15. package/dist/integrations/feishu/feishu-auth-store.js +113 -0
  16. package/dist/integrations/feishu/feishu-auth-store.js.map +1 -0
  17. package/dist/integrations/feishu/feishu-client.d.ts +52 -0
  18. package/dist/integrations/feishu/feishu-client.js +217 -0
  19. package/dist/integrations/feishu/feishu-client.js.map +1 -0
  20. package/dist/integrations/feishu/feishu-doc-service.d.ts +52 -0
  21. package/dist/integrations/feishu/feishu-doc-service.js +323 -0
  22. package/dist/integrations/feishu/feishu-doc-service.js.map +1 -0
  23. package/dist/integrations/feishu/feishu-token-store.d.ts +17 -0
  24. package/dist/integrations/feishu/feishu-token-store.js +34 -0
  25. package/dist/integrations/feishu/feishu-token-store.js.map +1 -0
  26. package/dist/integrations/feishu/feishu-user-service.d.ts +14 -0
  27. package/dist/integrations/feishu/feishu-user-service.js +60 -0
  28. package/dist/integrations/feishu/feishu-user-service.js.map +1 -0
  29. package/dist/integrations/jira/jira-auth-refresh.d.ts +12 -1
  30. package/dist/integrations/jira/jira-auth-refresh.js +76 -0
  31. package/dist/integrations/jira/jira-auth-refresh.js.map +1 -1
  32. package/dist/integrations/jira/jira-cli.js +25 -11
  33. package/dist/integrations/jira/jira-cli.js.map +1 -1
  34. package/dist/integrations/jira/jira-client.d.ts +26 -0
  35. package/dist/integrations/jira/jira-client.js +111 -0
  36. package/dist/integrations/jira/jira-client.js.map +1 -1
  37. package/dist/integrations/jira/jira-submit.d.ts +5 -1
  38. package/dist/integrations/jira/jira-submit.js +119 -12
  39. package/dist/integrations/jira/jira-submit.js.map +1 -1
  40. package/dist/problem-solving-core/codex/codex-runner.d.ts +2 -0
  41. package/dist/problem-solving-core/codex/codex-runner.js +78 -0
  42. package/dist/problem-solving-core/codex/codex-runner.js.map +1 -1
  43. package/dist/problem-solving-core/codex/evolution-skill-guard.js +0 -2
  44. package/dist/problem-solving-core/codex/evolution-skill-guard.js.map +1 -1
  45. package/dist/task-environment/delivery/commit-message/bugfix-commit-message-template.js +4 -1
  46. package/dist/task-environment/delivery/commit-message/bugfix-commit-message-template.js.map +1 -1
  47. package/dist/task-environment/delivery/feishu-analysis-doc-service.d.ts +7 -25
  48. package/dist/task-environment/delivery/feishu-analysis-doc-service.js +35 -336
  49. package/dist/task-environment/delivery/feishu-analysis-doc-service.js.map +1 -1
  50. package/dist/task-environment/delivery/feishu-card-renderer.js +2 -2
  51. package/dist/task-environment/delivery/feishu-card-renderer.js.map +1 -1
  52. package/dist/task-environment/delivery/feishu-content/feishu-content-renderer.d.ts +7 -1
  53. package/dist/task-environment/delivery/feishu-content/feishu-content-renderer.js +51 -2
  54. package/dist/task-environment/delivery/feishu-content/feishu-content-renderer.js.map +1 -1
  55. package/dist/task-environment/delivery/feishu-notifier.js +7 -1
  56. package/dist/task-environment/delivery/feishu-notifier.js.map +1 -1
  57. package/dist/task-environment/delivery/feishu-templates/analysis-message-template.js +1 -1
  58. package/dist/task-environment/delivery/feishu-templates/analysis-message-template.js.map +1 -1
  59. package/dist/task-environment/delivery/feishu-templates/bugfix-message-template.js +27 -4
  60. package/dist/task-environment/delivery/feishu-templates/bugfix-message-template.js.map +1 -1
  61. package/dist/task-environment/delivery/feishu-templates/default-message-template.js +1 -1
  62. package/dist/task-environment/delivery/feishu-templates/default-message-template.js.map +1 -1
  63. package/dist/task-environment/delivery/feishu-templates/patch-message-template.js +27 -4
  64. package/dist/task-environment/delivery/feishu-templates/patch-message-template.js.map +1 -1
  65. package/dist/task-environment/delivery/feishu-templates/sentry-bugfix-message-template.js +27 -4
  66. package/dist/task-environment/delivery/feishu-templates/sentry-bugfix-message-template.js.map +1 -1
  67. package/dist/task-environment/delivery/feishu-templates/template-types.d.ts +7 -1
  68. package/dist/task-environment/delivery/sentry-feishu-card-renderer.js +1 -1
  69. package/dist/task-environment/delivery/sentry-feishu-card-renderer.js.map +1 -1
  70. package/dist/task-environment/delivery/task-delivery-service.d.ts +2 -0
  71. package/dist/task-environment/delivery/task-delivery-service.js +178 -6
  72. package/dist/task-environment/delivery/task-delivery-service.js.map +1 -1
  73. package/dist/task-environment/delivery/task-publication-service.d.ts +29 -2
  74. package/dist/task-environment/delivery/task-publication-service.js +139 -13
  75. package/dist/task-environment/delivery/task-publication-service.js.map +1 -1
  76. package/dist/task-environment/evidence/evidence-preparation-service.d.ts +36 -0
  77. package/dist/task-environment/evidence/evidence-preparation-service.js +341 -0
  78. package/dist/task-environment/evidence/evidence-preparation-service.js.map +1 -0
  79. package/dist/task-environment/execution-addresses.d.ts +8 -0
  80. package/dist/task-environment/execution-addresses.js +8 -0
  81. package/dist/task-environment/execution-addresses.js.map +1 -1
  82. package/dist/task-environment/intake/manual-problem-intake.js +15 -0
  83. package/dist/task-environment/intake/manual-problem-intake.js.map +1 -1
  84. package/dist/task-environment/intake/triage-rejection-feedback-service.d.ts +12 -0
  85. package/dist/task-environment/intake/triage-rejection-feedback-service.js +64 -11
  86. package/dist/task-environment/intake/triage-rejection-feedback-service.js.map +1 -1
  87. package/dist/task-environment/observability/logger.js +24 -0
  88. package/dist/task-environment/observability/logger.js.map +1 -1
  89. package/dist/task-environment/orchestration/execution-context-assembler.d.ts +19 -0
  90. package/dist/task-environment/orchestration/execution-context-assembler.js +422 -1
  91. package/dist/task-environment/orchestration/execution-context-assembler.js.map +1 -1
  92. package/dist/task-environment/orchestration/task-orchestrator.d.ts +3 -0
  93. package/dist/task-environment/orchestration/task-orchestrator.js +135 -6
  94. package/dist/task-environment/orchestration/task-orchestrator.js.map +1 -1
  95. package/dist/task-environment/orchestration/triage-runner.d.ts +2 -0
  96. package/dist/task-environment/orchestration/triage-runner.js +27 -1
  97. package/dist/task-environment/orchestration/triage-runner.js.map +1 -1
  98. package/dist/task-environment/runtime/optimus-runtime.js +4 -3
  99. package/dist/task-environment/runtime/optimus-runtime.js.map +1 -1
  100. package/dist/types.d.ts +22 -0
  101. package/embedded-skills/shared/video-keyframe-analyzer/SKILL.md +86 -0
  102. package/embedded-skills/shared/video-keyframe-analyzer/scripts/extract-keyframes.mjs +614 -0
  103. package/embedded-skills/shared/{repo-inspection → video-keyframe-analyzer}/skill.json +1 -1
  104. package/package.json +7 -3
  105. package/task-harnesses/bugfix/STANDARD.md +104 -31
  106. package/embedded-skills/shared/repo-inspection/SKILL.md +0 -9
@@ -0,0 +1,217 @@
1
+ import { FeishuAuthService } from "./feishu-auth-service.js";
2
+ import { FileFeishuTokenStore } from "./feishu-token-store.js";
3
+ const DEFAULT_FEISHU_BASE_URL = "https://open.feishu.cn";
4
+ const TENANT_TOKEN_SKEW_MS = 5 * 60 * 1000;
5
+ export class FeishuIntegrationError extends Error {
6
+ diagnostics;
7
+ constructor(message, diagnostics) {
8
+ super(message);
9
+ this.diagnostics = diagnostics;
10
+ this.name = "FeishuIntegrationError";
11
+ }
12
+ }
13
+ export class FeishuClient {
14
+ env;
15
+ fetchImpl;
16
+ tokenStore;
17
+ authService;
18
+ baseUrl;
19
+ appId;
20
+ appSecret;
21
+ constructor(options = {}) {
22
+ this.env = options.env ?? process.env;
23
+ this.fetchImpl = options.fetchImpl ?? globalThis.fetch?.bind(globalThis);
24
+ this.tokenStore = options.tokenStore ?? new FileFeishuTokenStore();
25
+ this.authService = options.authService ?? new FeishuAuthService({
26
+ env: this.env,
27
+ fetchImpl: this.fetchImpl,
28
+ ...(options.authServiceOptions ?? {})
29
+ });
30
+ const feishuConfig = options.config?.delivery.feishu;
31
+ this.baseUrl = this.normalizeBaseUrl(feishuConfig?.baseUrl ?? this.env.FEISHU_BASE_URL ?? DEFAULT_FEISHU_BASE_URL);
32
+ this.appId = this.readConfiguredValue(feishuConfig?.appId, this.env.FEISHU_APP_ID);
33
+ this.appSecret = this.readConfiguredValue(feishuConfig?.appSecret, this.env.FEISHU_APP_SECRET);
34
+ }
35
+ isConfigured() {
36
+ return this.authService.readStatus().authenticated || Boolean(this.appId && this.appSecret);
37
+ }
38
+ async get(path, query) {
39
+ return await this.request("GET", path, undefined, query);
40
+ }
41
+ async post(path, body, query) {
42
+ return await this.request("POST", path, body, query);
43
+ }
44
+ async patch(path, body, query) {
45
+ return await this.request("PATCH", path, body, query);
46
+ }
47
+ async request(method, path, body, query, retryAfterAuthRefresh = true) {
48
+ const token = await this.getAccessToken();
49
+ const response = await this.fetchImpl(this.buildUrl(path, query), {
50
+ method,
51
+ headers: {
52
+ authorization: `Bearer ${token}`,
53
+ "content-type": "application/json; charset=utf-8"
54
+ },
55
+ ...(body === undefined ? {} : { body: JSON.stringify(body) })
56
+ });
57
+ const payload = await this.readResponsePayload(response);
58
+ if (response.ok && !this.payloadHasError(payload)) {
59
+ return payload;
60
+ }
61
+ const code = this.extractCode(payload);
62
+ if (retryAfterAuthRefresh && this.isAuthExpired(response.status, code, payload)) {
63
+ await this.tokenStore.clearTenantToken().catch(() => undefined);
64
+ await this.authService.recoverExpiredAuth?.("request_auth_expired").catch(() => undefined);
65
+ return await this.request(method, path, body, query, false);
66
+ }
67
+ throw new FeishuIntegrationError("Feishu API request failed.", {
68
+ category: response.status === 401 || response.status === 403 ? "auth_failed" : "request_failed",
69
+ status: response.status,
70
+ ...(code !== undefined ? { code } : {}),
71
+ detail: this.compact(JSON.stringify(payload))
72
+ });
73
+ }
74
+ async getTenantAccessToken() {
75
+ if (!this.fetchImpl) {
76
+ throw new FeishuIntegrationError("Feishu integration requires global fetch.", { category: "request_failed" });
77
+ }
78
+ if (!this.appId || !this.appSecret) {
79
+ throw new FeishuIntegrationError("Feishu auth is not ready. Run `optimus feishu auth login`.", {
80
+ category: "config_missing"
81
+ });
82
+ }
83
+ const cached = await this.tokenStore.readTenantToken();
84
+ if (cached?.tenantAccessToken && cached.expireAtMs > Date.now() + TENANT_TOKEN_SKEW_MS) {
85
+ return cached.tenantAccessToken;
86
+ }
87
+ const response = await this.fetchImpl(`${this.baseUrl}/open-apis/auth/v3/tenant_access_token/internal`, {
88
+ method: "POST",
89
+ headers: {
90
+ "content-type": "application/json; charset=utf-8"
91
+ },
92
+ body: JSON.stringify({
93
+ app_id: this.appId,
94
+ app_secret: this.appSecret
95
+ })
96
+ });
97
+ const payload = await this.readResponsePayload(response);
98
+ const token = this.readString(payload, ["tenant_access_token", "tenantAccessToken"]);
99
+ const expireSeconds = this.readNumber(payload, ["expire"]);
100
+ if (!response.ok || this.payloadHasError(payload) || !token) {
101
+ const code = this.extractCode(payload);
102
+ throw new FeishuIntegrationError("Feishu tenant token request failed.", {
103
+ category: "auth_failed",
104
+ status: response.status,
105
+ ...(code !== undefined ? { code } : {}),
106
+ detail: this.compact(JSON.stringify(payload))
107
+ });
108
+ }
109
+ await this.tokenStore.writeTenantToken({
110
+ tenantAccessToken: token,
111
+ expireAtMs: Date.now() + Math.max(60, expireSeconds ?? 7200) * 1000
112
+ }).catch(() => undefined);
113
+ return token;
114
+ }
115
+ async getAccessToken() {
116
+ try {
117
+ const authenticated = await this.authService.getValidAccessToken();
118
+ return authenticated.accessToken;
119
+ }
120
+ catch (error) {
121
+ if (this.appId && this.appSecret) {
122
+ return await this.getTenantAccessToken();
123
+ }
124
+ if (error instanceof Error) {
125
+ throw new FeishuIntegrationError(error.message, {
126
+ category: /expired|failed/i.test(error.message) ? "auth_failed" : "config_missing"
127
+ });
128
+ }
129
+ throw error;
130
+ }
131
+ }
132
+ buildUrl(path, query) {
133
+ const normalizedPath = path.startsWith("/") ? path : `/${path}`;
134
+ const url = new URL(`${this.baseUrl}${normalizedPath}`);
135
+ for (const [key, value] of Object.entries(query ?? {})) {
136
+ if (value?.trim()) {
137
+ url.searchParams.set(key, value.trim());
138
+ }
139
+ }
140
+ return url.toString();
141
+ }
142
+ async readResponsePayload(response) {
143
+ const text = await response.text();
144
+ if (!text.trim()) {
145
+ return {};
146
+ }
147
+ try {
148
+ return JSON.parse(text);
149
+ }
150
+ catch {
151
+ return { raw: text };
152
+ }
153
+ }
154
+ payloadHasError(payload) {
155
+ const code = this.extractCode(payload);
156
+ return code !== undefined && code !== 0;
157
+ }
158
+ extractCode(payload) {
159
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
160
+ return undefined;
161
+ }
162
+ const record = payload;
163
+ const raw = record.code ?? record.Code;
164
+ return typeof raw === "number" ? raw : typeof raw === "string" && raw.trim() ? Number(raw) : undefined;
165
+ }
166
+ isAuthExpired(status, code, payload) {
167
+ if (status === 401) {
168
+ return true;
169
+ }
170
+ const detail = JSON.stringify(payload).toLowerCase();
171
+ return [
172
+ 99991663,
173
+ 99991664,
174
+ 99991668,
175
+ 99991672,
176
+ 99991673
177
+ ].includes(code ?? -1) || /token|auth|unauthorized|expired/.test(detail);
178
+ }
179
+ readString(value, keys) {
180
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
181
+ return undefined;
182
+ }
183
+ const record = value;
184
+ for (const key of keys) {
185
+ const raw = record[key];
186
+ if (typeof raw === "string" && raw.trim()) {
187
+ return raw.trim();
188
+ }
189
+ }
190
+ return undefined;
191
+ }
192
+ readNumber(value, keys) {
193
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
194
+ return undefined;
195
+ }
196
+ const record = value;
197
+ for (const key of keys) {
198
+ const raw = record[key];
199
+ const parsed = typeof raw === "number" ? raw : typeof raw === "string" ? Number(raw) : Number.NaN;
200
+ if (Number.isFinite(parsed)) {
201
+ return parsed;
202
+ }
203
+ }
204
+ return undefined;
205
+ }
206
+ readConfiguredValue(configValue, envValue) {
207
+ const value = configValue?.trim() || envValue?.trim();
208
+ return value || undefined;
209
+ }
210
+ normalizeBaseUrl(value) {
211
+ return value.trim().replace(/\/+$/u, "");
212
+ }
213
+ compact(value) {
214
+ return value.replace(/\s+/gu, " ").trim().slice(0, 2000);
215
+ }
216
+ }
217
+ //# sourceMappingURL=feishu-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feishu-client.js","sourceRoot":"","sources":["../../../src/integrations/feishu/feishu-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { OptimusConfig } from "../../types.js";
2
+ import { FeishuClient, type FeishuClientOptions } from "./feishu-client.js";
3
+ export interface FeishuWikiNodeRef {
4
+ nodeToken: string;
5
+ title: string;
6
+ spaceId?: string;
7
+ url?: string;
8
+ }
9
+ export interface FeishuCreatedDocument {
10
+ token: string;
11
+ url: string;
12
+ nodeToken?: string;
13
+ spaceId?: string;
14
+ }
15
+ export interface FeishuCreateDocumentOptions {
16
+ spaceId?: string;
17
+ parentNodeToken?: string;
18
+ }
19
+ export interface FeishuDocumentServiceOptions {
20
+ client?: Pick<FeishuClient, "get" | "post" | "patch" | "isConfigured">;
21
+ config?: Pick<OptimusConfig, "delivery">;
22
+ authServiceOptions?: FeishuClientOptions["authServiceOptions"];
23
+ }
24
+ export declare class FeishuDocumentService {
25
+ private readonly client;
26
+ constructor(options?: FeishuDocumentServiceOptions);
27
+ isConfigured(): boolean;
28
+ getWikiNode(nodeToken: string): Promise<FeishuWikiNodeRef | undefined>;
29
+ listWikiNodes(spaceId: string): Promise<FeishuWikiNodeRef[]>;
30
+ createMarkdownDocument(input: {
31
+ title: string;
32
+ markdownPath: string;
33
+ parentSpaceId?: string;
34
+ parentNodeToken?: string;
35
+ }): Promise<FeishuCreatedDocument>;
36
+ createEmptyDocument(title: string, options?: FeishuCreateDocumentOptions): Promise<FeishuCreatedDocument>;
37
+ private createDocument;
38
+ private createWikiNode;
39
+ private appendMarkdown;
40
+ private convertMarkdown;
41
+ private updateTitleBestEffort;
42
+ private toBasicBlocks;
43
+ private toTextBlock;
44
+ private extractDocumentToken;
45
+ private extractDocumentUrl;
46
+ private extractWikiNodes;
47
+ private extractWikiNode;
48
+ private extractWikiNodeToken;
49
+ private extractWikiSpaceId;
50
+ private findArray;
51
+ private readString;
52
+ }
@@ -0,0 +1,323 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { FeishuClient } from "./feishu-client.js";
3
+ export class FeishuDocumentService {
4
+ client;
5
+ constructor(options = {}) {
6
+ this.client = options.client ?? new FeishuClient({
7
+ ...(options.config ? { config: options.config } : {}),
8
+ ...(options.authServiceOptions ? { authServiceOptions: options.authServiceOptions } : {})
9
+ });
10
+ }
11
+ isConfigured() {
12
+ return this.client.isConfigured();
13
+ }
14
+ async getWikiNode(nodeToken) {
15
+ const payload = await this.client.get(`/open-apis/wiki/v2/spaces/get_node`, { token: nodeToken });
16
+ return this.extractWikiNode(payload);
17
+ }
18
+ async listWikiNodes(spaceId) {
19
+ const payload = await this.client.get(`/open-apis/wiki/v2/spaces/${encodeURIComponent(spaceId)}/nodes`, {
20
+ page_size: "50"
21
+ });
22
+ return this.extractWikiNodes(payload);
23
+ }
24
+ async createMarkdownDocument(input) {
25
+ const markdown = await readFile(input.markdownPath, "utf8");
26
+ const created = await this.createDocument(input.title, {
27
+ ...(input.parentSpaceId ? { spaceId: input.parentSpaceId } : {}),
28
+ ...(input.parentNodeToken ? { parentNodeToken: input.parentNodeToken } : {})
29
+ });
30
+ await this.appendMarkdown(created.token, markdown);
31
+ await this.updateTitleBestEffort(created.token, input.title);
32
+ return created;
33
+ }
34
+ async createEmptyDocument(title, options) {
35
+ return await this.createDocument(title, options);
36
+ }
37
+ async createDocument(title, options) {
38
+ const payload = await this.client.post("/open-apis/docx/v1/documents", {
39
+ title
40
+ });
41
+ const token = this.extractDocumentToken(payload);
42
+ if (!token) {
43
+ throw new Error("feishu_doc_created_but_identifier_missing");
44
+ }
45
+ const url = this.extractDocumentUrl(payload) ?? `https://mi.feishu.cn/docx/${token}`;
46
+ const node = this.extractWikiNode(payload);
47
+ const fallbackNodeToken = this.extractWikiNodeToken(payload);
48
+ const fallbackSpaceId = this.extractWikiSpaceId(payload);
49
+ const created = {
50
+ token,
51
+ url
52
+ };
53
+ const nodeToken = node?.nodeToken ?? fallbackNodeToken;
54
+ const spaceId = node?.spaceId ?? fallbackSpaceId;
55
+ if (nodeToken) {
56
+ created.nodeToken = nodeToken;
57
+ }
58
+ if (spaceId) {
59
+ created.spaceId = spaceId;
60
+ }
61
+ if (options?.spaceId) {
62
+ const wikiNode = await this.createWikiNode({
63
+ title,
64
+ spaceId: options.spaceId,
65
+ objToken: token,
66
+ ...(options.parentNodeToken ? { parentNodeToken: options.parentNodeToken } : {})
67
+ });
68
+ if (wikiNode.nodeToken) {
69
+ created.nodeToken = wikiNode.nodeToken;
70
+ }
71
+ if (wikiNode.spaceId) {
72
+ created.spaceId = wikiNode.spaceId;
73
+ }
74
+ if (wikiNode.url) {
75
+ created.url = wikiNode.url;
76
+ }
77
+ }
78
+ return created;
79
+ }
80
+ async createWikiNode(input) {
81
+ const payload = await this.client.post(`/open-apis/wiki/v2/spaces/${encodeURIComponent(input.spaceId)}/nodes`, {
82
+ title: input.title,
83
+ obj_type: "docx",
84
+ obj_token: input.objToken,
85
+ ...(input.parentNodeToken ? { parent_node_token: input.parentNodeToken } : {})
86
+ });
87
+ const node = this.extractWikiNode(payload);
88
+ if (node) {
89
+ return node;
90
+ }
91
+ const nodeToken = this.extractWikiNodeToken(payload);
92
+ const spaceId = this.extractWikiSpaceId(payload) ?? input.spaceId;
93
+ if (!nodeToken) {
94
+ throw new Error("feishu_wiki_node_created_but_identifier_missing");
95
+ }
96
+ return {
97
+ nodeToken,
98
+ title: input.title,
99
+ ...(spaceId ? { spaceId } : {}),
100
+ url: this.extractDocumentUrl(payload) ?? `https://mi.feishu.cn/wiki/${nodeToken}`
101
+ };
102
+ }
103
+ async appendMarkdown(documentToken, markdown) {
104
+ const blocks = await this.convertMarkdown(markdown).catch(() => this.toBasicBlocks(markdown));
105
+ if (blocks.length === 0) {
106
+ return;
107
+ }
108
+ await this.client.post(`/open-apis/docx/v1/documents/${encodeURIComponent(documentToken)}/blocks/${encodeURIComponent(documentToken)}/children`, {
109
+ index: 0,
110
+ children: blocks
111
+ }, { document_revision_id: "-1" });
112
+ }
113
+ async convertMarkdown(markdown) {
114
+ const payload = await this.client.post("/open-apis/docx/v1/documents/blocks/convert", {
115
+ content_type: "markdown",
116
+ content: markdown
117
+ });
118
+ const blocks = this.findArray(payload, ["blocks", "children"]);
119
+ return blocks ?? [];
120
+ }
121
+ async updateTitleBestEffort(documentToken, title) {
122
+ try {
123
+ await this.client.patch(`/open-apis/docx/v1/documents/${encodeURIComponent(documentToken)}`, { title });
124
+ }
125
+ catch {
126
+ // The create request already carries the title. Title patch support differs across Feishu tenants.
127
+ }
128
+ }
129
+ toBasicBlocks(markdown) {
130
+ return markdown
131
+ .split(/\r?\n/u)
132
+ .map((line) => line.trimEnd())
133
+ .filter((line) => line.trim().length > 0)
134
+ .slice(0, 300)
135
+ .map((line) => this.toTextBlock(line));
136
+ }
137
+ toTextBlock(line) {
138
+ const heading = line.match(/^(#{1,4})\s+(.+)$/u);
139
+ const content = heading ? heading[2] ?? line : line.replace(/^[-*]\s+/u, "");
140
+ const blockType = heading ? 2 + Math.min(heading[1]?.length ?? 1, 4) : /^[-*]\s+/u.test(line) ? 12 : 2;
141
+ return {
142
+ block_type: blockType,
143
+ text: {
144
+ elements: [{
145
+ text_run: {
146
+ content,
147
+ text_element_style: {}
148
+ }
149
+ }],
150
+ style: {}
151
+ }
152
+ };
153
+ }
154
+ extractDocumentToken(value) {
155
+ if (typeof value === "string") {
156
+ return undefined;
157
+ }
158
+ if (Array.isArray(value)) {
159
+ for (const entry of value) {
160
+ const matched = this.extractDocumentToken(entry);
161
+ if (matched) {
162
+ return matched;
163
+ }
164
+ }
165
+ return undefined;
166
+ }
167
+ if (!value || typeof value !== "object") {
168
+ return undefined;
169
+ }
170
+ const record = value;
171
+ const direct = this.readString(record, ["document_id", "documentId", "doc_token", "docToken", "token"]);
172
+ if (direct) {
173
+ return direct;
174
+ }
175
+ for (const entry of Object.values(record)) {
176
+ const matched = this.extractDocumentToken(entry);
177
+ if (matched) {
178
+ return matched;
179
+ }
180
+ }
181
+ return undefined;
182
+ }
183
+ extractDocumentUrl(value) {
184
+ if (typeof value === "string") {
185
+ return /https?:\/\/[^\s"'`<>]+\/(?:docx|wiki)\/[^\s"'`<>]+/u.test(value) ? value : undefined;
186
+ }
187
+ if (Array.isArray(value)) {
188
+ for (const entry of value) {
189
+ const matched = this.extractDocumentUrl(entry);
190
+ if (matched) {
191
+ return matched;
192
+ }
193
+ }
194
+ return undefined;
195
+ }
196
+ if (!value || typeof value !== "object") {
197
+ return undefined;
198
+ }
199
+ for (const entry of Object.values(value)) {
200
+ const matched = this.extractDocumentUrl(entry);
201
+ if (matched) {
202
+ return matched;
203
+ }
204
+ }
205
+ return undefined;
206
+ }
207
+ extractWikiNodes(value) {
208
+ const nodes = this.findArray(value, ["nodes", "items"]);
209
+ return (nodes ?? []).flatMap((entry) => {
210
+ const node = this.extractWikiNode(entry);
211
+ return node ? [node] : [];
212
+ });
213
+ }
214
+ extractWikiNode(value) {
215
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
216
+ return undefined;
217
+ }
218
+ const record = value;
219
+ const nodeToken = this.readString(record, ["node_token", "nodeToken"]);
220
+ const title = this.readString(record, ["title"]);
221
+ if (nodeToken && title) {
222
+ const spaceId = this.readString(record, ["space_id", "spaceId"]);
223
+ const url = this.extractDocumentUrl(record);
224
+ return {
225
+ nodeToken,
226
+ title,
227
+ ...(spaceId ? { spaceId } : {}),
228
+ ...(url ? { url } : {})
229
+ };
230
+ }
231
+ for (const entry of Object.values(record)) {
232
+ const matched = this.extractWikiNode(entry);
233
+ if (matched) {
234
+ return matched;
235
+ }
236
+ }
237
+ return undefined;
238
+ }
239
+ extractWikiNodeToken(value) {
240
+ if (!value || typeof value !== "object") {
241
+ return undefined;
242
+ }
243
+ if (Array.isArray(value)) {
244
+ for (const entry of value) {
245
+ const matched = this.extractWikiNodeToken(entry);
246
+ if (matched) {
247
+ return matched;
248
+ }
249
+ }
250
+ return undefined;
251
+ }
252
+ const record = value;
253
+ const direct = this.readString(record, ["node_token", "nodeToken"]);
254
+ if (direct) {
255
+ return direct;
256
+ }
257
+ for (const entry of Object.values(record)) {
258
+ const matched = this.extractWikiNodeToken(entry);
259
+ if (matched) {
260
+ return matched;
261
+ }
262
+ }
263
+ return undefined;
264
+ }
265
+ extractWikiSpaceId(value) {
266
+ if (!value || typeof value !== "object") {
267
+ return undefined;
268
+ }
269
+ if (Array.isArray(value)) {
270
+ for (const entry of value) {
271
+ const matched = this.extractWikiSpaceId(entry);
272
+ if (matched) {
273
+ return matched;
274
+ }
275
+ }
276
+ return undefined;
277
+ }
278
+ const record = value;
279
+ const direct = this.readString(record, ["space_id", "spaceId"]);
280
+ if (direct) {
281
+ return direct;
282
+ }
283
+ for (const entry of Object.values(record)) {
284
+ const matched = this.extractWikiSpaceId(entry);
285
+ if (matched) {
286
+ return matched;
287
+ }
288
+ }
289
+ return undefined;
290
+ }
291
+ findArray(value, keys) {
292
+ if (Array.isArray(value)) {
293
+ return value;
294
+ }
295
+ if (!value || typeof value !== "object") {
296
+ return undefined;
297
+ }
298
+ const record = value;
299
+ for (const key of keys) {
300
+ const candidate = record[key];
301
+ if (Array.isArray(candidate)) {
302
+ return candidate;
303
+ }
304
+ }
305
+ for (const entry of Object.values(record)) {
306
+ const matched = this.findArray(entry, keys);
307
+ if (matched) {
308
+ return matched;
309
+ }
310
+ }
311
+ return undefined;
312
+ }
313
+ readString(record, keys) {
314
+ for (const key of keys) {
315
+ const value = record[key];
316
+ if (typeof value === "string" && value.trim()) {
317
+ return value.trim();
318
+ }
319
+ }
320
+ return undefined;
321
+ }
322
+ }
323
+ //# sourceMappingURL=feishu-doc-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feishu-doc-service.js","sourceRoot":"","sources":["../../../src/integrations/feishu/feishu-doc-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface FeishuTenantTokenRecord {
2
+ tenantAccessToken: string;
3
+ expireAtMs: number;
4
+ }
5
+ export interface FeishuTokenStore {
6
+ readTenantToken(): Promise<FeishuTenantTokenRecord | undefined>;
7
+ writeTenantToken(record: FeishuTenantTokenRecord): Promise<void>;
8
+ clearTenantToken(): Promise<void>;
9
+ }
10
+ export declare function resolveDefaultFeishuTokenPath(): string;
11
+ export declare class FileFeishuTokenStore implements FeishuTokenStore {
12
+ private readonly path;
13
+ constructor(path?: string);
14
+ readTenantToken(): Promise<FeishuTenantTokenRecord | undefined>;
15
+ writeTenantToken(record: FeishuTenantTokenRecord): Promise<void>;
16
+ clearTenantToken(): Promise<void>;
17
+ }