@grackle-ai/web-components 0.115.1 → 0.116.0

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.
Files changed (55) hide show
  1. package/.rush/temp/chunked-rush-logs/web-components._phase_build.chunks.jsonl +6 -6
  2. package/.rush/temp/chunked-rush-logs/web-components._phase_test.chunks.jsonl +26 -28
  3. package/.rush/temp/{689afee5625b24607e65ba3a6d3b279d5895784d.tar.log → f238c174d295031bec7f186733732e0fd7e4b9a5.tar.log} +55 -60
  4. package/.rush/temp/{689afee5625b24607e65ba3a6d3b279d5895784d.untar.log → f238c174d295031bec7f186733732e0fd7e4b9a5.untar.log} +2 -2
  5. package/.rush/temp/{e12a67384bc67b4cba24253105ba33ed0945c91d.tar.log → f5301e6a84109dcec06242d178df01e555a83456.tar.log} +2 -2
  6. package/.rush/temp/{e12a67384bc67b4cba24253105ba33ed0945c91d.untar.log → f5301e6a84109dcec06242d178df01e555a83456.untar.log} +2 -2
  7. package/.rush/temp/operation/_phase_build/all.log +6 -6
  8. package/.rush/temp/operation/_phase_build/log-chunks.jsonl +6 -6
  9. package/.rush/temp/operation/_phase_build/state.json +1 -1
  10. package/.rush/temp/operation/_phase_test/all.log +26 -28
  11. package/.rush/temp/operation/_phase_test/log-chunks.jsonl +26 -28
  12. package/.rush/temp/operation/_phase_test/state.json +1 -1
  13. package/.rush/temp/shrinkwrap-deps.json +3 -3
  14. package/README.md +2 -2
  15. package/dist/index.css +1 -1
  16. package/dist/index.js +9055 -9498
  17. package/package.json +2 -2
  18. package/rush-logs/web-components._phase_build.cache.log +1 -1
  19. package/rush-logs/web-components._phase_build.log +6 -6
  20. package/rush-logs/web-components._phase_test.cache.log +1 -1
  21. package/rush-logs/web-components._phase_test.log +26 -28
  22. package/src/components/index.ts +0 -3
  23. package/src/components/knowledge/KnowledgeDetailPanel.tsx +1 -4
  24. package/src/components/layout/AppNav.stories.tsx +3 -6
  25. package/src/components/layout/AppNav.tsx +3 -7
  26. package/src/components/layout/BottomStatusBar.tsx +4 -6
  27. package/src/components/lists/index.ts +0 -1
  28. package/src/components/panels/KeyboardShortcutsPanel.tsx +0 -1
  29. package/src/components/panels/index.ts +0 -1
  30. package/src/components/personas/McpToolSelector.stories.tsx +12 -12
  31. package/src/components/tools/ToolCard.stories.tsx +0 -26
  32. package/src/components/tools/ToolCard.tsx +0 -3
  33. package/src/components/tools/ToolSearchCard.stories.tsx +8 -8
  34. package/src/components/tools/WorkpadCard.stories.tsx +5 -5
  35. package/src/components/tools/classifyTool.test.ts +0 -1
  36. package/src/components/tools/classifyTool.ts +2 -7
  37. package/src/context/GrackleContextTypes.ts +1 -3
  38. package/src/hooks/types.ts +1 -44
  39. package/src/index.ts +4 -8
  40. package/src/mocks/MockGrackleProvider.tsx +0 -75
  41. package/src/mocks/mockData.ts +8 -99
  42. package/src/test-utils/storybook-helpers.ts +0 -19
  43. package/src/utils/breadcrumbs.test.ts +0 -43
  44. package/src/utils/breadcrumbs.ts +1 -37
  45. package/src/utils/navigation.ts +1 -20
  46. package/src/utils/route-config.test.ts +0 -31
  47. package/temp/build/lint/_eslint-5eVG3S6w.json +30 -54
  48. package/src/components/lists/FindingsNav.module.scss +0 -126
  49. package/src/components/lists/FindingsNav.tsx +0 -146
  50. package/src/components/panels/FindingsPanel.module.scss +0 -94
  51. package/src/components/panels/FindingsPanel.stories.tsx +0 -109
  52. package/src/components/panels/FindingsPanel.tsx +0 -76
  53. package/src/components/tools/FindingCard.stories.tsx +0 -124
  54. package/src/components/tools/FindingCard.tsx +0 -178
  55. package/src/utils/findingCategory.ts +0 -33
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grackle-ai/web-components",
3
- "version": "0.115.1",
3
+ "version": "0.116.0",
4
4
  "description": "Presentational React component library for the Grackle web UI",
5
5
  "license": "MIT",
