@flanksource/clicky-ui 0.3.35 → 0.3.36
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/dist/ai.cjs +2 -1
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +2 -1
- package/dist/ai.js.map +1 -1
- package/dist/data/TaskHeaderExtras.cjs +35 -0
- package/dist/data/TaskHeaderExtras.cjs.map +1 -0
- package/dist/data/TaskHeaderExtras.d.ts +27 -0
- package/dist/data/TaskHeaderExtras.d.ts.map +1 -0
- package/dist/data/TaskHeaderExtras.js +35 -0
- package/dist/data/TaskHeaderExtras.js.map +1 -0
- package/dist/data/TaskManager.cjs +18 -6
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts +13 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +18 -6
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskProcessDetails.cjs +4 -1
- package/dist/data/TaskProcessDetails.cjs.map +1 -1
- package/dist/data/TaskProcessDetails.d.ts.map +1 -1
- package/dist/data/TaskProcessDetails.js +4 -1
- package/dist/data/TaskProcessDetails.js.map +1 -1
- package/dist/data/TaskProcessMetadata.cjs +50 -0
- package/dist/data/TaskProcessMetadata.cjs.map +1 -0
- package/dist/data/TaskProcessMetadata.d.ts +20 -0
- package/dist/data/TaskProcessMetadata.d.ts.map +1 -0
- package/dist/data/TaskProcessMetadata.js +50 -0
- package/dist/data/TaskProcessMetadata.js.map +1 -0
- package/dist/data/TaskProgress.cjs +22 -31
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +14 -1
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +22 -31
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +22 -0
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/TaskStreamTabs.cjs +78 -0
- package/dist/data/TaskStreamTabs.cjs.map +1 -0
- package/dist/data/TaskStreamTabs.d.ts +35 -0
- package/dist/data/TaskStreamTabs.d.ts.map +1 -0
- package/dist/data/TaskStreamTabs.js +78 -0
- package/dist/data/TaskStreamTabs.js.map +1 -0
- package/dist/data/ai/SessionInspector.approvals-model.cjs +9 -0
- package/dist/data/ai/SessionInspector.approvals-model.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.approvals-model.d.ts +17 -0
- package/dist/data/ai/SessionInspector.approvals-model.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.approvals-model.js +9 -0
- package/dist/data/ai/SessionInspector.approvals-model.js.map +1 -0
- package/dist/data/ai/SessionInspector.approvals.cjs +7 -11
- package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.d.ts +2 -10
- package/dist/data/ai/SessionInspector.approvals.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.js +4 -8
- package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
- package/dist/data/ai/SessionInspector.cjs +2 -2
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.d.ts +1 -1
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.js +1 -1
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.panel-parts.cjs +0 -13
- package/dist/data/ai/SessionInspector.panel-parts.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.panel-parts.d.ts +4 -5
- package/dist/data/ai/SessionInspector.panel-parts.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.panel-parts.js +1 -14
- package/dist/data/ai/SessionInspector.panel-parts.js.map +1 -1
- package/dist/data/ai/SessionInspector.panel-values.cjs +18 -0
- package/dist/data/ai/SessionInspector.panel-values.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.panel-values.d.ts +13 -0
- package/dist/data/ai/SessionInspector.panel-values.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.panel-values.js +18 -0
- package/dist/data/ai/SessionInspector.panel-values.js.map +1 -0
- package/dist/data/ai/SessionInspector.panels.cjs +27 -26
- package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.panels.js +2 -1
- package/dist/data/ai/SessionInspector.panels.js.map +1 -1
- package/dist/data/ai/index.d.ts +2 -1
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/task-metadata.cjs +36 -0
- package/dist/data/task-metadata.cjs.map +1 -0
- package/dist/data/task-metadata.d.ts +39 -0
- package/dist/data/task-metadata.d.ts.map +1 -0
- package/dist/data/task-metadata.js +36 -0
- package/dist/data/task-metadata.js.map +1 -0
- package/dist/data/task-streams.cjs +39 -0
- package/dist/data/task-streams.cjs.map +1 -0
- package/dist/data/task-streams.d.ts +60 -0
- package/dist/data/task-streams.d.ts.map +1 -0
- package/dist/data/task-streams.js +39 -0
- package/dist/data/task-streams.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +14 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +6 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +14 -0
- package/dist/data.js.map +1 -1
- package/dist/hooks/use-task-run.cjs +13 -15
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +14 -16
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/index.cjs +14 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionInspector.panel-values.cjs","sources":["../../../src/data/ai/SessionInspector.panel-values.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { KeyValueListItem } from \"../KeyValueList\";\n\n/** Value builders for the SessionInspector detail panels.\n *\n * They live apart from the panel components in SessionInspector.panel-parts\n * because they are not components: a module that mixes the two loses fast\n * refresh for everything in it, so the components keep their own file and\n * these keep this one. */\n\n/** Renders a value the panel has nothing to show for. */\nexport function muted(value: ReactNode) {\n return <span className=\"text-muted-foreground\">{value}</span>;\n}\n\n/** One key/value row, hidden and dashed out when the value is absent. */\nexport function kv(\n label: ReactNode,\n value: ReactNode | undefined | null\n): KeyValueListItem {\n const absent = value === undefined || value === null || value === \"\";\n return {\n key: String(label),\n label,\n value: absent ? muted(\"-\") : value,\n hidden: absent,\n };\n}\n"],"names":["jsx"],"mappings":";;;AAWO,SAAS,MAAM,OAAkB;AACtC,SAAOA,2BAAAA,IAAC,QAAA,EAAK,WAAU,yBAAyB,UAAA,OAAM;AACxD;AAGO,SAAS,GACd,OACA,OACkB;AAClB,QAAM,SAAS,UAAU,UAAa,UAAU,QAAQ,UAAU;AAClE,SAAO;AAAA,IACL,KAAK,OAAO,KAAK;AAAA,IACjB;AAAA,IACA,OAAO,SAAS,MAAM,GAAG,IAAI;AAAA,IAC7B,QAAQ;AAAA,EAAA;AAEZ;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { KeyValueListItem } from '../KeyValueList';
|
|
3
|
+
/** Value builders for the SessionInspector detail panels.
|
|
4
|
+
*
|
|
5
|
+
* They live apart from the panel components in SessionInspector.panel-parts
|
|
6
|
+
* because they are not components: a module that mixes the two loses fast
|
|
7
|
+
* refresh for everything in it, so the components keep their own file and
|
|
8
|
+
* these keep this one. */
|
|
9
|
+
/** Renders a value the panel has nothing to show for. */
|
|
10
|
+
export declare function muted(value: ReactNode): import("react").JSX.Element;
|
|
11
|
+
/** One key/value row, hidden and dashed out when the value is absent. */
|
|
12
|
+
export declare function kv(label: ReactNode, value: ReactNode | undefined | null): KeyValueListItem;
|
|
13
|
+
//# sourceMappingURL=SessionInspector.panel-values.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionInspector.panel-values.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionInspector.panel-values.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;;;2BAK2B;AAE3B,yDAAyD;AACzD,wBAAgB,KAAK,CAAC,KAAK,EAAE,SAAS,+BAErC;AAED,yEAAyE;AACzE,wBAAgB,EAAE,CAChB,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,GAClC,gBAAgB,CAQlB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
function muted(value) {
|
|
3
|
+
return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: value });
|
|
4
|
+
}
|
|
5
|
+
function kv(label, value) {
|
|
6
|
+
const absent = value === void 0 || value === null || value === "";
|
|
7
|
+
return {
|
|
8
|
+
key: String(label),
|
|
9
|
+
label,
|
|
10
|
+
value: absent ? muted("-") : value,
|
|
11
|
+
hidden: absent
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
kv,
|
|
16
|
+
muted
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=SessionInspector.panel-values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionInspector.panel-values.js","sources":["../../../src/data/ai/SessionInspector.panel-values.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { KeyValueListItem } from \"../KeyValueList\";\n\n/** Value builders for the SessionInspector detail panels.\n *\n * They live apart from the panel components in SessionInspector.panel-parts\n * because they are not components: a module that mixes the two loses fast\n * refresh for everything in it, so the components keep their own file and\n * these keep this one. */\n\n/** Renders a value the panel has nothing to show for. */\nexport function muted(value: ReactNode) {\n return <span className=\"text-muted-foreground\">{value}</span>;\n}\n\n/** One key/value row, hidden and dashed out when the value is absent. */\nexport function kv(\n label: ReactNode,\n value: ReactNode | undefined | null\n): KeyValueListItem {\n const absent = value === undefined || value === null || value === \"\";\n return {\n key: String(label),\n label,\n value: absent ? muted(\"-\") : value,\n hidden: absent,\n };\n}\n"],"names":[],"mappings":";AAWO,SAAS,MAAM,OAAkB;AACtC,SAAO,oBAAC,QAAA,EAAK,WAAU,yBAAyB,UAAA,OAAM;AACxD;AAGO,SAAS,GACd,OACA,OACkB;AAClB,QAAM,SAAS,UAAU,UAAa,UAAU,QAAQ,UAAU;AAClE,SAAO;AAAA,IACL,KAAK,OAAO,KAAK;AAAA,IACjB;AAAA,IACA,OAAO,SAAS,MAAM,GAAG,IAAI;AAAA,IAC7B,QAAQ;AAAA,EAAA;AAEZ;"}
|
|
@@ -9,6 +9,7 @@ const SessionInspector_files = require("./SessionInspector.files.cjs");
|
|
|
9
9
|
const SessionInspector_plan = require("./SessionInspector.plan.cjs");
|
|
10
10
|
const SessionInspector_approvals = require("./SessionInspector.approvals.cjs");
|
|
11
11
|
const SessionInspector_panelParts = require("./SessionInspector.panel-parts.cjs");
|
|
12
|
+
const SessionInspector_panelValues = require("./SessionInspector.panel-values.cjs");
|
|
12
13
|
const tokens = require("../../lib/tokens.cjs");
|
|
13
14
|
function SessionInspectorPanel({
|
|
14
15
|
tab,
|
|
@@ -67,13 +68,13 @@ function CostsPanel({
|
|
|
67
68
|
KeyValueList.KeyValueList,
|
|
68
69
|
{
|
|
69
70
|
items: [
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
71
|
+
SessionInspector_panelValues.kv("Tokens", usageLabel(usage ?? cost)),
|
|
72
|
+
SessionInspector_panelValues.kv("Cost", costLabel(cost)),
|
|
73
|
+
SessionInspector_panelValues.kv("Input", tokens.compactTokens((_a = usage ?? cost) == null ? void 0 : _a.inputTokens)),
|
|
74
|
+
SessionInspector_panelValues.kv("Output", tokens.compactTokens((_b = usage ?? cost) == null ? void 0 : _b.outputTokens)),
|
|
75
|
+
SessionInspector_panelValues.kv("Reasoning", tokens.compactTokens((_c = usage ?? cost) == null ? void 0 : _c.reasoningTokens)),
|
|
76
|
+
SessionInspector_panelValues.kv("Cache Read", tokens.compactTokens((_d = usage ?? cost) == null ? void 0 : _d.cacheReadTokens)),
|
|
77
|
+
SessionInspector_panelValues.kv("Cache Write", tokens.compactTokens((_e = usage ?? cost) == null ? void 0 : _e.cacheWriteTokens))
|
|
77
78
|
]
|
|
78
79
|
}
|
|
79
80
|
),
|
|
@@ -91,7 +92,7 @@ function CostBreakdown({ costs }) {
|
|
|
91
92
|
/* @__PURE__ */ jsxRuntime.jsx(Th, { children: "Cost" })
|
|
92
93
|
] }) }),
|
|
93
94
|
/* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "divide-y divide-border", children: costs.map((entry, index) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
94
|
-
/* @__PURE__ */ jsxRuntime.jsx(Td, { children: entry.model ||
|
|
95
|
+
/* @__PURE__ */ jsxRuntime.jsx(Td, { children: entry.model || SessionInspector_panelValues.muted("unknown") }),
|
|
95
96
|
/* @__PURE__ */ jsxRuntime.jsx(Td, { children: tokens.compactTokens(sessionCost.tokenTotal(entry)) }),
|
|
96
97
|
/* @__PURE__ */ jsxRuntime.jsx(Td, { children: tokens.compactTokens(entry.inputTokens) }),
|
|
97
98
|
/* @__PURE__ */ jsxRuntime.jsx(Td, { children: tokens.compactTokens(entry.outputTokens) }),
|
|
@@ -107,22 +108,22 @@ function MetadataPanel({
|
|
|
107
108
|
}) {
|
|
108
109
|
if (!session) return /* @__PURE__ */ jsxRuntime.jsx(SessionInspector_panelParts.EmptyState, { children: "No unified session metadata." });
|
|
109
110
|
const identity = [
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
111
|
+
SessionInspector_panelValues.kv("ID", session.id),
|
|
112
|
+
SessionInspector_panelValues.kv("Source", session.source),
|
|
113
|
+
SessionInspector_panelValues.kv("Project", session.project),
|
|
114
|
+
SessionInspector_panelValues.kv("CWD", session.cwd),
|
|
115
|
+
SessionInspector_panelValues.kv("History", session.historyFile),
|
|
116
|
+
SessionInspector_panelValues.kv("Model", session.model),
|
|
117
|
+
SessionInspector_panelValues.kv("Provider", session.provider),
|
|
118
|
+
SessionInspector_panelValues.kv("Mode", session.modelMode),
|
|
119
|
+
SessionInspector_panelValues.kv("Effort", session.reasoningEffort),
|
|
120
|
+
SessionInspector_panelValues.kv("Version", session.version),
|
|
121
|
+
SessionInspector_panelValues.kv("Git", gitLabel(session.git)),
|
|
122
|
+
SessionInspector_panelValues.kv("Started", SessionInspector_model.formatDate(session.startedAt)),
|
|
123
|
+
SessionInspector_panelValues.kv("Ended", SessionInspector_model.formatDate(session.endedAt)),
|
|
124
|
+
SessionInspector_panelValues.kv("Duration", SessionInspector_model.durationLabel(session.startedAt, session.endedAt)),
|
|
125
|
+
SessionInspector_panelValues.kv("Live", liveLabel(session.live)),
|
|
126
|
+
SessionInspector_panelValues.kv("Health", healthLabel(session.health))
|
|
126
127
|
];
|
|
127
128
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-density-4", children: [
|
|
128
129
|
/* @__PURE__ */ jsxRuntime.jsx(KeyValueList.KeyValueList, { items: identity }),
|
|
@@ -181,11 +182,11 @@ function jsonSource(value) {
|
|
|
181
182
|
}
|
|
182
183
|
function usageLabel(usage) {
|
|
183
184
|
const total = sessionCost.tokenTotal(usage);
|
|
184
|
-
return total ? `${tokens.compactTokens(total)} tokens` :
|
|
185
|
+
return total ? `${tokens.compactTokens(total)} tokens` : SessionInspector_panelValues.muted("-");
|
|
185
186
|
}
|
|
186
187
|
function costLabel(cost) {
|
|
187
188
|
const total = sessionCost.costTotal(cost);
|
|
188
|
-
return total ? tokens.formatCost(total) :
|
|
189
|
+
return total ? tokens.formatCost(total) : SessionInspector_panelValues.muted("-");
|
|
189
190
|
}
|
|
190
191
|
function gitLabel(git) {
|
|
191
192
|
if (!git) return "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionInspector.panels.cjs","sources":["../../../src/data/ai/SessionInspector.panels.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { CodeBlock } from \"../CodeBlock\";\nimport { KeyValueList, type KeyValueListItem } from \"../KeyValueList\";\nimport {\n compactTokens,\n costTotal,\n formatCost,\n tokenTotal,\n} from \"./session-cost\";\nimport { durationLabel, formatDate } from \"./SessionInspector.model\";\nimport { SessionFilesPanel } from \"./SessionInspector.files\";\nimport { SessionPlanPanel } from \"./SessionInspector.plan\";\nimport {\n SessionApprovalsPanel,\n type ApprovalResolveHandler,\n} from \"./SessionInspector.approvals\";\nimport { EmptyState, kv, muted } from \"./SessionInspector.panel-parts\";\nimport type { SessionInput } from \"./SessionViewer.model\";\nimport type {\n SessionCost,\n SessionHealth,\n SessionLiveProcess,\n SessionUsage,\n UnifiedSessionInput,\n} from \"./SessionViewer.unified\";\nimport type { SessionInspectorTab } from \"./SessionInspector\";\n\nexport function SessionInspectorPanel({\n tab,\n detail,\n session,\n onPlanChange,\n onResolveApproval,\n}: {\n tab: SessionInspectorTab;\n detail: UnifiedSessionInput | undefined;\n session: SessionInput;\n onPlanChange?: (content: string) => void;\n onResolveApproval?: ApprovalResolveHandler;\n}) {\n switch (tab) {\n case \"files\":\n return <SessionFilesPanel files={detail?.files} />;\n case \"plan\":\n return (\n <SessionPlanPanel\n plan={detail?.plan}\n {...(onPlanChange ? { onChange: onPlanChange } : {})}\n />\n );\n case \"approvals\":\n return (\n <SessionApprovalsPanel\n approvals={detail?.approvals}\n requests={detail?.requests}\n {...(onResolveApproval ? { onResolve: onResolveApproval } : {})}\n />\n );\n case \"costs\":\n return (\n <CostsPanel\n usage={detail?.usage}\n cost={detail?.cost}\n toolCosts={detail?.toolCosts}\n />\n );\n case \"metadata\":\n return <MetadataPanel session={detail} />;\n case \"raw\":\n return <RawPanel value={detail ?? session} />;\n default:\n return null;\n }\n}\n\nfunction CostsPanel({\n usage,\n cost,\n toolCosts,\n}: {\n usage: SessionUsage | undefined;\n cost: SessionCost | undefined;\n toolCosts: SessionCost[] | undefined;\n}) {\n if (!usage && !cost && !toolCosts?.length)\n return <EmptyState>No cost metadata.</EmptyState>;\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList\n items={[\n kv(\"Tokens\", usageLabel(usage ?? cost)),\n kv(\"Cost\", costLabel(cost)),\n kv(\"Input\", compactTokens((usage ?? cost)?.inputTokens)),\n kv(\"Output\", compactTokens((usage ?? cost)?.outputTokens)),\n kv(\"Reasoning\", compactTokens((usage ?? cost)?.reasoningTokens)),\n kv(\"Cache Read\", compactTokens((usage ?? cost)?.cacheReadTokens)),\n kv(\"Cache Write\", compactTokens((usage ?? cost)?.cacheWriteTokens)),\n ]}\n />\n {toolCosts?.length ? <CostBreakdown costs={toolCosts} /> : null}\n </div>\n );\n}\n\nfunction CostBreakdown({ costs }: { costs: SessionCost[] }) {\n return (\n <div className=\"overflow-auto rounded-md border border-border\">\n <table className=\"w-full min-w-[560px] border-collapse text-left text-sm\">\n <thead className=\"bg-muted/60 text-xs text-muted-foreground\">\n <tr>\n <Th>Model</Th>\n <Th>Tokens</Th>\n <Th>Input</Th>\n <Th>Output</Th>\n <Th>Cache</Th>\n <Th>Cost</Th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {costs.map((entry, index) => (\n <tr key={`${entry.model || \"model\"}-${index}`}>\n <Td>{entry.model || muted(\"unknown\")}</Td>\n <Td>{compactTokens(tokenTotal(entry))}</Td>\n <Td>{compactTokens(entry.inputTokens)}</Td>\n <Td>{compactTokens(entry.outputTokens)}</Td>\n <Td>\n {compactTokens(\n (entry.cacheReadTokens ?? 0) + (entry.cacheWriteTokens ?? 0)\n )}\n </Td>\n <Td>{costLabel(entry)}</Td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction MetadataPanel({\n session,\n}: {\n session: UnifiedSessionInput | undefined;\n}) {\n if (!session) return <EmptyState>No unified session metadata.</EmptyState>;\n const identity: KeyValueListItem[] = [\n kv(\"ID\", session.id),\n kv(\"Source\", session.source),\n kv(\"Project\", session.project),\n kv(\"CWD\", session.cwd),\n kv(\"History\", session.historyFile),\n kv(\"Model\", session.model),\n kv(\"Provider\", session.provider),\n kv(\"Mode\", session.modelMode),\n kv(\"Effort\", session.reasoningEffort),\n kv(\"Version\", session.version),\n kv(\"Git\", gitLabel(session.git)),\n kv(\"Started\", formatDate(session.startedAt)),\n kv(\"Ended\", formatDate(session.endedAt)),\n kv(\"Duration\", durationLabel(session.startedAt, session.endedAt)),\n kv(\"Live\", liveLabel(session.live)),\n kv(\"Health\", healthLabel(session.health)),\n ];\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList items={identity} />\n <JsonSection title=\"Capabilities\" value={session.capabilities} />\n <JsonSection title=\"Context\" value={session.context} />\n <JsonSection title=\"Budget\" value={session.budget} />\n <JsonSection title=\"Events\" value={session.events} />\n <JsonSection title=\"Prompt\" value={session.prompt} />\n </div>\n );\n}\n\nfunction RawPanel({ value }: { value: unknown }) {\n return (\n <CodeBlock\n language=\"json\"\n source={jsonSource(value)}\n copyable\n jsonDefaultOpenDepth={1}\n />\n );\n}\n\nfunction JsonSection({ title, value }: { title: string; value: unknown }) {\n if (\n value === undefined ||\n value === null ||\n (Array.isArray(value) && value.length === 0)\n )\n return null;\n return (\n <section>\n <h3 className=\"mb-density-2 text-xs font-semibold uppercase text-muted-foreground\">\n {title}\n </h3>\n <CodeBlock\n language=\"json\"\n source={jsonSource(value)}\n jsonDefaultOpenDepth={1}\n />\n </section>\n );\n}\n\nfunction Th({ children }: { children: ReactNode }) {\n return <th className=\"px-density-3 py-density-2 font-medium\">{children}</th>;\n}\n\nfunction Td({ children }: { children: ReactNode }) {\n return <td className=\"px-density-3 py-density-2\">{children}</td>;\n}\n\nfunction jsonSource(value: unknown) {\n if (typeof value === \"string\") {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return value;\n }\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction usageLabel(usage?: SessionUsage | SessionCost) {\n const total = tokenTotal(usage);\n return total ? `${compactTokens(total)} tokens` : muted(\"-\");\n}\n\nfunction costLabel(cost?: SessionCost) {\n const total = costTotal(cost);\n return total ? formatCost(total) : muted(\"-\");\n}\n\nfunction gitLabel(git?: {\n branch?: string;\n commit?: string;\n worktree?: string;\n diff?: string;\n}) {\n if (!git) return \"\";\n return [git.branch, git.commit, git.worktree, git.diff ? \"diff\" : \"\"]\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction liveLabel(live?: SessionLiveProcess) {\n if (!live) return \"\";\n return [\n live.status || (live.active ? \"active\" : \"inactive\"),\n live.pid ? `pid ${live.pid}` : \"\",\n live.command,\n ]\n .filter(Boolean)\n .join(\" - \");\n}\n\nfunction healthLabel(health?: SessionHealth[]) {\n return (\n health?.map((item) => `${item.severity}:${item.kind}`).join(\", \") ?? \"\"\n );\n}\n"],"names":["jsx","SessionFilesPanel","SessionPlanPanel","SessionApprovalsPanel","EmptyState","jsxs","KeyValueList","kv","compactTokens","muted","tokenTotal","formatDate","durationLabel","CodeBlock","costTotal","formatCost"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SessionInspector.panels.cjs","sources":["../../../src/data/ai/SessionInspector.panels.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { CodeBlock } from \"../CodeBlock\";\nimport { KeyValueList, type KeyValueListItem } from \"../KeyValueList\";\nimport {\n compactTokens,\n costTotal,\n formatCost,\n tokenTotal,\n} from \"./session-cost\";\nimport { durationLabel, formatDate } from \"./SessionInspector.model\";\nimport { SessionFilesPanel } from \"./SessionInspector.files\";\nimport { SessionPlanPanel } from \"./SessionInspector.plan\";\nimport {\n SessionApprovalsPanel,\n type ApprovalResolveHandler,\n} from \"./SessionInspector.approvals\";\nimport { EmptyState } from \"./SessionInspector.panel-parts\";\nimport { kv, muted } from \"./SessionInspector.panel-values\";\nimport type { SessionInput } from \"./SessionViewer.model\";\nimport type {\n SessionCost,\n SessionHealth,\n SessionLiveProcess,\n SessionUsage,\n UnifiedSessionInput,\n} from \"./SessionViewer.unified\";\nimport type { SessionInspectorTab } from \"./SessionInspector\";\n\nexport function SessionInspectorPanel({\n tab,\n detail,\n session,\n onPlanChange,\n onResolveApproval,\n}: {\n tab: SessionInspectorTab;\n detail: UnifiedSessionInput | undefined;\n session: SessionInput;\n onPlanChange?: (content: string) => void;\n onResolveApproval?: ApprovalResolveHandler;\n}) {\n switch (tab) {\n case \"files\":\n return <SessionFilesPanel files={detail?.files} />;\n case \"plan\":\n return (\n <SessionPlanPanel\n plan={detail?.plan}\n {...(onPlanChange ? { onChange: onPlanChange } : {})}\n />\n );\n case \"approvals\":\n return (\n <SessionApprovalsPanel\n approvals={detail?.approvals}\n requests={detail?.requests}\n {...(onResolveApproval ? { onResolve: onResolveApproval } : {})}\n />\n );\n case \"costs\":\n return (\n <CostsPanel\n usage={detail?.usage}\n cost={detail?.cost}\n toolCosts={detail?.toolCosts}\n />\n );\n case \"metadata\":\n return <MetadataPanel session={detail} />;\n case \"raw\":\n return <RawPanel value={detail ?? session} />;\n default:\n return null;\n }\n}\n\nfunction CostsPanel({\n usage,\n cost,\n toolCosts,\n}: {\n usage: SessionUsage | undefined;\n cost: SessionCost | undefined;\n toolCosts: SessionCost[] | undefined;\n}) {\n if (!usage && !cost && !toolCosts?.length)\n return <EmptyState>No cost metadata.</EmptyState>;\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList\n items={[\n kv(\"Tokens\", usageLabel(usage ?? cost)),\n kv(\"Cost\", costLabel(cost)),\n kv(\"Input\", compactTokens((usage ?? cost)?.inputTokens)),\n kv(\"Output\", compactTokens((usage ?? cost)?.outputTokens)),\n kv(\"Reasoning\", compactTokens((usage ?? cost)?.reasoningTokens)),\n kv(\"Cache Read\", compactTokens((usage ?? cost)?.cacheReadTokens)),\n kv(\"Cache Write\", compactTokens((usage ?? cost)?.cacheWriteTokens)),\n ]}\n />\n {toolCosts?.length ? <CostBreakdown costs={toolCosts} /> : null}\n </div>\n );\n}\n\nfunction CostBreakdown({ costs }: { costs: SessionCost[] }) {\n return (\n <div className=\"overflow-auto rounded-md border border-border\">\n <table className=\"w-full min-w-[560px] border-collapse text-left text-sm\">\n <thead className=\"bg-muted/60 text-xs text-muted-foreground\">\n <tr>\n <Th>Model</Th>\n <Th>Tokens</Th>\n <Th>Input</Th>\n <Th>Output</Th>\n <Th>Cache</Th>\n <Th>Cost</Th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {costs.map((entry, index) => (\n <tr key={`${entry.model || \"model\"}-${index}`}>\n <Td>{entry.model || muted(\"unknown\")}</Td>\n <Td>{compactTokens(tokenTotal(entry))}</Td>\n <Td>{compactTokens(entry.inputTokens)}</Td>\n <Td>{compactTokens(entry.outputTokens)}</Td>\n <Td>\n {compactTokens(\n (entry.cacheReadTokens ?? 0) + (entry.cacheWriteTokens ?? 0)\n )}\n </Td>\n <Td>{costLabel(entry)}</Td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction MetadataPanel({\n session,\n}: {\n session: UnifiedSessionInput | undefined;\n}) {\n if (!session) return <EmptyState>No unified session metadata.</EmptyState>;\n const identity: KeyValueListItem[] = [\n kv(\"ID\", session.id),\n kv(\"Source\", session.source),\n kv(\"Project\", session.project),\n kv(\"CWD\", session.cwd),\n kv(\"History\", session.historyFile),\n kv(\"Model\", session.model),\n kv(\"Provider\", session.provider),\n kv(\"Mode\", session.modelMode),\n kv(\"Effort\", session.reasoningEffort),\n kv(\"Version\", session.version),\n kv(\"Git\", gitLabel(session.git)),\n kv(\"Started\", formatDate(session.startedAt)),\n kv(\"Ended\", formatDate(session.endedAt)),\n kv(\"Duration\", durationLabel(session.startedAt, session.endedAt)),\n kv(\"Live\", liveLabel(session.live)),\n kv(\"Health\", healthLabel(session.health)),\n ];\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList items={identity} />\n <JsonSection title=\"Capabilities\" value={session.capabilities} />\n <JsonSection title=\"Context\" value={session.context} />\n <JsonSection title=\"Budget\" value={session.budget} />\n <JsonSection title=\"Events\" value={session.events} />\n <JsonSection title=\"Prompt\" value={session.prompt} />\n </div>\n );\n}\n\nfunction RawPanel({ value }: { value: unknown }) {\n return (\n <CodeBlock\n language=\"json\"\n source={jsonSource(value)}\n copyable\n jsonDefaultOpenDepth={1}\n />\n );\n}\n\nfunction JsonSection({ title, value }: { title: string; value: unknown }) {\n if (\n value === undefined ||\n value === null ||\n (Array.isArray(value) && value.length === 0)\n )\n return null;\n return (\n <section>\n <h3 className=\"mb-density-2 text-xs font-semibold uppercase text-muted-foreground\">\n {title}\n </h3>\n <CodeBlock\n language=\"json\"\n source={jsonSource(value)}\n jsonDefaultOpenDepth={1}\n />\n </section>\n );\n}\n\nfunction Th({ children }: { children: ReactNode }) {\n return <th className=\"px-density-3 py-density-2 font-medium\">{children}</th>;\n}\n\nfunction Td({ children }: { children: ReactNode }) {\n return <td className=\"px-density-3 py-density-2\">{children}</td>;\n}\n\nfunction jsonSource(value: unknown) {\n if (typeof value === \"string\") {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return value;\n }\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction usageLabel(usage?: SessionUsage | SessionCost) {\n const total = tokenTotal(usage);\n return total ? `${compactTokens(total)} tokens` : muted(\"-\");\n}\n\nfunction costLabel(cost?: SessionCost) {\n const total = costTotal(cost);\n return total ? formatCost(total) : muted(\"-\");\n}\n\nfunction gitLabel(git?: {\n branch?: string;\n commit?: string;\n worktree?: string;\n diff?: string;\n}) {\n if (!git) return \"\";\n return [git.branch, git.commit, git.worktree, git.diff ? \"diff\" : \"\"]\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction liveLabel(live?: SessionLiveProcess) {\n if (!live) return \"\";\n return [\n live.status || (live.active ? \"active\" : \"inactive\"),\n live.pid ? `pid ${live.pid}` : \"\",\n live.command,\n ]\n .filter(Boolean)\n .join(\" - \");\n}\n\nfunction healthLabel(health?: SessionHealth[]) {\n return (\n health?.map((item) => `${item.severity}:${item.kind}`).join(\", \") ?? \"\"\n );\n}\n"],"names":["jsx","SessionFilesPanel","SessionPlanPanel","SessionApprovalsPanel","EmptyState","jsxs","KeyValueList","kv","compactTokens","muted","tokenTotal","formatDate","durationLabel","CodeBlock","costTotal","formatCost"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionInspector.panels.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionInspector.panels.tsx"],"names":[],"mappings":"AAYA,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionInspector.panels.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionInspector.panels.tsx"],"names":[],"mappings":"AAYA,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAKV,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,wBAAgB,qBAAqB,CAAC,EACpC,GAAG,EACH,MAAM,EACN,OAAO,EACP,YAAY,EACZ,iBAAiB,GAClB,EAAE;IACD,GAAG,EAAE,mBAAmB,CAAC;IACzB,MAAM,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACxC,OAAO,EAAE,YAAY,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,iBAAiB,CAAC,EAAE,sBAAsB,CAAC;CAC5C,sCAkCA"}
|
|
@@ -6,7 +6,8 @@ import { formatDate, durationLabel } from "./SessionInspector.model.js";
|
|
|
6
6
|
import { SessionFilesPanel } from "./SessionInspector.files.js";
|
|
7
7
|
import { SessionPlanPanel } from "./SessionInspector.plan.js";
|
|
8
8
|
import { SessionApprovalsPanel } from "./SessionInspector.approvals.js";
|
|
9
|
-
import { EmptyState
|
|
9
|
+
import { EmptyState } from "./SessionInspector.panel-parts.js";
|
|
10
|
+
import { kv, muted } from "./SessionInspector.panel-values.js";
|
|
10
11
|
import { compactTokens, formatCost } from "../../lib/tokens.js";
|
|
11
12
|
function SessionInspectorPanel({
|
|
12
13
|
tab,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionInspector.panels.js","sources":["../../../src/data/ai/SessionInspector.panels.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { CodeBlock } from \"../CodeBlock\";\nimport { KeyValueList, type KeyValueListItem } from \"../KeyValueList\";\nimport {\n compactTokens,\n costTotal,\n formatCost,\n tokenTotal,\n} from \"./session-cost\";\nimport { durationLabel, formatDate } from \"./SessionInspector.model\";\nimport { SessionFilesPanel } from \"./SessionInspector.files\";\nimport { SessionPlanPanel } from \"./SessionInspector.plan\";\nimport {\n SessionApprovalsPanel,\n type ApprovalResolveHandler,\n} from \"./SessionInspector.approvals\";\nimport { EmptyState, kv, muted } from \"./SessionInspector.panel-parts\";\nimport type { SessionInput } from \"./SessionViewer.model\";\nimport type {\n SessionCost,\n SessionHealth,\n SessionLiveProcess,\n SessionUsage,\n UnifiedSessionInput,\n} from \"./SessionViewer.unified\";\nimport type { SessionInspectorTab } from \"./SessionInspector\";\n\nexport function SessionInspectorPanel({\n tab,\n detail,\n session,\n onPlanChange,\n onResolveApproval,\n}: {\n tab: SessionInspectorTab;\n detail: UnifiedSessionInput | undefined;\n session: SessionInput;\n onPlanChange?: (content: string) => void;\n onResolveApproval?: ApprovalResolveHandler;\n}) {\n switch (tab) {\n case \"files\":\n return <SessionFilesPanel files={detail?.files} />;\n case \"plan\":\n return (\n <SessionPlanPanel\n plan={detail?.plan}\n {...(onPlanChange ? { onChange: onPlanChange } : {})}\n />\n );\n case \"approvals\":\n return (\n <SessionApprovalsPanel\n approvals={detail?.approvals}\n requests={detail?.requests}\n {...(onResolveApproval ? { onResolve: onResolveApproval } : {})}\n />\n );\n case \"costs\":\n return (\n <CostsPanel\n usage={detail?.usage}\n cost={detail?.cost}\n toolCosts={detail?.toolCosts}\n />\n );\n case \"metadata\":\n return <MetadataPanel session={detail} />;\n case \"raw\":\n return <RawPanel value={detail ?? session} />;\n default:\n return null;\n }\n}\n\nfunction CostsPanel({\n usage,\n cost,\n toolCosts,\n}: {\n usage: SessionUsage | undefined;\n cost: SessionCost | undefined;\n toolCosts: SessionCost[] | undefined;\n}) {\n if (!usage && !cost && !toolCosts?.length)\n return <EmptyState>No cost metadata.</EmptyState>;\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList\n items={[\n kv(\"Tokens\", usageLabel(usage ?? cost)),\n kv(\"Cost\", costLabel(cost)),\n kv(\"Input\", compactTokens((usage ?? cost)?.inputTokens)),\n kv(\"Output\", compactTokens((usage ?? cost)?.outputTokens)),\n kv(\"Reasoning\", compactTokens((usage ?? cost)?.reasoningTokens)),\n kv(\"Cache Read\", compactTokens((usage ?? cost)?.cacheReadTokens)),\n kv(\"Cache Write\", compactTokens((usage ?? cost)?.cacheWriteTokens)),\n ]}\n />\n {toolCosts?.length ? <CostBreakdown costs={toolCosts} /> : null}\n </div>\n );\n}\n\nfunction CostBreakdown({ costs }: { costs: SessionCost[] }) {\n return (\n <div className=\"overflow-auto rounded-md border border-border\">\n <table className=\"w-full min-w-[560px] border-collapse text-left text-sm\">\n <thead className=\"bg-muted/60 text-xs text-muted-foreground\">\n <tr>\n <Th>Model</Th>\n <Th>Tokens</Th>\n <Th>Input</Th>\n <Th>Output</Th>\n <Th>Cache</Th>\n <Th>Cost</Th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {costs.map((entry, index) => (\n <tr key={`${entry.model || \"model\"}-${index}`}>\n <Td>{entry.model || muted(\"unknown\")}</Td>\n <Td>{compactTokens(tokenTotal(entry))}</Td>\n <Td>{compactTokens(entry.inputTokens)}</Td>\n <Td>{compactTokens(entry.outputTokens)}</Td>\n <Td>\n {compactTokens(\n (entry.cacheReadTokens ?? 0) + (entry.cacheWriteTokens ?? 0)\n )}\n </Td>\n <Td>{costLabel(entry)}</Td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction MetadataPanel({\n session,\n}: {\n session: UnifiedSessionInput | undefined;\n}) {\n if (!session) return <EmptyState>No unified session metadata.</EmptyState>;\n const identity: KeyValueListItem[] = [\n kv(\"ID\", session.id),\n kv(\"Source\", session.source),\n kv(\"Project\", session.project),\n kv(\"CWD\", session.cwd),\n kv(\"History\", session.historyFile),\n kv(\"Model\", session.model),\n kv(\"Provider\", session.provider),\n kv(\"Mode\", session.modelMode),\n kv(\"Effort\", session.reasoningEffort),\n kv(\"Version\", session.version),\n kv(\"Git\", gitLabel(session.git)),\n kv(\"Started\", formatDate(session.startedAt)),\n kv(\"Ended\", formatDate(session.endedAt)),\n kv(\"Duration\", durationLabel(session.startedAt, session.endedAt)),\n kv(\"Live\", liveLabel(session.live)),\n kv(\"Health\", healthLabel(session.health)),\n ];\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList items={identity} />\n <JsonSection title=\"Capabilities\" value={session.capabilities} />\n <JsonSection title=\"Context\" value={session.context} />\n <JsonSection title=\"Budget\" value={session.budget} />\n <JsonSection title=\"Events\" value={session.events} />\n <JsonSection title=\"Prompt\" value={session.prompt} />\n </div>\n );\n}\n\nfunction RawPanel({ value }: { value: unknown }) {\n return (\n <CodeBlock\n language=\"json\"\n source={jsonSource(value)}\n copyable\n jsonDefaultOpenDepth={1}\n />\n );\n}\n\nfunction JsonSection({ title, value }: { title: string; value: unknown }) {\n if (\n value === undefined ||\n value === null ||\n (Array.isArray(value) && value.length === 0)\n )\n return null;\n return (\n <section>\n <h3 className=\"mb-density-2 text-xs font-semibold uppercase text-muted-foreground\">\n {title}\n </h3>\n <CodeBlock\n language=\"json\"\n source={jsonSource(value)}\n jsonDefaultOpenDepth={1}\n />\n </section>\n );\n}\n\nfunction Th({ children }: { children: ReactNode }) {\n return <th className=\"px-density-3 py-density-2 font-medium\">{children}</th>;\n}\n\nfunction Td({ children }: { children: ReactNode }) {\n return <td className=\"px-density-3 py-density-2\">{children}</td>;\n}\n\nfunction jsonSource(value: unknown) {\n if (typeof value === \"string\") {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return value;\n }\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction usageLabel(usage?: SessionUsage | SessionCost) {\n const total = tokenTotal(usage);\n return total ? `${compactTokens(total)} tokens` : muted(\"-\");\n}\n\nfunction costLabel(cost?: SessionCost) {\n const total = costTotal(cost);\n return total ? formatCost(total) : muted(\"-\");\n}\n\nfunction gitLabel(git?: {\n branch?: string;\n commit?: string;\n worktree?: string;\n diff?: string;\n}) {\n if (!git) return \"\";\n return [git.branch, git.commit, git.worktree, git.diff ? \"diff\" : \"\"]\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction liveLabel(live?: SessionLiveProcess) {\n if (!live) return \"\";\n return [\n live.status || (live.active ? \"active\" : \"inactive\"),\n live.pid ? `pid ${live.pid}` : \"\",\n live.command,\n ]\n .filter(Boolean)\n .join(\" - \");\n}\n\nfunction healthLabel(health?: SessionHealth[]) {\n return (\n health?.map((item) => `${item.severity}:${item.kind}`).join(\", \") ?? \"\"\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SessionInspector.panels.js","sources":["../../../src/data/ai/SessionInspector.panels.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { CodeBlock } from \"../CodeBlock\";\nimport { KeyValueList, type KeyValueListItem } from \"../KeyValueList\";\nimport {\n compactTokens,\n costTotal,\n formatCost,\n tokenTotal,\n} from \"./session-cost\";\nimport { durationLabel, formatDate } from \"./SessionInspector.model\";\nimport { SessionFilesPanel } from \"./SessionInspector.files\";\nimport { SessionPlanPanel } from \"./SessionInspector.plan\";\nimport {\n SessionApprovalsPanel,\n type ApprovalResolveHandler,\n} from \"./SessionInspector.approvals\";\nimport { EmptyState } from \"./SessionInspector.panel-parts\";\nimport { kv, muted } from \"./SessionInspector.panel-values\";\nimport type { SessionInput } from \"./SessionViewer.model\";\nimport type {\n SessionCost,\n SessionHealth,\n SessionLiveProcess,\n SessionUsage,\n UnifiedSessionInput,\n} from \"./SessionViewer.unified\";\nimport type { SessionInspectorTab } from \"./SessionInspector\";\n\nexport function SessionInspectorPanel({\n tab,\n detail,\n session,\n onPlanChange,\n onResolveApproval,\n}: {\n tab: SessionInspectorTab;\n detail: UnifiedSessionInput | undefined;\n session: SessionInput;\n onPlanChange?: (content: string) => void;\n onResolveApproval?: ApprovalResolveHandler;\n}) {\n switch (tab) {\n case \"files\":\n return <SessionFilesPanel files={detail?.files} />;\n case \"plan\":\n return (\n <SessionPlanPanel\n plan={detail?.plan}\n {...(onPlanChange ? { onChange: onPlanChange } : {})}\n />\n );\n case \"approvals\":\n return (\n <SessionApprovalsPanel\n approvals={detail?.approvals}\n requests={detail?.requests}\n {...(onResolveApproval ? { onResolve: onResolveApproval } : {})}\n />\n );\n case \"costs\":\n return (\n <CostsPanel\n usage={detail?.usage}\n cost={detail?.cost}\n toolCosts={detail?.toolCosts}\n />\n );\n case \"metadata\":\n return <MetadataPanel session={detail} />;\n case \"raw\":\n return <RawPanel value={detail ?? session} />;\n default:\n return null;\n }\n}\n\nfunction CostsPanel({\n usage,\n cost,\n toolCosts,\n}: {\n usage: SessionUsage | undefined;\n cost: SessionCost | undefined;\n toolCosts: SessionCost[] | undefined;\n}) {\n if (!usage && !cost && !toolCosts?.length)\n return <EmptyState>No cost metadata.</EmptyState>;\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList\n items={[\n kv(\"Tokens\", usageLabel(usage ?? cost)),\n kv(\"Cost\", costLabel(cost)),\n kv(\"Input\", compactTokens((usage ?? cost)?.inputTokens)),\n kv(\"Output\", compactTokens((usage ?? cost)?.outputTokens)),\n kv(\"Reasoning\", compactTokens((usage ?? cost)?.reasoningTokens)),\n kv(\"Cache Read\", compactTokens((usage ?? cost)?.cacheReadTokens)),\n kv(\"Cache Write\", compactTokens((usage ?? cost)?.cacheWriteTokens)),\n ]}\n />\n {toolCosts?.length ? <CostBreakdown costs={toolCosts} /> : null}\n </div>\n );\n}\n\nfunction CostBreakdown({ costs }: { costs: SessionCost[] }) {\n return (\n <div className=\"overflow-auto rounded-md border border-border\">\n <table className=\"w-full min-w-[560px] border-collapse text-left text-sm\">\n <thead className=\"bg-muted/60 text-xs text-muted-foreground\">\n <tr>\n <Th>Model</Th>\n <Th>Tokens</Th>\n <Th>Input</Th>\n <Th>Output</Th>\n <Th>Cache</Th>\n <Th>Cost</Th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {costs.map((entry, index) => (\n <tr key={`${entry.model || \"model\"}-${index}`}>\n <Td>{entry.model || muted(\"unknown\")}</Td>\n <Td>{compactTokens(tokenTotal(entry))}</Td>\n <Td>{compactTokens(entry.inputTokens)}</Td>\n <Td>{compactTokens(entry.outputTokens)}</Td>\n <Td>\n {compactTokens(\n (entry.cacheReadTokens ?? 0) + (entry.cacheWriteTokens ?? 0)\n )}\n </Td>\n <Td>{costLabel(entry)}</Td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction MetadataPanel({\n session,\n}: {\n session: UnifiedSessionInput | undefined;\n}) {\n if (!session) return <EmptyState>No unified session metadata.</EmptyState>;\n const identity: KeyValueListItem[] = [\n kv(\"ID\", session.id),\n kv(\"Source\", session.source),\n kv(\"Project\", session.project),\n kv(\"CWD\", session.cwd),\n kv(\"History\", session.historyFile),\n kv(\"Model\", session.model),\n kv(\"Provider\", session.provider),\n kv(\"Mode\", session.modelMode),\n kv(\"Effort\", session.reasoningEffort),\n kv(\"Version\", session.version),\n kv(\"Git\", gitLabel(session.git)),\n kv(\"Started\", formatDate(session.startedAt)),\n kv(\"Ended\", formatDate(session.endedAt)),\n kv(\"Duration\", durationLabel(session.startedAt, session.endedAt)),\n kv(\"Live\", liveLabel(session.live)),\n kv(\"Health\", healthLabel(session.health)),\n ];\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList items={identity} />\n <JsonSection title=\"Capabilities\" value={session.capabilities} />\n <JsonSection title=\"Context\" value={session.context} />\n <JsonSection title=\"Budget\" value={session.budget} />\n <JsonSection title=\"Events\" value={session.events} />\n <JsonSection title=\"Prompt\" value={session.prompt} />\n </div>\n );\n}\n\nfunction RawPanel({ value }: { value: unknown }) {\n return (\n <CodeBlock\n language=\"json\"\n source={jsonSource(value)}\n copyable\n jsonDefaultOpenDepth={1}\n />\n );\n}\n\nfunction JsonSection({ title, value }: { title: string; value: unknown }) {\n if (\n value === undefined ||\n value === null ||\n (Array.isArray(value) && value.length === 0)\n )\n return null;\n return (\n <section>\n <h3 className=\"mb-density-2 text-xs font-semibold uppercase text-muted-foreground\">\n {title}\n </h3>\n <CodeBlock\n language=\"json\"\n source={jsonSource(value)}\n jsonDefaultOpenDepth={1}\n />\n </section>\n );\n}\n\nfunction Th({ children }: { children: ReactNode }) {\n return <th className=\"px-density-3 py-density-2 font-medium\">{children}</th>;\n}\n\nfunction Td({ children }: { children: ReactNode }) {\n return <td className=\"px-density-3 py-density-2\">{children}</td>;\n}\n\nfunction jsonSource(value: unknown) {\n if (typeof value === \"string\") {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return value;\n }\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction usageLabel(usage?: SessionUsage | SessionCost) {\n const total = tokenTotal(usage);\n return total ? `${compactTokens(total)} tokens` : muted(\"-\");\n}\n\nfunction costLabel(cost?: SessionCost) {\n const total = costTotal(cost);\n return total ? formatCost(total) : muted(\"-\");\n}\n\nfunction gitLabel(git?: {\n branch?: string;\n commit?: string;\n worktree?: string;\n diff?: string;\n}) {\n if (!git) return \"\";\n return [git.branch, git.commit, git.worktree, git.diff ? \"diff\" : \"\"]\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction liveLabel(live?: SessionLiveProcess) {\n if (!live) return \"\";\n return [\n live.status || (live.active ? \"active\" : \"inactive\"),\n live.pid ? `pid ${live.pid}` : \"\",\n live.command,\n ]\n .filter(Boolean)\n .join(\" - \");\n}\n\nfunction healthLabel(health?: SessionHealth[]) {\n return (\n health?.map((item) => `${item.severity}:${item.kind}`).join(\", \") ?? \"\"\n );\n}\n"],"names":[],"mappings":"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"}
|
package/dist/data/ai/index.d.ts
CHANGED
|
@@ -34,7 +34,8 @@ export { SessionContextMeter } from './SessionViewer.header';
|
|
|
34
34
|
export { serializeContext, parseContextPrefix, makeContextId, type ChatContextItem, type ContextTypeConfig, type ContextTypeStyle, } from './context';
|
|
35
35
|
export { SessionViewer, type SessionViewerProps, type SessionPendingTool, type SessionToolDecision, type SessionEntry, type SessionEvent, type SessionInput, type SessionThemeOverride, } from './SessionViewer';
|
|
36
36
|
export { SessionInspector, type SessionInspectorProps, type SessionInspectorTab, } from './SessionInspector';
|
|
37
|
-
export { SessionApprovalsPanel
|
|
37
|
+
export { SessionApprovalsPanel } from './SessionInspector.approvals';
|
|
38
|
+
export { pendingApprovalRequests, type ApprovalResolveAction, type ApprovalResolveHandler, } from './SessionInspector.approvals-model';
|
|
38
39
|
export { SessionChatComposer, type SessionChatCapabilities, type SessionChatComposerProps, type SessionChatQueuedMessage, } from './SessionChatComposer';
|
|
39
40
|
export type { SessionCollectionInput, SessionCollectionItem, SessionCollectionSummary, SessionInspectorInput, } from './SessionInspector.collection';
|
|
40
41
|
export { compactTokens, costTotal, formatCost, tokenTotal, } from './session-cost';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/ai/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/ai/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const collections = require("../lib/collections.cjs");
|
|
4
|
+
function isScalar(value) {
|
|
5
|
+
return typeof value === "string" || typeof value === "number" || typeof value === "boolean";
|
|
6
|
+
}
|
|
7
|
+
function metadataEntries(value) {
|
|
8
|
+
if (!collections.isPlainObject(value)) return [];
|
|
9
|
+
const entries = [];
|
|
10
|
+
for (const [key, item] of Object.entries(value)) {
|
|
11
|
+
if (!isScalar(item) || item === "") continue;
|
|
12
|
+
entries.push({ key, value: item, text: String(item) });
|
|
13
|
+
}
|
|
14
|
+
return entries;
|
|
15
|
+
}
|
|
16
|
+
function isFlatMetadata(value) {
|
|
17
|
+
return collections.isPlainObject(value) && Object.values(value).every(isScalar);
|
|
18
|
+
}
|
|
19
|
+
const LINK_KEYS = /* @__PURE__ */ new Set(["href", "url", "link"]);
|
|
20
|
+
const HAS_SCHEME = /^[a-z][a-z0-9+.-]*:/i;
|
|
21
|
+
const NAVIGABLE_URL = /^https?:\/\//i;
|
|
22
|
+
const OFF_SITE_PATH = /^\/[/\\]/;
|
|
23
|
+
function withoutBlanks(text) {
|
|
24
|
+
let stripped = "";
|
|
25
|
+
for (const character of text) if (character > " ") stripped += character;
|
|
26
|
+
return stripped;
|
|
27
|
+
}
|
|
28
|
+
function isMetadataLink(key, text) {
|
|
29
|
+
if (!LINK_KEYS.has(key) && !text.startsWith("/") && !text.startsWith("https://")) return false;
|
|
30
|
+
const destination = withoutBlanks(text);
|
|
31
|
+
return HAS_SCHEME.test(destination) ? NAVIGABLE_URL.test(destination) : !OFF_SITE_PATH.test(destination);
|
|
32
|
+
}
|
|
33
|
+
exports.isFlatMetadata = isFlatMetadata;
|
|
34
|
+
exports.isMetadataLink = isMetadataLink;
|
|
35
|
+
exports.metadataEntries = metadataEntries;
|
|
36
|
+
//# sourceMappingURL=task-metadata.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-metadata.cjs","sources":["../../src/data/task-metadata.ts"],"sourcesContent":["/**\n * Task metadata is whatever JSON the producer chose to attach to a snapshot, so\n * rendering it starts with reading its shape rather than assuming one. The split\n * these helpers make is between values that read as a label — a state, a model,\n * a session id — and values that do not, because only the first kind can go in a\n * row of chips without turning into `[object Object]`.\n */\n\nimport { isPlainObject } from \"../lib/collections\";\n\n/** A metadata value that renders as one short piece of text. */\nexport type MetadataScalar = string | number | boolean;\n\nexport interface MetadataEntry {\n key: string;\n value: MetadataScalar;\n /** The text to render, and to test for a link. */\n text: string;\n}\n\nfunction isScalar(value: unknown): value is MetadataScalar {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\n\n/**\n * The scalar entries of a metadata object, in the producer's own key order.\n * Empty strings are dropped: a producer that reports a field it has no value for\n * yet is saying nothing, and a blank chip reads as a rendering fault.\n */\nexport function metadataEntries(value: unknown): MetadataEntry[] {\n if (!isPlainObject(value)) return [];\n const entries: MetadataEntry[] = [];\n for (const [key, item] of Object.entries(value)) {\n if (!isScalar(item) || item === \"\") continue;\n entries.push({ key, value: item, text: String(item) });\n }\n return entries;\n}\n\n/**\n * True when every value in the object is a scalar — the case a chip row or a\n * definition list can render completely, with nothing left over to fall back to\n * a JSON view for.\n */\nexport function isFlatMetadata(value: unknown): boolean {\n return isPlainObject(value) && Object.values(value).every(isScalar);\n}\n\n/** Keys whose value is meant as a destination rather than a label. */\nconst LINK_KEYS = new Set([\"href\", \"url\", \"link\"]);\n\nconst HAS_SCHEME = /^[a-z][a-z0-9+.-]*:/i;\n\n/** The schemes that only ever navigate. `javascript:` and `data:` run instead. */\nconst NAVIGABLE_URL = /^https?:\\/\\//i;\n\n/** A leading `//` or `/\\` is somewhere else entirely, wearing a path's clothes. */\nconst OFF_SITE_PATH = /^\\/[/\\\\]/;\n\n/** A browser ignores spaces and control characters when reading an href, so a scheme is read from the same stripped form it would see. */\nfunction withoutBlanks(text: string): string {\n let stripped = \"\";\n for (const character of text) if (character > \" \") stripped += character;\n return stripped;\n}\n\n/**\n * Whether a metadata value can be put in an `href`.\n *\n * The key says what the producer meant by a value; it does not say what the\n * value is. Metadata is whatever JSON reached this client over the task API or\n * the SSE stream, so a `url` of `javascript:…` is a script the page would run\n * on click rather than a place it would go. What may be linked is therefore\n * named rather than what may not: a relative reference, or an http(s) URL.\n * Anything else keeps rendering as the plain text it already was.\n */\nexport function isMetadataLink(key: string, text: string): boolean {\n if (!LINK_KEYS.has(key) && !text.startsWith(\"/\") && !text.startsWith(\"https://\")) return false;\n const destination = withoutBlanks(text);\n return HAS_SCHEME.test(destination) ? NAVIGABLE_URL.test(destination) : !OFF_SITE_PATH.test(destination);\n}\n"],"names":["isPlainObject"],"mappings":";;;AAoBA,SAAS,SAAS,OAAyC;AACzD,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU;AACpF;AAOO,SAAS,gBAAgB,OAAiC;AAC/D,MAAI,CAACA,YAAAA,cAAc,KAAK,UAAU,CAAA;AAClC,QAAM,UAA2B,CAAA;AACjC,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,QAAI,CAAC,SAAS,IAAI,KAAK,SAAS,GAAI;AACpC,YAAQ,KAAK,EAAE,KAAK,OAAO,MAAM,MAAM,OAAO,IAAI,GAAG;AAAA,EACvD;AACA,SAAO;AACT;AAOO,SAAS,eAAe,OAAyB;AACtD,SAAOA,YAAAA,cAAc,KAAK,KAAK,OAAO,OAAO,KAAK,EAAE,MAAM,QAAQ;AACpE;AAGA,MAAM,YAAY,oBAAI,IAAI,CAAC,QAAQ,OAAO,MAAM,CAAC;AAEjD,MAAM,aAAa;AAGnB,MAAM,gBAAgB;AAGtB,MAAM,gBAAgB;AAGtB,SAAS,cAAc,MAAsB;AAC3C,MAAI,WAAW;AACf,aAAW,aAAa,KAAM,KAAI,YAAY,IAAK,aAAY;AAC/D,SAAO;AACT;AAYO,SAAS,eAAe,KAAa,MAAuB;AACjE,MAAI,CAAC,UAAU,IAAI,GAAG,KAAK,CAAC,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,UAAU,EAAG,QAAO;AACzF,QAAM,cAAc,cAAc,IAAI;AACtC,SAAO,WAAW,KAAK,WAAW,IAAI,cAAc,KAAK,WAAW,IAAI,CAAC,cAAc,KAAK,WAAW;AACzG;;;;"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task metadata is whatever JSON the producer chose to attach to a snapshot, so
|
|
3
|
+
* rendering it starts with reading its shape rather than assuming one. The split
|
|
4
|
+
* these helpers make is between values that read as a label — a state, a model,
|
|
5
|
+
* a session id — and values that do not, because only the first kind can go in a
|
|
6
|
+
* row of chips without turning into `[object Object]`.
|
|
7
|
+
*/
|
|
8
|
+
/** A metadata value that renders as one short piece of text. */
|
|
9
|
+
export type MetadataScalar = string | number | boolean;
|
|
10
|
+
export interface MetadataEntry {
|
|
11
|
+
key: string;
|
|
12
|
+
value: MetadataScalar;
|
|
13
|
+
/** The text to render, and to test for a link. */
|
|
14
|
+
text: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The scalar entries of a metadata object, in the producer's own key order.
|
|
18
|
+
* Empty strings are dropped: a producer that reports a field it has no value for
|
|
19
|
+
* yet is saying nothing, and a blank chip reads as a rendering fault.
|
|
20
|
+
*/
|
|
21
|
+
export declare function metadataEntries(value: unknown): MetadataEntry[];
|
|
22
|
+
/**
|
|
23
|
+
* True when every value in the object is a scalar — the case a chip row or a
|
|
24
|
+
* definition list can render completely, with nothing left over to fall back to
|
|
25
|
+
* a JSON view for.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isFlatMetadata(value: unknown): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Whether a metadata value can be put in an `href`.
|
|
30
|
+
*
|
|
31
|
+
* The key says what the producer meant by a value; it does not say what the
|
|
32
|
+
* value is. Metadata is whatever JSON reached this client over the task API or
|
|
33
|
+
* the SSE stream, so a `url` of `javascript:…` is a script the page would run
|
|
34
|
+
* on click rather than a place it would go. What may be linked is therefore
|
|
35
|
+
* named rather than what may not: a relative reference, or an http(s) URL.
|
|
36
|
+
* Anything else keeps rendering as the plain text it already was.
|
|
37
|
+
*/
|
|
38
|
+
export declare function isMetadataLink(key: string, text: string): boolean;
|
|
39
|
+
//# sourceMappingURL=task-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-metadata.d.ts","sourceRoot":"","sources":["../../src/data/task-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,gEAAgE;AAChE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,cAAc,CAAC;IACtB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;CACd;AAMD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,EAAE,CAQ/D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEtD;AAoBD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAIjE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { isPlainObject } from "../lib/collections.js";
|
|
2
|
+
function isScalar(value) {
|
|
3
|
+
return typeof value === "string" || typeof value === "number" || typeof value === "boolean";
|
|
4
|
+
}
|
|
5
|
+
function metadataEntries(value) {
|
|
6
|
+
if (!isPlainObject(value)) return [];
|
|
7
|
+
const entries = [];
|
|
8
|
+
for (const [key, item] of Object.entries(value)) {
|
|
9
|
+
if (!isScalar(item) || item === "") continue;
|
|
10
|
+
entries.push({ key, value: item, text: String(item) });
|
|
11
|
+
}
|
|
12
|
+
return entries;
|
|
13
|
+
}
|
|
14
|
+
function isFlatMetadata(value) {
|
|
15
|
+
return isPlainObject(value) && Object.values(value).every(isScalar);
|
|
16
|
+
}
|
|
17
|
+
const LINK_KEYS = /* @__PURE__ */ new Set(["href", "url", "link"]);
|
|
18
|
+
const HAS_SCHEME = /^[a-z][a-z0-9+.-]*:/i;
|
|
19
|
+
const NAVIGABLE_URL = /^https?:\/\//i;
|
|
20
|
+
const OFF_SITE_PATH = /^\/[/\\]/;
|
|
21
|
+
function withoutBlanks(text) {
|
|
22
|
+
let stripped = "";
|
|
23
|
+
for (const character of text) if (character > " ") stripped += character;
|
|
24
|
+
return stripped;
|
|
25
|
+
}
|
|
26
|
+
function isMetadataLink(key, text) {
|
|
27
|
+
if (!LINK_KEYS.has(key) && !text.startsWith("/") && !text.startsWith("https://")) return false;
|
|
28
|
+
const destination = withoutBlanks(text);
|
|
29
|
+
return HAS_SCHEME.test(destination) ? NAVIGABLE_URL.test(destination) : !OFF_SITE_PATH.test(destination);
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
isFlatMetadata,
|
|
33
|
+
isMetadataLink,
|
|
34
|
+
metadataEntries
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=task-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-metadata.js","sources":["../../src/data/task-metadata.ts"],"sourcesContent":["/**\n * Task metadata is whatever JSON the producer chose to attach to a snapshot, so\n * rendering it starts with reading its shape rather than assuming one. The split\n * these helpers make is between values that read as a label — a state, a model,\n * a session id — and values that do not, because only the first kind can go in a\n * row of chips without turning into `[object Object]`.\n */\n\nimport { isPlainObject } from \"../lib/collections\";\n\n/** A metadata value that renders as one short piece of text. */\nexport type MetadataScalar = string | number | boolean;\n\nexport interface MetadataEntry {\n key: string;\n value: MetadataScalar;\n /** The text to render, and to test for a link. */\n text: string;\n}\n\nfunction isScalar(value: unknown): value is MetadataScalar {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\n\n/**\n * The scalar entries of a metadata object, in the producer's own key order.\n * Empty strings are dropped: a producer that reports a field it has no value for\n * yet is saying nothing, and a blank chip reads as a rendering fault.\n */\nexport function metadataEntries(value: unknown): MetadataEntry[] {\n if (!isPlainObject(value)) return [];\n const entries: MetadataEntry[] = [];\n for (const [key, item] of Object.entries(value)) {\n if (!isScalar(item) || item === \"\") continue;\n entries.push({ key, value: item, text: String(item) });\n }\n return entries;\n}\n\n/**\n * True when every value in the object is a scalar — the case a chip row or a\n * definition list can render completely, with nothing left over to fall back to\n * a JSON view for.\n */\nexport function isFlatMetadata(value: unknown): boolean {\n return isPlainObject(value) && Object.values(value).every(isScalar);\n}\n\n/** Keys whose value is meant as a destination rather than a label. */\nconst LINK_KEYS = new Set([\"href\", \"url\", \"link\"]);\n\nconst HAS_SCHEME = /^[a-z][a-z0-9+.-]*:/i;\n\n/** The schemes that only ever navigate. `javascript:` and `data:` run instead. */\nconst NAVIGABLE_URL = /^https?:\\/\\//i;\n\n/** A leading `//` or `/\\` is somewhere else entirely, wearing a path's clothes. */\nconst OFF_SITE_PATH = /^\\/[/\\\\]/;\n\n/** A browser ignores spaces and control characters when reading an href, so a scheme is read from the same stripped form it would see. */\nfunction withoutBlanks(text: string): string {\n let stripped = \"\";\n for (const character of text) if (character > \" \") stripped += character;\n return stripped;\n}\n\n/**\n * Whether a metadata value can be put in an `href`.\n *\n * The key says what the producer meant by a value; it does not say what the\n * value is. Metadata is whatever JSON reached this client over the task API or\n * the SSE stream, so a `url` of `javascript:…` is a script the page would run\n * on click rather than a place it would go. What may be linked is therefore\n * named rather than what may not: a relative reference, or an http(s) URL.\n * Anything else keeps rendering as the plain text it already was.\n */\nexport function isMetadataLink(key: string, text: string): boolean {\n if (!LINK_KEYS.has(key) && !text.startsWith(\"/\") && !text.startsWith(\"https://\")) return false;\n const destination = withoutBlanks(text);\n return HAS_SCHEME.test(destination) ? NAVIGABLE_URL.test(destination) : !OFF_SITE_PATH.test(destination);\n}\n"],"names":[],"mappings":";AAoBA,SAAS,SAAS,OAAyC;AACzD,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU;AACpF;AAOO,SAAS,gBAAgB,OAAiC;AAC/D,MAAI,CAAC,cAAc,KAAK,UAAU,CAAA;AAClC,QAAM,UAA2B,CAAA;AACjC,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,QAAI,CAAC,SAAS,IAAI,KAAK,SAAS,GAAI;AACpC,YAAQ,KAAK,EAAE,KAAK,OAAO,MAAM,MAAM,OAAO,IAAI,GAAG;AAAA,EACvD;AACA,SAAO;AACT;AAOO,SAAS,eAAe,OAAyB;AACtD,SAAO,cAAc,KAAK,KAAK,OAAO,OAAO,KAAK,EAAE,MAAM,QAAQ;AACpE;AAGA,MAAM,YAAY,oBAAI,IAAI,CAAC,QAAQ,OAAO,MAAM,CAAC;AAEjD,MAAM,aAAa;AAGnB,MAAM,gBAAgB;AAGtB,MAAM,gBAAgB;AAGtB,SAAS,cAAc,MAAsB;AAC3C,MAAI,WAAW;AACf,aAAW,aAAa,KAAM,KAAI,YAAY,IAAK,aAAY;AAC/D,SAAO;AACT;AAYO,SAAS,eAAe,KAAa,MAAuB;AACjE,MAAI,CAAC,UAAU,IAAI,GAAG,KAAK,CAAC,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,UAAU,EAAG,QAAO;AACzF,QAAM,cAAc,cAAc,IAAI;AACtC,SAAO,WAAW,KAAK,WAAW,IAAI,cAAc,KAAK,WAAW,IAAI,CAAC,cAAc,KAAK,WAAW;AACzG;"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const emptyTaskStreams = {
|
|
4
|
+
stdoutTruncated: false,
|
|
5
|
+
stderrTruncated: false,
|
|
6
|
+
stdoutEnd: 0,
|
|
7
|
+
stderrEnd: 0
|
|
8
|
+
};
|
|
9
|
+
const encoder = new TextEncoder();
|
|
10
|
+
function utf8Length(data) {
|
|
11
|
+
return encoder.encode(data).byteLength;
|
|
12
|
+
}
|
|
13
|
+
function applyTaskOutputDelta(current, delta) {
|
|
14
|
+
const held = delta.stream === "stdout" ? current.stdout : current.stderr;
|
|
15
|
+
const end = delta.stream === "stdout" ? current.stdoutEnd : current.stderrEnd;
|
|
16
|
+
const continues = delta.reset !== true && held !== void 0 && end === delta.offset;
|
|
17
|
+
const text = continues ? `${held}${delta.data}` : delta.data;
|
|
18
|
+
const wasTruncated = delta.stream === "stdout" ? current.stdoutTruncated : current.stderrTruncated;
|
|
19
|
+
const truncated = delta.truncated ?? (continues && wasTruncated);
|
|
20
|
+
const streamEnd = delta.offset + utf8Length(delta.data);
|
|
21
|
+
return delta.stream === "stdout" ? { ...current, stdout: text, stdoutTruncated: truncated, stdoutEnd: streamEnd } : { ...current, stderr: text, stderrTruncated: truncated, stderrEnd: streamEnd };
|
|
22
|
+
}
|
|
23
|
+
function withTaskStreams(snapshot, streams) {
|
|
24
|
+
if (!streams) return snapshot;
|
|
25
|
+
const merged = { ...snapshot };
|
|
26
|
+
if (streams.stdout !== void 0) {
|
|
27
|
+
merged.stdout = streams.stdout;
|
|
28
|
+
merged.stdoutTruncated = streams.stdoutTruncated;
|
|
29
|
+
}
|
|
30
|
+
if (streams.stderr !== void 0) {
|
|
31
|
+
merged.stderr = streams.stderr;
|
|
32
|
+
merged.stderrTruncated = streams.stderrTruncated;
|
|
33
|
+
}
|
|
34
|
+
return merged;
|
|
35
|
+
}
|
|
36
|
+
exports.applyTaskOutputDelta = applyTaskOutputDelta;
|
|
37
|
+
exports.emptyTaskStreams = emptyTaskStreams;
|
|
38
|
+
exports.withTaskStreams = withTaskStreams;
|
|
39
|
+
//# sourceMappingURL=task-streams.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-streams.cjs","sources":["../../src/data/task-streams.ts"],"sourcesContent":["import type { TaskSnapshot } from \"./TaskSnapshot\";\n\n/**\n * A task's stdout/stderr arrive as append-only deltas on their own SSE frames,\n * never on the task frames — clicky strips them there deliberately, so the tail\n * of a long-running process is not re-sent every time a duration ticks over.\n *\n * That makes where a client keeps the accumulated text a correctness question,\n * not a style one. Kept on the snapshot object, it is destroyed the next time a\n * task frame replaces that object, and since the server only sends what a client\n * has not seen it is never sent again — the output appears, vanishes a moment\n * later, and only flickers back when the process happens to write more. So it is\n * kept here instead, beside the snapshots rather than inside them, and merged in\n * at the boundary.\n */\nexport interface TaskStreams {\n stdout?: string;\n stderr?: string;\n stdoutTruncated: boolean;\n stderrTruncated: boolean;\n /** Absolute stream offset one past the last byte held, per stream. */\n stdoutEnd: number;\n stderrEnd: number;\n}\n\nexport const emptyTaskStreams: TaskStreams = {\n stdoutTruncated: false,\n stderrTruncated: false,\n stdoutEnd: 0,\n stderrEnd: 0,\n};\n\n/**\n * One `event: output` frame. `offset` is an ABSOLUTE position in the task's\n * stream, not a length into what this client holds: on an append it is where\n * `data` belongs, and on a `reset` it is where the server's retained tail now\n * begins. `truncated` says bytes ahead of that point are gone for good.\n */\nexport interface TaskOutputDelta {\n id: string;\n groupId?: string;\n stream: \"stdout\" | \"stderr\";\n data: string;\n offset: number;\n reset?: boolean;\n truncated?: boolean;\n}\n\nconst encoder = new TextEncoder();\n\n/**\n * How far `data` advances the stream. Offsets are byte positions in the\n * process's own output, and a JS string measures UTF-16 code units — so `\"é\"`\n * counts as one there and as the two bytes the server actually wrote. Measuring\n * the wrong unit puts the client's end short of the next delta's start, and\n * every following frame is then read as a gap and replaces the text it should\n * have continued.\n */\nfunction utf8Length(data: string): number {\n return encoder.encode(data).byteLength;\n}\n\n/**\n * Applies one delta to what a task's streams already hold.\n *\n * Appending is only correct where the two actually meet — the client's own end\n * is exactly the delta's start. Anything else is a replacement: an explicit\n * `reset`, or a gap opened by a retained window that rolled past what this\n * client last saw. Concatenating across such a gap would silently splice\n * together two pieces of output that never ran together.\n *\n * Truncation carries across an append: dropping the head of a stream is not\n * undone by writing more to its tail, so a frame that simply says nothing about\n * it leaves the flag as it was, and only an explicit value changes it.\n */\nexport function applyTaskOutputDelta(current: TaskStreams, delta: TaskOutputDelta): TaskStreams {\n const held = delta.stream === \"stdout\" ? current.stdout : current.stderr;\n const end = delta.stream === \"stdout\" ? current.stdoutEnd : current.stderrEnd;\n const continues = delta.reset !== true && held !== undefined && end === delta.offset;\n const text = continues ? `${held}${delta.data}` : delta.data;\n const wasTruncated = delta.stream === \"stdout\" ? current.stdoutTruncated : current.stderrTruncated;\n const truncated = delta.truncated ?? (continues && wasTruncated);\n const streamEnd = delta.offset + utf8Length(delta.data);\n\n return delta.stream === \"stdout\"\n ? { ...current, stdout: text, stdoutTruncated: truncated, stdoutEnd: streamEnd }\n : { ...current, stderr: text, stderrTruncated: truncated, stderrEnd: streamEnd };\n}\n\n/**\n * Projects accumulated streams back onto a snapshot for rendering. The offset\n * bookkeeping stays here: it is how this client tracks its own position, not\n * something a consumer of a snapshot has any use for.\n */\nexport function withTaskStreams(snapshot: TaskSnapshot, streams: TaskStreams | undefined): TaskSnapshot {\n if (!streams) return snapshot;\n const merged: TaskSnapshot = { ...snapshot };\n if (streams.stdout !== undefined) {\n merged.stdout = streams.stdout;\n merged.stdoutTruncated = streams.stdoutTruncated;\n }\n if (streams.stderr !== undefined) {\n merged.stderr = streams.stderr;\n merged.stderrTruncated = streams.stderrTruncated;\n }\n return merged;\n}\n"],"names":[],"mappings":";;AAyBO,MAAM,mBAAgC;AAAA,EAC3C,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,WAAW;AACb;AAkBA,MAAM,UAAU,IAAI,YAAA;AAUpB,SAAS,WAAW,MAAsB;AACxC,SAAO,QAAQ,OAAO,IAAI,EAAE;AAC9B;AAeO,SAAS,qBAAqB,SAAsB,OAAqC;AAC9F,QAAM,OAAO,MAAM,WAAW,WAAW,QAAQ,SAAS,QAAQ;AAClE,QAAM,MAAM,MAAM,WAAW,WAAW,QAAQ,YAAY,QAAQ;AACpE,QAAM,YAAY,MAAM,UAAU,QAAQ,SAAS,UAAa,QAAQ,MAAM;AAC9E,QAAM,OAAO,YAAY,GAAG,IAAI,GAAG,MAAM,IAAI,KAAK,MAAM;AACxD,QAAM,eAAe,MAAM,WAAW,WAAW,QAAQ,kBAAkB,QAAQ;AACnF,QAAM,YAAY,MAAM,cAAc,aAAa;AACnD,QAAM,YAAY,MAAM,SAAS,WAAW,MAAM,IAAI;AAEtD,SAAO,MAAM,WAAW,WACpB,EAAE,GAAG,SAAS,QAAQ,MAAM,iBAAiB,WAAW,WAAW,UAAA,IACnE,EAAE,GAAG,SAAS,QAAQ,MAAM,iBAAiB,WAAW,WAAW,UAAA;AACzE;AAOO,SAAS,gBAAgB,UAAwB,SAAgD;AACtG,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,SAAuB,EAAE,GAAG,SAAA;AAClC,MAAI,QAAQ,WAAW,QAAW;AAChC,WAAO,SAAS,QAAQ;AACxB,WAAO,kBAAkB,QAAQ;AAAA,EACnC;AACA,MAAI,QAAQ,WAAW,QAAW;AAChC,WAAO,SAAS,QAAQ;AACxB,WAAO,kBAAkB,QAAQ;AAAA,EACnC;AACA,SAAO;AACT;;;;"}
|