@codexhost/cli-linux-arm64 0.10.0 → 0.10.1

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.
@@ -527,6 +527,7 @@ function splitLines(text) {
527
527
 
528
528
  // dist/omp-adapter.js
529
529
  import { randomUUID as randomUUID2 } from "node:crypto";
530
+ import { realpath as realpath2, stat } from "node:fs/promises";
530
531
  import path4 from "node:path";
531
532
 
532
533
  // ../../../node_modules/zod/v4/classic/external.js
@@ -16706,6 +16707,100 @@ function resolveOmpForkBoundary(history, checkpointId) {
16706
16707
  };
16707
16708
  }
16708
16709
 
16710
+ // dist/omp-session-file.js
16711
+ import { createReadStream } from "node:fs";
16712
+ import { open, realpath } from "node:fs/promises";
16713
+ import readline from "node:readline";
16714
+ var MAX_SESSION_HEADER_BYTES = 64 * 1024;
16715
+ var utf8Decoder = new TextDecoder("utf-8", { fatal: true });
16716
+ function isRecord5(value) {
16717
+ return typeof value === "object" && value !== null && !Array.isArray(value);
16718
+ }
16719
+ function historyEntry(value) {
16720
+ if (!isRecord5(value) || value.type === "title" || value.type === "session" || typeof value.id !== "string" || value.id.length === 0 || value.parentId !== null && typeof value.parentId !== "string" || typeof value.type !== "string") {
16721
+ return null;
16722
+ }
16723
+ return value;
16724
+ }
16725
+ async function readOmpSessionHistory(sessionFile, maxBytes) {
16726
+ const entries = [];
16727
+ let leafId = null;
16728
+ const lines = readline.createInterface({
16729
+ input: createReadStream(sessionFile, {
16730
+ encoding: "utf8",
16731
+ ...maxBytes === void 0 ? {} : { end: maxBytes - 1 }
16732
+ }),
16733
+ crlfDelay: Number.POSITIVE_INFINITY
16734
+ });
16735
+ try {
16736
+ for await (const line of lines) {
16737
+ if (line.length === 0)
16738
+ continue;
16739
+ let parsed;
16740
+ try {
16741
+ parsed = JSON.parse(line);
16742
+ } catch {
16743
+ continue;
16744
+ }
16745
+ const entry = historyEntry(parsed);
16746
+ if (!entry)
16747
+ continue;
16748
+ entries.push(entry);
16749
+ leafId = entry.id;
16750
+ }
16751
+ } finally {
16752
+ lines.close();
16753
+ }
16754
+ return { entries, leafId };
16755
+ }
16756
+ async function readOmpSessionHeader(sessionFile) {
16757
+ const handle = await open(sessionFile, "r");
16758
+ try {
16759
+ const buffer = Buffer.allocUnsafe(MAX_SESSION_HEADER_BYTES);
16760
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
16761
+ const contents = buffer.subarray(0, bytesRead);
16762
+ const newline = contents.indexOf(10);
16763
+ if (newline < 0 && bytesRead === buffer.length) {
16764
+ throw new Error("Omp Session header exceeds the supported size");
16765
+ }
16766
+ const contentsText = utf8Decoder.decode(contents);
16767
+ for (const line of contentsText.split("\n")) {
16768
+ if (line.length === 0)
16769
+ continue;
16770
+ let parsed;
16771
+ try {
16772
+ parsed = JSON.parse(line);
16773
+ } catch {
16774
+ continue;
16775
+ }
16776
+ if (!isRecord5(parsed) || parsed.type !== "session")
16777
+ continue;
16778
+ if (typeof parsed.id !== "string" || parsed.id.length === 0 || typeof parsed.cwd !== "string" || parsed.cwd.length === 0) {
16779
+ throw new Error("Omp Session header is invalid");
16780
+ }
16781
+ return { type: "session", id: parsed.id, cwd: parsed.cwd };
16782
+ }
16783
+ throw new Error("Omp Session header is invalid");
16784
+ } finally {
16785
+ await handle.close();
16786
+ }
16787
+ }
16788
+ async function verifyOmpSessionCwd(input) {
16789
+ if (!input.sessionFile)
16790
+ throw new Error("Omp Fork Session has no persisted Session file");
16791
+ const header = await readOmpSessionHeader(input.sessionFile);
16792
+ if (header.id !== input.sessionId) {
16793
+ throw new Error("Omp Fork Session header identity does not match RPC state");
16794
+ }
16795
+ const [actualCwd, expectedCwd] = await Promise.all([
16796
+ realpath(header.cwd),
16797
+ realpath(input.expectedCwd)
16798
+ ]);
16799
+ if (actualCwd !== expectedCwd) {
16800
+ throw new Error("Omp Fork Session did not bind the requested cwd");
16801
+ }
16802
+ }
16803
+
16709
16804
  // dist/omp-last-turn-rollback.js
