@sireai/optimus 0.1.15 → 0.1.17

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.
@@ -1,7 +1,8 @@
1
- import { copyFile, stat } from "node:fs/promises";
1
+ import { copyFile, readdir, readFile, stat } from "node:fs/promises";
2
2
  import { mkdir, writeFile } from "node:fs/promises";
3
- import { join } from "node:path";
3
+ import { basename, join } from "node:path";
4
4
  import { execFile } from "node:child_process";
5
+ import { hostname, userInfo } from "node:os";
5
6
  import { promisify } from "node:util";
6
7
  import { platform } from "node:process";
7
8
  import { resolveDefaultFeedbackRootDir, resolveDefaultRuntimeRootDir } from "../config/optimus-paths.js";
@@ -50,6 +51,7 @@ function renderFeedbackMarkdown(input) {
50
51
  "## Environment",
51
52
  `Version: v${input.version}`,
52
53
  `Submitted At: ${input.submittedAt}`,
54
+ `Submitted By: ${input.submitter.username}@${input.submitter.host}`,
53
55
  `Platform: ${platform}`,
54
56
  `Install Source: ${input.installSource}`,
55
57
  "",
@@ -71,6 +73,10 @@ export async function createFeedbackReport(input) {
71
73
  const archivePath = join(feedbackDir, `${feedbackId}.tar.gz`);
72
74
  const runtimeRootDir = resolveDefaultRuntimeRootDir();
73
75
  const installSource = await detectInstallSource(input.packageRoot);
76
+ const submitter = {
77
+ username: resolveSubmitterUsername(),
78
+ host: resolveSubmitterHost()
79
+ };
74
80
  await mkdir(feedbackDir, { recursive: true });
75
81
  const selectedLogs = resolveRuntimeLogsForTimestamp(runtimeRootDir, submittedAt);
76
82
  const files = [];
@@ -91,6 +97,7 @@ export async function createFeedbackReport(input) {
91
97
  version: input.currentVersion,
92
98
  platform,
93
99
  installSource,
100
+ submitter,
94
101
  files: files.map((file) => ({
95
102
  kind: file.kind,
96
103
  fileName: file.fileName,
@@ -105,6 +112,7 @@ export async function createFeedbackReport(input) {
105
112
  submittedAt,
106
113
  version: input.currentVersion,
107
114
  installSource,
115
+ submitter,
108
116
  files
109
117
  })}\n`, "utf8");
110
118
  await writeFile(reportJsonPath, `${JSON.stringify(reportJson, null, 2)}\n`, "utf8");
@@ -116,18 +124,10 @@ export async function createFeedbackReport(input) {
116
124
  reportJsonPath,
117
125
  archivePath
118
126
  }, 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"
127
+ const archiveResult = await refreshFeedbackArchive({
128
+ feedbackDir,
129
+ archivePath
129
130
  });
130
- const archiveStats = await stat(archivePath);
131
131
  return {
132
132
  id: feedbackId,
133
133
  feedbackDir,
@@ -135,9 +135,67 @@ export async function createFeedbackReport(input) {
135
135
  reportJsonPath,
136
136
  metaPath,
137
137
  archivePath,
138
- archiveSizeBytes: archiveStats.size,
138
+ archiveSizeBytes: archiveResult.archiveSizeBytes,
139
139
  submittedAt,
140
+ submitter,
140
141
  files
141
142
  };
142
143
  }
144
+ function resolveSubmitterUsername() {
145
+ try {
146
+ const username = userInfo().username?.trim();
147
+ if (username) {
148
+ return username;
149
+ }
150
+ }
151
+ catch {
152
+ // ignore and fall back to env
153
+ }
154
+ return process.env.USER?.trim() || process.env.LOGNAME?.trim() || "unknown";
155
+ }
156
+ function resolveSubmitterHost() {
157
+ try {
158
+ const value = hostname().trim();
159
+ if (value) {
160
+ return value;
161
+ }
162
+ }
163
+ catch {
164
+ // ignore and fall back to env
165
+ }
166
+ return process.env.HOSTNAME?.trim() || "unknown-host";
167
+ }
168
+ export async function updateFeedbackMeta(report, patch) {
169
+ let current = {};
170
+ try {
171
+ const raw = await readFile(report.metaPath, "utf8");
172
+ const parsed = JSON.parse(raw);
173
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
174
+ current = parsed;
175
+ }
176
+ }
177
+ catch {
178
+ current = {};
179
+ }
180
+ await writeFile(report.metaPath, `${JSON.stringify({
181
+ ...current,
182
+ ...patch
183
+ }, null, 2)}\n`, "utf8");
184
+ }
185
+ export async function refreshFeedbackArchive(input) {
186
+ const entries = (await readdir(input.feedbackDir, { withFileTypes: true }))
187
+ .filter((entry) => entry.isFile())
188
+ .map((entry) => entry.name)
189
+ .filter((name) => name !== basename(input.archivePath))
190
+ .sort();
191
+ await execFileAsync("tar", ["-czf", input.archivePath, "-C", input.feedbackDir, ...entries], {
192
+ encoding: "utf8"
193
+ });
194
+ const archiveStats = await stat(input.archivePath);
195
+ return {
196
+ archivePath: input.archivePath,
197
+ archiveSizeBytes: archiveStats.size,
198
+ includedFiles: entries
199
+ };
200
+ }
143
201
  //# sourceMappingURL=feedback.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/cli/feedback.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/cli/feedback.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  import { buildDefaultConfig, loadConfig } from "../config/load-config.js";
3
3
  import { createReadStream, createWriteStream } from "node:fs";
4
4
  import { access, mkdir, readdir, readFile, stat, writeFile } from "node:fs/promises";
5
- import { basename, dirname, join, resolve } from "node:path";
5
+ import { basename, dirname, join, resolve, sep } from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import { execFile, spawn } from "node:child_process";
8
8
  import { createInterface } from "node:readline/promises";
@@ -32,7 +32,7 @@ import { TaskPublicationService } from "../task-environment/delivery/task-public
32
32
  import { FeishuClient } from "../integrations/feishu/feishu-client.js";
33
33
  import { FeishuUserService } from "../integrations/feishu/feishu-user-service.js";
34
34
  import { createFeedbackReport } from "./feedback.js";
35
- import { DEFAULT_FEEDBACK_RECIPIENT_EMAIL, FeishuFeedbackDeliveryService, resolveDefaultFeedbackRecipientFallbackOpenId } from "./feedback-delivery.js";
35
+ import { DEFAULT_FEEDBACK_RECIPIENT_EMAIL, FeishuFeedbackDeliveryService, persistFeedbackDeliveryResult, resolveDefaultFeedbackRecipientFallbackOpenId } from "./feedback-delivery.js";
36
36
  import { resolveDefaultConfigPath, resolveDefaultEnvPath, resolveOptimusHomeDir } from "../config/optimus-paths.js";
37
37
  import { checkForSelfUpdate, installSelfUpdate, recordSkippedSelfUpdate, readSelfUpdateState, shouldPromptForCachedStartupUpdate } from "./self-update.js";
38
38
  const CLI_ROOT_DIR = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..");
@@ -1731,15 +1731,25 @@ function inferArtifactDir(artifacts, bundle) {
1731
1731
  }
1732
1732
  return dirname(artifactPath);
1733
1733
  }
1734
- function inferTaskRootDir(artifactDir) {
1734
+ function inferTaskRootDir(artifactDir, fallbackTaskRootDir) {
1735
1735
  if (!artifactDir) {
1736
- return undefined;
1736
+ return fallbackTaskRootDir;
1737
+ }
1738
+ if (fallbackTaskRootDir) {
1739
+ const resolvedArtifactDir = resolve(artifactDir);
1740
+ const resolvedFallbackTaskRootDir = resolve(fallbackTaskRootDir);
1741
+ if (resolvedArtifactDir === resolvedFallbackTaskRootDir
1742
+ || resolvedArtifactDir.startsWith(`${resolvedFallbackTaskRootDir}${sep}`)) {
1743
+ return resolve(artifactDir, "..", "..");
1744
+ }
1745
+ return resolvedFallbackTaskRootDir;
1737
1746
  }
1738
1747
  return resolve(artifactDir, "..", "..");
1739
1748
  }
1740
1749
  async function buildReplayExecutionContext(input) {
1741
1750
  const artifactDir = inferArtifactDir(input.artifacts, input.deliveryBundle);
1742
- const taskRootDir = inferTaskRootDir(artifactDir);
1751
+ const fallbackTaskRootDir = join(input.config.storage.rootDir, "workspaces", input.taskId);
1752
+ const taskRootDir = inferTaskRootDir(artifactDir, fallbackTaskRootDir);
1743
1753
  const sourceDir = input.deliveryBundle?.publication?.git?.repoDir?.trim()
1744
1754
  || input.latestRun?.addresses?.visibleRepoDir?.trim()
1745
1755
  || input.latestRun?.addresses?.workspaceDir?.trim();
@@ -2114,18 +2124,13 @@ async function main() {
2114
2124
  process.exitCode = 1;
2115
2125
  return;
2116
2126
  }
2127
+ console.log("[optimus] submitting feedback...");
2117
2128
  const result = await createFeedbackReport({
2118
2129
  title,
2119
2130
  description,
2120
2131
  currentVersion,
2121
2132
  packageRoot: CLI_ROOT_DIR
2122
2133
  });
2123
- console.log("[optimus] feedback saved locally");
2124
- console.log(`id: ${result.id}`);
2125
- console.log(`path: ${result.feedbackDir}`);
2126
- console.log(`report: ${result.reportPath}`);
2127
- console.log(`archive: ${result.archivePath}`);
2128
- console.log(`logs: ${result.files.filter((file) => file.found).length}/${result.files.length}`);
2129
2134
  const feedbackDelivery = new FeishuFeedbackDeliveryService({
2130
2135
  config
2131
2136
  });
@@ -2135,10 +2140,14 @@ async function main() {
2135
2140
  currentVersion,
2136
2141
  report: result
2137
2142
  });
2138
- console.log(`recipient: ${deliveryResult.recipientEmail}`);
2139
- console.log(`open_id: ${deliveryResult.recipientOpenId}`);
2140
- console.log(`doc: ${deliveryResult.document.status}${deliveryResult.document.url ? ` (${deliveryResult.document.url})` : deliveryResult.document.reason ? ` (${deliveryResult.document.reason})` : ""}`);
2141
- console.log(`notify: ${deliveryResult.notification.status}${deliveryResult.notification.reason ? ` (${deliveryResult.notification.reason})` : ""}`);
2143
+ await persistFeedbackDeliveryResult(result, deliveryResult);
2144
+ const hasWarning = deliveryResult.document.status !== "created" || deliveryResult.notification.status !== "sent";
2145
+ if (hasWarning) {
2146
+ console.log(`[optimus] feedback finished with warnings. doc=${deliveryResult.document.status}, notify=${deliveryResult.notification.status}`);
2147
+ }
2148
+ else {
2149
+ console.log("[optimus] feedback submitted.");
2150
+ }
2142
2151
  return;
2143
2152
  }
2144
2153
  if (command === "retry-task") {
@@ -2363,6 +2372,7 @@ async function main() {
2363
2372
  const existingBundle = await store.getLatestTaskDeliveryBundle(taskId);
2364
2373
  const latestRun = (await store.listTaskRuns()).filter((run) => run.taskId === taskId).at(-1) ?? null;
2365
2374
  const replayContext = await buildReplayExecutionContext({
2375
+ taskId,
2366
2376
  config,
2367
2377
  taskType: task.taskType,
2368
2378
  taskRepo: taskPackage.repo,