@sireai/optimus 0.1.14 → 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.
Files changed (69) hide show
  1. package/README.md +1 -2
  2. package/dist/cli/feedback-delivery.d.ts +56 -0
  3. package/dist/cli/feedback-delivery.js +297 -0
  4. package/dist/cli/feedback-delivery.js.map +1 -0
  5. package/dist/cli/feedback.d.ts +25 -0
  6. package/dist/cli/feedback.js +143 -0
  7. package/dist/cli/feedback.js.map +1 -0
  8. package/dist/cli/optimus.js +382 -195
  9. package/dist/cli/optimus.js.map +1 -1
  10. package/dist/config/load-config.js +5 -4
  11. package/dist/config/load-config.js.map +1 -1
  12. package/dist/config/optimus-paths.d.ts +1 -0
  13. package/dist/config/optimus-paths.js +3 -0
  14. package/dist/config/optimus-paths.js.map +1 -1
  15. package/dist/integrations/feishu/feishu-auth-config.d.ts +5 -1
  16. package/dist/integrations/feishu/feishu-auth-config.js +9 -6
  17. package/dist/integrations/feishu/feishu-auth-config.js.map +1 -1
  18. package/dist/integrations/feishu/feishu-client.d.ts +2 -6
  19. package/dist/integrations/feishu/feishu-client.js +16 -41
  20. package/dist/integrations/feishu/feishu-client.js.map +1 -1
  21. package/dist/integrations/feishu/feishu-doc-service.d.ts +8 -3
  22. package/dist/integrations/feishu/feishu-doc-service.js +16 -2
  23. package/dist/integrations/feishu/feishu-doc-service.js.map +1 -1
  24. package/dist/integrations/feishu/feishu-user-service.d.ts +1 -2
  25. package/dist/integrations/feishu/feishu-user-service.js +1 -2
  26. package/dist/integrations/feishu/feishu-user-service.js.map +1 -1
  27. package/dist/integrations/jira/jira-cli.js +21 -2
  28. package/dist/integrations/jira/jira-cli.js.map +1 -1
  29. package/dist/integrations/jira/jira-client.d.ts +2 -1
  30. package/dist/integrations/jira/jira-client.js +19 -2
  31. package/dist/integrations/jira/jira-client.js.map +1 -1
  32. package/dist/integrations/jira/jira-submit.js +24 -24
  33. package/dist/integrations/jira/jira-submit.js.map +1 -1
  34. package/dist/integrations/sentry/sentry-cli.js +21 -1
  35. package/dist/integrations/sentry/sentry-cli.js.map +1 -1
  36. package/dist/task-environment/delivery/feishu-analysis-doc-service.d.ts +7 -3
  37. package/dist/task-environment/delivery/feishu-analysis-doc-service.js +62 -3
  38. package/dist/task-environment/delivery/feishu-analysis-doc-service.js.map +1 -1
  39. package/dist/task-environment/delivery/feishu-card-renderer.d.ts +1 -0
  40. package/dist/task-environment/delivery/feishu-card-renderer.js +17 -6
  41. package/dist/task-environment/delivery/feishu-card-renderer.js.map +1 -1
  42. package/dist/task-environment/delivery/feishu-notifier.d.ts +13 -0
  43. package/dist/task-environment/delivery/feishu-notifier.js +206 -22
  44. package/dist/task-environment/delivery/feishu-notifier.js.map +1 -1
  45. package/dist/task-environment/delivery/sentry-feishu-card-renderer.d.ts +1 -0
  46. package/dist/task-environment/delivery/sentry-feishu-card-renderer.js +16 -5
  47. package/dist/task-environment/delivery/sentry-feishu-card-renderer.js.map +1 -1
  48. package/dist/task-environment/orchestration/task-orchestrator.d.ts +0 -1
  49. package/dist/task-environment/orchestration/task-orchestrator.js +3 -23
  50. package/dist/task-environment/orchestration/task-orchestrator.js.map +1 -1
  51. package/dist/task-environment/runtime/optimus-runtime.js +1 -0
  52. package/dist/task-environment/runtime/optimus-runtime.js.map +1 -1
  53. package/dist/types.d.ts +2 -2
  54. package/package.json +3 -5
  55. package/dist/integrations/feishu/feishu-auth-service.d.ts +0 -71
  56. package/dist/integrations/feishu/feishu-auth-service.js +0 -399
  57. package/dist/integrations/feishu/feishu-auth-service.js.map +0 -1
  58. package/dist/integrations/feishu/feishu-auth-store.d.ts +0 -29
  59. package/dist/integrations/feishu/feishu-auth-store.js +0 -113
  60. package/dist/integrations/feishu/feishu-auth-store.js.map +0 -1
  61. package/dist/integrations/jira/jira-cli-config.d.ts +0 -15
  62. package/dist/integrations/jira/jira-cli-config.js +0 -100
  63. package/dist/integrations/jira/jira-cli-config.js.map +0 -1
  64. package/dist/problem-solving-core/codex/codex-global-config.d.ts +0 -17
  65. package/dist/problem-solving-core/codex/codex-global-config.js +0 -100
  66. package/dist/problem-solving-core/codex/codex-global-config.js.map +0 -1
  67. package/dist/task-environment/orchestration/triage-agent.d.ts +0 -54
  68. package/dist/task-environment/orchestration/triage-agent.js +0 -636
  69. 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. If Feishu delivery is enabled, run `optimus feishu auth login` after setup to enable analysis-doc upload and real @mentions. 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.
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAE/F,OAAO,EAAE,qBAAqB,IAAI,4BAA4B,EAAE,MAAM,8CAA8C,CAAC;AACrH,OAAO,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAElF,MAAM,CAAC,MAAM,gCAAgC,GAAG,sBAAsB,CAAC;AACvE,MAAM,4CAA4C,GAA2B;IAC3E,oBAAoB,EAAE,qCAAqC;CAC5D,CAAC;AA8BF,MAAM,UAAU,6CAA6C,CAC3D,MAAyB,OAAO,CAAC,GAAG,EACpC,MAAwC;IAExC,MAAM,SAAS,GAAG,0BAA0B,CAC1C,GAAG,EACH,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAC1F,CAAC;IACF,OAAO,4CAA4C,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAAwD;IACrG,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,OAAO;QACL,yBAAyB;QACzB,EAAE;QACF,cAAc;QACd,gBAAgB,gCAAgC,EAAE;QAClD,EAAE;QACF,aAAa;QACb,UAAU,KAAK,CAAC,KAAK,EAAE;QACvB,gBAAgB,KAAK,CAAC,WAAW,EAAE;QACnC,EAAE;QACF,gBAAgB;QAChB,aAAa,KAAK,CAAC,cAAc,EAAE;QACnC,iBAAiB,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE;QAC3C,gBAAgB,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE;QACjC,EAAE;QACF,oBAAoB;QACpB,qBAAqB,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE;QAC/C,gBAAgB,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE;QACzC,iBAAiB,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE;QAC3C,EAAE;QACF,yBAAyB;QACzB,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC9F,EAAE;QACF,uBAAuB;QACvB,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC1G,EAAE;QACF,mBAAmB;QACnB,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,SAAS;KACxC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAQvC;IACC,OAAO;QACL,MAAM,EAAE;YACN,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,IAAI;SACrB;QACD,MAAM,EAAE;YACN,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE;gBACL,GAAG,EAAE,YAAY;gBACjB,OAAO,EAAE,sBAAsB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;aAC3D;SACF;QACD,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,KAAK;gBACV,MAAM,EAAE;oBACN;wBACE,QAAQ,EAAE,IAAI;wBACd,IAAI,EAAE;4BACJ,GAAG,EAAE,SAAS;4BACd,OAAO,EAAE,KAAK,CAAC,eAAe;gCAC5B,CAAC,CAAC,yBAAyB,KAAK,CAAC,eAAe,QAAQ;gCACxD,CAAC,CAAC,kBAAkB,cAAc,CAAC,gCAAgC,CAAC,EAAE;yBACzE;qBACF;oBACD;wBACE,QAAQ,EAAE,IAAI;wBACd,IAAI,EAAE;4BACJ,GAAG,EAAE,SAAS;4BACd,OAAO,EAAE,iBAAiB,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE;yBACjE;qBACF;iBACF;aACF;YACD;gBACE,GAAG,EAAE,IAAI;aACV;YACD;gBACE,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE;oBACJ,GAAG,EAAE,SAAS;oBACd,OAAO,EAAE,cAAc,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;iBACrD;aACF;YACD;gBACE,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE;oBACJ,GAAG,EAAE,SAAS;oBACd,OAAO,EAAE,oBAAoB,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;iBACjE;aACF;YACD;gBACE,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE;oBACJ,GAAG,EAAE,SAAS;oBACd,OAAO,EAAE,qBAAqB,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;iBAClE;aACF;YACD;gBACE,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE;oBACJ,GAAG,EAAE,SAAS;oBACd,OAAO,EAAE,kBAAkB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,uBAAuB;iBACtI;aACF;YACD;gBACE,GAAG,EAAE,QAAQ;gBACb,OAAO,EAAE;oBACP;wBACE,GAAG,EAAE,QAAQ;wBACb,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE;4BACJ,GAAG,EAAE,YAAY;4BACjB,OAAO,EAAE,mBAAmB;yBAC7B;wBACD,GAAG,EAAE,KAAK,CAAC,WAAW;qBACvB;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,6BAA6B;IACvB,MAAM,CAA8D;IACpE,eAAe,CAA2G;IAC1H,WAAW,CAA4D;IAExF,YAAmB,UAAyC,EAAE;QAC5D,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,YAAY,CAAC;YAC/C,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,4BAA4B,CAAC;YACjF,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,iBAAiB,CAAC;YAC9D,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,KAA4B;QAC/C,MAAM,cAAc,GAAG,gCAAgC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,EAAE,CAAC;YAChF,OAAO;gBACL,cAAc;gBACd,QAAQ,EAAE;oBACR,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,wBAAwB;iBACjC;gBACD,YAAY,EAAE;oBACZ,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,wBAAwB;iBACjC;aACF,CAAC;QACJ,CAAC;QAED,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;QAC1E,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO;gBACL,cAAc;gBACd,QAAQ,EAAE;oBACR,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,8BAA8B;iBACvC;gBACD,YAAY,EAAE;oBACZ,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,8BAA8B;iBACvC;aACF,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QACjF,IAAI,cAAc,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;YAC/D,OAAO;gBACL,cAAc;gBACd,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,QAAQ,EAAE,cAAc;gBACxB,YAAY,EAAE;oBACZ,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,+BAA+B;iBACxC;aACF,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC;YAC/C,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;YACrC,WAAW,EAAE,cAAc,CAAC,GAAG;YAC/B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,eAAe;SAChB,CAAC,CAAC;QACH,OAAO;YACL,cAAc;YACd,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,QAAQ,EAAE,cAAc;YACxB,YAAY;SACb,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAClC,KAA4B,EAC5B,eAAuB;QAEvB,IAAI,CAAC;YACH,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;YACzE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC;gBAChE,KAAK,EAAE,sBAAsB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBACxD,YAAY,EAAE,kBAAkB;aACjC,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,CAAC,6BAA6B,CAAC;gBACvD,aAAa,EAAE,OAAO,CAAC,KAAK;gBAC5B,QAAQ,EAAE,eAAe;gBACzB,UAAU,EAAE,QAAQ;gBACpB,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;YACH,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;aAClC,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,2BAA2B,CAAC,KAA4B;QACpE,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;QAChF,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACtF,MAAM,QAAQ,GAAG,8BAA8B,CAAC;YAC9C,GAAG,KAAK;YACR,aAAa;SACd,CAAC,CAAC;QACH,MAAM,SAAS,CAAC,kBAAkB,EAAE,GAAG,QAAQ,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,KAQ9B;QACC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,2BAA2B,EAAE;gBAC1D,UAAU,EAAE,KAAK,CAAC,eAAe;gBACjC,QAAQ,EAAE,aAAa;gBACvB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;aACxD,EAAE;gBACD,eAAe,EAAE,SAAS;aAC3B,CAAC,CAAC;YACH,OAAO;gBACL,MAAM,EAAE,MAAM;aACf,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;aAClC,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,KAAc;QAClC,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;YACxC,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;YACpC,OAAO;gBACL,KAAK,CAAC,OAAO;gBACb,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;gBACrD,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;gBAC/C,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;aACxC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,cAAsB;QACzD,MAAM,cAAc,GAAG,cAAc,KAAK,gCAAgC;YACxE,CAAC,CAAC,6CAA6C,CAAC,OAAO,CAAC,GAAG,CAAC;YAC5D,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,CAAC;YACrC,OAAO,cAAc,CAAC;QACxB,CAAC;QACD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC;QAChF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;CACF;AAED,SAAS,oBAAoB,CAAC,IAA0B;IACtD,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,OAAO,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;AAC/E,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC;AAC5D,CAAC"}
@@ -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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"}