@migor/cli 0.10.5 → 0.10.7
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/CHANGELOG.md +175 -1
- package/dist/AGENTS.md +9 -1
- package/dist/inspector/fromTrace.js +16 -7
- package/dist/inspector/full-view.js +369 -0
- package/dist/inspector/index.js +5 -0
- package/dist/inspector/trace-view.bundle.js +424 -9
- package/dist/inspector/trace-view.css +144 -0
- package/dist/inspector/view.js +29 -3
- package/dist/inspector-routes.js +4 -0
- package/dist/templates/package.json +2 -2
- package/package.json +1 -1
package/dist/inspector/view.js
CHANGED
|
@@ -17,6 +17,13 @@
|
|
|
17
17
|
* 宿主需提供的 CSS 变量:--ice --faint --text(见 trace-view.css)。
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
+
/* 展开态的正文有两种形状,由 `full` 的类型决定(2026-11-11):
|
|
21
|
+
* - 字符串 → 老路:`.tr-io` 里放原文,靠 `.tr-open` 换行(纯文本正文、官网模拟回放);
|
|
22
|
+
* - 对象/数组 → 追加一个 `.tr-full` 结构化块(折叠 / 成表 / 路径复制),`.tr-io` 由 CSS 隐藏。
|
|
23
|
+
* 两档并存是刻意的:字符串那条路有 test/style.test.js 的两个不变量守着(最小宽度、caret 常显),
|
|
24
|
+
* 全换成本件会让那两个守卫失去落点。 */
|
|
25
|
+
import { createFullView } from './full-view.js';
|
|
26
|
+
|
|
20
27
|
export const CAP_ICO = { tool: '⚙', skill: '◆', prompt: '¶', subagent: '⊕' };
|
|
21
28
|
|
|
22
29
|
/** 能力类型取自名字前缀(tool: / skill: / prompt: / subagent:) */
|
|
@@ -88,6 +95,9 @@ export function createTraceView(rootEl, opts = {}) {
|
|
|
88
95
|
/* 展开态的行 key 集合 + 事件 key 发号器。两者都必须活在 renderTrace 之外:
|
|
89
96
|
渲染是【全量重建】(rootEl.innerHTML = ''),状态放进 DOM 或渲染过程里就活不过下一次事件。 */
|
|
90
97
|
const expanded = new Set();
|
|
98
|
+
/* 结构化块内部的折叠状态,按事件键一份(`ev.key` → 路径 → 是否展开)。
|
|
99
|
+
与 `expanded` 同一条理由,而且更硬:块本身每次重建都会 new 一个,状态只能挂在树上。 */
|
|
100
|
+
const folds = new Map();
|
|
91
101
|
let evSeq = 0;
|
|
92
102
|
|
|
93
103
|
/** 正在选文本时不要收起/展开 —— 鼠标拖选到行外松手会补一次 click,否则选完就自己合上了 */
|
|
@@ -136,20 +146,35 @@ export function createTraceView(rootEl, opts = {}) {
|
|
|
136
146
|
// 非 tool.* 事件(usage.unpriced / llm.retry / budget.* / context.budget)没有工具名 ——
|
|
137
147
|
// 这一格整个不渲染,别把「无工具」显示成假工具名(.tr-name 是 flex:none,.tr-io 自然占满)
|
|
138
148
|
if (ev.tool) row.appendChild(el('span', 'tr-name', ev.tool));
|
|
139
|
-
// 展开态用全文(ev.full),折叠态用摘要(ev.text)——
|
|
140
|
-
|
|
149
|
+
// 展开态用全文(ev.full),折叠态用摘要(ev.text)—— 折叠态因此与加展开之前逐字一致。
|
|
150
|
+
// `full` 是对象/数组时(2026-11-11):`.tr-io` 仍放**原文**(结构化块挂在行后、由 CSS
|
|
151
|
+
// 隐藏本格),所以「展开拿到的是原文而不是 62 字符摘要」这条不变量原样成立。
|
|
152
|
+
const structured = ev.full !== null && typeof ev.full === 'object';
|
|
153
|
+
const fullText = structured ? rawArg(ev.full) : ev.full || '';
|
|
154
|
+
const io = el('span', 'tr-io', (open ? fullText : ev.text) || '');
|
|
141
155
|
// 展开后正文已在行里,再挂一个占满整行的原生 tooltip 只会挡视线
|
|
142
156
|
io.title = open ? '' : ev.text || '';
|
|
143
157
|
row.appendChild(io);
|
|
144
158
|
if (ev.full) {
|
|
145
159
|
row.dataset.expandable = '1'; // 可展开标记:CSS 靠它出 caret / cursor,测试靠它找行
|
|
146
160
|
row.appendChild(el('span', 'tr-caret', open ? '▾' : '▸'));
|
|
147
|
-
if (open) row.className += ' tr-open';
|
|
161
|
+
if (open) row.className += ' tr-open' + (structured ? ' tr-structured' : '');
|
|
148
162
|
row.addEventListener('click', () => {
|
|
149
163
|
if (!hasSelection()) toggleExpand(ev.key);
|
|
150
164
|
});
|
|
151
165
|
}
|
|
152
166
|
rootEl.appendChild(row);
|
|
167
|
+
// 结构化正文是**兄弟块**而不是 `.tr-io` 的子节点:行是 flex + nowrap,
|
|
168
|
+
// 塞进去会把树的列对齐打乱;独立成块才能自己换行、自己缩进。
|
|
169
|
+
// 折叠状态按事件键取一份带进去(2026-11-11 晚):块每次重建都 new,状态不能放块里。
|
|
170
|
+
if (open && structured) {
|
|
171
|
+
let fold = folds.get(ev.key);
|
|
172
|
+
if (!fold) {
|
|
173
|
+
fold = new Map();
|
|
174
|
+
folds.set(ev.key, fold);
|
|
175
|
+
}
|
|
176
|
+
rootEl.appendChild(createFullView(ev.full, { fold }));
|
|
177
|
+
}
|
|
153
178
|
return;
|
|
154
179
|
}
|
|
155
180
|
|
|
@@ -224,6 +249,7 @@ export function createTraceView(rootEl, opts = {}) {
|
|
|
224
249
|
spanMap.clear();
|
|
225
250
|
spanMap.set('root', traceRoot);
|
|
226
251
|
expanded.clear(); // 展开态属于上一棵树:reset 开新树时一并清掉
|
|
252
|
+
folds.clear(); // 块内折叠同理:留着只会在下一次点开时出现"莫名已折叠"的状态
|
|
227
253
|
usageAcc.input = 0;
|
|
228
254
|
usageAcc.output = 0;
|
|
229
255
|
usageAcc.cacheRead = 0;
|
package/dist/inspector-routes.js
CHANGED
|
@@ -108,6 +108,10 @@ const STATIC = new Map([
|
|
|
108
108
|
['index.js', join(ASSETS, 'index.js')],
|
|
109
109
|
['view.js', join(ASSETS, 'view.js')],
|
|
110
110
|
['fromTrace.js', join(ASSETS, 'fromTrace.js')],
|
|
111
|
+
/* 结构化展开正文(2026-11-11):`full` 是对象/数组时,view.js 用它铺缩进/着色/复制块。
|
|
112
|
+
* 与上面四个同性质 —— 渲染器的一部分,页面**会** import 它(view.js 的静态 import 被
|
|
113
|
+
* 剥成页面级 import 时它必须可达),漏登记 = 浏览器 404 = 面板整块模块求值失败。 */
|
|
114
|
+
['full-view.js', join(ASSETS, 'full-view.js')],
|
|
111
115
|
['summary.js', join(ASSETS, 'summary.js')],
|
|
112
116
|
['trace-view.css', join(ASSETS, 'trace-view.css')],
|
|
113
117
|
/* 单文件 bundle(`agentia view` 内联进自包含 HTML 用)。⚠️ **页面不 import 它** ——
|
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@migor/agentia": "^0.10.
|
|
14
|
+
"@migor/agentia": "^0.10.7"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"@migor/cli": "^0.10.
|
|
17
|
+
"@migor/cli": "^0.10.7",
|
|
18
18
|
"tsx": "^4.19.0",
|
|
19
19
|
"typescript": "^7.0.2",
|
|
20
20
|
"@types/node": "^22.0.0"
|
package/package.json
CHANGED