minecodex 2.0.24 → 2.0.25

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,3 +1,10 @@
1
+ export function contextUsageExport(source) {
2
+ // 新版从宿主感知的 tokenUsageInfo selector 派生 thread atom family。
3
+ const selector = source.match(/([\w$]+)=[\w$]+\(([`"'])tokenUsageInfo\2\),([\w$]+)=[\w$]+\(/);
4
+ const local = selector?.[3] ?? source.match(/([\w$]+)=[\w$]+\(\(\{latestTokenUsageInfo:/)?.[1];
5
+ return local ? [...source.matchAll(/([\w$]+) as ([\w$]+)/g)].find(match => match[1] === local)?.[2] ?? null : null;
6
+ }
7
+
1
8
  // 原生 atom、scope 和 bundle 字段不进入状态栏呈现层。
2
9
  export function createContextUsageAdapter(signal, codex, onChange, loadFamily = null) {
3
10
  let family=null, thread=null, composer=null, unsubscribe=null;
@@ -34,8 +41,7 @@ export function createContextUsageAdapter(signal, codex, onChange, loadFamily =
34
41
  const url=[...document.querySelectorAll('link[rel=modulepreload]')].map(link=>link.href).find(url=>/\/app-shared-[^/]+\.js(?:$|\?)/.test(url));
35
42
  if (!url) throw new Error("context-bundle-unavailable");
36
43
  const source=await (await fetch(url,{signal})).text();
37
- const local=source.match(/([\w$]+)=[\w$]+\(\(\{latestTokenUsageInfo:/)?.[1];
38
- const exported=[...source.matchAll(/([\w$]+) as ([\w$]+)/g)].find(match=>match[1]===local)?.[2];
44
+ const exported=contextUsageExport(source);
39
45
  if (!exported) throw new Error("context-export-unavailable");
40
46
  return (await import(url))[exported];
41
47
  }
@@ -77,6 +77,11 @@ export function sessionFacts(record) {
77
77
  }
78
78
  if (p.type === "token_count") emit("usage-observed", { total:usage(p.info?.total_token_usage), last:usage(p.info?.last_token_usage), contextWindow:p.info?.model_context_window });
79
79
  }
80
- if (record?.type === "token_usage_record") emit("response-measured", { id:p.response_id, total:usage(p.thread_token_usage), last:usage(p.usage), end:Date.parse(at) });
80
+ if (record?.type === "token_usage_record") {
81
+ // 外部模型可能没有响应 ID;序号只在所属 rollout 会话内唯一。
82
+ const id = p.response_id || (p.session_id && Number.isSafeInteger(record.ordinal) && record.ordinal >= 0
83
+ ? JSON.stringify(["usage-record", p.session_id, record.ordinal]) : null);
84
+ emit("response-measured", { id, total:usage(p.thread_token_usage), last:usage(p.usage), end:Date.parse(at) });
85
+ }
81
86
  return facts;
82
87
  }
@@ -1,6 +1,6 @@
1
1
  import { readFile } from "node:fs/promises";
2
- import { createContextUsageAdapter } from "./adapters/codex/context-usage.mjs";
2
+ import { contextUsageExport, createContextUsageAdapter } from "./adapters/codex/context-usage.mjs";
3
3
  export async function createPageScriptSource() {
4
4
  const source=await readFile(new URL("./session-status.mjs",import.meta.url),"utf8");
5
- return `const createContextUsageAdapter=${createContextUsageAdapter.toString()};\n${source}`;
5
+ return `const contextUsageExport=${contextUsageExport.toString()};\nconst createContextUsageAdapter=${createContextUsageAdapter.toString()};\n${source}`;
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "minecodex",
3
- "version": "2.0.24",
3
+ "version": "2.0.25",
4
4
  "description": "Lightweight, local-first plugins for the Codex desktop app.",
5
5
  "license": "MIT",
6
6
  "type": "module",