6
6
  "sideEffects": [
@@ -46,7 +46,7 @@
46
46
  "remark-gfm": "^4.0.0",
47
47
  "lucide-react": "~0.474.0",
48
48
  "react-router": "^7.0.0",
49
- "@grackle-ai/common": "0.115.1"
49
+ "@grackle-ai/common": "0.116.0"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@rushstack/heft": "1.2.7",
@@ -1,4 +1,4 @@
1
1
  Build cache hit.
2
- Cache key: 689afee5625b24607e65ba3a6d3b279d5895784d
2
+ Cache key: f238c174d295031bec7f186733732e0fd7e4b9a5
3
3
  Clearing cached folders: dist, storybook-static, .rush/temp/operation/_phase_build
4
4
  Successfully restored output from the build cache.
@@ -7,13 +7,13 @@ Invoking: heft run --only build -- --clean
7
7
  [build:lint] Using ESLint version 9.39.4
8
8
  vite v6.4.2 building for production...
9
9
  transforming...
10
- 2718 modules transformed.
10
+ 2712 modules transformed.
11
11
  rendering chunks...
12
12
  computing gzip size...
13
- dist/index.css 159.65 kB │ gzip: 20.78 kB
13
+ dist/index.css 155.14 kB │ gzip: 20.34 kB
14
14
  dist/McpAppWidget-CSX2W2Vb.js 205.28 kB │ gzip: 47.19 kB
15
- dist/index.js 1,392.84 kB │ gzip: 356.12 kB
16
- ✓ built in 5.74s
15
+ dist/index.js 1,374.93 kB │ gzip: 352.80 kB
16
+ ✓ built in 5.75s
17
17
  [build:vite-build] Vite build completed.
18
- ---- build finished (75.038s) ----
19
- -------------------- Finished (75.045s) --------------------
18
+ ---- build finished (50.985s) ----
19
+ -------------------- Finished (50.988s) --------------------
@@ -1,4 +1,4 @@
1
1
  Build cache hit.
2
- Cache key: e12a67384bc67b4cba24253105ba33ed0945c91d
2
+ Cache key: f5301e6a84109dcec06242d178df01e555a83456
3
3
  Clearing cached folders: .rush/temp/operation/_phase_test
4
4
  Successfully restored output from the build cache.
@@ -5,32 +5,30 @@ The provided list of phases does not contain all phase dependencies. You may nee
5
5
 
6
6
  RUN v3.2.4 /home/runner/work/grackle/grackle/packages/web-components
7
7
 
8
- ✓ src/utils/sessionEvents.test.ts (14 tests) 45ms
9
- ✓ src/utils/eventContent.test.ts (38 tests) 118ms
10
- ✓ src/utils/dashboard.test.ts (4 tests) 23ms
11
- ✓ src/utils/route-config.test.ts (23 tests) 53ms
12
- ✓ src/utils/streamCoordination.test.ts (10 tests) 26ms
13
- ✓ src/utils/breadcrumbs.test.ts (18 tests) 43ms
14
- ✓ src/utils/scrollUtils.test.ts (11 tests) 39ms
15
- ✓ src/components/tools/classifyTool.test.ts (6 tests) 17ms
16
- ✓ src/utils/assetUrl.test.ts (3 tests) 11ms
17
- ✓ src/components/tools/toolCardHelpers.test.ts (10 tests) 18ms
18
- ✓ src/components/display/extractText.test.tsx (8 tests) 33ms
8
+ ✓ src/utils/sessionEvents.test.ts (14 tests) 46ms
9
+ ✓ src/utils/eventContent.test.ts (38 tests) 129ms
10
+ ✓ src/utils/dashboard.test.ts (4 tests) 9ms
11
+ ✓ src/utils/streamCoordination.test.ts (10 tests) 20ms
12
+ ✓ src/utils/route-config.test.ts (16 tests) 27ms
13
+ ✓ src/utils/breadcrumbs.test.ts (15 tests) 15ms
14
+ ✓ src/utils/scrollUtils.test.ts (11 tests) 21ms
15
+ ✓ src/components/tools/classifyTool.test.ts (6 tests) 11ms
16
+ ✓ src/components/tools/toolCardHelpers.test.ts (10 tests) 25ms
17
+ ✓ src/utils/assetUrl.test.ts (3 tests) 14ms
18
+ ✓ src/components/display/extractText.test.tsx (8 tests) 22ms
19
+ ✓ src/hooks/useEventSelection.test.ts (13 tests) 180ms
19
20
  ✓ src/components/editable/useEditableField.test.tsx (17 tests) 159ms
20
- ✓ src/hooks/useEventSelection.test.ts (13 tests) 175ms
21
- ✓ src/components/display/McpAppWidget.test.tsx (3 tests) 594ms
22
- ✓ McpAppWidget > mounts an iframe host for the widget 399ms
23
- ✓ src/components/notifications/UpdateBanner.test.tsx (4 tests) 124ms
24
- ✓ src/utils/grackleHostStyleVariables.test.ts (2 tests) 465ms
25
- ✓ grackleHostStyleVariables > always returns the MCP-standard fallback variables 443ms
21
+ ✓ src/components/notifications/UpdateBanner.test.tsx (4 tests) 95ms
22
+ ✓ src/utils/grackleHostStyleVariables.test.ts (2 tests) 195ms
23
+ src/components/display/McpAppWidget.test.tsx (3 tests) 361ms
26
24
 
27
25
  Test Files 16 passed (16)
28
- Tests 184 passed (184)
29
- Start at 14:11:00
30
- Duration 16.59s (transform 2.42s, setup 0ms, collect 18.42s, tests 1.94s, environment 11.64s, prepare 5.10s)
26
+ Tests 174 passed (174)
27
+ Start at 23:49:50
28
+ Duration 15.38s (transform 2.97s, setup 0ms, collect 14.70s, tests 1.33s, environment 12.10s, prepare 5.21s)
31
29
 
32
30
  [test:vitest] Vitest completed.
33
- [test:storybook-test] Starting Storybook static server on port 34877...
31
+ [test:storybook-test] Starting Storybook static server on port 45217...
34
32
  [test:storybook-test] Storybook server ready. Running interaction tests...
35
33
  jest-haste-map: duplicate manual mock found: adapter-manager
36
34
  The following files share their name; please delete one of them:
@@ -97,16 +95,16 @@ jest-haste-map: duplicate manual mock found: stream-hub
97
95
  * <rootDir>/packages/server/dist/__mocks__/stream-hub.js
98
96
  * <rootDir>/packages/server/src/__mocks__/stream-hub.ts
99
97
 
100
- jest-haste-map: duplicate manual mock found: token-push
101
- The following files share their name; please delete one of them:
102
- * <rootDir>/packages/server/dist/__mocks__/token-push.js
103
- * <rootDir>/packages/server/src/__mocks__/token-push.ts
104
-
105
98
  jest-haste-map: duplicate manual mock found: stream-registry
106
99
  The following files share their name; please delete one of them:
107
100
  * <rootDir>/packages/server/dist/__mocks__/stream-registry.js
108
101
  * <rootDir>/packages/server/src/__mocks__/stream-registry.ts
109
102
 
103
+ jest-haste-map: duplicate manual mock found: token-push
104
+ The following files share their name; please delete one of them:
105
+ * <rootDir>/packages/server/dist/__mocks__/token-push.js
106
+ * <rootDir>/packages/server/src/__mocks__/token-push.ts
107
+
110
108
  jest-haste-map: duplicate manual mock found: utils/exec
111
109
  The following files share their name; please delete one of them:
112
110
  * <rootDir>/packages/server/dist/__mocks__/utils/exec.js
@@ -123,5 +121,5 @@ jest-haste-map: duplicate manual mock found: utils/network
123
121
  * <rootDir>/packages/server/src/__mocks__/utils/network.ts
124
122
 
125
123
  [test:storybook-test] Storybook interaction tests completed.
126
- ---- test finished (115.192s) ----
127
- -------------------- Finished (115.202s) --------------------
124
+ ---- test finished (74.932s) ----
125
+ -------------------- Finished (74.942s) --------------------
@@ -6,9 +6,6 @@
6
6
  // Layout components - application shell structure
7
7
  export { StatusBar, Sidebar, BottomStatusBar } from "./layout/index.js";
8
8
 
9
- // Panel components - main content areas
10
- export { FindingsPanel } from "./panels/index.js";
11
-
12
9
  // List components - sidebar navigation
13
10
  export { EnvironmentNav } from "./lists/index.js";
14
11
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  import { useMemo, type JSX } from "react";
8
8
  import type { GraphNode, NodeDetail } from "../../hooks/types.js";
9
- import { taskUrl, sessionUrl, findingUrl } from "../../utils/navigation.js";
9
+ import { taskUrl, sessionUrl } from "../../utils/navigation.js";
10
10
  import { useAppNavigate } from "../../utils/navigation.js";
11
11
  import styles from "./KnowledgeDetailPanel.module.scss";
12
12
 
@@ -40,9 +40,6 @@ export function KnowledgeDetailPanel({
40
40
  case "session":
41
41
  navigate(sessionUrl(node.sourceId));
42
42
  break;
43
- case "finding":
44
- navigate(findingUrl(node.sourceId));
45
- break;
46
43
  default:
47
44
  break;
48
45
  }
@@ -1,9 +1,9 @@
1
1
  import type { Meta, StoryObj } from "@storybook/react";
2
2
  import { expect, userEvent } from "@storybook/test";
3
- import { Brain, ClipboardList, Home, MessageSquare, Monitor, Search, Settings } from "lucide-react";
3
+ import { Brain, ClipboardList, Home, MessageSquare, Monitor, Settings } from "lucide-react";
4
4
  import { AppNav } from "./AppNav.js";
5
5
  import { ICON_LG } from "../../utils/iconSize.js";
6
- import { HOME_URL, CHAT_URL, ENVIRONMENTS_URL, SETTINGS_CREDENTIALS_URL, TASKS_URL, FINDINGS_URL, KNOWLEDGE_URL } from "../../utils/navigation.js";
6
+ import { HOME_URL, CHAT_URL, ENVIRONMENTS_URL, SETTINGS_CREDENTIALS_URL, TASKS_URL, KNOWLEDGE_URL } from "../../utils/navigation.js";
7
7
 
8
8
  const meta: Meta<typeof AppNav> = {
9
9
  title: "Grackle/Layout/AppNav",
@@ -25,7 +25,7 @@ export const AllTabsRendered: Story = {
25
25
  },
26
26
  };
27
27
 
28
- /** Core-only tabs: orchestration (Tasks, Findings) and knowledge tabs are absent. */
28
+ /** Core-only tabs: orchestration (Tasks) and knowledge tabs are absent. */
29
29
  export const CoreOnlyTabs: Story = {
30
30
  args: {
31
31
  tabs: [
@@ -55,13 +55,11 @@ export const AllTabsExplicit: Story = {
55
55
  { view: "tasks", label: "Tasks", icon: <ClipboardList size={ICON_LG} />, route: TASKS_URL, testId: "sidebar-tab-tasks" },
56
56
  { view: "environments", label: "Environments", icon: <Monitor size={ICON_LG} />, route: ENVIRONMENTS_URL, testId: "sidebar-tab-environments" },
57
57
  { view: "knowledge", label: "Knowledge", icon: <Brain size={ICON_LG} />, route: KNOWLEDGE_URL, testId: "sidebar-tab-knowledge" },
58
- { view: "findings", label: "Findings", icon: <Search size={ICON_LG} />, route: FINDINGS_URL, testId: "sidebar-tab-findings" },
59
58
  { view: "settings", label: "Settings", icon: <Settings size={ICON_LG} />, route: SETTINGS_CREDENTIALS_URL, testId: "sidebar-tab-settings" },
60
59
  ],
61
60
  },
62
61
  play: async ({ canvas }) => {
63
62
  await expect(canvas.getByRole("tab", { name: /Tasks/ })).toBeInTheDocument();
64
- await expect(canvas.getByRole("tab", { name: /Findings/ })).toBeInTheDocument();
65
63
  await expect(canvas.getByRole("tab", { name: /Knowledge/ })).toBeInTheDocument();
66
64
  },
67
65
  };
@@ -82,7 +80,6 @@ export const SettingsPinnedRight: Story = {
82
80
  { view: "environments", label: "Environments", icon: <Monitor size={ICON_LG} />, route: ENVIRONMENTS_URL, testId: "sidebar-tab-environments" },
83
81
  { view: "settings", label: "Settings", icon: <Settings size={ICON_LG} />, route: SETTINGS_CREDENTIALS_URL, testId: "sidebar-tab-settings", align: "end" },
84
82
  { view: "tasks", label: "Tasks", icon: <ClipboardList size={ICON_LG} />, route: TASKS_URL, testId: "sidebar-tab-tasks" },
85
- { view: "findings", label: "Findings", icon: <Search size={ICON_LG} />, route: FINDINGS_URL, testId: "sidebar-tab-findings" },
86
83
  { view: "knowledge", label: "Knowledge", icon: <Brain size={ICON_LG} />, route: KNOWLEDGE_URL, testId: "sidebar-tab-knowledge" },
87
84
  ],
88
85
  },
@@ -1,13 +1,13 @@
1
1
  import { useCallback, useMemo, useRef, type JSX, type KeyboardEvent, type ReactNode } from "react";
2
2
  import { useLocation } from "react-router";
3
- import { Brain, ClipboardList, Home, MessageSquare, Monitor, Network, Search, Settings } from "lucide-react";
4
- import { CHAT_URL, COORDINATION_URL, ENVIRONMENTS_URL, FINDINGS_URL, HOME_URL, KNOWLEDGE_URL, SETTINGS_URL, SETTINGS_CREDENTIALS_URL, TASKS_URL, useAppNavigate } from "../../utils/navigation.js";
3
+ import { Brain, ClipboardList, Home, MessageSquare, Monitor, Network, Settings } from "lucide-react";
4
+ import { CHAT_URL, COORDINATION_URL, ENVIRONMENTS_URL, HOME_URL, KNOWLEDGE_URL, SETTINGS_URL, SETTINGS_CREDENTIALS_URL, TASKS_URL, useAppNavigate } from "../../utils/navigation.js";
5
5
  import { ICON_LG } from "../../utils/iconSize.js";
6
6
  import { Tooltip } from "../display/Tooltip.js";
7
7
  import styles from "./AppNav.module.scss";
8
8
 
9
9
  /** Application view identifiers. */
10
- export type AppView = "dashboard" | "chat" | "tasks" | "environments" | "knowledge" | "findings" | "coordination" | "settings";
10
+ export type AppView = "dashboard" | "chat" | "tasks" | "environments" | "knowledge" | "coordination" | "settings";
11
11
 
12
12
  /** Tab definition for the application navigation bar. */
13
13
  export interface AppTab {
@@ -37,7 +37,6 @@ export const TABS: AppTab[] = [
37
37
  { view: "tasks", label: "Tasks", icon: <ClipboardList size={ICON_LG} />, route: TASKS_URL, testId: "sidebar-tab-tasks", order: 1 },
38
38
  { view: "environments", label: "Environments", icon: <Monitor size={ICON_LG} />, route: ENVIRONMENTS_URL, testId: "sidebar-tab-environments", order: 2 },
39
39
  { view: "chat", label: "Root", icon: <MessageSquare size={ICON_LG} />, route: CHAT_URL, testId: "sidebar-tab-chat", order: 3 },
40
- { view: "findings", label: "Findings", icon: <Search size={ICON_LG} />, route: FINDINGS_URL, testId: "sidebar-tab-findings", order: 4 },
41
40
  { view: "knowledge", label: "Knowledge", icon: <Brain size={ICON_LG} />, route: KNOWLEDGE_URL, testId: "sidebar-tab-knowledge", order: 5 },
42
41
  { view: "coordination", label: "Coordination", icon: <Network size={ICON_LG} />, route: COORDINATION_URL, testId: "sidebar-tab-coordination", order: 6 },
43
42
  { view: "settings", label: "Settings", icon: <Settings size={ICON_LG} />, route: SETTINGS_CREDENTIALS_URL, testId: "sidebar-tab-settings", align: "end" },
@@ -60,9 +59,6 @@ export function getActiveView(pathname: string): AppView {
60
59
  if (pathname.startsWith(KNOWLEDGE_URL)) {
61
60
  return "knowledge";
62
61
  }
63
- if (pathname.startsWith(FINDINGS_URL)) {
64
- return "findings";
65
- }
66
62
  if (pathname.startsWith(SETTINGS_URL)) {
67
63
  return "settings";
68
64
  }
@@ -30,11 +30,9 @@ export function BottomStatusBar({ sessions, tasks, environments }: BottomStatusB
30
30
  const sessionMatch = useMatch("/sessions/:sessionId");
31
31
  const taskMatch = useMatch("/tasks/:taskId");
32
32
  const taskStreamMatch = useMatch("/tasks/:taskId/stream");
33
- const taskFindingsMatch = useMatch("/tasks/:taskId/findings");
34
33
  const taskEditMatch = useMatch("/tasks/:taskId/edit");
35
34
  const wsTaskMatch = useMatch("/environments/:environmentId/workspaces/:workspaceId/tasks/:taskId");
36
35
  const wsTaskStreamMatch = useMatch("/environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/stream");
37
- const wsTaskFindingsMatch = useMatch("/environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/findings");
38
36
  const wsTaskEditMatch = useMatch("/environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/edit");
39
37
  const newChatMatch = useMatch("/sessions/new");
40
38
  const workspaceMatch = useMatch("/environments/:environmentId/workspaces/:workspaceId");
@@ -45,14 +43,14 @@ export function BottomStatusBar({ sessions, tasks, environments }: BottomStatusB
45
43
 
46
44
  // Derive current page context
47
45
  const sessionId = sessionMatch?.params.sessionId;
48
- const taskId = taskMatch?.params.taskId ?? taskStreamMatch?.params.taskId ?? taskFindingsMatch?.params.taskId
49
- ?? wsTaskMatch?.params.taskId ?? wsTaskStreamMatch?.params.taskId ?? wsTaskFindingsMatch?.params.taskId ?? wsTaskEditMatch?.params.taskId;
50
- const wsMatch = wsTaskMatch ?? wsTaskStreamMatch ?? wsTaskFindingsMatch ?? wsTaskEditMatch;
46
+ const taskId = taskMatch?.params.taskId ?? taskStreamMatch?.params.taskId
47
+ ?? wsTaskMatch?.params.taskId ?? wsTaskStreamMatch?.params.taskId ?? wsTaskEditMatch?.params.taskId;
48
+ const wsMatch = wsTaskMatch ?? wsTaskStreamMatch ?? wsTaskEditMatch;
51
49
  const routeEnvironmentId = wsMatch?.params.environmentId ?? workspaceMatch?.params.environmentId;
52
50
  const isEnvironments = location.pathname.startsWith("/environments") && !workspaceMatch && !wsMatch;
53
51
  const isChat = !!chatMatch;
54
52
  const isNewChat = !!newChatMatch;
55
- const isWorkspace = !!workspaceMatch && !wsTaskMatch && !wsTaskStreamMatch && !wsTaskFindingsMatch && !wsTaskEditMatch;
53
+ const isWorkspace = !!workspaceMatch && !wsTaskMatch && !wsTaskStreamMatch && !wsTaskEditMatch;
56
54
  const isNewTask = !!newTaskMatch;
57
55
  const isTaskEdit = !!taskEditMatch || !!wsTaskEditMatch;
58
56
  const isEmpty = !!emptyMatch && !isNewChat && !isWorkspace && !isNewTask;
@@ -3,4 +3,3 @@
3
3
  * @module lists
4
4
  */
5
5
  export { EnvironmentNav } from "./EnvironmentNav.js";
6
- export { FindingsNav } from "./FindingsNav.js";
@@ -33,7 +33,6 @@ const SHORTCUT_GROUPS: ShortcutGroup[] = [
33
33
  shortcuts: [
34
34
  { keys: ["1"], description: "Switch to Overview tab" },
35
35
  { keys: ["2"], description: "Switch to Stream tab" },
36
- { keys: ["3"], description: "Switch to Findings tab" },
37
36
  ],
38
37
  },
39
38
  {
@@ -2,7 +2,6 @@
2
2
  * Main content panel components.
3
3
  * @module panels
4
4
  */
5
- export { FindingsPanel } from "./FindingsPanel.js";
6
5
  export { TokensPanel } from "./TokensPanel.js";
7
6
  export { AppearancePanel } from "./AppearancePanel.js";
8
7
  export { AboutPanel } from "./AboutPanel.js";
@@ -58,13 +58,13 @@ export const WithPresetWorker: Story = {
58
58
 
59
59
  export const CustomSelection: Story = {
60
60
  args: {
61
- selectedTools: ["finding_post", "task_list", "workpad_read"],
61
+ selectedTools: ["task_show", "task_list", "workpad_read"],
62
62
  },
63
63
  play: async ({ canvasElement }) => {
64
64
  const canvas = within(canvasElement);
65
65
  // Verify selected tools are checked
66
- const findingPost = canvas.getByTestId("tool-finding_post") as HTMLInputElement;
67
- await expect(findingPost.checked).toBe(true);
66
+ const taskShow = canvas.getByTestId("tool-task_show") as HTMLInputElement;
67
+ await expect(taskShow.checked).toBe(true);
68
68
  const taskList = canvas.getByTestId("tool-task_list") as HTMLInputElement;
69
69
  await expect(taskList.checked).toBe(true);
70
70
  // Verify unselected tool is not checked
@@ -78,8 +78,8 @@ export const CustomSelection: Story = {
78
78
  export const ToggleIndividualTool: Story = {
79
79
  play: async ({ canvasElement, args }) => {
80
80
  const canvas = within(canvasElement);
81
- await userEvent.click(canvas.getByTestId("tool-finding_post"));
82
- await expect(args.onChange).toHaveBeenCalledWith(["finding_post"]);
81
+ await userEvent.click(canvas.getByTestId("tool-task_show"));
82
+ await expect(args.onChange).toHaveBeenCalledWith(["task_show"]);
83
83
  },
84
84
  };
85
85
 
@@ -87,11 +87,11 @@ export const SearchFilter: Story = {
87
87
  play: async ({ canvasElement }) => {
88
88
  const canvas = within(canvasElement);
89
89
  const filterInput = canvas.getByTestId("mcp-tool-filter");
90
- await userEvent.type(filterInput, "finding");
91
- // finding group should be visible with its tools
92
- await expect(canvas.getByTestId("tool-group-finding")).toBeInTheDocument();
93
- await expect(canvas.getByTestId("tool-finding_post")).toBeInTheDocument();
94
- await expect(canvas.getByTestId("tool-finding_list")).toBeInTheDocument();
90
+ await userEvent.type(filterInput, "workpad");
91
+ // workpad group should be visible with its tools
92
+ await expect(canvas.getByTestId("tool-group-workpad")).toBeInTheDocument();
93
+ await expect(canvas.getByTestId("tool-workpad_write")).toBeInTheDocument();
94
+ await expect(canvas.getByTestId("tool-workpad_read")).toBeInTheDocument();
95
95
  // env group should be hidden (no match)
96
96
  await expect(canvas.queryByTestId("tool-group-env")).not.toBeInTheDocument();
97
97
  },
@@ -115,7 +115,7 @@ export const GroupSelectAll: Story = {
115
115
  export const DisabledState: Story = {
116
116
  args: {
117
117
  disabled: true,
118
- selectedTools: ["finding_post"],
118
+ selectedTools: ["task_show"],
119
119
  },
120
120
  play: async ({ canvasElement }) => {
121
121
  const canvas = within(canvasElement);
@@ -124,6 +124,6 @@ export const DisabledState: Story = {
124
124
  // Filter input should be disabled
125
125
  await expect(canvas.getByTestId("mcp-tool-filter")).toBeDisabled();
126
126
  // Tool checkboxes should be disabled
127
- await expect(canvas.getByTestId("tool-finding_post")).toBeDisabled();
127
+ await expect(canvas.getByTestId("tool-task_show")).toBeDisabled();
128
128
  },
129
129
  };
@@ -49,32 +49,6 @@ export const GenericTool: Story = {
49
49
  },
50
50
  };
51
51
 
52
- /** MCP finding tool (Claude Code format) routes to FindingCard. */
53
- export const McpFinding: Story = {
54
- name: "MCP finding_post (Claude Code)",
55
- args: {
56
- tool: "mcp__grackle__finding_post",
57
- args: { title: "Test finding", category: "insight" },
58
- result: JSON.stringify({ id: "f1", title: "Test finding", category: "insight", tags: [] }),
59
- },
60
- play: async ({ canvas }) => {
61
- await expect(canvas.getByTestId("tool-card-finding")).toBeInTheDocument();
62
- },
63
- };
64
-
65
- /** MCP finding tool (Copilot format) routes to FindingCard. */
66
- export const McpFindingCopilot: Story = {
67
- name: "MCP finding_post (Copilot)",
68
- args: {
69
- tool: "grackle-finding_post",
70
- args: { title: "Copilot finding", category: "bug" },
71
- result: JSON.stringify({ id: "f2", title: "Copilot finding", category: "bug", tags: [] }),
72
- },
73
- play: async ({ canvas }) => {
74
- await expect(canvas.getByTestId("tool-card-finding")).toBeInTheDocument();
75
- },
76
- };
77
-
78
52
  /** MCP task tool routes to TaskCard. */
79
53
  export const McpTask: Story = {
80
54
  name: "MCP task_list",
@@ -7,7 +7,6 @@ import { ShellCard } from "./ShellCard.js";
7
7
  import { SearchCard } from "./SearchCard.js";
8
8
  import { TodoCard } from "./TodoCard.js";
9
9
  import { MetadataCard } from "./MetadataCard.js";
10
- import { FindingCard } from "./FindingCard.js";
11
10
  import { TaskCard } from "./TaskCard.js";
12
11
  import { WorkpadCard } from "./WorkpadCard.js";
13
12
  import { KnowledgeCard } from "./KnowledgeCard.js";
@@ -40,8 +39,6 @@ export function ToolCard(props: ToolCardProps): JSX.Element {
40
39
  return <TodoCard {...props} />;
41
40
  case "metadata":
42
41
  return <MetadataCard {...props} />;
43
- case "finding":
44
- return <FindingCard {...props} />;
45
42
  case "task":
46
43
  return <TaskCard {...props} />;
47
44
  case "workpad":
@@ -13,7 +13,7 @@ export const InProgress: Story = {
13
13
  name: "ToolSearch - in progress",
14
14
  args: {
15
15
  tool: "ToolSearch",
16
- args: { query: "select:mcp__grackle__finding_post,mcp__grackle__workpad_write", max_results: 3 },
16
+ args: { query: "select:mcp__grackle__task_create,mcp__grackle__workpad_write", max_results: 3 },
17
17
  },
18
18
  play: async ({ canvas }) => {
19
19
  await expect(canvas.getByTestId("tool-card-tool-search")).toBeInTheDocument();
@@ -25,15 +25,15 @@ export const WithResults: Story = {
25
25
  name: "ToolSearch - with results",
26
26
  args: {
27
27
  tool: "ToolSearch",
28
- args: { query: "select:mcp__grackle__finding_post", max_results: 3 },
28
+ args: { query: "select:mcp__grackle__task_create", max_results: 3 },
29
29
  result: [
30
- "mcp__grackle__finding_post:",
31
- " Post a new finding to the workspace.",
30
+ "mcp__grackle__task_create:",
31
+ " Create a new task in the workspace.",
32
32
  " Parameters:",
33
- " title (string, required): Finding title",
34
- " category (string, optional): Category (bug, insight, decision)",
35
- " content (string, optional): Detailed content",
36
- " tags (array, optional): Tags for categorization",
33
+ " title (string, required): Task title",
34
+ " description (string, optional): Task description",
35
+ " parentTaskId (string, optional): Parent task to nest under",
36
+ " canDecompose (boolean, optional): Allow the task to create subtasks",
37
37
  "",
38
38
  "mcp__grackle__workpad_write:",
39
39
  " Write to the task workpad.",
@@ -37,10 +37,10 @@ export const WriteCompleted: Story = {
37
37
  taskId: "74f5b716",
38
38
  workpad: {
39
39
  status: "completed",
40
- summary: "Tested Grackle MCP tools: posted a finding, wrote to workpad, and searched knowledge.",
40
+ summary: "Tested Grackle MCP tools: created a task, wrote to workpad, and searched knowledge.",
41
41
  extra: {
42
- tools_tested: ["finding_post", "workpad_write", "knowledge_search"],
43
- finding_topic: "qdrant catalog",
42
+ tools_tested: ["task_create", "workpad_write", "knowledge_search"],
43
+ search_topic: "qdrant catalog",
44
44
  },
45
45
  },
46
46
  }),
@@ -79,10 +79,10 @@ export const CopilotFormat: Story = {
79
79
  name: "workpad_write - Copilot tool name",
80
80
  args: {
81
81
  tool: "grackle-workpad_write",
82
- args: { status: "in progress", summary: "Posted a finding about Rush worktrees." },
82
+ args: { status: "in progress", summary: "Wrote a progress note about Rush worktrees." },
83
83
  result: JSON.stringify({
84
84
  taskId: "e4366a55",
85
- workpad: { status: "in progress", summary: "Posted a finding about Rush worktrees." },
85
+ workpad: { status: "in progress", summary: "Wrote a progress note about Rush worktrees." },
86
86
  }),
87
87
  },
88
88
  play: async ({ canvas }) => {
@@ -33,7 +33,6 @@ describe("classifyTool", () => {
33
33
 
34
34
  it("classifies Grackle MCP tools", () => {
35
35
  expect(classifyTool("mcp__grackle__workpad_write")).toBe("workpad");
36
- expect(classifyTool("mcp__grackle__finding_post")).toBe("finding");
37
36
  expect(classifyTool("mcp__grackle__task_create")).toBe("task");
38
37
  });
39
38
 
@@ -14,7 +14,6 @@ export type ToolCategory =
14
14
  | "search"
15
15
  | "todo"
16
16
  | "metadata"
17
- | "finding"
18
17
  | "task"
19
18
  | "workpad"
20
19
  | "knowledge"
@@ -29,8 +28,8 @@ const KNOWN_MCP_SERVERS: Set<string> = new Set(["grackle"]);
29
28
  /**
30
29
  * Extracts the bare tool name from runtime-specific naming conventions.
31
30
  *
32
- * - Claude Code / Codex: `mcp__grackle__finding_post` -> `finding_post`
33
- * - Copilot: `grackle-finding_post` -> `finding_post`
31
+ * - Claude Code / Codex: `mcp__grackle__task_create` -> `task_create`
32
+ * - Copilot: `grackle-task_create` -> `task_create`
34
33
  * - Built-in: `Read` -> `read` (unchanged, lowered later)
35
34
  */
36
35
  export function extractBareName(toolName: string): string {
@@ -84,10 +83,6 @@ const TOOL_MAP: Record<string, ToolCategory> = {
84
83
  // Metadata — Copilot: report_intent
85
84
  report_intent: "metadata",
86
85
 
87
- // Finding — Grackle MCP
88
- finding_post: "finding",
89
- finding_list: "finding",
90
-
91
86
  // Task — Grackle MCP
92
87
  task_list: "task",
93
88
  task_create: "task",
@@ -9,7 +9,7 @@
9
9
  import type {
10
10
  UsageStats, UseKnowledgeResult,
11
11
  UseEnvironmentsResult, UseSessionsResult, UseWorkspacesResult,
12
- UseTasksResult, UseFindingsResult, UseTokensResult,
12
+ UseTasksResult, UseTokensResult,
13
13
  UseCredentialsResult, UseCodespacesResult, UseDockerContainersResult, UsePersonasResult,
14
14
  UsePluginsResult,
15
15
  UseSchedulesResult,
@@ -30,8 +30,6 @@ export interface UseGrackleSocketResult {
30
30
  workspaces: Omit<UseWorkspacesResult, "handleEvent" | "onDisconnect">;
31
31
  /** Task state and actions. */
32
32
  tasks: Omit<UseTasksResult, "handleEvent" | "onDisconnect" | "handleLegacyMessage">;
33
- /** Finding state and actions. */
34
- findings: Omit<UseFindingsResult, "handleEvent">;
35
33
  /** Token state and actions. */
36
34
  tokens: Omit<UseTokensResult, "handleEvent">;
37
35
  /** Credential provider state and actions. */
@@ -74,7 +74,7 @@ export interface SessionEvent {
74
74
  raw?: string;
75
75
  }
76
76
 
77
- /** A workspace that groups tasks and findings. */
77
+ /** A workspace that groups tasks. */
78
78
  export interface Workspace {
79
79
  id: string;
80
80
  name: string;
@@ -125,19 +125,6 @@ export interface TaskData {
125
125
  costBudgetMillicents: number;
126
126
  }
127
127
 
128
- /** A finding posted by an agent or user. */
129
- export interface FindingData {
130
- id: string;
131
- workspaceId: string;
132
- taskId: string;
133
- sessionId: string;
134
- category: string;
135
- title: string;
136
- content: string;
137
- tags: string[];
138
- createdAt: string;
139
- }
140
-
141
128
  /** Metadata about a stored token. */
142
129
  export interface TokenInfo {
143
130
  name: string;
@@ -419,36 +406,6 @@ export interface UseTasksResult {
419
406
  domainHook: DomainHook;
420
407
  }
421
408
 
422
- /** Values returned by the findings domain hook. */
423
- export interface UseFindingsResult {
424
- /** All loaded findings. */
425
- findings: FindingData[];
426
- /** The currently selected finding (loaded by ID). */
427
- selectedFinding: FindingData | undefined;
428
- /** Whether a single finding is being loaded. */
429
- findingLoading: boolean;
430
- /** Whether a findings list fetch is in-flight. */
431
- findingsLoading: boolean;
432
- /** Load findings for a given workspace. */
433
- loadFindings: (workspaceId: string) => Promise<void>;
434
- /** Load findings across all workspaces. */
435
- loadAllFindings: () => Promise<void>;
436
- /** Load a single finding by ID. */
437
- loadFinding: (findingId: string) => Promise<void>;
438
- /** Post a new finding to a workspace. */
439
- postFinding: (
440
- workspaceId: string,
441
- title: string,
442
- content: string,
443
- category?: string,
444
- tags?: string[],
445
- ) => Promise<void>;
446
- /** Handle a domain event from the event bus. Returns `true` if handled. */
447
- handleEvent: (event: GrackleEvent) => boolean;
448
- /** Lifecycle hook for connect/disconnect/event routing. */
449
- domainHook: DomainHook;
450
- }
451
-
452
409
  /** Values returned by the tokens domain hook. */
453
410
  export interface UseTokensResult {
454
411
  /** All known tokens. */