16710
16805
  function modelFromState(state) {
16711
16806
  if (state.provider === null && state.modelId === null)
@@ -17013,14 +17108,14 @@ function resolveOmpExecutable(input, dependencies = {}) {
17013
17108
  }
17014
17109
 
17015
17110
  // dist/omp-usage.js
17016
- function isRecord5(value) {
17111
+ function isRecord6(value) {
17017
17112
  return typeof value === "object" && value !== null && !Array.isArray(value);
17018
17113
  }
17019
17114
  function nonNegativeSafeInteger(value) {
17020
17115
  return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : null;
17021
17116
  }
17022
17117
  function optionalOmpCacheHitRatePercent(value) {
17023
- if (!isRecord5(value) || value.role !== "assistant" || !isRecord5(value.usage))
17118
+ if (!isRecord6(value) || value.role !== "assistant" || !isRecord6(value.usage))
17024
17119
  return null;
17025
17120
  const input = nonNegativeSafeInteger(value.usage.input);
17026
17121
  const cacheRead = nonNegativeSafeInteger(value.usage.cacheRead);
@@ -17033,20 +17128,20 @@ function optionalOmpCacheHitRatePercent(value) {
17033
17128
  function latestOmpCacheHitRatePercent(history) {
17034
17129
  let latest = null;
17035
17130
  for (const entry of activeOmpEntries(history)) {
17036
- if (entry.type === "message" && isRecord5(entry.message) && entry.message.role === "assistant") {
17131
+ if (entry.type === "message" && isRecord6(entry.message) && entry.message.role === "assistant") {
17037
17132
  latest = optionalOmpCacheHitRatePercent(entry.message);
17038
17133
  }
17039
17134
  }
17040
17135
  return latest;
17041
17136
  }
17042
17137
  function responseData(response, operation) {
17043
- if (!isRecord5(response.data)) {
17138
+ if (!isRecord6(response.data)) {
17044
17139
  throw new Error(`Omp RPC ${operation} response has no data`);
17045
17140
  }
17046
17141
  return response.data;
17047
17142
  }
17048
17143
  function contextUsage(value) {
17049
- if (!isRecord5(value))
17144
+ if (!isRecord6(value))
17050
17145
  throw new Error("Omp RPC context Usage is invalid");
17051
17146
  return parseHostUsage({
17052
17147
  contextUsedTokens: value.tokens,
@@ -17056,15 +17151,15 @@ function contextUsage(value) {
17056
17151
  function parseOmpSessionUsage(response) {
17057
17152
  const data = responseData(response, "Session stats");
17058
17153
  const tokens = data.tokens;
17059
- if (tokens !== void 0 && !isRecord5(tokens)) {
17154
+ if (tokens !== void 0 && !isRecord6(tokens)) {
17060
17155
  throw new Error("Omp RPC Session stats tokens are invalid");
17061
17156
  }
17062
17157
  return parseHostUsage({
17063
- ...isRecord5(tokens) && tokens.input !== void 0 ? { inputTokens: tokens.input } : {},
17064
- ...isRecord5(tokens) && tokens.cacheRead !== void 0 ? { cachedInputTokens: tokens.cacheRead } : {},
17065
- ...isRecord5(tokens) && tokens.cacheWrite !== void 0 ? { cacheWriteInputTokens: tokens.cacheWrite } : {},
17066
- ...isRecord5(tokens) && tokens.output !== void 0 ? { outputTokens: tokens.output } : {},
17067
- ...isRecord5(tokens) && tokens.total !== void 0 ? { totalTokens: tokens.total } : {},
17158
+ ...isRecord6(tokens) && tokens.input !== void 0 ? { inputTokens: tokens.input } : {},
17159
+ ...isRecord6(tokens) && tokens.cacheRead !== void 0 ? { cachedInputTokens: tokens.cacheRead } : {},
17160
+ ...isRecord6(tokens) && tokens.cacheWrite !== void 0 ? { cacheWriteInputTokens: tokens.cacheWrite } : {},
17161
+ ...isRecord6(tokens) && tokens.output !== void 0 ? { outputTokens: tokens.output } : {},
17162
+ ...isRecord6(tokens) && tokens.total !== void 0 ? { totalTokens: tokens.total } : {},
17068
17163
  ...data.cost !== void 0 ? { totalCostUsd: data.cost } : {},
17069
17164
  ...data.contextUsage !== void 0 ? contextUsage(data.contextUsage) : {}
17070
17165
  });
@@ -17083,97 +17178,6 @@ function optionalOmpStateContextUsage(value) {
17083
17178
  }
17084
17179
  }
17085
17180
 
17086
- // dist/omp-session-file.js
17087
- import { createReadStream } from "node:fs";
17088
- import { open, realpath } from "node:fs/promises";
17089
- import readline from "node:readline";
17090
- var MAX_SESSION_HEADER_BYTES = 64 * 1024;
17091
- var utf8Decoder = new TextDecoder("utf-8", { fatal: true });
17092
- function isRecord6(value) {
17093
- return typeof value === "object" && value !== null && !Array.isArray(value);
17094
- }
17095
- function historyEntry(value) {
17096
- if (!isRecord6(value) || value.type === "title" || value.type === "session" || typeof value.id !== "string" || value.id.length === 0 || value.parentId !== null && typeof value.parentId !== "string" || typeof value.type !== "string") {
17097
- return null;
17098
- }
17099
- return value;
17100
- }
17101
- async function readOmpSessionHistory(sessionFile) {
17102
- const entries = [];
17103
- let leafId = null;
17104
- const lines = readline.createInterface({
17105
- input: createReadStream(sessionFile, { encoding: "utf8" }),
17106
- crlfDelay: Number.POSITIVE_INFINITY
17107
- });
17108
- try {
17109
- for await (const line of lines) {
17110
- if (line.length === 0)
17111
- continue;
17112
- let parsed;
17113
- try {
17114
- parsed = JSON.parse(line);
17115
- } catch {
17116
- continue;
17117
- }
17118
- const entry = historyEntry(parsed);
17119
- if (!entry)
17120
- continue;
17121
- entries.push(entry);
17122
- leafId = entry.id;
17123
- }
17124
- } finally {
17125
- lines.close();
17126
- }
17127
- return { entries, leafId };
17128
- }
17129
- async function readOmpSessionHeader(sessionFile) {
17130
- const handle = await open(sessionFile, "r");
17131
- try {
17132
- const buffer = Buffer.allocUnsafe(MAX_SESSION_HEADER_BYTES);
17133
- const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
17134
- const contents = buffer.subarray(0, bytesRead);
17135
- const newline = contents.indexOf(10);
17136
- if (newline < 0 && bytesRead === buffer.length) {
17137
- throw new Error("Omp Session header exceeds the supported size");
17138
- }
17139
- const contentsText = utf8Decoder.decode(contents);
17140
- for (const line of contentsText.split("\n")) {
17141
- if (line.length === 0)
17142
- continue;
17143
- let parsed;
17144
- try {
17145
- parsed = JSON.parse(line);
17146
- } catch {
17147
- continue;
17148
- }
17149
- if (!isRecord6(parsed) || parsed.type !== "session")
17150
- continue;
17151
- if (typeof parsed.id !== "string" || parsed.id.length === 0 || typeof parsed.cwd !== "string" || parsed.cwd.length === 0) {
17152
- throw new Error("Omp Session header is invalid");
17153
- }
17154
- return { type: "session", id: parsed.id, cwd: parsed.cwd };
17155
- }
17156
- throw new Error("Omp Session header is invalid");
17157
- } finally {
17158
- await handle.close();
17159
- }
17160
- }
17161
- async function verifyOmpSessionCwd(input) {
17162
- if (!input.sessionFile)
17163
- throw new Error("Omp Fork Session has no persisted Session file");
17164
- const header = await readOmpSessionHeader(input.sessionFile);
17165
- if (header.id !== input.sessionId) {
17166
- throw new Error("Omp Fork Session header identity does not match RPC state");
17167
- }
17168
- const [actualCwd, expectedCwd] = await Promise.all([
17169
- realpath(header.cwd),
17170
- realpath(input.expectedCwd)
17171
- ]);
17172
- if (actualCwd !== expectedCwd) {
17173
- throw new Error("Omp Fork Session did not bind the requested cwd");
17174
- }
17175
- }
17176
-
17177
17181
  // dist/omp-protocol.js
17178
17182
  var MAX_FRAME_BYTES = 1024 * 1024;
17179
17183
  var MAX_REASSEMBLED_BYTES = 64 * 1024 * 1024;
@@ -17568,6 +17572,9 @@ var OmpRpcSession = class {
17568
17572
  new Promise((_resolve, reject) => setTimeout(() => reject(new Error("Omp RPC ready signal timed out")), this.#options.commandTimeoutMs))
17569
17573
  ]);
17570
17574
  await this.#send("negotiate_protocol", { protocolVersion: 2 }).catch(() => void 0);
17575
+ if (this.#options.subscribeSubagentEvents !== false) {
17576
+ await this.#send("set_subagent_subscription", { level: "events" }).catch(() => void 0);
17577
+ }
17571
17578
  try {
17572
17579
  this.#state = parseSessionState(await this.#send("get_state", {}));
17573
17580
  } catch (error51) {
@@ -18713,6 +18720,46 @@ function sessionFileFromRef(ref) {
18713
18720
  }
18714
18721
  return ref.locator.sessionFile;
18715
18722
  }
18723
+ var MAX_SUBAGENT_TRANSCRIPT_BYTES = 8 * 1024 * 1024;
18724
+ function subagentTranscriptPath(parentSessionFile, nativeSubagentId) {
18725
+ if (nativeSubagentId.includes("/") || nativeSubagentId.includes("\\") || nativeSubagentId.includes("\0") || nativeSubagentId === "." || nativeSubagentId === "..") {
18726
+ throw new Error("Omp Subagent ID is not a plain transcript file name");
18727
+ }
18728
+ if (!parentSessionFile.endsWith(".jsonl") || !path4.isAbsolute(parentSessionFile)) {
18729
+ return null;
18730
+ }
18731
+ return `${parentSessionFile.slice(0, -".jsonl".length)}/${nativeSubagentId}.jsonl`;
18732
+ }
18733
+ async function readSubagentTranscriptFile(parentSessionFile, nativeSubagentId) {
18734
+ const transcriptFile = subagentTranscriptPath(parentSessionFile, nativeSubagentId);
18735
+ if (transcriptFile === null)
18736
+ return { status: "missing" };
18737
+ const parentDirectory = path4.dirname(transcriptFile);
18738
+ let metadata;
18739
+ try {
18740
+ metadata = await stat(transcriptFile);
18741
+ } catch (error51) {
18742
+ if (error51.code === "ENOENT")
18743
+ return { status: "missing" };
18744
+ throw error51;
18745
+ }
18746
+ if (!metadata.isFile())
18747
+ return { status: "missing" };
18748
+ if (metadata.size > MAX_SUBAGENT_TRANSCRIPT_BYTES) {
18749
+ throw new Error("Omp Subagent transcript exceeds the supported size");
18750
+ }
18751
+ const [resolvedTranscript, resolvedParentDirectory] = await Promise.all([
18752
+ realpath2(transcriptFile),
18753
+ realpath2(parentDirectory)
18754
+ ]);
18755
+ if (path4.dirname(resolvedTranscript) !== resolvedParentDirectory) {
18756
+ throw new Error("Omp Subagent transcript resolves outside its parent Session directory");
18757
+ }
18758
+ return {
18759
+ status: "read",
18760
+ history: await readOmpSessionHistory(transcriptFile, MAX_SUBAGENT_TRANSCRIPT_BYTES)
18761
+ };
18762
+ }
18716
18763
  function toolFailure(toolName) {
18717
18764
  return {
18718
18765
  code: "nativeFailure",
@@ -20316,9 +20363,18 @@ var OmpAdapter = class {
20316
20363
  }
20317
20364
  let transport;
20318
20365
  try {
20366
+ const transcriptFile = await readSubagentTranscriptFile(sessionFileFromRef(input.parent), input.nativeSubagentId);
20367
+ if (transcriptFile.status === "read") {
20368
+ const snapshot2 = mapOmpSnapshot(transcriptFile.history, {
20369
+ sessionId: input.parent.nativeSessionId,
20370
+ model: null
20371
+ });
20372
+ return { ok: true, value: snapshot2 };
20373
+ }
20319
20374
  transport = this.#createTransport({
20320
20375
  cwd: input.cwd,
20321
20376
  sessionFile: sessionFileFromRef(input.parent),
20377
+ subscribeSubagentEvents: false,
20322
20378
  onFault: () => void 0
20323
20379
  });
20324
20380
  await transport.start();
@@ -20390,7 +20446,11 @@ var OmpAdapter = class {
20390
20446
  async #inspectCwd(cwd) {
20391
20447
  const startedAt = Date.now();
20392
20448
  let stage = "spawn";
20393
- const transport = this.#createTransport({ cwd, onFault: () => void 0 });
20449
+ const transport = this.#createTransport({
20450
+ cwd,
20451
+ subscribeSubagentEvents: false,
20452
+ onFault: () => void 0
20453
+ });
20394
20454
  this.#inspections.add(transport);
20395
20455
  try {
20396
20456
  stage = "startup";
@@ -18700,7 +18700,10 @@ var PiRpcSession = class {
18700
18700
  }
18701
18701
  this.#options = {
18702
18702
  commandTimeoutMs: 3e4,
18703
- cancelTimeoutMs: 2e3,
18703
+ // Bounds proven stable settlement (Abort acknowledgement plus agent_settled and get_state
18704
+ // confirmation), not the RPC write round trip; must exceed the Host's 20s external steering
18705
+ // bound so a slow cancellation times out gracefully instead of faulting the whole Session.
18706
+ cancelTimeoutMs: 3e4,
18704
18707
  closeTimeoutMs: 2e3,
18705
18708
  ...options
18706
18709
  };
@@ -16538,6 +16538,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16538
16538
  "settings",
16539
16539
  "close",
16540
16540
  "star",
16541
+ "github",
16541
16542
  "language",
16542
16543
  "connections",
16543
16544
  "accounts",
@@ -16574,6 +16575,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16574
16575
  settings: Settings,
16575
16576
  close: X,
16576
16577
  star: Star,
16578
+ github: [
16579
+ [
16580
+ "path",
16581
+ {
16582
+ fill: "currentColor",
16583
+ stroke: "none",
16584
+ d: "M12 .297C5.37.297 0 5.67 0 12.297c0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.043-1.61-4.043-1.61-.546-1.387-1.333-1.756-1.333-1.756-1.09-.745.083-.729.083-.729 1.205.084 1.838 1.237 1.838 1.237 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.467-1.334-5.467-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23a11.5 11.5 0 0 1 3-.405c1.02.005 2.045.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"
16585
+ }
16586
+ ]
16587
+ ],
16577
16588
  language: Languages,
16578
16589
  connections: PlugZap,
16579
16590
  accounts: Users,
@@ -17817,7 +17828,7 @@ ${error51.stderrTail}`] : []
17817
17828
  locale: "en",
17818
17829
  title: "Settings",
17819
17830
  close: "Close settings",
17820
- starOnGitHub: "Give us a Star~",
17831
+ starOnGitHub: "Star to support",
17821
17832
  sectionsLabel: "Settings sections",
17822
17833
  generalSection: "General",
17823
17834
  otherSection: "Other",
@@ -17976,7 +17987,7 @@ ${error51.stderrTail}`] : []
17976
17987
  launchPathSaveError: "Could not save. Enter an existing absolute installation folder on this Host and check configuration permissions.",
17977
17988
  connectionOpenInstallation: "Show installation instructions",
17978
17989
  connectionOpenHarnessWeb: "Open DeepSeek Harness Web",
17979
- connectionDeepSeekTestedVersions: "Tested with DSH 0.1.2-rc.1, 0.1.5-rc.1 and 0.1.5-rc.2. Other versions may connect, but have not been verified.",
17990
+ connectionDeepSeekTestedVersions: "Supported DSH versions: 0.1.2-rc.1, 0.1.5-rc.1, 0.1.5-rc.2, 0.1.5-rc.3, 0.1.7-rc.1 and 0.1.7-rc.2. Other versions may connect after native protocol checks, but are not listed as supported.",
17980
17991
  connectionInstall: "Install",
17981
17992
  connectionInstallDescription: "This Harness was not detected.",
17982
17993
  connectionErrorTitle: "Connection check failed",
@@ -18033,6 +18044,8 @@ ${error51.stderrTail}`] : []
18033
18044
  updateCopyFailed: "Copy failed",
18034
18045
  updateDownloadFromReleases: "Download from GitHub Releases",
18035
18046
  updateDownloadWindowsInstaller: "Download Windows installer",
18047
+ updateStarCallout: "If CodexHost has helped you, please Star it on GitHub. It means a lot to us \u{1F449}",
18048
+ updateStarLink: "GitHub",
18036
18049
  aboutTagline: "Run Pi and other Harnesses in Codex Desktop",
18037
18050
  aboutParagraphs: Object.freeze([
18038
18051
  "We believe Codex Desktop offers the best desktop development experience available today.",
@@ -18056,7 +18069,7 @@ ${error51.stderrTail}`] : []
18056
18069
  locale: "zh-CN",
18057
18070
  title: "\u8BBE\u7F6E",
18058
18071
  close: "\u5173\u95ED\u8BBE\u7F6E",
18059
- starOnGitHub: "\u70B9\u4E2A Star~",
18072
+ starOnGitHub: "Star \u652F\u6301",
18060
18073
  sectionsLabel: "\u8BBE\u7F6E\u5206\u7C7B",
18061
18074
  generalSection: "\u901A\u7528",
18062
18075
  otherSection: "\u5176\u4ED6",
@@ -18215,7 +18228,7 @@ ${error51.stderrTail}`] : []
18215
18228
  launchPathSaveError: "\u4FDD\u5B58\u5931\u8D25\u3002\u8BF7\u586B\u5199\u6B64 Host \u4E0A\u5B9E\u9645\u5B58\u5728\u7684\u5B89\u88C5\u76EE\u5F55\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u5E76\u786E\u8BA4\u914D\u7F6E\u76EE\u5F55\u53EF\u5199\u3002",
18216
18229
  connectionOpenInstallation: "\u67E5\u770B\u5B89\u88C5\u6307\u5F15",
18217
18230
  connectionOpenHarnessWeb: "\u6253\u5F00 DeepSeek Harness Web",
18218
- connectionDeepSeekTestedVersions: "\u5DF2\u5728 DSH 0.1.2-rc.1\u30010.1.5-rc.1 \u548C 0.1.5-rc.2 \u4E0A\u6D4B\u8BD5\u3002\u5176\u4ED6\u7248\u672C\u53EF\u4EE5\u5C1D\u8BD5\u8FDE\u63A5\uFF0C\u4F46\u5C1A\u672A\u9A8C\u8BC1\u3002",
18231
+ connectionDeepSeekTestedVersions: "\u652F\u6301 DSH \u7248\u672C\uFF1A0.1.2-rc.1\u30010.1.5-rc.1\u30010.1.5-rc.2\u30010.1.5-rc.3\u30010.1.7-rc.1 \u548C 0.1.7-rc.2\u3002\u5176\u4ED6\u7248\u672C\u53EF\u4EE5\u5728\u901A\u8FC7\u539F\u751F\u534F\u8BAE\u68C0\u67E5\u540E\u5C1D\u8BD5\u8FDE\u63A5\uFF0C\u4F46\u5C1A\u672A\u5217\u5165\u652F\u6301\u5217\u8868\u3002",
18219
18232
  connectionInstall: "\u5B89\u88C5",
18220
18233
  connectionInstallDescription: "\u5C1A\u672A\u68C0\u6D4B\u5230\u8BE5 Harness\u3002",
18221
18234
  connectionErrorTitle: "\u8FDE\u63A5\u68C0\u67E5\u5931\u8D25",
@@ -18272,6 +18285,8 @@ ${error51.stderrTail}`] : []
18272
18285
  updateCopyFailed: "\u590D\u5236\u5931\u8D25",
18273
18286
  updateDownloadFromReleases: "\u524D\u5F80 GitHub Releases \u4E0B\u8F7D",
18274
18287
  updateDownloadWindowsInstaller: "\u4E0B\u8F7D Windows \u5B89\u88C5\u5305",
18288
+ updateStarCallout: "\u5982\u679C CodexHost \u5E2E\u5230\u4E86\u4F60\uFF0C\u8BF7\u5728 GitHub \u70B9\u4E2A Star\uFF0C\u8FD9\u5BF9\u6211\u4EEC\u610F\u4E49\u91CD\u5927 \u{1F449}",
18289
+ updateStarLink: "GitHub",
18275
18290
  aboutTagline: "\u5728 Codex Desktop \u4E2D\u8FD0\u884C Pi \u548C\u5176\u4ED6 Harness",
18276
18291
  aboutParagraphs: Object.freeze([
18277
18292
  "\u6211\u4EEC\u8BA4\u4E3A Codex Desktop \u63D0\u4F9B\u4E86\u76EE\u524D\u6700\u597D\u7684\u684C\u9762\u5F00\u53D1\u4EA4\u4E92\u4F53\u9A8C\u3002",
@@ -26938,6 +26953,23 @@ ${error51.stderrTail}`] : []
26938
26953
  }
26939
26954
  });
26940
26955
  }
26956
+ function updateStarBanner(document2, messages) {
26957
+ const banner = document2.createElement("div");
26958
+ banner.className = "settings-update-star";
26959
+ const copy = document2.createElement("p");
26960
+ copy.className = "settings-update-star__copy";
26961
+ copy.textContent = messages.updateStarCallout;
26962
+ const link = document2.createElement("a");
26963
+ link.className = "settings-update-link settings-update-star__link";
26964
+ link.href = CODEXHOST_GITHUB_REPOSITORY_URL;
26965
+ link.target = "_blank";
26966
+ link.rel = "noopener noreferrer";
26967
+ const star = createRendererSettingsIcon("star", 14);
26968
+ star.classList.add("settings-update-star__mark");
26969
+ link.append(createRendererSettingsIcon("github", 15), messages.updateStarLink, star);
26970
+ banner.append(copy, link);
26971
+ return banner;
26972
+ }
26941
26973
  function updatesPage(messages, getClient) {
26942
26974
  return Object.freeze({
26943
26975
  id: "updates",
@@ -27044,7 +27076,8 @@ ${error51.stderrTail}`] : []
27044
27076
  controls.append(manualTitle, manualNpm, manualWindowsInstaller, actions);
27045
27077
  const notes = document2.createElement("div");
27046
27078
  notes.className = "settings-update-notes-section";
27047
- context.content.append(heading, metadata, panel, controls, notes);
27079
+ const starBanner = updateStarBanner(document2, messages);
27080
+ context.content.append(heading, metadata, panel, controls, starBanner, notes);
27048
27081
  const setManualFallback = (fallback) => {
27049
27082
  controls.className = !fallback && !windows ? "settings-update-controls is-quiet" : "settings-update-controls";
27050
27083
  manualNpmDescription.textContent = windows ? messages.updateWindowsNpmDescription : fallback ? messages.updateManualFallbackDescription : messages.updateManualNpmDescription;
@@ -27545,6 +27578,7 @@ ${error51.stderrTail}`] : []
27545
27578
  .settings-nav-star-link {
27546
27579
  margin-top: 0;
27547
27580
  color: var(--settings-text);
27581
+ font-weight: 600;
27548
27582
  text-decoration: none;
27549
27583
  }
27550
27584
 
@@ -29198,6 +29232,46 @@ ${error51.stderrTail}`] : []
29198
29232
  outline-offset: 2px;
29199
29233
  }
29200
29234
 
29235
+ .settings-update-star {
29236
+ display: flex;
29237
+ align-items: center;
29238
+ justify-content: space-between;
29239
+ flex-wrap: wrap;
29240
+ gap: 12px 16px;
29241
+ margin-top: 16px;
29242
+ padding: 12px 14px;
29243
+ background: var(--settings-panel);
29244
+ border: 1px solid var(--settings-border);
29245
+ border-radius: 12px;
29246
+ }
29247
+
29248
+ .settings-update-star__copy {
29249
+ margin: 0;
29250
+ min-width: min(100%, 16rem);
29251
+ flex: 1;
29252
+ color: var(--settings-focus);
29253
+ font-size: 13px;
29254
+ font-weight: 600;
29255
+ line-height: 20px;
29256
+ }
29257
+
29258
+ .settings-update-star__link {
29259
+ color: var(--settings-focus);
29260
+ background: light-dark(rgb(11 117 209 / 8%), rgb(102 170 249 / 12%));
29261
+ border-color: light-dark(rgb(11 117 209 / 22%), rgb(102 170 249 / 32%));
29262
+ }
29263
+
29264
+ .settings-update-star__link:hover {
29265
+ background: light-dark(rgb(11 117 209 / 14%), rgb(102 170 249 / 18%));
29266
+ border-color: light-dark(rgb(11 117 209 / 32%), rgb(102 170 249 / 42%));
29267
+ }
29268
+
29269
+ .settings-update-star__mark {
29270
+ color: light-dark(#f5b400, #ffd15c);
29271
+ fill: currentColor;
29272
+ stroke: none;
29273
+ }
29274
+
29201
29275
  .codexhost-settings-icon {
29202
29276
  display: block;
29203
29277
  flex: none;
@@ -30266,7 +30340,7 @@ ${accounts_default}`;
30266
30340
  starLink.rel = "noopener noreferrer";
30267
30341
  starLink.setAttribute("aria-label", messages.starOnGitHub);
30268
30342
  starLink.title = messages.starOnGitHub;
30269
- starLink.append(createRendererSettingsIcon("star", 17));
30343
+ starLink.append(createRendererSettingsIcon("github", 17));
30270
30344
  const starLabel = ownerDocument.createElement("span");
30271
30345
  starLabel.textContent = messages.starOnGitHub;
30272
30346
  starLink.append(starLabel);
package/bin/codexhost CHANGED
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codexhost/cli-linux-arm64",
3
- "version": "0.10.0",
3
+ "version": "0.10.1",
4
4
  "description": "Run Pi and Claude Code as first-class external harnesses inside Codex Desktop.",
5
5
  "type": "module",
6
6
  "files": [