@flanksource/clicky-ui 0.3.4 → 0.3.6
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 +15 -0
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +15 -0
- package/dist/ai.js.map +1 -1
- package/dist/data/ProgressBars.cjs +194 -0
- package/dist/data/ProgressBars.cjs.map +1 -0
- package/dist/data/ProgressBars.d.ts +85 -0
- package/dist/data/ProgressBars.d.ts.map +1 -0
- package/dist/data/ProgressBars.js +194 -0
- package/dist/data/ProgressBars.js.map +1 -0
- package/dist/data/ProgressBars.model.cjs +27 -0
- package/dist/data/ProgressBars.model.cjs.map +1 -0
- package/dist/data/ProgressBars.model.d.ts +20 -0
- package/dist/data/ProgressBars.model.d.ts.map +1 -0
- package/dist/data/ProgressBars.model.js +27 -0
- package/dist/data/ProgressBars.model.js.map +1 -0
- package/dist/data/TimeseriesCoreBars.cjs +19 -173
- package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.d.ts +9 -26
- package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.js +20 -174
- package/dist/data/TimeseriesCoreBars.js.map +1 -1
- package/dist/data/WorkloadCard.model.cjs.map +1 -1
- package/dist/data/WorkloadCard.model.d.ts +2 -2
- package/dist/data/WorkloadCard.model.d.ts.map +1 -1
- package/dist/data/WorkloadCard.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.cjs +275 -0
- package/dist/data/ai/SessionViewer.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.d.ts +33 -0
- package/dist/data/ai/SessionViewer.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.fixtures.d.ts +4 -0
- package/dist/data/ai/SessionViewer.fixtures.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.js +275 -0
- package/dist/data/ai/SessionViewer.js.map +1 -0
- package/dist/data/ai/SessionViewer.model.cjs +275 -0
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.model.d.ts +87 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.model.js +275 -0
- package/dist/data/ai/SessionViewer.model.js.map +1 -0
- package/dist/data/ai/SessionViewerMenu.cjs +190 -0
- package/dist/data/ai/SessionViewerMenu.cjs.map +1 -0
- package/dist/data/ai/SessionViewerMenu.d.ts +24 -0
- package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -0
- package/dist/data/ai/SessionViewerMenu.js +190 -0
- package/dist/data/ai/SessionViewerMenu.js.map +1 -0
- package/dist/data/ai/index.d.ts +3 -0
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/session-categories.cjs +219 -0
- package/dist/data/ai/session-categories.cjs.map +1 -0
- package/dist/data/ai/session-categories.d.ts +36 -0
- package/dist/data/ai/session-categories.d.ts.map +1 -0
- package/dist/data/ai/session-categories.js +219 -0
- package/dist/data/ai/session-categories.js.map +1 -0
- package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.cjs.map +1 -1
- package/dist/data/version-info.js +3 -3
- package/dist/data/version-info.js.map +1 -1
- package/dist/data.cjs +4 -2
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +3 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +4 -2
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +4 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/data/TimeseriesCoreBars.model.cjs +0 -27
- package/dist/data/TimeseriesCoreBars.model.cjs.map +0 -1
- package/dist/data/TimeseriesCoreBars.model.d.ts +0 -20
- package/dist/data/TimeseriesCoreBars.model.d.ts.map +0 -1
- package/dist/data/TimeseriesCoreBars.model.js +0 -27
- package/dist/data/TimeseriesCoreBars.model.js.map +0 -1
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../../lib/utils.js";
|
|
3
|
+
import { DropdownMenu } from "../../overlay/DropdownMenu.js";
|
|
4
|
+
import { Icon } from "../Icon.js";
|
|
5
|
+
import { CATEGORY_LABELS } from "./session-categories.js";
|
|
6
|
+
import { UiDotsVertical } from "../../icons/components/UiDotsVertical.js";
|
|
7
|
+
import { UiResizeVertical } from "../../icons/components/UiResizeVertical.js";
|
|
8
|
+
import { UiRows } from "../../icons/components/UiRows.js";
|
|
9
|
+
import { UiListFlat } from "../../icons/components/UiListFlat.js";
|
|
10
|
+
import { UiListDashes } from "../../icons/components/UiListDashes.js";
|
|
11
|
+
import { UiDesktop } from "../../icons/components/UiDesktop.js";
|
|
12
|
+
import { UiSun } from "../../icons/components/UiSun.js";
|
|
13
|
+
import { UiMoon } from "../../icons/components/UiMoon.js";
|
|
14
|
+
import { UiCheck } from "../../icons/components/UiCheck.js";
|
|
15
|
+
const DENSITY_OPTIONS = [
|
|
16
|
+
{ value: "compact", icon: UiRows, label: "Compact" },
|
|
17
|
+
{ value: "comfortable", icon: UiListFlat, label: "Comfortable" },
|
|
18
|
+
{ value: "spacious", icon: UiListDashes, label: "Spacious" }
|
|
19
|
+
];
|
|
20
|
+
const THEME_OPTIONS = [
|
|
21
|
+
{ value: "light", icon: UiSun, label: "Light" },
|
|
22
|
+
{ value: "dark", icon: UiMoon, label: "Dark" }
|
|
23
|
+
];
|
|
24
|
+
function SessionViewerMenu({
|
|
25
|
+
density,
|
|
26
|
+
onDensityChange,
|
|
27
|
+
theme,
|
|
28
|
+
onThemeChange,
|
|
29
|
+
filters,
|
|
30
|
+
hiddenCategories,
|
|
31
|
+
hiddenTools,
|
|
32
|
+
hiddenSources,
|
|
33
|
+
onToggleCategory,
|
|
34
|
+
onToggleTool,
|
|
35
|
+
onToggleSource,
|
|
36
|
+
showThinking,
|
|
37
|
+
onToggleThinking,
|
|
38
|
+
hasThinking
|
|
39
|
+
}) {
|
|
40
|
+
return /* @__PURE__ */ jsx(
|
|
41
|
+
DropdownMenu,
|
|
42
|
+
{
|
|
43
|
+
icon: UiDotsVertical,
|
|
44
|
+
hideChevron: true,
|
|
45
|
+
variant: "ghost",
|
|
46
|
+
size: "icon",
|
|
47
|
+
align: "right",
|
|
48
|
+
title: "Session options",
|
|
49
|
+
menuLabel: "Session options",
|
|
50
|
+
menuClassName: "min-w-[14rem] max-h-[70vh] overflow-auto px-1",
|
|
51
|
+
children: () => /* @__PURE__ */ jsxs("div", { className: "text-popover-foreground", children: [
|
|
52
|
+
/* @__PURE__ */ jsx(MenuHeading, { children: "Density" }),
|
|
53
|
+
/* @__PURE__ */ jsx(
|
|
54
|
+
RadioRow,
|
|
55
|
+
{
|
|
56
|
+
icon: UiResizeVertical,
|
|
57
|
+
label: "Use page density",
|
|
58
|
+
active: density === void 0,
|
|
59
|
+
onSelect: () => onDensityChange(void 0)
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
DENSITY_OPTIONS.map((option) => /* @__PURE__ */ jsx(
|
|
63
|
+
RadioRow,
|
|
64
|
+
{
|
|
65
|
+
icon: option.icon,
|
|
66
|
+
label: option.label,
|
|
67
|
+
active: density === option.value,
|
|
68
|
+
onSelect: () => onDensityChange(option.value)
|
|
69
|
+
},
|
|
70
|
+
option.value
|
|
71
|
+
)),
|
|
72
|
+
/* @__PURE__ */ jsxs(Section, { heading: "Theme", children: [
|
|
73
|
+
/* @__PURE__ */ jsx(
|
|
74
|
+
RadioRow,
|
|
75
|
+
{
|
|
76
|
+
icon: UiDesktop,
|
|
77
|
+
label: "Use page theme",
|
|
78
|
+
active: theme === void 0,
|
|
79
|
+
onSelect: () => onThemeChange(void 0)
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
THEME_OPTIONS.map((option) => /* @__PURE__ */ jsx(
|
|
83
|
+
RadioRow,
|
|
84
|
+
{
|
|
85
|
+
icon: option.icon,
|
|
86
|
+
label: option.label,
|
|
87
|
+
active: theme === option.value,
|
|
88
|
+
onSelect: () => onThemeChange(option.value)
|
|
89
|
+
},
|
|
90
|
+
option.value
|
|
91
|
+
))
|
|
92
|
+
] }),
|
|
93
|
+
filters.categories.length > 0 && /* @__PURE__ */ jsx(Section, { heading: "Categories", children: filters.categories.map((category) => /* @__PURE__ */ jsx(
|
|
94
|
+
CheckRow,
|
|
95
|
+
{
|
|
96
|
+
label: CATEGORY_LABELS[category],
|
|
97
|
+
checked: !hiddenCategories.has(category),
|
|
98
|
+
onToggle: () => onToggleCategory(category)
|
|
99
|
+
},
|
|
100
|
+
category
|
|
101
|
+
)) }),
|
|
102
|
+
filters.tools.length > 0 && /* @__PURE__ */ jsx(Section, { heading: "Tools", children: filters.tools.map((tool) => /* @__PURE__ */ jsx(
|
|
103
|
+
CheckRow,
|
|
104
|
+
{
|
|
105
|
+
label: tool.label,
|
|
106
|
+
checked: !hiddenTools.has(tool.key),
|
|
107
|
+
onToggle: () => onToggleTool(tool.key)
|
|
108
|
+
},
|
|
109
|
+
tool.key
|
|
110
|
+
)) }),
|
|
111
|
+
filters.sources.length > 1 && /* @__PURE__ */ jsx(Section, { heading: "Source", children: filters.sources.map((source) => /* @__PURE__ */ jsx(
|
|
112
|
+
CheckRow,
|
|
113
|
+
{
|
|
114
|
+
label: source,
|
|
115
|
+
checked: !hiddenSources.has(source),
|
|
116
|
+
onToggle: () => onToggleSource(source)
|
|
117
|
+
},
|
|
118
|
+
source
|
|
119
|
+
)) }),
|
|
120
|
+
hasThinking && /* @__PURE__ */ jsx(Section, { heading: "Other", children: /* @__PURE__ */ jsx(CheckRow, { label: "Reasoning", checked: showThinking, onToggle: onToggleThinking }) })
|
|
121
|
+
] })
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
function MenuHeading({ children }) {
|
|
126
|
+
return /* @__PURE__ */ jsx("div", { className: "px-2 py-1.5 text-xs font-medium text-muted-foreground", children });
|
|
127
|
+
}
|
|
128
|
+
function Section({ heading, children }) {
|
|
129
|
+
return /* @__PURE__ */ jsxs("div", { className: "mt-1 border-t border-border pt-1", children: [
|
|
130
|
+
/* @__PURE__ */ jsx(MenuHeading, { children: heading }),
|
|
131
|
+
children
|
|
132
|
+
] });
|
|
133
|
+
}
|
|
134
|
+
const ROW_CLASS = "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none";
|
|
135
|
+
function RadioRow({
|
|
136
|
+
icon,
|
|
137
|
+
label,
|
|
138
|
+
active,
|
|
139
|
+
onSelect
|
|
140
|
+
}) {
|
|
141
|
+
return /* @__PURE__ */ jsxs(
|
|
142
|
+
"button",
|
|
143
|
+
{
|
|
144
|
+
type: "button",
|
|
145
|
+
role: "menuitemradio",
|
|
146
|
+
"aria-checked": active,
|
|
147
|
+
className: cn(ROW_CLASS, active && "text-foreground"),
|
|
148
|
+
onClick: onSelect,
|
|
149
|
+
children: [
|
|
150
|
+
/* @__PURE__ */ jsx(Icon, { icon, className: "text-sm text-muted-foreground" }),
|
|
151
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: label }),
|
|
152
|
+
active ? /* @__PURE__ */ jsx(Icon, { icon: UiCheck, className: "text-sm text-foreground" }) : /* @__PURE__ */ jsx("span", { className: "inline-block h-4 w-4", "aria-hidden": true })
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
function CheckRow({
|
|
158
|
+
label,
|
|
159
|
+
checked,
|
|
160
|
+
onToggle
|
|
161
|
+
}) {
|
|
162
|
+
return /* @__PURE__ */ jsxs(
|
|
163
|
+
"button",
|
|
164
|
+
{
|
|
165
|
+
type: "button",
|
|
166
|
+
role: "menuitemcheckbox",
|
|
167
|
+
"aria-checked": checked,
|
|
168
|
+
className: cn(ROW_CLASS, !checked && "text-muted-foreground"),
|
|
169
|
+
onClick: onToggle,
|
|
170
|
+
children: [
|
|
171
|
+
/* @__PURE__ */ jsx(
|
|
172
|
+
"span",
|
|
173
|
+
{
|
|
174
|
+
"aria-hidden": true,
|
|
175
|
+
className: cn(
|
|
176
|
+
"flex h-4 w-4 shrink-0 items-center justify-center rounded border",
|
|
177
|
+
checked ? "border-primary bg-primary text-primary-foreground" : "border-input"
|
|
178
|
+
),
|
|
179
|
+
children: checked && /* @__PURE__ */ jsx(Icon, { icon: UiCheck, className: "text-[0.7rem]" })
|
|
180
|
+
}
|
|
181
|
+
),
|
|
182
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: label })
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
export {
|
|
188
|
+
SessionViewerMenu
|
|
189
|
+
};
|
|
190
|
+
//# sourceMappingURL=SessionViewerMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionViewerMenu.js","sources":["../../../src/data/ai/SessionViewerMenu.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport {\n UiCheck,\n UiDesktop,\n UiDotsVertical,\n UiListDashes,\n UiListFlat,\n UiMoon,\n UiResizeVertical,\n UiRows,\n UiSun,\n} from \"../../icons\";\nimport { type Density } from \"../../hooks/use-density\";\nimport { CATEGORY_LABELS, type SessionCategory, type SessionFilters } from \"./session-categories\";\n\nexport type SessionThemeOverride = \"light\" | \"dark\";\n\nconst DENSITY_OPTIONS: Array<{ value: Density; icon: StaticIconComponent; label: string }> = [\n { value: \"compact\", icon: UiRows, label: \"Compact\" },\n { value: \"comfortable\", icon: UiListFlat, label: \"Comfortable\" },\n { value: \"spacious\", icon: UiListDashes, label: \"Spacious\" },\n];\n\nconst THEME_OPTIONS: Array<{ value: SessionThemeOverride; icon: StaticIconComponent; label: string }> = [\n { value: \"light\", icon: UiSun, label: \"Light\" },\n { value: \"dark\", icon: UiMoon, label: \"Dark\" },\n];\n\nexport interface SessionViewerMenuProps {\n density: Density | undefined;\n onDensityChange: (density: Density | undefined) => void;\n theme: SessionThemeOverride | undefined;\n onThemeChange: (theme: SessionThemeOverride | undefined) => void;\n filters: SessionFilters;\n hiddenCategories: ReadonlySet<SessionCategory>;\n hiddenTools: ReadonlySet<string>;\n hiddenSources: ReadonlySet<string>;\n onToggleCategory: (category: SessionCategory) => void;\n onToggleTool: (tool: string) => void;\n onToggleSource: (source: string) => void;\n showThinking: boolean;\n onToggleThinking: () => void;\n hasThinking: boolean;\n}\n\n/** The SessionViewer's \"3-dot\" menu: a density override (matching DataTable's\n * pattern) plus visibility toggles for the captain category / tool / source\n * facets present in the session. */\nexport function SessionViewerMenu({\n density,\n onDensityChange,\n theme,\n onThemeChange,\n filters,\n hiddenCategories,\n hiddenTools,\n hiddenSources,\n onToggleCategory,\n onToggleTool,\n onToggleSource,\n showThinking,\n onToggleThinking,\n hasThinking,\n}: SessionViewerMenuProps) {\n return (\n <DropdownMenu\n icon={UiDotsVertical}\n hideChevron\n variant=\"ghost\"\n size=\"icon\"\n align=\"right\"\n title=\"Session options\"\n menuLabel=\"Session options\"\n menuClassName=\"min-w-[14rem] max-h-[70vh] overflow-auto px-1\"\n >\n {() => (\n <div className=\"text-popover-foreground\">\n <MenuHeading>Density</MenuHeading>\n <RadioRow\n icon={UiResizeVertical}\n label=\"Use page density\"\n active={density === undefined}\n onSelect={() => onDensityChange(undefined)}\n />\n {DENSITY_OPTIONS.map((option) => (\n <RadioRow\n key={option.value}\n icon={option.icon}\n label={option.label}\n active={density === option.value}\n onSelect={() => onDensityChange(option.value)}\n />\n ))}\n\n <Section heading=\"Theme\">\n <RadioRow\n icon={UiDesktop}\n label=\"Use page theme\"\n active={theme === undefined}\n onSelect={() => onThemeChange(undefined)}\n />\n {THEME_OPTIONS.map((option) => (\n <RadioRow\n key={option.value}\n icon={option.icon}\n label={option.label}\n active={theme === option.value}\n onSelect={() => onThemeChange(option.value)}\n />\n ))}\n </Section>\n\n {filters.categories.length > 0 && (\n <Section heading=\"Categories\">\n {filters.categories.map((category) => (\n <CheckRow\n key={category}\n label={CATEGORY_LABELS[category]}\n checked={!hiddenCategories.has(category)}\n onToggle={() => onToggleCategory(category)}\n />\n ))}\n </Section>\n )}\n\n {filters.tools.length > 0 && (\n <Section heading=\"Tools\">\n {filters.tools.map((tool) => (\n <CheckRow\n key={tool.key}\n label={tool.label}\n checked={!hiddenTools.has(tool.key)}\n onToggle={() => onToggleTool(tool.key)}\n />\n ))}\n </Section>\n )}\n\n {filters.sources.length > 1 && (\n <Section heading=\"Source\">\n {filters.sources.map((source) => (\n <CheckRow\n key={source}\n label={source}\n checked={!hiddenSources.has(source)}\n onToggle={() => onToggleSource(source)}\n />\n ))}\n </Section>\n )}\n\n {hasThinking && (\n <Section heading=\"Other\">\n <CheckRow label=\"Reasoning\" checked={showThinking} onToggle={onToggleThinking} />\n </Section>\n )}\n </div>\n )}\n </DropdownMenu>\n );\n}\n\nfunction MenuHeading({ children }: { children: ReactNode }) {\n return <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\">{children}</div>;\n}\n\nfunction Section({ heading, children }: { heading: string; children: ReactNode }) {\n return (\n <div className=\"mt-1 border-t border-border pt-1\">\n <MenuHeading>{heading}</MenuHeading>\n {children}\n </div>\n );\n}\n\nconst ROW_CLASS =\n \"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\";\n\nfunction RadioRow({\n icon,\n label,\n active,\n onSelect,\n}: {\n icon: StaticIconComponent;\n label: string;\n active: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n className={cn(ROW_CLASS, active && \"text-foreground\")}\n onClick={onSelect}\n >\n <Icon icon={icon} className=\"text-sm text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n {active ? (\n <Icon icon={UiCheck} className=\"text-sm text-foreground\" />\n ) : (\n <span className=\"inline-block h-4 w-4\" aria-hidden />\n )}\n </button>\n );\n}\n\nfunction CheckRow({\n label,\n checked,\n onToggle,\n}: {\n label: string;\n checked: boolean;\n onToggle: () => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n className={cn(ROW_CLASS, !checked && \"text-muted-foreground\")}\n onClick={onToggle}\n >\n <span\n aria-hidden\n className={cn(\n \"flex h-4 w-4 shrink-0 items-center justify-center rounded border\",\n checked ? \"border-primary bg-primary text-primary-foreground\" : \"border-input\",\n )}\n >\n {checked && <Icon icon={UiCheck} className=\"text-[0.7rem]\" />}\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n </button>\n );\n}\n"],"names":[],"mappings":"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"}
|
package/dist/data/ai/index.d.ts
CHANGED
|
@@ -7,4 +7,7 @@ export { ContextBadges, ContextBadgesReadonly, type ContextBadgesProps, } from '
|
|
|
7
7
|
export { ToolPreferences, type ToolPreferencesProps, type ToolMeta, type ToolMode, } from './ToolPreferences';
|
|
8
8
|
export { ContextUsage, type ContextUsageProps } from '../chat/ContextUsage';
|
|
9
9
|
export { serializeContext, parseContextPrefix, makeContextId, type ChatContextItem, type ContextTypeConfig, type ContextTypeStyle, } from './context';
|
|
10
|
+
export { SessionViewer, type SessionViewerProps, type SessionEntry, type SessionEvent, type SessionInput, type SessionThemeOverride, } from './SessionViewer';
|
|
11
|
+
export { getSessionAction, normalizeSession, splitMcpTool, summarizeSession, summarizeToolInput, type SessionActionMeta, type SessionEventKind, type SessionToolUse, type SessionMessage, type SessionContent, type SessionTone, } from './SessionViewer.model';
|
|
12
|
+
export { CATEGORY_LABELS, classifyCommand, classifyToolCategory, collectSessionFilters, eventCategory, isEventVisible, type SessionCategory, type SessionFilters, type SessionVisibility, } from './session-categories';
|
|
10
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/ai/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,yBAAyB,EACzB,KAAK,8BAA8B,GACpC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,KAAK,kBAAkB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EACb,KAAK,QAAQ,GACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE5E,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/ai/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,yBAAyB,EACzB,KAAK,8BAA8B,GACpC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,KAAK,kBAAkB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EACb,KAAK,QAAQ,GACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE5E,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,oBAAoB,GAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const SessionViewer_model = require("./SessionViewer.model.cjs");
|
|
4
|
+
const CATEGORY_LABELS = {
|
|
5
|
+
build: "Build",
|
|
6
|
+
test: "Test",
|
|
7
|
+
install: "Install",
|
|
8
|
+
explore: "Explore",
|
|
9
|
+
lint: "Lint",
|
|
10
|
+
cleanup: "Cleanup",
|
|
11
|
+
git: "Git",
|
|
12
|
+
docker: "Docker",
|
|
13
|
+
k8s: "Kubernetes",
|
|
14
|
+
run: "Run",
|
|
15
|
+
plan: "Plan",
|
|
16
|
+
edit: "Edit",
|
|
17
|
+
clarify: "Clarify",
|
|
18
|
+
read: "Read",
|
|
19
|
+
other: "Other"
|
|
20
|
+
};
|
|
21
|
+
const CATEGORY_PRIORITY = {
|
|
22
|
+
install: 100,
|
|
23
|
+
edit: 90,
|
|
24
|
+
run: 80,
|
|
25
|
+
test: 70,
|
|
26
|
+
build: 60,
|
|
27
|
+
cleanup: 50,
|
|
28
|
+
docker: 40,
|
|
29
|
+
k8s: 40,
|
|
30
|
+
git: 30,
|
|
31
|
+
explore: 20,
|
|
32
|
+
lint: 20,
|
|
33
|
+
plan: 20,
|
|
34
|
+
read: 15,
|
|
35
|
+
clarify: 10,
|
|
36
|
+
other: 0
|
|
37
|
+
};
|
|
38
|
+
const CATEGORY_CONFIG = [
|
|
39
|
+
[
|
|
40
|
+
"build",
|
|
41
|
+
{
|
|
42
|
+
commands: ["go build", "make build", "make all", "cargo build", "npm run build", "yarn build", "task build", "gradle build", "mvn compile", "mvn package", "dotnet build", "pnpm build", "bun build", "mage", "bazel build", "nx build", "turbo build", "javac"],
|
|
43
|
+
patterns: [".*gradle.*(build|compile|bootJar|jar).*", ".*mvn.*(compile|package)", "^go build", "^make\\s*$", "^make\\s+(build|all)\\b", "^cargo build", "^task build"]
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
[
|
|
47
|
+
"test",
|
|
48
|
+
{
|
|
49
|
+
commands: ["go test", "pytest", "npm test", "yarn test", "task test", "make test", "cargo test", "mvn test", "gradle test", "vitest", "jest", "bun test", "dotnet test", "ginkgo", "gotestsum", "zig test"],
|
|
50
|
+
patterns: [".*gradle.*test", ".*mvn.*test", "^go test", "^pytest", "^npm (run )?test", "^make\\s+test", "^vitest", "^jest", "^bun test", "^ginkgo", "^gotestsum"]
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
[
|
|
54
|
+
"install",
|
|
55
|
+
{
|
|
56
|
+
commands: ["npm install", "npm i", "yarn install", "yarn add", "go mod tidy", "go mod download", "go get", "pip install", "pip3 install", "cargo add", "brew install", "apt install", "apt-get install", "pnpm install", "pnpm add", "bun install", "bun add", "poetry install", "poetry add", "uv pip install", "pdm install", "pdm add"],
|
|
57
|
+
patterns: ["^npm (install|i)\\b", "^yarn (install|add)\\b", "^pip3? install", "^go (mod tidy|mod download|get)", "^pnpm (install|add)\\b", "^bun (install|add)\\b", "^poetry (install|add)\\b", "^uv pip install", "^pdm (install|add)\\b"]
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
[
|
|
61
|
+
"explore",
|
|
62
|
+
{
|
|
63
|
+
tools: ["Read", "Grep", "Glob", "LSP", "WebFetch", "WebSearch"],
|
|
64
|
+
commands: ["ls", "md5", "echo", "find", "grep", "rg", "ag", "cat", "head", "tail", "less", "more", "tree", "wc", "file", "stat", "du", "df", "pwd", "which", "whereis", "type", "fd", "bat", "exa", "eza", "fzf", "jq", "yq", "ripgrep", "sd", "diff", "go list", "git status", "git diff", "git log", "ps", "printenv", "sed"],
|
|
65
|
+
patterns: ["^ls\\b", "^find\\b", "^grep\\b", "^rg\\b", "^cat\\b", "^head\\b", "^tail\\b", "^tree\\b", "^fd\\b", "^bat\\b", "^exa\\b", "^eza\\b", "^jq\\b", "^yq\\b", "^diff\\b", "^go list\\b", "^git\\s+(status|diff|log)\\b"]
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
[
|
|
69
|
+
"lint",
|
|
70
|
+
{
|
|
71
|
+
commands: ["golangci-lint", "eslint", "gofmt", "go fmt", "prettier", "black", "flake8", "pylint", "rubocop", "shellcheck", "task fmt", "make fmt", "make lint", "biome", "ruff", "mypy", "staticcheck", "buf lint", "deno lint", "oxlint"],
|
|
72
|
+
patterns: ["lint", "^go fmt", "^gofmt", "^prettier", "^black\\b", "^biome\\b", "^ruff\\b", "^mypy\\b", "^staticcheck\\b"]
|
|
73
|
+
}
|
|
74
|
+
],
|
|
75
|
+
[
|
|
76
|
+
"cleanup",
|
|
77
|
+
{
|
|
78
|
+
commands: ["rm", "rmdir", "git clean", "make clean", "cargo clean", "go clean", "npm cache clean", "docker prune", "docker system prune"],
|
|
79
|
+
patterns: ["^rm\\b", "^rmdir\\b", "clean\\b", "prune\\b"]
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
[
|
|
83
|
+
"git",
|
|
84
|
+
{
|
|
85
|
+
commands: ["git show", "git branch", "git checkout", "git switch", "git commit", "git push", "git pull", "git fetch", "git merge", "git rebase", "git stash", "git add", "git reset", "git clone", "git remote", "git tag"],
|
|
86
|
+
patterns: ["^git\\b"]
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
[
|
|
90
|
+
"docker",
|
|
91
|
+
{
|
|
92
|
+
commands: ["docker run", "docker build", "docker push", "docker pull", "docker ps", "docker images", "docker logs", "docker exec", "docker stop", "docker start", "docker rm", "docker rmi", "docker-compose", "podman"],
|
|
93
|
+
patterns: ["^docker\\b", "^docker-compose\\b", "^podman\\b"]
|
|
94
|
+
}
|
|
95
|
+
],
|
|
96
|
+
[
|
|
97
|
+
"k8s",
|
|
98
|
+
{
|
|
99
|
+
commands: ["kubectl", "helm", "k9s", "kubectx", "kubens", "kustomize", "minikube", "kind"],
|
|
100
|
+
patterns: ["^kubectl\\b", "^helm\\b", "^k9s\\b", "^kubectx\\b", "^kubens\\b", "^kustomize\\b", "^minikube\\b", "^kind\\b"]
|
|
101
|
+
}
|
|
102
|
+
],
|
|
103
|
+
[
|
|
104
|
+
"run",
|
|
105
|
+
{
|
|
106
|
+
tools: ["KillShell"],
|
|
107
|
+
commands: ["go run", "python", "python3", "node", "bun run", "deno run", "ruby", "perl", "php", "java"],
|
|
108
|
+
patterns: [".*gradle.*run.*", "^go run\\b", "^python3?\\b", "^node\\b", "^bun run\\b", "^deno run\\b", "^ruby\\b", "^perl\\b", "^php\\b", "^java\\s+-jar\\b", "^\\./[\\w.-]+\\.(sh|bash|py|rb|pl)$", "^bash\\s+\\S+\\.sh"]
|
|
109
|
+
}
|
|
110
|
+
],
|
|
111
|
+
[
|
|
112
|
+
"plan",
|
|
113
|
+
{
|
|
114
|
+
tools: ["Task", "TodoWrite", "EnterPlanMode"],
|
|
115
|
+
commands: ["task", "make help", "task explore", "task plan", "task todos", "task todo"],
|
|
116
|
+
patterns: ["^task\\s*$", "^task\\s+--list", "^make\\s+help"]
|
|
117
|
+
}
|
|
118
|
+
],
|
|
119
|
+
[
|
|
120
|
+
"edit",
|
|
121
|
+
{
|
|
122
|
+
tools: ["Edit", "Write", "NotebookEdit"],
|
|
123
|
+
commands: ["mkdir"],
|
|
124
|
+
patterns: ["sed.* -i"]
|
|
125
|
+
}
|
|
126
|
+
],
|
|
127
|
+
["clarify", { tools: ["AskUserQuestion", "ExitPlanMode", "TaskOutput"] }]
|
|
128
|
+
];
|
|
129
|
+
const COMPILED = CATEGORY_CONFIG.map(([cat, rule]) => [
|
|
130
|
+
cat,
|
|
131
|
+
(rule.patterns ?? []).map((p) => new RegExp(p))
|
|
132
|
+
]);
|
|
133
|
+
function chooseBetterMatch(current, candidate) {
|
|
134
|
+
if (!candidate.matched || candidate.category === "other") return current;
|
|
135
|
+
if (!current.matched || current.category === "other") return candidate;
|
|
136
|
+
if (candidate.specificity > current.specificity) return candidate;
|
|
137
|
+
if (candidate.specificity < current.specificity) return current;
|
|
138
|
+
const cp = CATEGORY_PRIORITY[candidate.category];
|
|
139
|
+
const kp = CATEGORY_PRIORITY[current.category];
|
|
140
|
+
if (cp > kp) return candidate;
|
|
141
|
+
if (cp < kp) return current;
|
|
142
|
+
return candidate.category < current.category ? candidate : current;
|
|
143
|
+
}
|
|
144
|
+
function classifyCommand(command) {
|
|
145
|
+
const cmd = command.trim();
|
|
146
|
+
if (!cmd) return "other";
|
|
147
|
+
let best = { category: "other", specificity: 0, matched: false };
|
|
148
|
+
for (const [cat, rule] of CATEGORY_CONFIG) {
|
|
149
|
+
for (const prefix of rule.commands ?? []) {
|
|
150
|
+
if (cmd === prefix || cmd.startsWith(`${prefix} `)) {
|
|
151
|
+
best = chooseBetterMatch(best, { category: cat, specificity: prefix.length, matched: true });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
for (const [cat, regexps] of COMPILED) {
|
|
156
|
+
for (const re of regexps) {
|
|
157
|
+
if (re.test(cmd)) {
|
|
158
|
+
best = chooseBetterMatch(best, { category: cat, specificity: re.source.length, matched: true });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return best.category;
|
|
163
|
+
}
|
|
164
|
+
function classifyTool(tool) {
|
|
165
|
+
var _a;
|
|
166
|
+
for (const [cat, rule] of CATEGORY_CONFIG) {
|
|
167
|
+
if ((_a = rule.tools) == null ? void 0 : _a.includes(tool)) return cat;
|
|
168
|
+
}
|
|
169
|
+
return "other";
|
|
170
|
+
}
|
|
171
|
+
function inputString(input, key) {
|
|
172
|
+
return typeof (input == null ? void 0 : input[key]) === "string" ? input[key] : "";
|
|
173
|
+
}
|
|
174
|
+
function classifyToolCategory(tool, input) {
|
|
175
|
+
const filePath = inputString(input, "file_path") || inputString(input, "notebook_path") || inputString(input, "path");
|
|
176
|
+
if (filePath.includes("/.claude/plans/")) return "plan";
|
|
177
|
+
const cat = classifyTool(tool);
|
|
178
|
+
if (cat === "other" && tool === "Bash") return classifyCommand(inputString(input, "command"));
|
|
179
|
+
return cat;
|
|
180
|
+
}
|
|
181
|
+
function eventCategory(event) {
|
|
182
|
+
if (event.kind !== "tool") return null;
|
|
183
|
+
return classifyToolCategory(event.tool ?? "", event.toolInput);
|
|
184
|
+
}
|
|
185
|
+
function isEventVisible(event, v) {
|
|
186
|
+
if (event.kind === "thinking") return v.showThinking;
|
|
187
|
+
if (event.kind !== "tool") return true;
|
|
188
|
+
const tool = event.tool ?? "";
|
|
189
|
+
if (v.hiddenTools.has(tool)) return false;
|
|
190
|
+
if (v.hiddenCategories.has(classifyToolCategory(tool, event.toolInput))) return false;
|
|
191
|
+
if (event.source && v.hiddenSources.has(event.source)) return false;
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
function collectSessionFilters(events) {
|
|
195
|
+
const categories = /* @__PURE__ */ new Set();
|
|
196
|
+
const tools = /* @__PURE__ */ new Map();
|
|
197
|
+
const sources = /* @__PURE__ */ new Set();
|
|
198
|
+
for (const event of events) {
|
|
199
|
+
if (event.kind !== "tool") continue;
|
|
200
|
+
const tool = event.tool ?? "";
|
|
201
|
+
categories.add(classifyToolCategory(tool, event.toolInput));
|
|
202
|
+
if (!tools.has(tool)) tools.set(tool, SessionViewer_model.getSessionAction(tool).label);
|
|
203
|
+
if (event.source) sources.add(event.source);
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
categories: [...categories].sort(
|
|
207
|
+
(a, b) => CATEGORY_PRIORITY[b] - CATEGORY_PRIORITY[a] || a.localeCompare(b)
|
|
208
|
+
),
|
|
209
|
+
tools: [...tools].map(([key, label]) => ({ key, label })).sort((a, b) => a.label.localeCompare(b.label)),
|
|
210
|
+
sources: [...sources].sort()
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
exports.CATEGORY_LABELS = CATEGORY_LABELS;
|
|
214
|
+
exports.classifyCommand = classifyCommand;
|
|
215
|
+
exports.classifyToolCategory = classifyToolCategory;
|
|
216
|
+
exports.collectSessionFilters = collectSessionFilters;
|
|
217
|
+
exports.eventCategory = eventCategory;
|
|
218
|
+
exports.isEventVisible = isEventVisible;
|
|
219
|
+
//# sourceMappingURL=session-categories.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-categories.cjs","sources":["../../../src/data/ai/session-categories.ts"],"sourcesContent":["import { getSessionAction, type SessionEvent } from \"./SessionViewer.model\";\n\n// ── Captain category taxonomy ───────────────────────────────────────────────\n// A faithful TypeScript port of captain's `pkg/bash` category classifier\n// (`category.go` + `category_config.yaml`) so the SessionViewer's filter mirrors\n// what `captain history --category` / `--tool` expose. A tool maps to a category\n// either directly (Read → explore, Edit → edit, …) or, for Bash, by classifying\n// the command string.\n\nexport type SessionCategory =\n | \"build\"\n | \"test\"\n | \"install\"\n | \"explore\"\n | \"lint\"\n | \"cleanup\"\n | \"git\"\n | \"docker\"\n | \"k8s\"\n | \"run\"\n | \"plan\"\n | \"edit\"\n | \"clarify\"\n | \"read\"\n | \"other\";\n\nexport const CATEGORY_LABELS: Record<SessionCategory, string> = {\n build: \"Build\",\n test: \"Test\",\n install: \"Install\",\n explore: \"Explore\",\n lint: \"Lint\",\n cleanup: \"Cleanup\",\n git: \"Git\",\n docker: \"Docker\",\n k8s: \"Kubernetes\",\n run: \"Run\",\n plan: \"Plan\",\n edit: \"Edit\",\n clarify: \"Clarify\",\n read: \"Read\",\n other: \"Other\",\n};\n\nconst CATEGORY_PRIORITY: Record<SessionCategory, number> = {\n install: 100,\n edit: 90,\n run: 80,\n test: 70,\n build: 60,\n cleanup: 50,\n docker: 40,\n k8s: 40,\n git: 30,\n explore: 20,\n lint: 20,\n plan: 20,\n read: 15,\n clarify: 10,\n other: 0,\n};\n\ninterface CategoryRule {\n tools?: string[];\n commands?: string[];\n patterns?: string[];\n}\n\n// Mirrors pkg/bash/category_config.yaml. Order is irrelevant — ties resolve by\n// match specificity, then priority, then category name (see chooseBetterMatch).\nconst CATEGORY_CONFIG: Array<[SessionCategory, CategoryRule]> = [\n [\n \"build\",\n {\n commands: [\"go build\", \"make build\", \"make all\", \"cargo build\", \"npm run build\", \"yarn build\", \"task build\", \"gradle build\", \"mvn compile\", \"mvn package\", \"dotnet build\", \"pnpm build\", \"bun build\", \"mage\", \"bazel build\", \"nx build\", \"turbo build\", \"javac\"],\n patterns: [\".*gradle.*(build|compile|bootJar|jar).*\", \".*mvn.*(compile|package)\", \"^go build\", \"^make\\\\s*$\", \"^make\\\\s+(build|all)\\\\b\", \"^cargo build\", \"^task build\"],\n },\n ],\n [\n \"test\",\n {\n commands: [\"go test\", \"pytest\", \"npm test\", \"yarn test\", \"task test\", \"make test\", \"cargo test\", \"mvn test\", \"gradle test\", \"vitest\", \"jest\", \"bun test\", \"dotnet test\", \"ginkgo\", \"gotestsum\", \"zig test\"],\n patterns: [\".*gradle.*test\", \".*mvn.*test\", \"^go test\", \"^pytest\", \"^npm (run )?test\", \"^make\\\\s+test\", \"^vitest\", \"^jest\", \"^bun test\", \"^ginkgo\", \"^gotestsum\"],\n },\n ],\n [\n \"install\",\n {\n commands: [\"npm install\", \"npm i\", \"yarn install\", \"yarn add\", \"go mod tidy\", \"go mod download\", \"go get\", \"pip install\", \"pip3 install\", \"cargo add\", \"brew install\", \"apt install\", \"apt-get install\", \"pnpm install\", \"pnpm add\", \"bun install\", \"bun add\", \"poetry install\", \"poetry add\", \"uv pip install\", \"pdm install\", \"pdm add\"],\n patterns: [\"^npm (install|i)\\\\b\", \"^yarn (install|add)\\\\b\", \"^pip3? install\", \"^go (mod tidy|mod download|get)\", \"^pnpm (install|add)\\\\b\", \"^bun (install|add)\\\\b\", \"^poetry (install|add)\\\\b\", \"^uv pip install\", \"^pdm (install|add)\\\\b\"],\n },\n ],\n [\n \"explore\",\n {\n tools: [\"Read\", \"Grep\", \"Glob\", \"LSP\", \"WebFetch\", \"WebSearch\"],\n commands: [\"ls\", \"md5\", \"echo\", \"find\", \"grep\", \"rg\", \"ag\", \"cat\", \"head\", \"tail\", \"less\", \"more\", \"tree\", \"wc\", \"file\", \"stat\", \"du\", \"df\", \"pwd\", \"which\", \"whereis\", \"type\", \"fd\", \"bat\", \"exa\", \"eza\", \"fzf\", \"jq\", \"yq\", \"ripgrep\", \"sd\", \"diff\", \"go list\", \"git status\", \"git diff\", \"git log\", \"ps\", \"printenv\", \"sed\"],\n patterns: [\"^ls\\\\b\", \"^find\\\\b\", \"^grep\\\\b\", \"^rg\\\\b\", \"^cat\\\\b\", \"^head\\\\b\", \"^tail\\\\b\", \"^tree\\\\b\", \"^fd\\\\b\", \"^bat\\\\b\", \"^exa\\\\b\", \"^eza\\\\b\", \"^jq\\\\b\", \"^yq\\\\b\", \"^diff\\\\b\", \"^go list\\\\b\", \"^git\\\\s+(status|diff|log)\\\\b\"],\n },\n ],\n [\n \"lint\",\n {\n commands: [\"golangci-lint\", \"eslint\", \"gofmt\", \"go fmt\", \"prettier\", \"black\", \"flake8\", \"pylint\", \"rubocop\", \"shellcheck\", \"task fmt\", \"make fmt\", \"make lint\", \"biome\", \"ruff\", \"mypy\", \"staticcheck\", \"buf lint\", \"deno lint\", \"oxlint\"],\n patterns: [\"lint\", \"^go fmt\", \"^gofmt\", \"^prettier\", \"^black\\\\b\", \"^biome\\\\b\", \"^ruff\\\\b\", \"^mypy\\\\b\", \"^staticcheck\\\\b\"],\n },\n ],\n [\n \"cleanup\",\n {\n commands: [\"rm\", \"rmdir\", \"git clean\", \"make clean\", \"cargo clean\", \"go clean\", \"npm cache clean\", \"docker prune\", \"docker system prune\"],\n patterns: [\"^rm\\\\b\", \"^rmdir\\\\b\", \"clean\\\\b\", \"prune\\\\b\"],\n },\n ],\n [\n \"git\",\n {\n commands: [\"git show\", \"git branch\", \"git checkout\", \"git switch\", \"git commit\", \"git push\", \"git pull\", \"git fetch\", \"git merge\", \"git rebase\", \"git stash\", \"git add\", \"git reset\", \"git clone\", \"git remote\", \"git tag\"],\n patterns: [\"^git\\\\b\"],\n },\n ],\n [\n \"docker\",\n {\n commands: [\"docker run\", \"docker build\", \"docker push\", \"docker pull\", \"docker ps\", \"docker images\", \"docker logs\", \"docker exec\", \"docker stop\", \"docker start\", \"docker rm\", \"docker rmi\", \"docker-compose\", \"podman\"],\n patterns: [\"^docker\\\\b\", \"^docker-compose\\\\b\", \"^podman\\\\b\"],\n },\n ],\n [\n \"k8s\",\n {\n commands: [\"kubectl\", \"helm\", \"k9s\", \"kubectx\", \"kubens\", \"kustomize\", \"minikube\", \"kind\"],\n patterns: [\"^kubectl\\\\b\", \"^helm\\\\b\", \"^k9s\\\\b\", \"^kubectx\\\\b\", \"^kubens\\\\b\", \"^kustomize\\\\b\", \"^minikube\\\\b\", \"^kind\\\\b\"],\n },\n ],\n [\n \"run\",\n {\n tools: [\"KillShell\"],\n commands: [\"go run\", \"python\", \"python3\", \"node\", \"bun run\", \"deno run\", \"ruby\", \"perl\", \"php\", \"java\"],\n patterns: [\".*gradle.*run.*\", \"^go run\\\\b\", \"^python3?\\\\b\", \"^node\\\\b\", \"^bun run\\\\b\", \"^deno run\\\\b\", \"^ruby\\\\b\", \"^perl\\\\b\", \"^php\\\\b\", \"^java\\\\s+-jar\\\\b\", \"^\\\\./[\\\\w.-]+\\\\.(sh|bash|py|rb|pl)$\", \"^bash\\\\s+\\\\S+\\\\.sh\"],\n },\n ],\n [\n \"plan\",\n {\n tools: [\"Task\", \"TodoWrite\", \"EnterPlanMode\"],\n commands: [\"task\", \"make help\", \"task explore\", \"task plan\", \"task todos\", \"task todo\"],\n patterns: [\"^task\\\\s*$\", \"^task\\\\s+--list\", \"^make\\\\s+help\"],\n },\n ],\n [\n \"edit\",\n {\n tools: [\"Edit\", \"Write\", \"NotebookEdit\"],\n commands: [\"mkdir\"],\n patterns: [\"sed.* -i\"],\n },\n ],\n [\"clarify\", { tools: [\"AskUserQuestion\", \"ExitPlanMode\", \"TaskOutput\"] }],\n];\n\nconst COMPILED: Array<[SessionCategory, RegExp[]]> = CATEGORY_CONFIG.map(([cat, rule]) => [\n cat,\n (rule.patterns ?? []).map((p) => new RegExp(p)),\n]);\n\ninterface CategoryMatch {\n category: SessionCategory;\n specificity: number;\n matched: boolean;\n}\n\n// Port of betterCategoryMatch: prefer higher match specificity, then higher\n// category priority, then the lexicographically smaller name.\nfunction chooseBetterMatch(current: CategoryMatch, candidate: CategoryMatch): CategoryMatch {\n if (!candidate.matched || candidate.category === \"other\") return current;\n if (!current.matched || current.category === \"other\") return candidate;\n if (candidate.specificity > current.specificity) return candidate;\n if (candidate.specificity < current.specificity) return current;\n const cp = CATEGORY_PRIORITY[candidate.category];\n const kp = CATEGORY_PRIORITY[current.category];\n if (cp > kp) return candidate;\n if (cp < kp) return current;\n return candidate.category < current.category ? candidate : current;\n}\n\n/** Classify a raw shell command, mirroring captain's `Classify`. */\nexport function classifyCommand(command: string): SessionCategory {\n const cmd = command.trim();\n if (!cmd) return \"other\";\n let best: CategoryMatch = { category: \"other\", specificity: 0, matched: false };\n for (const [cat, rule] of CATEGORY_CONFIG) {\n for (const prefix of rule.commands ?? []) {\n if (cmd === prefix || cmd.startsWith(`${prefix} `)) {\n best = chooseBetterMatch(best, { category: cat, specificity: prefix.length, matched: true });\n }\n }\n }\n for (const [cat, regexps] of COMPILED) {\n for (const re of regexps) {\n if (re.test(cmd)) {\n best = chooseBetterMatch(best, { category: cat, specificity: re.source.length, matched: true });\n }\n }\n }\n return best.category;\n}\n\nfunction classifyTool(tool: string): SessionCategory {\n for (const [cat, rule] of CATEGORY_CONFIG) {\n if (rule.tools?.includes(tool)) return cat;\n }\n return \"other\";\n}\n\nfunction inputString(input: Record<string, unknown> | undefined, key: string): string {\n return typeof input?.[key] === \"string\" ? (input[key] as string) : \"\";\n}\n\n/** Category for a tool invocation, mirroring captain's classifyToolUse: a\n * `.claude/plans/` path is plan; a Bash command falls through to command\n * classification when the tool itself is uncategorized. */\nexport function classifyToolCategory(tool: string, input?: Record<string, unknown>): SessionCategory {\n const filePath =\n inputString(input, \"file_path\") || inputString(input, \"notebook_path\") || inputString(input, \"path\");\n if (filePath.includes(\"/.claude/plans/\")) return \"plan\";\n const cat = classifyTool(tool);\n if (cat === \"other\" && tool === \"Bash\") return classifyCommand(inputString(input, \"command\"));\n return cat;\n}\n\n/** The category of a normalized event, or null for non-tool events. */\nexport function eventCategory(event: SessionEvent): SessionCategory | null {\n if (event.kind !== \"tool\") return null;\n return classifyToolCategory(event.tool ?? \"\", event.toolInput);\n}\n\nexport interface SessionFilters {\n /** Distinct categories present, ordered by descending impact priority. */\n categories: SessionCategory[];\n /** Distinct tools present, with display labels, ordered by label. */\n tools: Array<{ key: string; label: string }>;\n /** Distinct sources present (e.g. \"claude\", \"codex\"). */\n sources: string[];\n}\n\nexport interface SessionVisibility {\n hiddenCategories: ReadonlySet<SessionCategory>;\n hiddenTools: ReadonlySet<string>;\n hiddenSources: ReadonlySet<string>;\n /** When false, reasoning (\"thinking\") events are hidden. */\n showThinking: boolean;\n}\n\n/** Whether an event survives the active filters. Tool events are gated by their\n * tool, category and source; reasoning by `showThinking`; everything else\n * (user/assistant/error) is always shown. */\nexport function isEventVisible(event: SessionEvent, v: SessionVisibility): boolean {\n if (event.kind === \"thinking\") return v.showThinking;\n if (event.kind !== \"tool\") return true;\n const tool = event.tool ?? \"\";\n if (v.hiddenTools.has(tool)) return false;\n if (v.hiddenCategories.has(classifyToolCategory(tool, event.toolInput))) return false;\n if (event.source && v.hiddenSources.has(event.source)) return false;\n return true;\n}\n\n/** Collect the filter facets (category / tool / source) present in a session. */\nexport function collectSessionFilters(events: SessionEvent[]): SessionFilters {\n const categories = new Set<SessionCategory>();\n const tools = new Map<string, string>();\n const sources = new Set<string>();\n for (const event of events) {\n if (event.kind !== \"tool\") continue;\n const tool = event.tool ?? \"\";\n categories.add(classifyToolCategory(tool, event.toolInput));\n if (!tools.has(tool)) tools.set(tool, getSessionAction(tool).label);\n if (event.source) sources.add(event.source);\n }\n return {\n categories: [...categories].sort(\n (a, b) => CATEGORY_PRIORITY[b] - CATEGORY_PRIORITY[a] || a.localeCompare(b),\n ),\n tools: [...tools].map(([key, label]) => ({ key, label })).sort((a, b) => a.label.localeCompare(b.label)),\n sources: [...sources].sort(),\n };\n}\n"],"names":["getSessionAction"],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { SessionEvent } from './SessionViewer.model';
|
|
2
|
+
export type SessionCategory = "build" | "test" | "install" | "explore" | "lint" | "cleanup" | "git" | "docker" | "k8s" | "run" | "plan" | "edit" | "clarify" | "read" | "other";
|
|
3
|
+
export declare const CATEGORY_LABELS: Record<SessionCategory, string>;
|
|
4
|
+
/** Classify a raw shell command, mirroring captain's `Classify`. */
|
|
5
|
+
export declare function classifyCommand(command: string): SessionCategory;
|
|
6
|
+
/** Category for a tool invocation, mirroring captain's classifyToolUse: a
|
|
7
|
+
* `.claude/plans/` path is plan; a Bash command falls through to command
|
|
8
|
+
* classification when the tool itself is uncategorized. */
|
|
9
|
+
export declare function classifyToolCategory(tool: string, input?: Record<string, unknown>): SessionCategory;
|
|
10
|
+
/** The category of a normalized event, or null for non-tool events. */
|
|
11
|
+
export declare function eventCategory(event: SessionEvent): SessionCategory | null;
|
|
12
|
+
export interface SessionFilters {
|
|
13
|
+
/** Distinct categories present, ordered by descending impact priority. */
|
|
14
|
+
categories: SessionCategory[];
|
|
15
|
+
/** Distinct tools present, with display labels, ordered by label. */
|
|
16
|
+
tools: Array<{
|
|
17
|
+
key: string;
|
|
18
|
+
label: string;
|
|
19
|
+
}>;
|
|
20
|
+
/** Distinct sources present (e.g. "claude", "codex"). */
|
|
21
|
+
sources: string[];
|
|
22
|
+
}
|
|
23
|
+
export interface SessionVisibility {
|
|
24
|
+
hiddenCategories: ReadonlySet<SessionCategory>;
|
|
25
|
+
hiddenTools: ReadonlySet<string>;
|
|
26
|
+
hiddenSources: ReadonlySet<string>;
|
|
27
|
+
/** When false, reasoning ("thinking") events are hidden. */
|
|
28
|
+
showThinking: boolean;
|
|
29
|
+
}
|
|
30
|
+
/** Whether an event survives the active filters. Tool events are gated by their
|
|
31
|
+
* tool, category and source; reasoning by `showThinking`; everything else
|
|
32
|
+
* (user/assistant/error) is always shown. */
|
|
33
|
+
export declare function isEventVisible(event: SessionEvent, v: SessionVisibility): boolean;
|
|
34
|
+
/** Collect the filter facets (category / tool / source) present in a session. */
|
|
35
|
+
export declare function collectSessionFilters(events: SessionEvent[]): SessionFilters;
|
|
36
|
+
//# sourceMappingURL=session-categories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-categories.d.ts","sourceRoot":"","sources":["../../../src/data/ai/session-categories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAS5E,MAAM,MAAM,eAAe,GACvB,OAAO,GACP,MAAM,GACN,SAAS,GACT,SAAS,GACT,MAAM,GACN,SAAS,GACT,KAAK,GACL,QAAQ,GACR,KAAK,GACL,KAAK,GACL,MAAM,GACN,MAAM,GACN,SAAS,GACT,MAAM,GACN,OAAO,CAAC;AAEZ,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAgB3D,CAAC;AAiJF,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAmBhE;AAaD;;4DAE4D;AAC5D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAOnG;AAED,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,eAAe,GAAG,IAAI,CAGzE;AAED,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,qEAAqE;IACrE,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,yDAAyD;IACzD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC;IAC/C,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,4DAA4D;IAC5D,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;8CAE8C;AAC9C,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAQjF;AAED,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,cAAc,CAkB5E"}
|