@sireai/optimus 0.1.13 → 0.1.15
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/README.md +1 -2
- package/dist/cli/feedback-delivery.d.ts +56 -0
- package/dist/cli/feedback-delivery.js +297 -0
- package/dist/cli/feedback-delivery.js.map +1 -0
- package/dist/cli/feedback.d.ts +25 -0
- package/dist/cli/feedback.js +143 -0
- package/dist/cli/feedback.js.map +1 -0
- package/dist/cli/optimus.js +385 -196
- package/dist/cli/optimus.js.map +1 -1
- package/dist/config/load-config.js +5 -4
- package/dist/config/load-config.js.map +1 -1
- package/dist/config/optimus-paths.d.ts +1 -0
- package/dist/config/optimus-paths.js +3 -0
- package/dist/config/optimus-paths.js.map +1 -1
- package/dist/integrations/feishu/feishu-auth-config.d.ts +5 -1
- package/dist/integrations/feishu/feishu-auth-config.js +9 -6
- package/dist/integrations/feishu/feishu-auth-config.js.map +1 -1
- package/dist/integrations/feishu/feishu-client.d.ts +2 -6
- package/dist/integrations/feishu/feishu-client.js +16 -41
- package/dist/integrations/feishu/feishu-client.js.map +1 -1
- package/dist/integrations/feishu/feishu-doc-service.d.ts +8 -3
- package/dist/integrations/feishu/feishu-doc-service.js +16 -2
- package/dist/integrations/feishu/feishu-doc-service.js.map +1 -1
- package/dist/integrations/feishu/feishu-user-service.d.ts +1 -2
- package/dist/integrations/feishu/feishu-user-service.js +1 -2
- package/dist/integrations/feishu/feishu-user-service.js.map +1 -1
- package/dist/integrations/jira/jira-cli.js +21 -2
- package/dist/integrations/jira/jira-cli.js.map +1 -1
- package/dist/integrations/jira/jira-client.d.ts +2 -1
- package/dist/integrations/jira/jira-client.js +19 -2
- package/dist/integrations/jira/jira-client.js.map +1 -1
- package/dist/integrations/jira/jira-submit.js +24 -24
- package/dist/integrations/jira/jira-submit.js.map +1 -1
- package/dist/integrations/sentry/sentry-cli.js +21 -1
- package/dist/integrations/sentry/sentry-cli.js.map +1 -1
- package/dist/problem-solving-core/codex/codex-preflight.js +8 -0
- package/dist/problem-solving-core/codex/codex-preflight.js.map +1 -1
- package/dist/problem-solving-core/codex/codex-provider-profile.js +3 -0
- package/dist/problem-solving-core/codex/codex-provider-profile.js.map +1 -1
- package/dist/task-environment/delivery/feishu-analysis-doc-service.d.ts +7 -3
- package/dist/task-environment/delivery/feishu-analysis-doc-service.js +62 -3
- package/dist/task-environment/delivery/feishu-analysis-doc-service.js.map +1 -1
- package/dist/task-environment/delivery/feishu-card-renderer.d.ts +1 -0
- package/dist/task-environment/delivery/feishu-card-renderer.js +17 -6
- package/dist/task-environment/delivery/feishu-card-renderer.js.map +1 -1
- package/dist/task-environment/delivery/feishu-notifier.d.ts +13 -0
- package/dist/task-environment/delivery/feishu-notifier.js +206 -22
- package/dist/task-environment/delivery/feishu-notifier.js.map +1 -1
- package/dist/task-environment/delivery/sentry-feishu-card-renderer.d.ts +1 -0
- package/dist/task-environment/delivery/sentry-feishu-card-renderer.js +16 -5
- package/dist/task-environment/delivery/sentry-feishu-card-renderer.js.map +1 -1
- package/dist/task-environment/observability/runtime-panel.d.ts +1 -1
- package/dist/task-environment/observability/runtime-panel.js +4 -1
- package/dist/task-environment/observability/runtime-panel.js.map +1 -1
- package/dist/task-environment/orchestration/task-orchestrator.d.ts +0 -1
- package/dist/task-environment/orchestration/task-orchestrator.js +3 -23
- package/dist/task-environment/orchestration/task-orchestrator.js.map +1 -1
- package/dist/task-environment/runtime/optimus-runtime.d.ts +1 -0
- package/dist/task-environment/runtime/optimus-runtime.js +2 -1
- package/dist/task-environment/runtime/optimus-runtime.js.map +1 -1
- package/dist/types.d.ts +3 -2
- package/package.json +3 -5
- package/dist/integrations/feishu/feishu-auth-service.d.ts +0 -71
- package/dist/integrations/feishu/feishu-auth-service.js +0 -399
- package/dist/integrations/feishu/feishu-auth-service.js.map +0 -1
- package/dist/integrations/feishu/feishu-auth-store.d.ts +0 -29
- package/dist/integrations/feishu/feishu-auth-store.js +0 -113
- package/dist/integrations/feishu/feishu-auth-store.js.map +0 -1
- package/dist/integrations/jira/jira-cli-config.d.ts +0 -15
- package/dist/integrations/jira/jira-cli-config.js +0 -100
- package/dist/integrations/jira/jira-cli-config.js.map +0 -1
- package/dist/problem-solving-core/codex/codex-global-config.d.ts +0 -17
- package/dist/problem-solving-core/codex/codex-global-config.js +0 -100
- package/dist/problem-solving-core/codex/codex-global-config.js.map +0 -1
- package/dist/task-environment/orchestration/triage-agent.d.ts +0 -54
- package/dist/task-environment/orchestration/triage-agent.js +0 -636
- package/dist/task-environment/orchestration/triage-agent.js.map +0 -1
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ npx playwright install chromium
|
|
|
35
35
|
optimus setup
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
Setup creates the `~/.optimus` runtime home, registers the first repository, configures Codex authentication, and records Jira, Sentry, and Feishu delivery settings.
|
|
38
|
+
Setup creates the `~/.optimus` runtime home, registers the first repository, configures Codex authentication, and records Jira, Sentry, and Feishu delivery settings. Optimus always includes its built-in Feishu app for message delivery and analysis-document publishing. A Feishu webhook can be added during setup when group delivery should take priority. When Jira and Sentry are both enabled, setup also stores the Jira project key used to auto-create Jira issues for Sentry-origin patch publication.
|
|
39
39
|
|
|
40
40
|
Supported Codex auth modes:
|
|
41
41
|
|
|
@@ -76,7 +76,6 @@ optimus setup
|
|
|
76
76
|
optimus doctor --quick
|
|
77
77
|
optimus start
|
|
78
78
|
optimus submit --title "..." --description "..."
|
|
79
|
-
optimus feishu auth login
|
|
80
79
|
```
|
|
81
80
|
|
|
82
81
|
Task inspection:
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { FeedbackReportResult } from "./feedback.js";
|
|
2
|
+
import type { OptimusConfig } from "../types.js";
|
|
3
|
+
import { FeishuClient } from "../integrations/feishu/feishu-client.js";
|
|
4
|
+
import type { FeishuDocumentService } from "../integrations/feishu/feishu-doc-service.js";
|
|
5
|
+
import { FeishuUserService } from "../integrations/feishu/feishu-user-service.js";
|
|
6
|
+
export declare const DEFAULT_FEEDBACK_RECIPIENT_EMAIL = "wangkai39@xiaomi.com";
|
|
7
|
+
export interface FeedbackDeliveryInput {
|
|
8
|
+
title: string;
|
|
9
|
+
description: string;
|
|
10
|
+
currentVersion: string;
|
|
11
|
+
report: FeedbackReportResult;
|
|
12
|
+
}
|
|
13
|
+
export interface FeishuFeedbackDeliveryOptions {
|
|
14
|
+
config?: Pick<OptimusConfig, "delivery">;
|
|
15
|
+
client?: Pick<FeishuClient, "hasTenantCredentials" | "postAsTenant">;
|
|
16
|
+
documentService?: Pick<FeishuDocumentService, "isConfigured" | "createMarkdownDocument" | "grantDocumentMemberPermission">;
|
|
17
|
+
userService?: Pick<FeishuUserService, "isConfigured" | "resolveOpenId">;
|
|
18
|
+
}
|
|
19
|
+
export interface FeishuFeedbackDeliveryResult {
|
|
20
|
+
recipientEmail: string;
|
|
21
|
+
recipientOpenId?: string;
|
|
22
|
+
document: {
|
|
23
|
+
status: "created" | "skipped" | "failed";
|
|
24
|
+
url?: string;
|
|
25
|
+
reason?: string;
|
|
26
|
+
};
|
|
27
|
+
notification: {
|
|
28
|
+
status: "sent" | "skipped" | "failed";
|
|
29
|
+
reason?: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export declare function resolveDefaultFeedbackRecipientFallbackOpenId(env?: NodeJS.ProcessEnv, config?: Pick<OptimusConfig, "delivery">): string | undefined;
|
|
33
|
+
export declare function renderFeedbackDocumentMarkdown(input: FeedbackDeliveryInput & {
|
|
34
|
+
reportContent: string;
|
|
35
|
+
}): string;
|
|
36
|
+
export declare function buildFeedbackFeishuCard(input: {
|
|
37
|
+
title: string;
|
|
38
|
+
description: string;
|
|
39
|
+
currentVersion: string;
|
|
40
|
+
submittedAt: string;
|
|
41
|
+
documentUrl: string;
|
|
42
|
+
report: FeedbackReportResult;
|
|
43
|
+
recipientOpenId?: string;
|
|
44
|
+
}): Record<string, unknown>;
|
|
45
|
+
export declare class FeishuFeedbackDeliveryService {
|
|
46
|
+
private readonly client;
|
|
47
|
+
private readonly documentService;
|
|
48
|
+
private readonly userService;
|
|
49
|
+
constructor(options?: FeishuFeedbackDeliveryOptions);
|
|
50
|
+
deliver(input: FeedbackDeliveryInput): Promise<FeishuFeedbackDeliveryResult>;
|
|
51
|
+
private createFeedbackDocument;
|
|
52
|
+
private writeFeedbackDocumentSource;
|
|
53
|
+
private sendFeedbackCard;
|
|
54
|
+
private describeError;
|
|
55
|
+
private resolveRecipientOpenId;
|
|
56
|
+
}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { FeishuClient, FeishuIntegrationError } from "../integrations/feishu/feishu-client.js";
|
|
4
|
+
import { FeishuDocumentService as DefaultFeishuDocumentService } from "../integrations/feishu/feishu-doc-service.js";
|
|
5
|
+
import { resolveFeishuAuthAppConfig } from "../integrations/feishu/feishu-auth-config.js";
|
|
6
|
+
import { FeishuUserService } from "../integrations/feishu/feishu-user-service.js";
|
|
7
|
+
export const DEFAULT_FEEDBACK_RECIPIENT_EMAIL = "wangkai39@xiaomi.com";
|
|
8
|
+
const DEFAULT_FEEDBACK_RECIPIENT_OPEN_ID_BY_APP_ID = {
|
|
9
|
+
cli_aa8f39fee7f99cc2: "ou_320eedc2ac77d77a96c5391f846717e1"
|
|
10
|
+
};
|
|
11
|
+
export function resolveDefaultFeedbackRecipientFallbackOpenId(env = process.env, config) {
|
|
12
|
+
const appConfig = resolveFeishuAuthAppConfig(env, config?.delivery.feishu.baseUrl ? { baseUrl: config.delivery.feishu.baseUrl } : undefined);
|
|
13
|
+
return DEFAULT_FEEDBACK_RECIPIENT_OPEN_ID_BY_APP_ID[appConfig.appId];
|
|
14
|
+
}
|
|
15
|
+
export function renderFeedbackDocumentMarkdown(input) {
|
|
16
|
+
const foundFiles = input.report.files.filter((file) => file.found);
|
|
17
|
+
const missingFiles = input.report.files.filter((file) => !file.found);
|
|
18
|
+
return [
|
|
19
|
+
"# Optimus User Feedback",
|
|
20
|
+
"",
|
|
21
|
+
"## Recipient",
|
|
22
|
+
`Feishu User: ${DEFAULT_FEEDBACK_RECIPIENT_EMAIL}`,
|
|
23
|
+
"",
|
|
24
|
+
"## Feedback",
|
|
25
|
+
`Title: ${input.title}`,
|
|
26
|
+
`Description: ${input.description}`,
|
|
27
|
+
"",
|
|
28
|
+
"## Environment",
|
|
29
|
+
`Version: v${input.currentVersion}`,
|
|
30
|
+
`Submitted At: ${input.report.submittedAt}`,
|
|
31
|
+
`Feedback ID: ${input.report.id}`,
|
|
32
|
+
"",
|
|
33
|
+
"## Local Artifacts",
|
|
34
|
+
`Bundle Directory: ${input.report.feedbackDir}`,
|
|
35
|
+
`Report File: ${input.report.reportPath}`,
|
|
36
|
+
`Archive File: ${input.report.archivePath}`,
|
|
37
|
+
"",
|
|
38
|
+
"### Available Artifacts",
|
|
39
|
+
...(foundFiles.length > 0 ? foundFiles.map((file) => renderArtifactBullet(file)) : ["- none"]),
|
|
40
|
+
"",
|
|
41
|
+
"### Missing Artifacts",
|
|
42
|
+
...(missingFiles.length > 0 ? missingFiles.map((file) => `- ${file.kind}: ${file.fileName}`) : ["- none"]),
|
|
43
|
+
"",
|
|
44
|
+
"## Report Content",
|
|
45
|
+
input.reportContent.trim() || "_empty_"
|
|
46
|
+
].join("\n");
|
|
47
|
+
}
|
|
48
|
+
export function buildFeedbackFeishuCard(input) {
|
|
49
|
+
return {
|
|
50
|
+
config: {
|
|
51
|
+
wide_screen_mode: true,
|
|
52
|
+
enable_forward: true
|
|
53
|
+
},
|
|
54
|
+
header: {
|
|
55
|
+
template: "blue",
|
|
56
|
+
title: {
|
|
57
|
+
tag: "plain_text",
|
|
58
|
+
content: `Optimus Feedback | ${compactTitle(input.title)}`
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
elements: [
|
|
62
|
+
{
|
|
63
|
+
tag: "div",
|
|
64
|
+
fields: [
|
|
65
|
+
{
|
|
66
|
+
is_short: true,
|
|
67
|
+
text: {
|
|
68
|
+
tag: "lark_md",
|
|
69
|
+
content: input.recipientOpenId
|
|
70
|
+
? `**Recipient**: <at id=${input.recipientOpenId}></at>`
|
|
71
|
+
: `**Recipient**: ${escapeMarkdown(DEFAULT_FEEDBACK_RECIPIENT_EMAIL)}`
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
is_short: true,
|
|
76
|
+
text: {
|
|
77
|
+
tag: "lark_md",
|
|
78
|
+
content: `**Version**: v${escapeMarkdown(input.currentVersion)}`
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
tag: "hr"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
tag: "div",
|
|
88
|
+
text: {
|
|
89
|
+
tag: "lark_md",
|
|
90
|
+
content: `**Title**: ${escapeMarkdown(input.title)}`
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
tag: "div",
|
|
95
|
+
text: {
|
|
96
|
+
tag: "lark_md",
|
|
97
|
+
content: `**Description**: ${escapeMarkdown(input.description)}`
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
tag: "div",
|
|
102
|
+
text: {
|
|
103
|
+
tag: "lark_md",
|
|
104
|
+
content: `**Submitted At**: ${escapeMarkdown(input.submittedAt)}`
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
tag: "div",
|
|
109
|
+
text: {
|
|
110
|
+
tag: "lark_md",
|
|
111
|
+
content: `**Artifacts**: ${input.report.files.filter((file) => file.found).length}/${input.report.files.length} local files captured`
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
tag: "action",
|
|
116
|
+
actions: [
|
|
117
|
+
{
|
|
118
|
+
tag: "button",
|
|
119
|
+
type: "primary",
|
|
120
|
+
text: {
|
|
121
|
+
tag: "plain_text",
|
|
122
|
+
content: "Open Feedback Doc"
|
|
123
|
+
},
|
|
124
|
+
url: input.documentUrl
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
]
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
export class FeishuFeedbackDeliveryService {
|
|
132
|
+
client;
|
|
133
|
+
documentService;
|
|
134
|
+
userService;
|
|
135
|
+
constructor(options = {}) {
|
|
136
|
+
this.client = options.client ?? new FeishuClient({
|
|
137
|
+
...(options.config ? { config: options.config } : {})
|
|
138
|
+
});
|
|
139
|
+
this.documentService = options.documentService ?? new DefaultFeishuDocumentService({
|
|
140
|
+
...(options.config ? { config: options.config } : {})
|
|
141
|
+
});
|
|
142
|
+
this.userService = options.userService ?? new FeishuUserService({
|
|
143
|
+
...(options.config ? { config: options.config } : {})
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
async deliver(input) {
|
|
147
|
+
const recipientEmail = DEFAULT_FEEDBACK_RECIPIENT_EMAIL;
|
|
148
|
+
if (!this.client.hasTenantCredentials() || !this.documentService.isConfigured()) {
|
|
149
|
+
return {
|
|
150
|
+
recipientEmail,
|
|
151
|
+
document: {
|
|
152
|
+
status: "skipped",
|
|
153
|
+
reason: "feishu_app_unavailable"
|
|
154
|
+
},
|
|
155
|
+
notification: {
|
|
156
|
+
status: "skipped",
|
|
157
|
+
reason: "feishu_app_unavailable"
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const recipientOpenId = await this.resolveRecipientOpenId(recipientEmail);
|
|
162
|
+
if (!recipientOpenId) {
|
|
163
|
+
return {
|
|
164
|
+
recipientEmail,
|
|
165
|
+
document: {
|
|
166
|
+
status: "skipped",
|
|
167
|
+
reason: "recipient_open_id_unresolved"
|
|
168
|
+
},
|
|
169
|
+
notification: {
|
|
170
|
+
status: "skipped",
|
|
171
|
+
reason: "recipient_open_id_unresolved"
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
const documentResult = await this.createFeedbackDocument(input, recipientOpenId);
|
|
176
|
+
if (documentResult.status !== "created" || !documentResult.url) {
|
|
177
|
+
return {
|
|
178
|
+
recipientEmail,
|
|
179
|
+
...(recipientOpenId ? { recipientOpenId } : {}),
|
|
180
|
+
document: documentResult,
|
|
181
|
+
notification: {
|
|
182
|
+
status: "skipped",
|
|
183
|
+
reason: "feedback_document_unavailable"
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
const notification = await this.sendFeedbackCard({
|
|
188
|
+
title: input.title,
|
|
189
|
+
description: input.description,
|
|
190
|
+
currentVersion: input.currentVersion,
|
|
191
|
+
submittedAt: input.report.submittedAt,
|
|
192
|
+
documentUrl: documentResult.url,
|
|
193
|
+
report: input.report,
|
|
194
|
+
recipientOpenId
|
|
195
|
+
});
|
|
196
|
+
return {
|
|
197
|
+
recipientEmail,
|
|
198
|
+
...(recipientOpenId ? { recipientOpenId } : {}),
|
|
199
|
+
document: documentResult,
|
|
200
|
+
notification
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
async createFeedbackDocument(input, recipientOpenId) {
|
|
204
|
+
try {
|
|
205
|
+
const sourceMarkdownPath = await this.writeFeedbackDocumentSource(input);
|
|
206
|
+
const created = await this.documentService.createMarkdownDocument({
|
|
207
|
+
title: `Optimus Feedback | ${compactTitle(input.title)}`,
|
|
208
|
+
markdownPath: sourceMarkdownPath
|
|
209
|
+
});
|
|
210
|
+
await this.documentService.grantDocumentMemberPermission({
|
|
211
|
+
documentToken: created.token,
|
|
212
|
+
memberId: recipientOpenId,
|
|
213
|
+
memberType: "openid",
|
|
214
|
+
perm: "edit"
|
|
215
|
+
});
|
|
216
|
+
return {
|
|
217
|
+
status: "created",
|
|
218
|
+
url: created.url
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
return {
|
|
223
|
+
status: "failed",
|
|
224
|
+
reason: this.describeError(error)
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
async writeFeedbackDocumentSource(input) {
|
|
229
|
+
const sourceMarkdownPath = join(input.report.feedbackDir, "feishu-feedback.md");
|
|
230
|
+
const reportContent = await readFile(input.report.reportPath, "utf8").catch(() => "");
|
|
231
|
+
const markdown = renderFeedbackDocumentMarkdown({
|
|
232
|
+
...input,
|
|
233
|
+
reportContent
|
|
234
|
+
});
|
|
235
|
+
await writeFile(sourceMarkdownPath, `${markdown}\n`, "utf8");
|
|
236
|
+
return sourceMarkdownPath;
|
|
237
|
+
}
|
|
238
|
+
async sendFeedbackCard(input) {
|
|
239
|
+
try {
|
|
240
|
+
await this.client.postAsTenant("/open-apis/im/v1/messages", {
|
|
241
|
+
receive_id: input.recipientOpenId,
|
|
242
|
+
msg_type: "interactive",
|
|
243
|
+
content: JSON.stringify(buildFeedbackFeishuCard(input))
|
|
244
|
+
}, {
|
|
245
|
+
receive_id_type: "open_id"
|
|
246
|
+
});
|
|
247
|
+
return {
|
|
248
|
+
status: "sent"
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
return {
|
|
253
|
+
status: "failed",
|
|
254
|
+
reason: this.describeError(error)
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
describeError(error) {
|
|
259
|
+
if (error instanceof FeishuIntegrationError) {
|
|
260
|
+
const detail = error.diagnostics.detail?.trim();
|
|
261
|
+
const status = error.diagnostics.status;
|
|
262
|
+
const code = error.diagnostics.code;
|
|
263
|
+
return [
|
|
264
|
+
error.message,
|
|
265
|
+
status !== undefined ? `status=${status}` : undefined,
|
|
266
|
+
code !== undefined ? `code=${code}` : undefined,
|
|
267
|
+
detail ? `detail=${detail}` : undefined
|
|
268
|
+
].filter(Boolean).join(" ");
|
|
269
|
+
}
|
|
270
|
+
return error instanceof Error ? error.message : String(error);
|
|
271
|
+
}
|
|
272
|
+
async resolveRecipientOpenId(recipientEmail) {
|
|
273
|
+
const fallbackOpenId = recipientEmail === DEFAULT_FEEDBACK_RECIPIENT_EMAIL
|
|
274
|
+
? resolveDefaultFeedbackRecipientFallbackOpenId(process.env)
|
|
275
|
+
: undefined;
|
|
276
|
+
if (!this.userService.isConfigured()) {
|
|
277
|
+
return fallbackOpenId;
|
|
278
|
+
}
|
|
279
|
+
try {
|
|
280
|
+
return await this.userService.resolveOpenId(recipientEmail) ?? fallbackOpenId;
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
return fallbackOpenId;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
function renderArtifactBullet(file) {
|
|
288
|
+
return `- ${file.kind}: ${file.outputPath}`;
|
|
289
|
+
}
|
|
290
|
+
function compactTitle(value) {
|
|
291
|
+
const normalized = value.replace(/\s+/gu, " ").trim();
|
|
292
|
+
return normalized.length > 80 ? `${normalized.slice(0, 77)}...` : normalized;
|
|
293
|
+
}
|
|
294
|
+
function escapeMarkdown(value) {
|
|
295
|
+
return value.replace(/[\\`*_{}\[\]()#+\-.!|>]/gu, "\\$&");
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=feedback-delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-delivery.js","sourceRoot":"","sources":["../../src/cli/feedback-delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface FeedbackInput {
|
|
2
|
+
title: string;
|
|
3
|
+
description: string;
|
|
4
|
+
currentVersion: string;
|
|
5
|
+
packageRoot: string;
|
|
6
|
+
}
|
|
7
|
+
export interface FeedbackArtifactFile {
|
|
8
|
+
kind: "runtime" | "runtime_trace";
|
|
9
|
+
fileName: string;
|
|
10
|
+
sourcePath: string;
|
|
11
|
+
outputPath: string;
|
|
12
|
+
found: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface FeedbackReportResult {
|
|
15
|
+
id: string;
|
|
16
|
+
feedbackDir: string;
|
|
17
|
+
reportPath: string;
|
|
18
|
+
reportJsonPath: string;
|
|
19
|
+
metaPath: string;
|
|
20
|
+
archivePath: string;
|
|
21
|
+
archiveSizeBytes: number;
|
|
22
|
+
submittedAt: string;
|
|
23
|
+
files: FeedbackArtifactFile[];
|
|
24
|
+
}
|
|
25
|
+
export declare function createFeedbackReport(input: FeedbackInput): Promise<FeedbackReportResult>;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { copyFile, stat } from "node:fs/promises";
|
|
2
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { execFile } from "node:child_process";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { platform } from "node:process";
|
|
7
|
+
import { resolveDefaultFeedbackRootDir, resolveDefaultRuntimeRootDir } from "../config/optimus-paths.js";
|
|
8
|
+
import { detectInstallSource } from "./self-update.js";
|
|
9
|
+
const execFileAsync = promisify(execFile);
|
|
10
|
+
function buildFeedbackId(submittedAt) {
|
|
11
|
+
const compactTimestamp = submittedAt.replace(/[-:TZ.]/g, "").slice(0, 14);
|
|
12
|
+
const randomSuffix = Math.random().toString(36).slice(2, 8);
|
|
13
|
+
return `feedback-${compactTimestamp}-${randomSuffix}`;
|
|
14
|
+
}
|
|
15
|
+
function resolveRuntimeLogsForTimestamp(runtimeRootDir, submittedAt) {
|
|
16
|
+
const datePart = submittedAt.slice(0, 10);
|
|
17
|
+
const logsDir = join(runtimeRootDir, "logs");
|
|
18
|
+
return [
|
|
19
|
+
{
|
|
20
|
+
kind: "runtime",
|
|
21
|
+
fileName: `runtime-${datePart}.log`,
|
|
22
|
+
sourcePath: join(logsDir, `runtime-${datePart}.log`)
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
kind: "runtime_trace",
|
|
26
|
+
fileName: `runtime-trace-${datePart}.log`,
|
|
27
|
+
sourcePath: join(logsDir, `runtime-trace-${datePart}.log`)
|
|
28
|
+
}
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
async function copyIfExists(sourcePath, destinationPath) {
|
|
32
|
+
try {
|
|
33
|
+
await copyFile(sourcePath, destinationPath);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function renderFeedbackMarkdown(input) {
|
|
41
|
+
const runtimeLog = input.files.find((item) => item.kind === "runtime");
|
|
42
|
+
const traceLog = input.files.find((item) => item.kind === "runtime_trace");
|
|
43
|
+
return [
|
|
44
|
+
"# Optimus Feedback",
|
|
45
|
+
"",
|
|
46
|
+
"## Summary",
|
|
47
|
+
`Title: ${input.title}`,
|
|
48
|
+
`Description: ${input.description}`,
|
|
49
|
+
"",
|
|
50
|
+
"## Environment",
|
|
51
|
+
`Version: v${input.version}`,
|
|
52
|
+
`Submitted At: ${input.submittedAt}`,
|
|
53
|
+
`Platform: ${platform}`,
|
|
54
|
+
`Install Source: ${input.installSource}`,
|
|
55
|
+
"",
|
|
56
|
+
"## Attached Logs",
|
|
57
|
+
`- ${runtimeLog?.found ? runtimeLog.outputPath : `missing: ${runtimeLog?.fileName ?? "runtime log"}`}`,
|
|
58
|
+
`- ${traceLog?.found ? traceLog.outputPath : `missing: ${traceLog?.fileName ?? "runtime trace log"}`}`,
|
|
59
|
+
"",
|
|
60
|
+
"## Notes",
|
|
61
|
+
"Logs are selected by the feedback submission date."
|
|
62
|
+
].join("\n");
|
|
63
|
+
}
|
|
64
|
+
export async function createFeedbackReport(input) {
|
|
65
|
+
const submittedAt = new Date().toISOString();
|
|
66
|
+
const feedbackId = buildFeedbackId(submittedAt);
|
|
67
|
+
const feedbackDir = join(resolveDefaultFeedbackRootDir(), feedbackId);
|
|
68
|
+
const reportPath = join(feedbackDir, "report.md");
|
|
69
|
+
const reportJsonPath = join(feedbackDir, "report.json");
|
|
70
|
+
const metaPath = join(feedbackDir, "meta.json");
|
|
71
|
+
const archivePath = join(feedbackDir, `${feedbackId}.tar.gz`);
|
|
72
|
+
const runtimeRootDir = resolveDefaultRuntimeRootDir();
|
|
73
|
+
const installSource = await detectInstallSource(input.packageRoot);
|
|
74
|
+
await mkdir(feedbackDir, { recursive: true });
|
|
75
|
+
const selectedLogs = resolveRuntimeLogsForTimestamp(runtimeRootDir, submittedAt);
|
|
76
|
+
const files = [];
|
|
77
|
+
for (const selectedLog of selectedLogs) {
|
|
78
|
+
const outputPath = join(feedbackDir, selectedLog.fileName);
|
|
79
|
+
const found = await copyIfExists(selectedLog.sourcePath, outputPath);
|
|
80
|
+
files.push({
|
|
81
|
+
...selectedLog,
|
|
82
|
+
outputPath,
|
|
83
|
+
found
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
const reportJson = {
|
|
87
|
+
id: feedbackId,
|
|
88
|
+
title: input.title,
|
|
89
|
+
description: input.description,
|
|
90
|
+
submittedAt,
|
|
91
|
+
version: input.currentVersion,
|
|
92
|
+
platform,
|
|
93
|
+
installSource,
|
|
94
|
+
files: files.map((file) => ({
|
|
95
|
+
kind: file.kind,
|
|
96
|
+
fileName: file.fileName,
|
|
97
|
+
sourcePath: file.sourcePath,
|
|
98
|
+
outputPath: file.outputPath,
|
|
99
|
+
found: file.found
|
|
100
|
+
}))
|
|
101
|
+
};
|
|
102
|
+
await writeFile(reportPath, `${renderFeedbackMarkdown({
|
|
103
|
+
title: input.title,
|
|
104
|
+
description: input.description,
|
|
105
|
+
submittedAt,
|
|
106
|
+
version: input.currentVersion,
|
|
107
|
+
installSource,
|
|
108
|
+
files
|
|
109
|
+
})}\n`, "utf8");
|
|
110
|
+
await writeFile(reportJsonPath, `${JSON.stringify(reportJson, null, 2)}\n`, "utf8");
|
|
111
|
+
await writeFile(metaPath, `${JSON.stringify({
|
|
112
|
+
id: feedbackId,
|
|
113
|
+
createdAt: submittedAt,
|
|
114
|
+
feedbackDir,
|
|
115
|
+
reportPath,
|
|
116
|
+
reportJsonPath,
|
|
117
|
+
archivePath
|
|
118
|
+
}, null, 2)}\n`, "utf8");
|
|
119
|
+
const archiveInputs = [
|
|
120
|
+
"report.md",
|
|
121
|
+
"report.json",
|
|
122
|
+
"meta.json",
|
|
123
|
+
...files
|
|
124
|
+
.filter((file) => file.found)
|
|
125
|
+
.map((file) => file.fileName)
|
|
126
|
+
];
|
|
127
|
+
await execFileAsync("tar", ["-czf", archivePath, "-C", feedbackDir, ...archiveInputs], {
|
|
128
|
+
encoding: "utf8"
|
|
129
|
+
});
|
|
130
|
+
const archiveStats = await stat(archivePath);
|
|
131
|
+
return {
|
|
132
|
+
id: feedbackId,
|
|
133
|
+
feedbackDir,
|
|
134
|
+
reportPath,
|
|
135
|
+
reportJsonPath,
|
|
136
|
+
metaPath,
|
|
137
|
+
archivePath,
|
|
138
|
+
archiveSizeBytes: archiveStats.size,
|
|
139
|
+
submittedAt,
|
|
140
|
+
files
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/cli/feedback.ts"],"names":[],"mappings":"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"}
|