@dan-ai-studio/dshopencodego 0.1.87 → 0.1.89
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.en.md +5 -5
- package/README.md +5 -5
- package/lib/client.js +148 -27
- package/lib/index.js +767 -257
- package/lib/types/request-log/store.d.ts +54 -0
- package/package.json +29 -29
package/README.en.md
CHANGED
|
@@ -240,7 +240,7 @@ The verdict:
|
|
|
240
240
|
- not satisfied → **that plugin row is disabled with a printed reason** (`Plugin … is incompatible with dsh …`), leaving other plugins untouched;
|
|
241
241
|
- to take the risk anyway, grant an **exact-version exemption**: `dsh plugin --profile <profile> allow-version <pkg>@<version> --dsh-version <exact> --accept-risk` (applies only to that package and that exact runtime version); `dsh plugin --profile <profile> version-exemptions` lists what a profile holds.
|
|
242
242
|
|
|
243
|
-
**This plugin declares `engines.dsh`, so that is the range the gate enforces**; the peer ranges are a declaration for readers and package managers, and only take over the verdict if `engines.dsh` is removed. The upper bound is written `<0.3.0-0` rather than `<0.3.0` precisely because the check includes prereleases: `<0.3.0` would judge `0.3.0-rc.1` and its siblings **compatible** and let them load, while `<0.3.0-0` closes the whole `0.3.0` line. `@deepseek-ai/cordis` is declared separately as `4.0.4 || 4.0.5-alpha.1 || 4.0.5-alpha.2 || 4.0.5` — the runtimes used by DSH `0.2.0-rc.1`/`rc.2`, `0.2.1-alpha.1`/`alpha.2`, `0.2.1-alpha.3`–`alpha.5`, and `0.2.1-rc.2` respectively (`4.0.2`/`4.0.3` were dropped along with pre-`0.2.0` support).
|
|
243
|
+
**This plugin declares `engines.dsh`, so that is the range the gate enforces**; the peer ranges are a declaration for readers and package managers, and only take over the verdict if `engines.dsh` is removed. The upper bound is written `<0.3.0-0` rather than `<0.3.0` precisely because the check includes prereleases: `<0.3.0` would judge `0.3.0-rc.1` and its siblings **compatible** and let them load, while `<0.3.0-0` closes the whole `0.3.0` line. `@deepseek-ai/cordis` is declared separately as `4.0.4 || 4.0.5-alpha.1 || 4.0.5-alpha.2 || 4.0.5 || 4.0.6-alpha.1 || 4.0.6-alpha.2` — the runtimes used by DSH `0.2.0-rc.1`/`rc.2`, `0.2.1-alpha.1`/`alpha.2`, `0.2.1-alpha.3`–`alpha.5`, and `0.2.1-rc.2` respectively (`4.0.2`/`4.0.3` were dropped along with pre-`0.2.0` support).
|
|
244
244
|
|
|
245
245
|
**Outside the declared range**: everything before `0.2.0-rc.1`, and the whole `0.3.0` line (prereleases included), are refused. If the seam is compatible, widen or drop this plugin's **`engines.dsh`** in your own build — widening the peer range does nothing, since it takes no part in the verdict — or wait for a plugin release.
|
|
246
246
|
|
|
@@ -250,10 +250,10 @@ The verdict:
|
|
|
250
250
|
| --- | --- | --- |
|
|
251
251
|
| `engines.dsh` | `>=0.2.0-rc.1 <0.3.0-0` | **DSH's gate at plugin load time; declaring it skips the peer verdict entirely** |
|
|
252
252
|
| `peerDependencies` (20 `@deepseek-ai/dsh-*` packages) | all `>=0.2.0-rc.1 <0.3.0-0` | takes over only when `engines.dsh` is absent; this plugin declares it, so the peers take no part today |
|
|
253
|
-
| `@deepseek-ai/cordis` | `4.0.4 \|\| 4.0.5-alpha.1 \|\| 4.0.5-alpha.2 \|\| 4.0.5` | the same peer channel |
|
|
253
|
+
| `@deepseek-ai/cordis` | `4.0.4 \|\| 4.0.5-alpha.1 \|\| 4.0.5-alpha.2 \|\| 4.0.5 \|\| 4.0.6-alpha.1 \|\| 4.0.6-alpha.2` | the same peer channel |
|
|
254
254
|
| `engines.node` | `^22.19.0 \|\| >=24.0.0` | the package manager |
|
|
255
|
-
| bundled `@earendil-works/pi-ai` |
|
|
256
|
-
| bundled `@deepseek-ai/schemastery` | `~3.18.
|
|
255
|
+
| bundled `@earendil-works/pi-ai` | `1.5.0` (within 1.5.x), **compiled into `lib/`** (devDependency) | an independent coupling: a change in pi-ai's request construction changes this plugin's wire behaviour, and its opencode-go builtin catalog is this plugin's fallback data. Bundling leaves the plugin with **no runtime dependencies** for an installer to resolve |
|
|
256
|
+
| bundled `@deepseek-ai/schemastery` | `~3.18.6-alpha.2`, **compiled into `lib/`** (devDependency) | a build-time dependency |
|
|
257
257
|
|
|
258
258
|
Things to keep in mind when maintaining this:
|
|
259
259
|
|
|
@@ -276,7 +276,7 @@ Things to keep in mind when maintaining this:
|
|
|
276
276
|
| The usage button shows "unavailable" | An endpoint or credential change invalidated the previous reading. Fix the configuration and press Retry. It never shows `0` in place of a missing reading. |
|
|
277
277
|
| npm publish fails with `ENEEDAUTH` | OIDC did not match: check the Trusted Publisher's **workflow filename** (must be exactly `publish-npm.yml`, case-sensitive) and the organization/repository fields; run on GitHub-hosted runners with `id-token: write`. A `repository.url` that does not match the GitHub repository is rejected as well. |
|
|
278
278
|
| A flood of `Accessing non-existent property 'Allow' of module exports inside circular dependency` | Caused by `pi-ai`'s **named import** of `partial-json`: resolving a named export from CommonJS enumerates the module's exports, and that package's `index.js`/`options.js` require each other, so reading `Allow` before its module initialises prints once per read — **a plugin reload turns it into a flood** (a restart usually clears it). **Removed at the mechanism since v0.1.38**: `pi-ai` and `partial-json` are now **compiled into the bundle**, so Node's ESM→CJS interop is not involved and there is no enumeration of an uninitialised export to begin with. That is a fix, not a filter. |
|
|
279
|
-
| The whole DSH process stalls during ultra-long tool calls (multi-MB arguments) | Observed on pi-ai `0.87.1`: per-delta re-parsing of the accumulated arguments (issue #9265 / PR #9461). This plugin does not port DSH's consumer-side patch (ADR-0005); the bundled dependency is now
|
|
279
|
+
| The whole DSH process stalls during ultra-long tool calls (multi-MB arguments) | Observed on pi-ai `0.87.1`: per-delta re-parsing of the accumulated arguments (issue #9265 / PR #9461). This plugin does not port DSH's consumer-side patch (ADR-0005); the bundled dependency is now `1.5.0`, so a recurrence would be upstream behaviour and would be fixed by an upstream release. |
|
|
280
280
|
|
|
281
281
|
## Development
|
|
282
282
|
|
package/README.md
CHANGED
|
@@ -239,7 +239,7 @@ API Key 通过 Harness 凭证库提供(引用名 `OPENCODE_GO_API_KEY`),
|
|
|
239
239
|
- 不满足 → **该插件行被禁用并打印原因**(`Plugin … is incompatible with dsh …`),其他插件不受影响;
|
|
240
240
|
- 需要冒险时可用**精确版本豁免**:`dsh plugin --profile <profile> allow-version <包>@<版本> --dsh-version <精确版本> --accept-risk`(只对该包与该精确版本生效);`dsh plugin --profile <profile> version-exemptions` 可列出当前 profile 的豁免。
|
|
241
241
|
|
|
242
|
-
**本插件声明了 `engines.dsh`,所以生效的门禁就是它**;peer 范围是给读者与包管理器的声明,只在 `engines.dsh` 被删除之后才会接管判定。上界写成 `<0.3.0-0` 而不是 `<0.3.0`,正是因为判定含预发布:`<0.3.0` 会把 `0.3.0-rc.1` 这类**预发布版判为兼容**并放行,`<0.3.0-0` 才真正封住整条 `0.3.0` 线。`@deepseek-ai/cordis` 单独声明为 `4.0.4 || 4.0.5-alpha.1 || 4.0.5-alpha.2 || 4.0.5`——依次是 DSH `0.2.0-rc.1`/`rc.2`、`0.2.1-alpha.1`/`alpha.2`、`0.2.1-alpha.3`–`alpha.5`、以及 `0.2.1-rc.2` 所用的运行时(`4.0.2`/`4.0.3` 随 `0.2.0` 之前的支持一并移除)。
|
|
242
|
+
**本插件声明了 `engines.dsh`,所以生效的门禁就是它**;peer 范围是给读者与包管理器的声明,只在 `engines.dsh` 被删除之后才会接管判定。上界写成 `<0.3.0-0` 而不是 `<0.3.0`,正是因为判定含预发布:`<0.3.0` 会把 `0.3.0-rc.1` 这类**预发布版判为兼容**并放行,`<0.3.0-0` 才真正封住整条 `0.3.0` 线。`@deepseek-ai/cordis` 单独声明为 `4.0.4 || 4.0.5-alpha.1 || 4.0.5-alpha.2 || 4.0.5 || 4.0.6-alpha.1 || 4.0.6-alpha.2`——依次是 DSH `0.2.0-rc.1`/`rc.2`、`0.2.1-alpha.1`/`alpha.2`、`0.2.1-alpha.3`–`alpha.5`、以及 `0.2.1-rc.2` 所用的运行时(`4.0.2`/`4.0.3` 随 `0.2.0` 之前的支持一并移除)。
|
|
243
243
|
|
|
244
244
|
**声明范围之外**:`0.2.0-rc.1` 之前的所有版本、以及整条 `0.3.0` 线(含预发布)都会被拒绝加载。如果 DSH 侧接口兼容,可自行放宽或删除该插件的 **`engines.dsh`** 后重新构建(改 peer 范围是无效的——它不参与判定);否则请等插件跟进发版。
|
|
245
245
|
|
|
@@ -249,10 +249,10 @@ API Key 通过 Harness 凭证库提供(引用名 `OPENCODE_GO_API_KEY`),
|
|
|
249
249
|
| --- | --- | --- |
|
|
250
250
|
| `engines.dsh` | `>=0.2.0-rc.1 <0.3.0-0` | **DSH 加载时的真门禁;声明了它,peer 判定被整体跳过** |
|
|
251
251
|
| `peerDependencies`(20 个 `@deepseek-ai/dsh-*`) | 均为 `>=0.2.0-rc.1 <0.3.0-0` | 仅当 `engines.dsh` 缺席时才接管;本插件声明了它,故当前不参与判定 |
|
|
252
|
-
| `@deepseek-ai/cordis` | `4.0.4 \|\| 4.0.5-alpha.1 \|\| 4.0.5-alpha.2 \|\| 4.0.5` | 同上(peer 通道) |
|
|
252
|
+
| `@deepseek-ai/cordis` | `4.0.4 \|\| 4.0.5-alpha.1 \|\| 4.0.5-alpha.2 \|\| 4.0.5 \|\| 4.0.6-alpha.1 \|\| 4.0.6-alpha.2` | 同上(peer 通道) |
|
|
253
253
|
| `engines.node` | `^22.19.0 \|\| >=24.0.0` | 包管理器 |
|
|
254
|
-
| 已打包依赖 `@earendil-works/pi-ai` |
|
|
255
|
-
| 已打包依赖 `@deepseek-ai/schemastery` | `~3.18.
|
|
254
|
+
| 已打包依赖 `@earendil-works/pi-ai` | `1.5.0`(1.5.x 内),**打进产物**(devDependency) | 独立耦合:pi-ai 改请求构造即影响本插件的线上行为;其 opencode-go 内置目录同时是本插件的打底数据。打包后本插件**没有任何运行时依赖**,安装者不必再解析它 |
|
|
255
|
+
| 已打包依赖 `@deepseek-ai/schemastery` | `~3.18.6-alpha.2`,**打进产物**(devDependency) | 构建期依赖 |
|
|
256
256
|
|
|
257
257
|
维护时需要注意:
|
|
258
258
|
|
|
@@ -275,7 +275,7 @@ API Key 通过 Harness 凭证库提供(引用名 `OPENCODE_GO_API_KEY`),
|
|
|
275
275
|
| 用量按钮显示「不可用」 | 端点或凭证变化导致旧读数作废;配置正确后点「重试」。数值不会以 0 冒充。 |
|
|
276
276
|
| npm 发布报 `ENEEDAUTH` | OIDC 没匹配上:核对包设置里 Trusted Publisher 的 **workflow 文件名**(必须恰为 `publish-npm.yml`、大小写敏感)与组织/仓库字段;确认跑在 GitHub 托管 runner 上且工作流带 `id-token: write`。`package.json` 的 `repository.url` 与仓库不符也会被拒。 |
|
|
277
277
|
| 日志成片出现 `Accessing non-existent property 'Allow' of module exports inside circular dependency` | 成因是 `pi-ai` 对 `partial-json` 的**具名导入**:Node 解析 CJS 的具名导出时会枚举其 exports,而该包内部 `index.js`/`options.js` 互相 require,读到尚未初始化的 `Allow` 就打印一次——**插件重载会让它成片出现**(重启后往往消失)。**自 v0.1.38 起从机制上消除**:`pi-ai` 与 `partial-json` 已**打包进产物**,Node 的 ESM→CJS 互操作不再参与,因此不存在"枚举读到未初始化属性"这一步(不是过滤,是让该路径不存在)。 |
|
|
278
|
-
| 超长工具调用(多 MB 参数)期间整个 DSH 进程卡顿 | 曾在 pi-ai `0.87.1` 上观测到逐 delta 重解析的固有开销(issue #9265 / PR #9461)。本插件不移植 DSH 的消费者侧补丁(ADR-0005);当前自带依赖已是
|
|
278
|
+
| 超长工具调用(多 MB 参数)期间整个 DSH 进程卡顿 | 曾在 pi-ai `0.87.1` 上观测到逐 delta 重解析的固有开销(issue #9265 / PR #9461)。本插件不移植 DSH 的消费者侧补丁(ADR-0005);当前自带依赖已是 `1.5.0`,若仍复现则属上游行为,随其发版解决。 |
|
|
279
279
|
|
|
280
280
|
## 开发
|
|
281
281
|
|
package/lib/client.js
CHANGED
|
@@ -209,6 +209,7 @@ var networkRemote = {
|
|
|
209
209
|
};
|
|
210
210
|
|
|
211
211
|
// src/request-log/store.ts
|
|
212
|
+
var MAX_TOOL_CALLS = 32;
|
|
212
213
|
var MAX_STREAM_MARKS = 200;
|
|
213
214
|
var MIN_STREAM_MS_FOR_RATE = 100;
|
|
214
215
|
|
|
@@ -239,6 +240,7 @@ function parseEntry(value) {
|
|
|
239
240
|
const shape = row["shape"];
|
|
240
241
|
const headers = row["headers"];
|
|
241
242
|
const protocol = row["protocol"];
|
|
243
|
+
const toolCalls = row["toolCalls"] === void 0 ? void 0 : parseToolCalls(row["toolCalls"]);
|
|
242
244
|
return {
|
|
243
245
|
seq: count("seq", row),
|
|
244
246
|
atMs: count("atMs", row),
|
|
@@ -266,6 +268,10 @@ function parseEntry(value) {
|
|
|
266
268
|
...row["decodeMs"] === void 0 ? {} : { decodeMs: count("decodeMs", row) },
|
|
267
269
|
...row["streamMs"] === void 0 ? {} : { streamMs: count("streamMs", row) },
|
|
268
270
|
...row["tps"] === void 0 ? {} : { tps: rate("tps", row) },
|
|
271
|
+
...toolCalls === void 0 || toolCalls.length === 0 ? {} : { toolCalls },
|
|
272
|
+
...row["estimatedInputTokens"] === void 0 ? {} : { estimatedInputTokens: count("estimatedInputTokens", row) },
|
|
273
|
+
...row["fittedMaxTokens"] === void 0 ? {} : { fittedMaxTokens: count("fittedMaxTokens", row) },
|
|
274
|
+
...row["maxTokensClamped"] === true ? { maxTokensClamped: true } : {},
|
|
269
275
|
// Running rows cross the wire too: a viewer opened mid-request must
|
|
270
276
|
// see them. Older snapshots predate the flag and read as finished.
|
|
271
277
|
...row["running"] === true ? { running: true } : {},
|
|
@@ -303,6 +309,20 @@ function rate(key, row) {
|
|
|
303
309
|
}
|
|
304
310
|
return entry;
|
|
305
311
|
}
|
|
312
|
+
function parseToolCalls(value) {
|
|
313
|
+
if (!Array.isArray(value)) return [];
|
|
314
|
+
const kept = [];
|
|
315
|
+
for (const item of value) {
|
|
316
|
+
if (kept.length >= MAX_TOOL_CALLS) break;
|
|
317
|
+
if (item === null || typeof item !== "object") continue;
|
|
318
|
+
const row = item;
|
|
319
|
+
if (typeof row["name"] !== "string" || row["name"].length === 0) continue;
|
|
320
|
+
const callCount = row["count"];
|
|
321
|
+
if (typeof callCount !== "number" || !Number.isInteger(callCount) || callCount < 1) continue;
|
|
322
|
+
kept.push({ name: row["name"], count: callCount });
|
|
323
|
+
}
|
|
324
|
+
return kept;
|
|
325
|
+
}
|
|
306
326
|
function parsePoolEvent(value) {
|
|
307
327
|
if (value === null || typeof value !== "object") throw new Error("invalid request-log pool event");
|
|
308
328
|
const row = value;
|
|
@@ -589,6 +609,12 @@ var en = {
|
|
|
589
609
|
requestLogTimelineBurst: "Delivered in one burst",
|
|
590
610
|
requestLogColStream: "Content span",
|
|
591
611
|
requestLogColFirstToken: "First token",
|
|
612
|
+
requestLogColPhase: "Phase",
|
|
613
|
+
requestLogColPhaseHint: "Share of time by phase: prep / wait / stream",
|
|
614
|
+
requestLogColTools: "Tools",
|
|
615
|
+
requestLogColToolsHint: "Tools this request actually invoked, with call counts",
|
|
616
|
+
requestLogColContext: "Context",
|
|
617
|
+
requestLogColContextHint: "Estimated input before send and the fitted output cap; an arrow marks a clamped request",
|
|
592
618
|
requestLogColStatus: "Status",
|
|
593
619
|
requestLogDetailRequest: "Request",
|
|
594
620
|
requestLogDetailTiming: "Timing",
|
|
@@ -794,6 +820,12 @@ var zh = {
|
|
|
794
820
|
requestLogTimelineBurst: "\u6574\u8F6E\u4E00\u6B21\u9001\u8FBE",
|
|
795
821
|
requestLogColStream: "\u5185\u5BB9\u8DE8\u5EA6",
|
|
796
822
|
requestLogColFirstToken: "\u9996\u5B57",
|
|
823
|
+
requestLogColPhase: "\u9636\u6BB5",
|
|
824
|
+
requestLogColPhaseHint: "\u5404\u9636\u6BB5\u8017\u65F6\u5360\u6BD4\uFF1A\u51C6\u5907 / \u7B49\u5F85 / \u8F93\u51FA",
|
|
825
|
+
requestLogColTools: "\u5DE5\u5177",
|
|
826
|
+
requestLogColToolsHint: "\u672C\u8F6E\u5B9E\u9645\u8C03\u7528\u7684\u5DE5\u5177\u53CA\u6B21\u6570",
|
|
827
|
+
requestLogColContext: "\u4E0A\u4E0B\u6587",
|
|
828
|
+
requestLogColContextHint: "\u53D1\u9001\u524D\u4F30\u7B97\u7684\u8F93\u5165\u4E0E\u88C5\u914D\u540E\u7684\u8F93\u51FA\u4E0A\u9650\uFF0C\u7BAD\u5934\u8868\u793A\u88AB\u6536\u7F29\u8FC7",
|
|
797
829
|
requestLogColStatus: "\u72B6\u6001",
|
|
798
830
|
requestLogDetailRequest: "\u8BF7\u6C42",
|
|
799
831
|
requestLogDetailTiming: "\u8017\u65F6",
|
|
@@ -2213,10 +2245,10 @@ if (!document.querySelector("style[data-plugin-css=" + JSON.stringify(id2) + "]"
|
|
|
2213
2245
|
const style = document.createElement("style");
|
|
2214
2246
|
style.dataset.plugin = "@dan-ai-studio/dshopencodego";
|
|
2215
2247
|
style.dataset.pluginCss = id2;
|
|
2216
|
-
style.textContent = ".Lx7MOq_page{box-sizing:border-box;background:var(--dsw-alias-bg-base);height:100%;min-height:0;color:var(--dsw-alias-label-primary);flex-direction:column;display:flex}.Lx7MOq_pageLoose{height:auto}.Lx7MOq_pageLoose .Lx7MOq_tableWrap{overflow:visible}.Lx7MOq_pageLoose .Lx7MOq_stuck{z-index:3;background:var(--dsw-alias-bg-base);position:sticky;top:0}.Lx7MOq_pageLoose .Lx7MOq_table th{top:var(--request-log-stuck,0px)}.Lx7MOq_pageLoose .Lx7MOq_foot{z-index:2;background:var(--dsw-alias-bg-base);position:sticky;bottom:0}.Lx7MOq_head{flex-wrap:wrap;flex:none;align-items:center;gap:12px;padding:20px clamp(16px,3vw,32px) 12px;display:flex}.Lx7MOq_headText{min-width:0}.Lx7MOq_title{margin:0;font-size:20px;font-weight:500;line-height:28px}.Lx7MOq_subtitle{color:var(--dsw-alias-label-secondary);margin:4px 0 0;font-size:13px;line-height:20px}.Lx7MOq_headActions{flex:none;align-items:center;gap:8px;margin-left:auto;display:flex}.Lx7MOq_button{border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-bg-layer-1);height:28px;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;align-items:center;gap:6px;padding:0 12px;font-size:13px;display:inline-flex}.Lx7MOq_button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.Lx7MOq_button:disabled{cursor:default;opacity:.5}.Lx7MOq_summary{flex-wrap:wrap;flex:none;gap:8px;padding:0 clamp(16px,3vw,32px) 12px;display:flex}.Lx7MOq_card{border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-1);flex-direction:column;gap:2px;min-width:104px;padding:8px 12px;display:flex}.Lx7MOq_cardLabel{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:16px}.Lx7MOq_cardValue{font-variant-numeric:tabular-nums;font-size:16px;font-weight:500;line-height:22px}.Lx7MOq_cardError .Lx7MOq_cardValue{color:var(--dsw-alias-state-error-primary)}.Lx7MOq_cardWarn .Lx7MOq_cardValue{color:var(--dsw-alias-state-warn-primary)}.Lx7MOq_toolbar{flex-wrap:wrap;flex:none;align-items:center;gap:8px 12px;padding:0 clamp(16px,3vw,32px) 12px;display:flex}.Lx7MOq_field{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:13px;line-height:20px;display:inline-flex}.Lx7MOq_select,.Lx7MOq_input{border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-bg-layer-1);height:28px;color:var(--dsw-alias-label-primary);font:inherit;padding:0 8px;font-size:13px}.Lx7MOq_input{width:160px}.Lx7MOq_inputNumber{width:72px}.Lx7MOq_checkbox{accent-color:var(--dsw-alias-brand-primary)}.Lx7MOq_sessionLink{color:var(--dsw-alias-link);font:inherit;text-align:left;cursor:pointer;white-space:nowrap;background:0 0;border:none;padding:0}.Lx7MOq_sessionLink:hover{text-decoration:underline}.Lx7MOq_sessionText{text-overflow:ellipsis;vertical-align:bottom;max-width:340px;display:inline-block;overflow:hidden}.Lx7MOq_modelText{text-overflow:ellipsis;vertical-align:bottom;max-width:220px;display:inline-block;overflow:hidden}.Lx7MOq_tableWrap{border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-1);flex:1;min-height:0;margin:0 clamp(16px,3vw,32px);overflow:auto}.Lx7MOq_table{border-collapse:separate;border-spacing:0;width:100%;min-width:940px;font-size:13px;line-height:20px}.Lx7MOq_table th{z-index:1;border-bottom:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-tertiary);text-align:left;white-space:nowrap;padding:8px 10px;font-size:12px;font-weight:500;position:sticky;top:0}.Lx7MOq_thSortable{cursor:pointer;user-select:none}.Lx7MOq_thSortable:hover{color:var(--dsw-alias-label-primary)}.Lx7MOq_table td{border-bottom:1px solid var(--dsw-alias-border-l1);white-space:nowrap;font-variant-numeric:tabular-nums;padding:6px 10px}.Lx7MOq_table tbody tr:last-child td{border-bottom:none}.Lx7MOq_row{cursor:pointer}.Lx7MOq_row:hover td{background:var(--dsw-alias-interactive-bg-hover)}.Lx7MOq_rowOk td:first-child{box-shadow:inset 3px 0 0 var(--dsw-alias-border-l3)}.Lx7MOq_rowSlow td:first-child{box-shadow:inset 3px 0 0 var(--dsw-alias-state-warn-primary)}.Lx7MOq_rowFail td:first-child{box-shadow:inset 3px 0 0 var(--dsw-alias-state-error-primary)}.Lx7MOq_rowRunning td:first-child{box-shadow:inset 3px 0 0 var(--dsw-alias-brand-primary)}.Lx7MOq_rowFail td:last-child,.Lx7MOq_rowSlow td:last-child{color:var(--dsw-alias-state-error-primary)}.Lx7MOq_group td{border-bottom:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);padding-top:12px;font-weight:500}.Lx7MOq_detail td{border-bottom:1px solid var(--dsw-alias-border-l1);white-space:normal;background:var(--dsw-alias-bg-layer-2);padding:12px 10px 16px}.Lx7MOq_detailGrid{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:6px 24px;display:grid}.Lx7MOq_timeline{flex-direction:column;grid-column:1/-1;gap:6px;padding:4px 0 8px;display:flex}.Lx7MOq_timelineTrackWrap{padding-bottom:18px;position:relative}.Lx7MOq_timelineTrack{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:999px;height:12px;position:relative}.Lx7MOq_timelineMidTick{background:var(--dsw-alias-label-tertiary);opacity:.7;width:1px;position:absolute;top:2px;bottom:2px;left:50%}.Lx7MOq_timelineMid{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:11px;line-height:16px;position:absolute;top:100%;transform:translate(-50%)}.Lx7MOq_timelineSeg{border-radius:4px;min-width:2px;position:absolute;top:2px;bottom:2px}.Lx7MOq_timelinePrep{background:var(--dsw-alias-state-idle-primary)}.Lx7MOq_timelineWait{background:var(--dsw-alias-state-warn-primary)}.Lx7MOq_timelineStream{background:var(--dsw-alias-state-success-primary);opacity:.45}.Lx7MOq_timelineStreamAlt{background:var(--dsw-alias-state-success-primary);opacity:.95}.Lx7MOq_timelineLive{background-image:linear-gradient(100deg,#0000 30%,#ffffff80 50%,#0000 70%);background-size:200% 100%;animation:1.6s linear infinite Lx7MOq_timelineShimmer}@keyframes Lx7MOq_timelineShimmer{0%{background-position:200% 0}to{background-position:-100% 0}}@media (prefers-reduced-motion:reduce){.Lx7MOq_timelineLive{animation:none}}.Lx7MOq_timelineRespTick{background:var(--dsw-alias-label-primary);width:2px;box-shadow:0 0 6px var(--dsw-alias-label-primary);border-radius:2px;position:absolute;top:-3px;bottom:-3px}.Lx7MOq_timelineTick{background:var(--dsw-alias-label-primary);border-radius:2px;width:2px;margin-left:-2px;position:absolute;top:-2px;bottom:-2px;left:100%}.Lx7MOq_timelineLegend{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex-wrap:wrap;gap:4px 16px;font-size:12px;display:flex}.Lx7MOq_timelineItem{white-space:nowrap;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:999px;align-items:center;gap:6px;padding:2px 10px;display:inline-flex}.Lx7MOq_timelineSwatch{border-radius:50%;width:8px;height:8px}.Lx7MOq_timelineSwatchPrep{background:var(--dsw-alias-state-idle-primary)}.Lx7MOq_timelineSwatchWait{background:var(--dsw-alias-state-warn-primary)}.Lx7MOq_timelineSwatchStream{background:var(--dsw-alias-state-success-primary)}.Lx7MOq_timelineTickSwatch{background:var(--dsw-alias-label-primary)}.Lx7MOq_detailItem{gap:8px;min-width:0;font-size:13px;line-height:20px;display:flex}.Lx7MOq_detailLabel{width:88px;color:var(--dsw-alias-label-tertiary);flex:none}.Lx7MOq_detailValue{overflow-wrap:anywhere;min-width:0;color:var(--dsw-alias-label-primary)}.Lx7MOq_mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}.Lx7MOq_empty{text-align:center;color:var(--dsw-alias-label-tertiary);padding:48px 16px}.Lx7MOq_foot{color:var(--dsw-alias-label-tertiary);flex-wrap:wrap;flex:none;align-items:center;gap:12px;padding:12px clamp(16px,3vw,32px) 20px;font-size:12px;display:flex}.Lx7MOq_pager{align-items:center;gap:8px;margin-left:auto;display:flex}.Lx7MOq_notice{color:var(--dsw-alias-label-secondary);padding:0 clamp(16px,3vw,32px) 12px;font-size:13px;line-height:20px}.Lx7MOq_noticeError{color:var(--dsw-alias-state-error-primary)}";
|
|
2248
|
+
style.textContent = ".Lx7MOq_page{box-sizing:border-box;background:var(--dsw-alias-bg-base);height:100%;min-height:0;color:var(--dsw-alias-label-primary);flex-direction:column;display:flex}.Lx7MOq_pageLoose{height:auto}.Lx7MOq_pageLoose .Lx7MOq_tableWrap{overflow:visible}.Lx7MOq_pageLoose .Lx7MOq_stuck{z-index:3;background:var(--dsw-alias-bg-base);position:sticky;top:0}.Lx7MOq_pageLoose .Lx7MOq_table th{top:var(--request-log-stuck,0px)}.Lx7MOq_pageLoose .Lx7MOq_foot{z-index:2;background:var(--dsw-alias-bg-base);position:sticky;bottom:0}.Lx7MOq_head{flex-wrap:wrap;flex:none;align-items:center;gap:12px;padding:20px clamp(16px,3vw,32px) 12px;display:flex}.Lx7MOq_headText{min-width:0}.Lx7MOq_title{margin:0;font-size:20px;font-weight:500;line-height:28px}.Lx7MOq_subtitle{color:var(--dsw-alias-label-secondary);margin:4px 0 0;font-size:13px;line-height:20px}.Lx7MOq_headActions{flex:none;align-items:center;gap:8px;margin-left:auto;display:flex}.Lx7MOq_button{border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-bg-layer-1);height:28px;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;align-items:center;gap:6px;padding:0 12px;font-size:13px;display:inline-flex}.Lx7MOq_button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.Lx7MOq_button:disabled{cursor:default;opacity:.5}.Lx7MOq_summary{flex-wrap:wrap;flex:none;gap:8px;padding:0 clamp(16px,3vw,32px) 12px;display:flex}.Lx7MOq_card{border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-1);flex-direction:column;gap:2px;min-width:104px;padding:8px 12px;display:flex}.Lx7MOq_cardLabel{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:16px}.Lx7MOq_cardValue{font-variant-numeric:tabular-nums;font-size:16px;font-weight:500;line-height:22px}.Lx7MOq_cardError .Lx7MOq_cardValue{color:var(--dsw-alias-state-error-primary)}.Lx7MOq_cardWarn .Lx7MOq_cardValue{color:var(--dsw-alias-state-warn-primary)}.Lx7MOq_toolbar{flex-wrap:wrap;flex:none;align-items:center;gap:8px 12px;padding:0 clamp(16px,3vw,32px) 12px;display:flex}.Lx7MOq_field{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:13px;line-height:20px;display:inline-flex}.Lx7MOq_select,.Lx7MOq_input{border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-bg-layer-1);height:28px;color:var(--dsw-alias-label-primary);font:inherit;padding:0 8px;font-size:13px}.Lx7MOq_input{width:160px}.Lx7MOq_inputNumber{width:72px}.Lx7MOq_checkbox{accent-color:var(--dsw-alias-brand-primary)}.Lx7MOq_sessionLink{color:var(--dsw-alias-link);font:inherit;text-align:left;cursor:pointer;white-space:nowrap;background:0 0;border:none;padding:0}.Lx7MOq_sessionLink:hover{text-decoration:underline}.Lx7MOq_sessionText{text-overflow:ellipsis;vertical-align:bottom;max-width:340px;display:inline-block;overflow:hidden}.Lx7MOq_modelText{text-overflow:ellipsis;vertical-align:bottom;max-width:220px;display:inline-block;overflow:hidden}.Lx7MOq_tableWrap{border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-1);flex:1;min-height:0;margin:0 clamp(16px,3vw,32px);overflow:auto}.Lx7MOq_table{border-collapse:separate;border-spacing:0;width:100%;min-width:940px;font-size:13px;line-height:20px}.Lx7MOq_table th{z-index:1;border-bottom:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-tertiary);text-align:left;white-space:nowrap;padding:8px 10px;font-size:12px;font-weight:500;position:sticky;top:0}.Lx7MOq_thSortable{cursor:pointer;user-select:none}.Lx7MOq_thSortable:hover{color:var(--dsw-alias-label-primary)}.Lx7MOq_table td{border-bottom:1px solid var(--dsw-alias-border-l1);white-space:nowrap;font-variant-numeric:tabular-nums;padding:6px 10px}.Lx7MOq_table tbody tr:last-child td{border-bottom:none}.Lx7MOq_row{cursor:pointer}.Lx7MOq_row:hover td{background:var(--dsw-alias-interactive-bg-hover)}.Lx7MOq_rowOk td:first-child{box-shadow:inset 3px 0 0 var(--dsw-alias-border-l3)}.Lx7MOq_rowSlow td:first-child{box-shadow:inset 3px 0 0 var(--dsw-alias-state-warn-primary)}.Lx7MOq_rowFail td:first-child{box-shadow:inset 3px 0 0 var(--dsw-alias-state-error-primary)}.Lx7MOq_rowRunning td:first-child{box-shadow:inset 3px 0 0 var(--dsw-alias-brand-primary)}.Lx7MOq_rowFail td:last-child,.Lx7MOq_rowSlow td:last-child{color:var(--dsw-alias-state-error-primary)}.Lx7MOq_group td{border-bottom:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);padding-top:12px;font-weight:500}.Lx7MOq_detail td{border-bottom:1px solid var(--dsw-alias-border-l1);white-space:normal;background:var(--dsw-alias-bg-layer-2);padding:12px 10px 16px}.Lx7MOq_detailGrid{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:6px 24px;display:grid}.Lx7MOq_timeline{flex-direction:column;grid-column:1/-1;gap:6px;padding:4px 0 8px;display:flex}.Lx7MOq_timelineTrackWrap{padding-bottom:18px;position:relative}.Lx7MOq_timelineTrack{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:999px;height:12px;position:relative}.Lx7MOq_timelineMidTick{background:var(--dsw-alias-label-tertiary);opacity:.7;width:1px;position:absolute;top:2px;bottom:2px;left:50%}.Lx7MOq_timelineMid{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:11px;line-height:16px;position:absolute;top:100%;transform:translate(-50%)}.Lx7MOq_timelineSeg{border-radius:4px;min-width:2px;position:absolute;top:2px;bottom:2px}.Lx7MOq_timelinePrep{background:var(--dsw-alias-state-idle-primary)}.Lx7MOq_timelineWait{background:var(--dsw-alias-state-warn-primary)}.Lx7MOq_timelineStream{background:var(--dsw-alias-state-success-primary);opacity:.45}.Lx7MOq_timelineStreamAlt{background:var(--dsw-alias-state-success-primary);opacity:.95}.Lx7MOq_timelineLive{background-image:linear-gradient(100deg,#0000 30%,#ffffff80 50%,#0000 70%);background-size:200% 100%;animation:1.6s linear infinite Lx7MOq_timelineShimmer}@keyframes Lx7MOq_timelineShimmer{0%{background-position:200% 0}to{background-position:-100% 0}}@media (prefers-reduced-motion:reduce){.Lx7MOq_timelineLive{animation:none}}.Lx7MOq_timelineRespTick{background:var(--dsw-alias-label-primary);width:2px;box-shadow:0 0 6px var(--dsw-alias-label-primary);border-radius:2px;position:absolute;top:-3px;bottom:-3px}.Lx7MOq_timelineTick{background:var(--dsw-alias-label-primary);border-radius:2px;width:2px;margin-left:-2px;position:absolute;top:-2px;bottom:-2px;left:100%}.Lx7MOq_phaseBar{background:var(--dsw-alias-bg-layer-1);border-radius:999px;min-width:110px;height:8px;position:relative}.Lx7MOq_phaseBar .Lx7MOq_timelineSeg{border-radius:3px;top:1px;bottom:1px}.Lx7MOq_phaseBar .Lx7MOq_timelineRespTick{top:-2px;bottom:-2px}.Lx7MOq_toolChips{flex-wrap:wrap;gap:4px;max-width:220px;display:inline-flex}.Lx7MOq_toolChip{white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:999px;align-items:center;gap:4px;padding:0 8px;font-size:12px;display:inline-flex}.Lx7MOq_toolChipCount{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums}.Lx7MOq_toolChipMore{white-space:nowrap;color:var(--dsw-alias-label-secondary);border:1px dashed var(--dsw-alias-border-l1);font-variant-numeric:tabular-nums;border-radius:999px;align-items:center;padding:0 8px;font-size:12px;display:inline-flex}.Lx7MOq_fitClamped{color:var(--dsw-alias-state-warn-primary)}.Lx7MOq_timelineLegend{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex-wrap:wrap;gap:4px 16px;font-size:12px;display:flex}.Lx7MOq_timelineItem{white-space:nowrap;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:999px;align-items:center;gap:6px;padding:2px 10px;display:inline-flex}.Lx7MOq_timelineSwatch{border-radius:50%;width:8px;height:8px}.Lx7MOq_timelineSwatchPrep{background:var(--dsw-alias-state-idle-primary)}.Lx7MOq_timelineSwatchWait{background:var(--dsw-alias-state-warn-primary)}.Lx7MOq_timelineSwatchStream{background:var(--dsw-alias-state-success-primary)}.Lx7MOq_timelineTickSwatch{background:var(--dsw-alias-label-primary)}.Lx7MOq_detailItem{gap:8px;min-width:0;font-size:13px;line-height:20px;display:flex}.Lx7MOq_detailLabel{width:88px;color:var(--dsw-alias-label-tertiary);flex:none}.Lx7MOq_detailValue{overflow-wrap:anywhere;min-width:0;color:var(--dsw-alias-label-primary)}.Lx7MOq_mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}.Lx7MOq_empty{text-align:center;color:var(--dsw-alias-label-tertiary);padding:48px 16px}.Lx7MOq_foot{color:var(--dsw-alias-label-tertiary);flex-wrap:wrap;flex:none;align-items:center;gap:12px;padding:12px clamp(16px,3vw,32px) 20px;font-size:12px;display:flex}.Lx7MOq_pager{align-items:center;gap:8px;margin-left:auto;display:flex}.Lx7MOq_notice{color:var(--dsw-alias-label-secondary);padding:0 clamp(16px,3vw,32px) 12px;font-size:13px;line-height:20px}.Lx7MOq_noticeError{color:var(--dsw-alias-state-error-primary)}";
|
|
2217
2249
|
document.head.appendChild(style);
|
|
2218
2250
|
}
|
|
2219
|
-
var request_log_default = { "button": "Lx7MOq_button", "card": "Lx7MOq_card", "cardError": "Lx7MOq_cardError", "cardLabel": "Lx7MOq_cardLabel", "cardValue": "Lx7MOq_cardValue", "cardWarn": "Lx7MOq_cardWarn", "checkbox": "Lx7MOq_checkbox", "detail": "Lx7MOq_detail", "detailGrid": "Lx7MOq_detailGrid", "detailItem": "Lx7MOq_detailItem", "detailLabel": "Lx7MOq_detailLabel", "detailValue": "Lx7MOq_detailValue", "empty": "Lx7MOq_empty", "field": "Lx7MOq_field", "foot": "Lx7MOq_foot", "group": "Lx7MOq_group", "head": "Lx7MOq_head", "headActions": "Lx7MOq_headActions", "headText": "Lx7MOq_headText", "input": "Lx7MOq_input", "inputNumber": "Lx7MOq_inputNumber", "modelText": "Lx7MOq_modelText", "mono": "Lx7MOq_mono", "notice": "Lx7MOq_notice", "noticeError": "Lx7MOq_noticeError", "page": "Lx7MOq_page", "pageLoose": "Lx7MOq_pageLoose", "pager": "Lx7MOq_pager", "row": "Lx7MOq_row", "rowFail": "Lx7MOq_rowFail", "rowOk": "Lx7MOq_rowOk", "rowRunning": "Lx7MOq_rowRunning", "rowSlow": "Lx7MOq_rowSlow", "select": "Lx7MOq_select", "sessionLink": "Lx7MOq_sessionLink", "sessionText": "Lx7MOq_sessionText", "stuck": "Lx7MOq_stuck", "subtitle": "Lx7MOq_subtitle", "summary": "Lx7MOq_summary", "table": "Lx7MOq_table", "tableWrap": "Lx7MOq_tableWrap", "thSortable": "Lx7MOq_thSortable", "timeline": "Lx7MOq_timeline", "timelineItem": "Lx7MOq_timelineItem", "timelineLegend": "Lx7MOq_timelineLegend", "timelineLive": "Lx7MOq_timelineLive", "timelineMid": "Lx7MOq_timelineMid", "timelineMidTick": "Lx7MOq_timelineMidTick", "timelinePrep": "Lx7MOq_timelinePrep", "timelineRespTick": "Lx7MOq_timelineRespTick", "timelineSeg": "Lx7MOq_timelineSeg", "timelineShimmer": "Lx7MOq_timelineShimmer", "timelineStream": "Lx7MOq_timelineStream", "timelineStreamAlt": "Lx7MOq_timelineStreamAlt", "timelineSwatch": "Lx7MOq_timelineSwatch", "timelineSwatchPrep": "Lx7MOq_timelineSwatchPrep", "timelineSwatchStream": "Lx7MOq_timelineSwatchStream", "timelineSwatchWait": "Lx7MOq_timelineSwatchWait", "timelineTick": "Lx7MOq_timelineTick", "timelineTickSwatch": "Lx7MOq_timelineTickSwatch", "timelineTrack": "Lx7MOq_timelineTrack", "timelineTrackWrap": "Lx7MOq_timelineTrackWrap", "timelineWait": "Lx7MOq_timelineWait", "title": "Lx7MOq_title", "toolbar": "Lx7MOq_toolbar" };
|
|
2251
|
+
var request_log_default = { "button": "Lx7MOq_button", "card": "Lx7MOq_card", "cardError": "Lx7MOq_cardError", "cardLabel": "Lx7MOq_cardLabel", "cardValue": "Lx7MOq_cardValue", "cardWarn": "Lx7MOq_cardWarn", "checkbox": "Lx7MOq_checkbox", "detail": "Lx7MOq_detail", "detailGrid": "Lx7MOq_detailGrid", "detailItem": "Lx7MOq_detailItem", "detailLabel": "Lx7MOq_detailLabel", "detailValue": "Lx7MOq_detailValue", "empty": "Lx7MOq_empty", "field": "Lx7MOq_field", "fitClamped": "Lx7MOq_fitClamped", "foot": "Lx7MOq_foot", "group": "Lx7MOq_group", "head": "Lx7MOq_head", "headActions": "Lx7MOq_headActions", "headText": "Lx7MOq_headText", "input": "Lx7MOq_input", "inputNumber": "Lx7MOq_inputNumber", "modelText": "Lx7MOq_modelText", "mono": "Lx7MOq_mono", "notice": "Lx7MOq_notice", "noticeError": "Lx7MOq_noticeError", "page": "Lx7MOq_page", "pageLoose": "Lx7MOq_pageLoose", "pager": "Lx7MOq_pager", "phaseBar": "Lx7MOq_phaseBar", "row": "Lx7MOq_row", "rowFail": "Lx7MOq_rowFail", "rowOk": "Lx7MOq_rowOk", "rowRunning": "Lx7MOq_rowRunning", "rowSlow": "Lx7MOq_rowSlow", "select": "Lx7MOq_select", "sessionLink": "Lx7MOq_sessionLink", "sessionText": "Lx7MOq_sessionText", "stuck": "Lx7MOq_stuck", "subtitle": "Lx7MOq_subtitle", "summary": "Lx7MOq_summary", "table": "Lx7MOq_table", "tableWrap": "Lx7MOq_tableWrap", "thSortable": "Lx7MOq_thSortable", "timeline": "Lx7MOq_timeline", "timelineItem": "Lx7MOq_timelineItem", "timelineLegend": "Lx7MOq_timelineLegend", "timelineLive": "Lx7MOq_timelineLive", "timelineMid": "Lx7MOq_timelineMid", "timelineMidTick": "Lx7MOq_timelineMidTick", "timelinePrep": "Lx7MOq_timelinePrep", "timelineRespTick": "Lx7MOq_timelineRespTick", "timelineSeg": "Lx7MOq_timelineSeg", "timelineShimmer": "Lx7MOq_timelineShimmer", "timelineStream": "Lx7MOq_timelineStream", "timelineStreamAlt": "Lx7MOq_timelineStreamAlt", "timelineSwatch": "Lx7MOq_timelineSwatch", "timelineSwatchPrep": "Lx7MOq_timelineSwatchPrep", "timelineSwatchStream": "Lx7MOq_timelineSwatchStream", "timelineSwatchWait": "Lx7MOq_timelineSwatchWait", "timelineTick": "Lx7MOq_timelineTick", "timelineTickSwatch": "Lx7MOq_timelineTickSwatch", "timelineTrack": "Lx7MOq_timelineTrack", "timelineTrackWrap": "Lx7MOq_timelineTrackWrap", "timelineWait": "Lx7MOq_timelineWait", "title": "Lx7MOq_title", "toolChip": "Lx7MOq_toolChip", "toolChipCount": "Lx7MOq_toolChipCount", "toolChipMore": "Lx7MOq_toolChipMore", "toolChips": "Lx7MOq_toolChips", "toolbar": "Lx7MOq_toolbar" };
|
|
2220
2252
|
|
|
2221
2253
|
// src/client/RequestLogPage.tsx
|
|
2222
2254
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
@@ -2232,6 +2264,7 @@ var SORT_DEFAULT_DIR = {
|
|
|
2232
2264
|
prepMs: "desc",
|
|
2233
2265
|
waitMs: "desc",
|
|
2234
2266
|
firstTokenMs: "desc",
|
|
2267
|
+
estimatedInputTokens: "desc",
|
|
2235
2268
|
durationMs: "desc",
|
|
2236
2269
|
status: "asc"
|
|
2237
2270
|
};
|
|
@@ -2259,6 +2292,8 @@ function sortValue(entry, key) {
|
|
|
2259
2292
|
return waitMs(entry) ?? -1;
|
|
2260
2293
|
case "firstTokenMs":
|
|
2261
2294
|
return entry.firstTokenMs ?? -1;
|
|
2295
|
+
case "estimatedInputTokens":
|
|
2296
|
+
return entry.estimatedInputTokens ?? -1;
|
|
2262
2297
|
case "durationMs":
|
|
2263
2298
|
return entry.durationMs ?? -1;
|
|
2264
2299
|
case "status":
|
|
@@ -2497,6 +2532,97 @@ function RequestLogPage({ readLog, enabled, canOpenSession, openSession, t, getL
|
|
|
2497
2532
|
label,
|
|
2498
2533
|
sortKey === key ? sortDir === "asc" ? " \u25B2" : " \u25BC" : ""
|
|
2499
2534
|
] });
|
|
2535
|
+
const plainHead = (label, hint) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("th", { title: hint, children: label });
|
|
2536
|
+
const kindClass = (kind) => kind === "prep" ? request_log_default.timelinePrep : kind === "wait" ? request_log_default.timelineWait : kind === "stream" ? request_log_default.timelineStream : request_log_default.timelineStreamAlt;
|
|
2537
|
+
const phaseSummary = (timeline) => {
|
|
2538
|
+
const totals = /* @__PURE__ */ new Map();
|
|
2539
|
+
const order = [];
|
|
2540
|
+
for (const block of timeline.blocks) {
|
|
2541
|
+
const key = block.kind === "streamAlt" ? "stream" : block.kind;
|
|
2542
|
+
const known = totals.get(key);
|
|
2543
|
+
if (known === void 0) {
|
|
2544
|
+
totals.set(key, { label: block.label, total: block.to - block.from });
|
|
2545
|
+
order.push(key);
|
|
2546
|
+
} else {
|
|
2547
|
+
known.total += block.to - block.from;
|
|
2548
|
+
}
|
|
2549
|
+
}
|
|
2550
|
+
const parts = [];
|
|
2551
|
+
for (const key of order) {
|
|
2552
|
+
const group = totals.get(key);
|
|
2553
|
+
if (group !== void 0) parts.push(`${group.label} ${duration(group.total)}`);
|
|
2554
|
+
}
|
|
2555
|
+
if (timeline.responseAt !== void 0) {
|
|
2556
|
+
parts.push(`${t("requestLogTimelineFirstByte")} ${duration(timeline.responseAt)}`);
|
|
2557
|
+
}
|
|
2558
|
+
return parts.join(", ");
|
|
2559
|
+
};
|
|
2560
|
+
const phaseBlocks = (timeline, live) => {
|
|
2561
|
+
const percent2 = (at) => `${(at / timeline.end * 100).toFixed(2)}%`;
|
|
2562
|
+
const liveIndex = live ? timeline.blocks.findLastIndex((block) => block.kind === "stream" || block.kind === "streamAlt") : -1;
|
|
2563
|
+
const out = timeline.blocks.map((block, index) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2564
|
+
"div",
|
|
2565
|
+
{
|
|
2566
|
+
className: `${request_log_default.timelineSeg} ${kindClass(block.kind)}${index === liveIndex ? ` ${request_log_default.timelineLive}` : ""}`,
|
|
2567
|
+
style: {
|
|
2568
|
+
left: percent2(block.from),
|
|
2569
|
+
width: percent2(Math.max(0, block.to - block.from))
|
|
2570
|
+
},
|
|
2571
|
+
title: `${block.label} ${duration(block.to - block.from)}`
|
|
2572
|
+
},
|
|
2573
|
+
`${block.kind}-${index}`
|
|
2574
|
+
));
|
|
2575
|
+
if (timeline.responseAt !== void 0) {
|
|
2576
|
+
out.push(
|
|
2577
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2578
|
+
"div",
|
|
2579
|
+
{
|
|
2580
|
+
className: request_log_default.timelineRespTick,
|
|
2581
|
+
style: { left: percent2(Math.min(timeline.responseAt, timeline.end)) },
|
|
2582
|
+
title: `${t("requestLogTimelineFirstByte")} ${duration(timeline.responseAt)}`
|
|
2583
|
+
},
|
|
2584
|
+
"response"
|
|
2585
|
+
)
|
|
2586
|
+
);
|
|
2587
|
+
}
|
|
2588
|
+
return out;
|
|
2589
|
+
};
|
|
2590
|
+
const MAX_ROW_TOOLS = 3;
|
|
2591
|
+
const toolChips = (entry) => {
|
|
2592
|
+
const calls = entry.toolCalls ?? [];
|
|
2593
|
+
if (calls.length === 0) return "\u2014";
|
|
2594
|
+
const full = calls.map((call) => `${call.name} \xD7${call.count}`).join(", ");
|
|
2595
|
+
const shown = calls.slice(0, MAX_ROW_TOOLS);
|
|
2596
|
+
const extra = calls.length - shown.length;
|
|
2597
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: request_log_default.toolChips, title: full, children: [
|
|
2598
|
+
shown.map((call) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: request_log_default.toolChip, title: `${call.name} \xD7${call.count}`, children: [
|
|
2599
|
+
call.name,
|
|
2600
|
+
" ",
|
|
2601
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: request_log_default.toolChipCount, children: [
|
|
2602
|
+
"\xD7",
|
|
2603
|
+
call.count
|
|
2604
|
+
] })
|
|
2605
|
+
] }, call.name)),
|
|
2606
|
+
extra > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: request_log_default.toolChipMore, title: full, children: [
|
|
2607
|
+
"+",
|
|
2608
|
+
extra
|
|
2609
|
+
] })
|
|
2610
|
+
] });
|
|
2611
|
+
};
|
|
2612
|
+
const fitText = (entry) => {
|
|
2613
|
+
if (entry.estimatedInputTokens === void 0) return "\u2014";
|
|
2614
|
+
const estimate = `~${compactCount(Math.round(entry.estimatedInputTokens))}`;
|
|
2615
|
+
if (entry.maxTokensClamped === true && entry.fittedMaxTokens !== void 0) {
|
|
2616
|
+
return `${estimate} \u2192 ${compactCount(entry.fittedMaxTokens)}`;
|
|
2617
|
+
}
|
|
2618
|
+
return estimate;
|
|
2619
|
+
};
|
|
2620
|
+
const fitTitle = (entry) => {
|
|
2621
|
+
if (entry.estimatedInputTokens === void 0) return t("requestLogColContextHint");
|
|
2622
|
+
const estimate = `~${count2(Math.round(entry.estimatedInputTokens))}`;
|
|
2623
|
+
const fitted = entry.maxTokensClamped === true && entry.fittedMaxTokens !== void 0 ? ` \u2192 ${count2(entry.fittedMaxTokens)}` : "";
|
|
2624
|
+
return `${t("requestLogColContextHint")}: ${estimate}${fitted}`;
|
|
2625
|
+
};
|
|
2500
2626
|
const rows = () => {
|
|
2501
2627
|
const out = [];
|
|
2502
2628
|
let lastGroup;
|
|
@@ -2505,7 +2631,7 @@ function RequestLogPage({ readLog, enabled, canOpenSession, openSession, t, getL
|
|
|
2505
2631
|
if (group !== void 0 && group !== lastGroup) {
|
|
2506
2632
|
lastGroup = group;
|
|
2507
2633
|
out.push(
|
|
2508
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("tr", { className: request_log_default.group, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { colSpan:
|
|
2634
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("tr", { className: request_log_default.group, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { colSpan: 16, children: groupBy === "session" ? sessionLabel(group).text : groupBy === "result" ? resultGroupLabel(group) : group }) }, `group-${group}-${entry.seq}`)
|
|
2509
2635
|
);
|
|
2510
2636
|
}
|
|
2511
2637
|
const state = entry.running === true ? "rowRunning" : !entry.ok ? "rowFail" : entry.tps !== void 0 && entry.tps < 5 ? "rowSlow" : "rowOk";
|
|
@@ -2548,6 +2674,20 @@ function RequestLogPage({ readLog, enabled, canOpenSession, openSession, t, getL
|
|
|
2548
2674
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { children: duration(entry.prepMs) }),
|
|
2549
2675
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { children: duration(waitMs(entry)) }),
|
|
2550
2676
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { children: duration(entry.firstTokenMs) }),
|
|
2677
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { children: (() => {
|
|
2678
|
+
const timeline = timelineOf(entry, t);
|
|
2679
|
+
if (timeline === void 0) return "\u2014";
|
|
2680
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: request_log_default.phaseBar, role: "img", "aria-label": phaseSummary(timeline), children: phaseBlocks(timeline, false) });
|
|
2681
|
+
})() }),
|
|
2682
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { children: toolChips(entry) }),
|
|
2683
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2684
|
+
"td",
|
|
2685
|
+
{
|
|
2686
|
+
className: entry.maxTokensClamped === true ? request_log_default.fitClamped : void 0,
|
|
2687
|
+
title: fitTitle(entry),
|
|
2688
|
+
children: fitText(entry)
|
|
2689
|
+
}
|
|
2690
|
+
),
|
|
2551
2691
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { children: entry.running === true ? duration(Math.max(0, Date.now() - entry.atMs)) : duration(entry.durationMs) }),
|
|
2552
2692
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { children: entry.running === true ? `${t("requestLogRunning")} \xB7 ${duration(Math.max(0, Date.now() - entry.atMs))}` : entry.ok ? entry.status === void 0 ? "\u2713" : String(entry.status) : entry.code ?? "\u2717" })
|
|
2553
2693
|
]
|
|
@@ -2557,11 +2697,10 @@ function RequestLogPage({ readLog, enabled, canOpenSession, openSession, t, getL
|
|
|
2557
2697
|
);
|
|
2558
2698
|
if (expanded === entry.seq) {
|
|
2559
2699
|
out.push(
|
|
2560
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("tr", { className: request_log_default.detail, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { colSpan:
|
|
2700
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("tr", { className: request_log_default.detail, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { colSpan: 16, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: request_log_default.detailGrid, children: [
|
|
2561
2701
|
(() => {
|
|
2562
2702
|
const timeline = timelineOf(entry, t);
|
|
2563
2703
|
if (timeline === void 0) return null;
|
|
2564
|
-
const kindClass = (kind) => kind === "prep" ? request_log_default.timelinePrep : kind === "wait" ? request_log_default.timelineWait : kind === "stream" ? request_log_default.timelineStream : request_log_default.timelineStreamAlt;
|
|
2565
2704
|
const legendSwatch = (key) => key === "prep" ? request_log_default.timelineSwatchPrep : key === "wait" ? request_log_default.timelineSwatchWait : key === "stream" ? request_log_default.timelineSwatchStream : request_log_default.timelineTickSwatch;
|
|
2566
2705
|
const legend = [];
|
|
2567
2706
|
const legendKey = (kind) => kind === "streamAlt" ? "stream" : kind;
|
|
@@ -2591,31 +2730,10 @@ function RequestLogPage({ readLog, enabled, canOpenSession, openSession, t, getL
|
|
|
2591
2730
|
text: `${t("requestLogColLatency")} ${duration(timeline.end)}`
|
|
2592
2731
|
});
|
|
2593
2732
|
const spoken = legend.map((item) => item.text).join(", ");
|
|
2594
|
-
const percent2 = (at) => `${(at / timeline.end * 100).toFixed(2)}%`;
|
|
2595
|
-
const liveIndex = entry.running === true ? timeline.blocks.findLastIndex((block) => block.kind === "stream" || block.kind === "streamAlt") : -1;
|
|
2596
2733
|
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: request_log_default.timeline, role: "img", "aria-label": spoken, children: [
|
|
2597
2734
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: request_log_default.timelineTrackWrap, children: [
|
|
2598
2735
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: request_log_default.timelineTrack, children: [
|
|
2599
|
-
timeline
|
|
2600
|
-
"div",
|
|
2601
|
-
{
|
|
2602
|
-
className: `${request_log_default.timelineSeg} ${kindClass(block.kind)}${index === liveIndex ? ` ${request_log_default.timelineLive}` : ""}`,
|
|
2603
|
-
style: {
|
|
2604
|
-
left: percent2(block.from),
|
|
2605
|
-
width: percent2(Math.max(0, block.to - block.from))
|
|
2606
|
-
},
|
|
2607
|
-
title: `${block.label} ${duration(block.to - block.from)}`
|
|
2608
|
-
},
|
|
2609
|
-
`${block.kind}-${index}`
|
|
2610
|
-
)),
|
|
2611
|
-
timeline.responseAt !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2612
|
-
"div",
|
|
2613
|
-
{
|
|
2614
|
-
className: request_log_default.timelineRespTick,
|
|
2615
|
-
style: { left: percent2(Math.min(timeline.responseAt, timeline.end)) },
|
|
2616
|
-
title: `${t("requestLogTimelineFirstByte")} ${duration(timeline.responseAt)}`
|
|
2617
|
-
}
|
|
2618
|
-
),
|
|
2736
|
+
phaseBlocks(timeline, entry.running === true),
|
|
2619
2737
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: request_log_default.timelineMidTick }),
|
|
2620
2738
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: request_log_default.timelineTick, title: duration(timeline.end) })
|
|
2621
2739
|
] }),
|
|
@@ -2902,6 +3020,9 @@ function RequestLogPage({ readLog, enabled, canOpenSession, openSession, t, getL
|
|
|
2902
3020
|
head("prepMs", t("requestLogColPrep")),
|
|
2903
3021
|
head("waitMs", t("requestLogColWait")),
|
|
2904
3022
|
head("firstTokenMs", t("requestLogColFirstToken")),
|
|
3023
|
+
plainHead(t("requestLogColPhase"), t("requestLogColPhaseHint")),
|
|
3024
|
+
plainHead(t("requestLogColTools"), t("requestLogColToolsHint")),
|
|
3025
|
+
head("estimatedInputTokens", t("requestLogColContext"), t("requestLogColContextHint")),
|
|
2905
3026
|
head("durationMs", t("requestLogColLatency")),
|
|
2906
3027
|
head("status", t("requestLogColStatus"))
|
|
2907
3028
|
] }) }),
|