@open-mercato/ai-assistant 0.4.2-canary-c02407ff85

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 (193) hide show
  1. package/AGENTS.md +1090 -0
  2. package/README.md +607 -0
  3. package/build.mjs +92 -0
  4. package/dist/di.js +8 -0
  5. package/dist/di.js.map +7 -0
  6. package/dist/frontend/components/CommandPalette/CommandFooter.js +80 -0
  7. package/dist/frontend/components/CommandPalette/CommandFooter.js.map +7 -0
  8. package/dist/frontend/components/CommandPalette/CommandHeader.js +53 -0
  9. package/dist/frontend/components/CommandPalette/CommandHeader.js.map +7 -0
  10. package/dist/frontend/components/CommandPalette/CommandInput.js +29 -0
  11. package/dist/frontend/components/CommandPalette/CommandInput.js.map +7 -0
  12. package/dist/frontend/components/CommandPalette/CommandItem.js +92 -0
  13. package/dist/frontend/components/CommandPalette/CommandItem.js.map +7 -0
  14. package/dist/frontend/components/CommandPalette/CommandPalette.js +244 -0
  15. package/dist/frontend/components/CommandPalette/CommandPalette.js.map +7 -0
  16. package/dist/frontend/components/CommandPalette/CommandPaletteProvider.js +42 -0
  17. package/dist/frontend/components/CommandPalette/CommandPaletteProvider.js.map +7 -0
  18. package/dist/frontend/components/CommandPalette/CommandPaletteWrapper.js +18 -0
  19. package/dist/frontend/components/CommandPalette/CommandPaletteWrapper.js.map +7 -0
  20. package/dist/frontend/components/CommandPalette/DebugPanel.js +215 -0
  21. package/dist/frontend/components/CommandPalette/DebugPanel.js.map +7 -0
  22. package/dist/frontend/components/CommandPalette/MessageBubble.js +64 -0
  23. package/dist/frontend/components/CommandPalette/MessageBubble.js.map +7 -0
  24. package/dist/frontend/components/CommandPalette/ToolCallConfirmation.js +91 -0
  25. package/dist/frontend/components/CommandPalette/ToolCallConfirmation.js.map +7 -0
  26. package/dist/frontend/components/CommandPalette/ToolCallDisplay.js +47 -0
  27. package/dist/frontend/components/CommandPalette/ToolCallDisplay.js.map +7 -0
  28. package/dist/frontend/components/CommandPalette/ToolChatPage.js +74 -0
  29. package/dist/frontend/components/CommandPalette/ToolChatPage.js.map +7 -0
  30. package/dist/frontend/components/CommandPalette/index.js +28 -0
  31. package/dist/frontend/components/CommandPalette/index.js.map +7 -0
  32. package/dist/frontend/constants.js +41 -0
  33. package/dist/frontend/constants.js.map +7 -0
  34. package/dist/frontend/hooks/index.js +13 -0
  35. package/dist/frontend/hooks/index.js.map +7 -0
  36. package/dist/frontend/hooks/useCommandPalette.js +1094 -0
  37. package/dist/frontend/hooks/useCommandPalette.js.map +7 -0
  38. package/dist/frontend/hooks/useMcpTools.js +66 -0
  39. package/dist/frontend/hooks/useMcpTools.js.map +7 -0
  40. package/dist/frontend/hooks/usePageContext.js +48 -0
  41. package/dist/frontend/hooks/usePageContext.js.map +7 -0
  42. package/dist/frontend/hooks/useRecentActions.js +56 -0
  43. package/dist/frontend/hooks/useRecentActions.js.map +7 -0
  44. package/dist/frontend/hooks/useRecentTools.js +55 -0
  45. package/dist/frontend/hooks/useRecentTools.js.map +7 -0
  46. package/dist/frontend/index.js +35 -0
  47. package/dist/frontend/index.js.map +7 -0
  48. package/dist/frontend/types.js +1 -0
  49. package/dist/frontend/types.js.map +7 -0
  50. package/dist/frontend/utils/index.js +7 -0
  51. package/dist/frontend/utils/index.js.map +7 -0
  52. package/dist/frontend/utils/toolMatcher.js +95 -0
  53. package/dist/frontend/utils/toolMatcher.js.map +7 -0
  54. package/dist/index.js +57 -0
  55. package/dist/index.js.map +7 -0
  56. package/dist/modules/ai_assistant/acl.js +14 -0
  57. package/dist/modules/ai_assistant/acl.js.map +7 -0
  58. package/dist/modules/ai_assistant/api/chat/route.js +152 -0
  59. package/dist/modules/ai_assistant/api/chat/route.js.map +7 -0
  60. package/dist/modules/ai_assistant/api/health/route.js +27 -0
  61. package/dist/modules/ai_assistant/api/health/route.js.map +7 -0
  62. package/dist/modules/ai_assistant/api/route/route.js +123 -0
  63. package/dist/modules/ai_assistant/api/route/route.js.map +7 -0
  64. package/dist/modules/ai_assistant/api/settings/route.js +60 -0
  65. package/dist/modules/ai_assistant/api/settings/route.js.map +7 -0
  66. package/dist/modules/ai_assistant/api/tools/execute/route.js +58 -0
  67. package/dist/modules/ai_assistant/api/tools/execute/route.js.map +7 -0
  68. package/dist/modules/ai_assistant/api/tools/route.js +48 -0
  69. package/dist/modules/ai_assistant/api/tools/route.js.map +7 -0
  70. package/dist/modules/ai_assistant/backend/config/ai-assistant/page.js +10 -0
  71. package/dist/modules/ai_assistant/backend/config/ai-assistant/page.js.map +7 -0
  72. package/dist/modules/ai_assistant/backend/config/ai-assistant/page.meta.js +28 -0
  73. package/dist/modules/ai_assistant/backend/config/ai-assistant/page.meta.js.map +7 -0
  74. package/dist/modules/ai_assistant/cli.js +192 -0
  75. package/dist/modules/ai_assistant/cli.js.map +7 -0
  76. package/dist/modules/ai_assistant/di.js +11 -0
  77. package/dist/modules/ai_assistant/di.js.map +7 -0
  78. package/dist/modules/ai_assistant/frontend/components/AiAssistantSettingsPageClient.js +257 -0
  79. package/dist/modules/ai_assistant/frontend/components/AiAssistantSettingsPageClient.js.map +7 -0
  80. package/dist/modules/ai_assistant/index.js +13 -0
  81. package/dist/modules/ai_assistant/index.js.map +7 -0
  82. package/dist/modules/ai_assistant/lib/ai-sdk.js +13 -0
  83. package/dist/modules/ai_assistant/lib/ai-sdk.js.map +7 -0
  84. package/dist/modules/ai_assistant/lib/api-discovery-tools.js +249 -0
  85. package/dist/modules/ai_assistant/lib/api-discovery-tools.js.map +7 -0
  86. package/dist/modules/ai_assistant/lib/api-endpoint-index-config.js +177 -0
  87. package/dist/modules/ai_assistant/lib/api-endpoint-index-config.js.map +7 -0
  88. package/dist/modules/ai_assistant/lib/api-endpoint-index.js +210 -0
  89. package/dist/modules/ai_assistant/lib/api-endpoint-index.js.map +7 -0
  90. package/dist/modules/ai_assistant/lib/auth.js +87 -0
  91. package/dist/modules/ai_assistant/lib/auth.js.map +7 -0
  92. package/dist/modules/ai_assistant/lib/chat-config.js +117 -0
  93. package/dist/modules/ai_assistant/lib/chat-config.js.map +7 -0
  94. package/dist/modules/ai_assistant/lib/client-factory.js +60 -0
  95. package/dist/modules/ai_assistant/lib/client-factory.js.map +7 -0
  96. package/dist/modules/ai_assistant/lib/http-server.js +367 -0
  97. package/dist/modules/ai_assistant/lib/http-server.js.map +7 -0
  98. package/dist/modules/ai_assistant/lib/in-process-client.js +126 -0
  99. package/dist/modules/ai_assistant/lib/in-process-client.js.map +7 -0
  100. package/dist/modules/ai_assistant/lib/mcp-client.js +146 -0
  101. package/dist/modules/ai_assistant/lib/mcp-client.js.map +7 -0
  102. package/dist/modules/ai_assistant/lib/mcp-dev-server.js +283 -0
  103. package/dist/modules/ai_assistant/lib/mcp-dev-server.js.map +7 -0
  104. package/dist/modules/ai_assistant/lib/mcp-server-config.js +160 -0
  105. package/dist/modules/ai_assistant/lib/mcp-server-config.js.map +7 -0
  106. package/dist/modules/ai_assistant/lib/mcp-server.js +156 -0
  107. package/dist/modules/ai_assistant/lib/mcp-server.js.map +7 -0
  108. package/dist/modules/ai_assistant/lib/mcp-tool-adapter.js +44 -0
  109. package/dist/modules/ai_assistant/lib/mcp-tool-adapter.js.map +7 -0
  110. package/dist/modules/ai_assistant/lib/opencode-client.js +247 -0
  111. package/dist/modules/ai_assistant/lib/opencode-client.js.map +7 -0
  112. package/dist/modules/ai_assistant/lib/opencode-handlers.js +398 -0
  113. package/dist/modules/ai_assistant/lib/opencode-handlers.js.map +7 -0
  114. package/dist/modules/ai_assistant/lib/schema-utils.js +94 -0
  115. package/dist/modules/ai_assistant/lib/schema-utils.js.map +7 -0
  116. package/dist/modules/ai_assistant/lib/tool-executor.js +55 -0
  117. package/dist/modules/ai_assistant/lib/tool-executor.js.map +7 -0
  118. package/dist/modules/ai_assistant/lib/tool-index-config.js +125 -0
  119. package/dist/modules/ai_assistant/lib/tool-index-config.js.map +7 -0
  120. package/dist/modules/ai_assistant/lib/tool-loader.js +88 -0
  121. package/dist/modules/ai_assistant/lib/tool-loader.js.map +7 -0
  122. package/dist/modules/ai_assistant/lib/tool-registry.js +65 -0
  123. package/dist/modules/ai_assistant/lib/tool-registry.js.map +7 -0
  124. package/dist/modules/ai_assistant/lib/tool-search.js +192 -0
  125. package/dist/modules/ai_assistant/lib/tool-search.js.map +7 -0
  126. package/dist/modules/ai_assistant/lib/types.js +1 -0
  127. package/dist/modules/ai_assistant/lib/types.js.map +7 -0
  128. package/package.json +108 -0
  129. package/src/di.ts +11 -0
  130. package/src/frontend/components/CommandPalette/CommandFooter.tsx +113 -0
  131. package/src/frontend/components/CommandPalette/CommandHeader.tsx +76 -0
  132. package/src/frontend/components/CommandPalette/CommandInput.tsx +50 -0
  133. package/src/frontend/components/CommandPalette/CommandItem.tsx +111 -0
  134. package/src/frontend/components/CommandPalette/CommandPalette.tsx +276 -0
  135. package/src/frontend/components/CommandPalette/CommandPaletteProvider.tsx +60 -0
  136. package/src/frontend/components/CommandPalette/CommandPaletteWrapper.tsx +21 -0
  137. package/src/frontend/components/CommandPalette/DebugPanel.tsx +257 -0
  138. package/src/frontend/components/CommandPalette/MessageBubble.tsx +73 -0
  139. package/src/frontend/components/CommandPalette/ToolCallConfirmation.tsx +130 -0
  140. package/src/frontend/components/CommandPalette/ToolCallDisplay.tsx +57 -0
  141. package/src/frontend/components/CommandPalette/ToolChatPage.tsx +125 -0
  142. package/src/frontend/components/CommandPalette/index.ts +14 -0
  143. package/src/frontend/constants.ts +35 -0
  144. package/src/frontend/hooks/index.ts +5 -0
  145. package/src/frontend/hooks/useCommandPalette.ts +1389 -0
  146. package/src/frontend/hooks/useMcpTools.ts +73 -0
  147. package/src/frontend/hooks/usePageContext.ts +61 -0
  148. package/src/frontend/hooks/useRecentActions.ts +64 -0
  149. package/src/frontend/hooks/useRecentTools.ts +69 -0
  150. package/src/frontend/index.ts +39 -0
  151. package/src/frontend/types.ts +260 -0
  152. package/src/frontend/utils/index.ts +1 -0
  153. package/src/frontend/utils/toolMatcher.ts +127 -0
  154. package/src/index.ts +92 -0
  155. package/src/modules/ai_assistant/acl.ts +10 -0
  156. package/src/modules/ai_assistant/api/chat/route.ts +213 -0
  157. package/src/modules/ai_assistant/api/health/route.ts +30 -0
  158. package/src/modules/ai_assistant/api/route/route.ts +149 -0
  159. package/src/modules/ai_assistant/api/settings/route.ts +73 -0
  160. package/src/modules/ai_assistant/api/tools/execute/route.ts +71 -0
  161. package/src/modules/ai_assistant/api/tools/route.ts +57 -0
  162. package/src/modules/ai_assistant/backend/config/ai-assistant/page.meta.ts +26 -0
  163. package/src/modules/ai_assistant/backend/config/ai-assistant/page.tsx +12 -0
  164. package/src/modules/ai_assistant/cli.ts +233 -0
  165. package/src/modules/ai_assistant/di.ts +9 -0
  166. package/src/modules/ai_assistant/frontend/components/AiAssistantSettingsPageClient.tsx +418 -0
  167. package/src/modules/ai_assistant/index.ts +11 -0
  168. package/src/modules/ai_assistant/lib/ai-sdk.ts +5 -0
  169. package/src/modules/ai_assistant/lib/api-discovery-tools.ts +334 -0
  170. package/src/modules/ai_assistant/lib/api-endpoint-index-config.ts +243 -0
  171. package/src/modules/ai_assistant/lib/api-endpoint-index.ts +381 -0
  172. package/src/modules/ai_assistant/lib/auth.ts +185 -0
  173. package/src/modules/ai_assistant/lib/chat-config.ts +152 -0
  174. package/src/modules/ai_assistant/lib/client-factory.ts +130 -0
  175. package/src/modules/ai_assistant/lib/http-server.ts +498 -0
  176. package/src/modules/ai_assistant/lib/in-process-client.ts +205 -0
  177. package/src/modules/ai_assistant/lib/mcp-client.ts +221 -0
  178. package/src/modules/ai_assistant/lib/mcp-dev-server.ts +373 -0
  179. package/src/modules/ai_assistant/lib/mcp-server-config.ts +287 -0
  180. package/src/modules/ai_assistant/lib/mcp-server.ts +214 -0
  181. package/src/modules/ai_assistant/lib/mcp-tool-adapter.ts +76 -0
  182. package/src/modules/ai_assistant/lib/opencode-client.ts +426 -0
  183. package/src/modules/ai_assistant/lib/opencode-handlers.ts +676 -0
  184. package/src/modules/ai_assistant/lib/schema-utils.ts +142 -0
  185. package/src/modules/ai_assistant/lib/tool-executor.ts +71 -0
  186. package/src/modules/ai_assistant/lib/tool-index-config.ts +178 -0
  187. package/src/modules/ai_assistant/lib/tool-loader.ts +149 -0
  188. package/src/modules/ai_assistant/lib/tool-registry.ts +114 -0
  189. package/src/modules/ai_assistant/lib/tool-search.ts +308 -0
  190. package/src/modules/ai_assistant/lib/types.ts +147 -0
  191. package/test-schema.ts +37 -0
  192. package/tsconfig.json +10 -0
  193. package/watch.mjs +6 -0
package/dist/di.js.map ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/di.ts"],
4
+ "sourcesContent": ["import type { AwilixContainer } from 'awilix'\n\n/**\n * Register AI Assistant module services in the DI container.\n *\n * This is called by the app bootstrap to register package-level services.\n */\nexport async function register(container: AwilixContainer): Promise<void> {\n const { register: registerModule } = await import('./modules/ai_assistant/di')\n registerModule(container)\n}\n"],
5
+ "mappings": "AAOA,eAAsB,SAAS,WAA2C;AACxE,QAAM,EAAE,UAAU,eAAe,IAAI,MAAM,OAAO,2BAA2B;AAC7E,iBAAe,SAAS;AAC1B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,80 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Code, ShieldCheck } from "lucide-react";
4
+ import { cn } from "@open-mercato/shared/lib/utils";
5
+ function ConnectionIndicator({ status }) {
6
+ const statusConfig = {
7
+ connected: { color: "bg-emerald-500", text: "Connected" },
8
+ connecting: { color: "bg-yellow-500 animate-pulse", text: "Connecting..." },
9
+ disconnected: { color: "bg-gray-400", text: "Disconnected" },
10
+ error: { color: "bg-red-500", text: "Error" }
11
+ };
12
+ const config = statusConfig[status];
13
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
14
+ /* @__PURE__ */ jsx("div", { className: cn("h-1.5 w-1.5 rounded-full", config.color) }),
15
+ /* @__PURE__ */ jsx("span", { children: config.text })
16
+ ] });
17
+ }
18
+ function KeyboardShortcut({ keys }) {
19
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-0.5", children: keys.map((key, i) => /* @__PURE__ */ jsx(
20
+ "kbd",
21
+ {
22
+ className: cn(
23
+ "inline-flex h-5 min-w-[20px] items-center justify-center rounded",
24
+ "bg-muted px-1.5 text-[10px] font-medium text-muted-foreground"
25
+ ),
26
+ children: key
27
+ },
28
+ i
29
+ )) });
30
+ }
31
+ function CommandFooter({
32
+ phase,
33
+ connectionStatus,
34
+ isSessionAuthorized = false,
35
+ showDebug = false,
36
+ onToggleDebug
37
+ }) {
38
+ const idleShortcuts = [
39
+ { label: "Submit", keys: ["\u21B5"] },
40
+ { label: "Close", keys: ["Esc"] }
41
+ ];
42
+ const chatShortcuts = [
43
+ { label: "Send", keys: ["\u21B5"] },
44
+ { label: "Back", keys: ["Esc"] }
45
+ ];
46
+ const shortcuts = phase === "idle" ? idleShortcuts : chatShortcuts;
47
+ return /* @__PURE__ */ jsxs("div", { className: "relative flex items-center justify-between px-3 py-2 border-t bg-muted/20 text-xs", children: [
48
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
49
+ /* @__PURE__ */ jsx(ConnectionIndicator, { status: connectionStatus }),
50
+ isSessionAuthorized && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-xs text-emerald-600 dark:text-emerald-400", children: [
51
+ /* @__PURE__ */ jsx(ShieldCheck, { className: "h-3 w-3" }),
52
+ /* @__PURE__ */ jsx("span", { children: "Authorized" })
53
+ ] }),
54
+ onToggleDebug && /* @__PURE__ */ jsxs(
55
+ "button",
56
+ {
57
+ type: "button",
58
+ onClick: onToggleDebug,
59
+ className: cn(
60
+ "flex items-center gap-1 transition-colors",
61
+ showDebug ? "text-blue-500 hover:text-blue-400" : "text-muted-foreground hover:text-foreground"
62
+ ),
63
+ title: "Toggle debug panel",
64
+ children: [
65
+ /* @__PURE__ */ jsx(Code, { className: "w-3 h-3" }),
66
+ /* @__PURE__ */ jsx("span", { children: showDebug ? "Hide Debug" : "Debug" })
67
+ ]
68
+ }
69
+ )
70
+ ] }),
71
+ /* @__PURE__ */ jsx("div", { className: "flex items-center gap-3", children: shortcuts.map((shortcut, i) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 text-muted-foreground", children: [
72
+ /* @__PURE__ */ jsx("span", { children: shortcut.label }),
73
+ /* @__PURE__ */ jsx(KeyboardShortcut, { keys: shortcut.keys })
74
+ ] }, i)) })
75
+ ] });
76
+ }
77
+ export {
78
+ CommandFooter
79
+ };
80
+ //# sourceMappingURL=CommandFooter.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/frontend/components/CommandPalette/CommandFooter.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { Code, ShieldCheck } from 'lucide-react'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport type { PalettePhase, ConnectionStatus } from '../../types'\n\ninterface CommandFooterProps {\n phase: PalettePhase\n connectionStatus: ConnectionStatus\n isSessionAuthorized?: boolean\n showDebug?: boolean\n onToggleDebug?: () => void\n}\n\nfunction ConnectionIndicator({ status }: { status: ConnectionStatus }) {\n const statusConfig: Record<ConnectionStatus, { color: string; text: string }> = {\n connected: { color: 'bg-emerald-500', text: 'Connected' },\n connecting: { color: 'bg-yellow-500 animate-pulse', text: 'Connecting...' },\n disconnected: { color: 'bg-gray-400', text: 'Disconnected' },\n error: { color: 'bg-red-500', text: 'Error' },\n }\n\n const config = statusConfig[status]\n\n return (\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <div className={cn('h-1.5 w-1.5 rounded-full', config.color)} />\n <span>{config.text}</span>\n </div>\n )\n}\n\nfunction KeyboardShortcut({ keys }: { keys: string[] }) {\n return (\n <div className=\"flex items-center gap-0.5\">\n {keys.map((key, i) => (\n <kbd\n key={i}\n className={cn(\n 'inline-flex h-5 min-w-[20px] items-center justify-center rounded',\n 'bg-muted px-1.5 text-[10px] font-medium text-muted-foreground'\n )}\n >\n {key}\n </kbd>\n ))}\n </div>\n )\n}\n\nexport function CommandFooter({\n phase,\n connectionStatus,\n isSessionAuthorized = false,\n showDebug = false,\n onToggleDebug,\n}: CommandFooterProps) {\n const idleShortcuts = [\n { label: 'Submit', keys: ['\\u21B5'] },\n { label: 'Close', keys: ['Esc'] },\n ]\n\n const chatShortcuts = [\n { label: 'Send', keys: ['\\u21B5'] },\n { label: 'Back', keys: ['Esc'] },\n ]\n\n const shortcuts = phase === 'idle' ? idleShortcuts : chatShortcuts\n\n return (\n <div className=\"relative flex items-center justify-between px-3 py-2 border-t bg-muted/20 text-xs\">\n <div className=\"flex items-center gap-3\">\n <ConnectionIndicator status={connectionStatus} />\n\n {/* Session authorization indicator */}\n {isSessionAuthorized && (\n <div className=\"flex items-center gap-1 text-xs text-emerald-600 dark:text-emerald-400\">\n <ShieldCheck className=\"h-3 w-3\" />\n <span>Authorized</span>\n </div>\n )}\n\n {/* Debug toggle button */}\n {onToggleDebug && (\n <button\n type=\"button\"\n onClick={onToggleDebug}\n className={cn(\n 'flex items-center gap-1 transition-colors',\n showDebug\n ? 'text-blue-500 hover:text-blue-400'\n : 'text-muted-foreground hover:text-foreground'\n )}\n title=\"Toggle debug panel\"\n >\n <Code className=\"w-3 h-3\" />\n <span>{showDebug ? 'Hide Debug' : 'Debug'}</span>\n </button>\n )}\n </div>\n\n <div className=\"flex items-center gap-3\">\n {shortcuts.map((shortcut, i) => (\n <div key={i} className=\"flex items-center gap-1.5 text-muted-foreground\">\n <span>{shortcut.label}</span>\n <KeyboardShortcut keys={shortcut.keys} />\n </div>\n ))}\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": ";AA0BI,SACE,KADF;AAvBJ,SAAS,MAAM,mBAAmB;AAClC,SAAS,UAAU;AAWnB,SAAS,oBAAoB,EAAE,OAAO,GAAiC;AACrE,QAAM,eAA0E;AAAA,IAC9E,WAAW,EAAE,OAAO,kBAAkB,MAAM,YAAY;AAAA,IACxD,YAAY,EAAE,OAAO,+BAA+B,MAAM,gBAAgB;AAAA,IAC1E,cAAc,EAAE,OAAO,eAAe,MAAM,eAAe;AAAA,IAC3D,OAAO,EAAE,OAAO,cAAc,MAAM,QAAQ;AAAA,EAC9C;AAEA,QAAM,SAAS,aAAa,MAAM;AAElC,SACE,qBAAC,SAAI,WAAU,2DACb;AAAA,wBAAC,SAAI,WAAW,GAAG,4BAA4B,OAAO,KAAK,GAAG;AAAA,IAC9D,oBAAC,UAAM,iBAAO,MAAK;AAAA,KACrB;AAEJ;AAEA,SAAS,iBAAiB,EAAE,KAAK,GAAuB;AACtD,SACE,oBAAC,SAAI,WAAU,6BACZ,eAAK,IAAI,CAAC,KAAK,MACd;AAAA,IAAC;AAAA;AAAA,MAEC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,IANI;AAAA,EAOP,CACD,GACH;AAEJ;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,sBAAsB;AAAA,EACtB,YAAY;AAAA,EACZ;AACF,GAAuB;AACrB,QAAM,gBAAgB;AAAA,IACpB,EAAE,OAAO,UAAU,MAAM,CAAC,QAAQ,EAAE;AAAA,IACpC,EAAE,OAAO,SAAS,MAAM,CAAC,KAAK,EAAE;AAAA,EAClC;AAEA,QAAM,gBAAgB;AAAA,IACpB,EAAE,OAAO,QAAQ,MAAM,CAAC,QAAQ,EAAE;AAAA,IAClC,EAAE,OAAO,QAAQ,MAAM,CAAC,KAAK,EAAE;AAAA,EACjC;AAEA,QAAM,YAAY,UAAU,SAAS,gBAAgB;AAErD,SACE,qBAAC,SAAI,WAAU,qFACb;AAAA,yBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,uBAAoB,QAAQ,kBAAkB;AAAA,MAG9C,uBACC,qBAAC,SAAI,WAAU,0EACb;AAAA,4BAAC,eAAY,WAAU,WAAU;AAAA,QACjC,oBAAC,UAAK,wBAAU;AAAA,SAClB;AAAA,MAID,iBACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAW;AAAA,YACT;AAAA,YACA,YACI,sCACA;AAAA,UACN;AAAA,UACA,OAAM;AAAA,UAEN;AAAA,gCAAC,QAAK,WAAU,WAAU;AAAA,YAC1B,oBAAC,UAAM,sBAAY,eAAe,SAAQ;AAAA;AAAA;AAAA,MAC5C;AAAA,OAEJ;AAAA,IAEA,oBAAC,SAAI,WAAU,2BACZ,oBAAU,IAAI,CAAC,UAAU,MACxB,qBAAC,SAAY,WAAU,mDACrB;AAAA,0BAAC,UAAM,mBAAS,OAAM;AAAA,MACtB,oBAAC,oBAAiB,MAAM,SAAS,MAAM;AAAA,SAF/B,CAGV,CACD,GACH;AAAA,KACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,53 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { ArrowLeft, Wrench, MessageSquare } from "lucide-react";
4
+ import { cn } from "@open-mercato/shared/lib/utils";
5
+ function CommandHeader({ phase, selectedTool, onBack }) {
6
+ if (phase === "idle") {
7
+ return null;
8
+ }
9
+ if (phase === "routing") {
10
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-3 py-2 border-b bg-muted/30", children: [
11
+ /* @__PURE__ */ jsx(
12
+ "button",
13
+ {
14
+ type: "button",
15
+ onClick: onBack,
16
+ className: cn(
17
+ "flex items-center justify-center h-6 w-6 rounded-md",
18
+ "hover:bg-muted transition-colors",
19
+ "text-muted-foreground hover:text-foreground"
20
+ ),
21
+ children: /* @__PURE__ */ jsx(ArrowLeft, { className: "h-4 w-4" })
22
+ }
23
+ ),
24
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: "Processing..." })
25
+ ] });
26
+ }
27
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-3 py-2 border-b bg-muted/30", children: [
28
+ /* @__PURE__ */ jsx(
29
+ "button",
30
+ {
31
+ type: "button",
32
+ onClick: onBack,
33
+ className: cn(
34
+ "flex items-center justify-center h-6 w-6 rounded-md",
35
+ "hover:bg-muted transition-colors",
36
+ "text-muted-foreground hover:text-foreground"
37
+ ),
38
+ children: /* @__PURE__ */ jsx(ArrowLeft, { className: "h-4 w-4" })
39
+ }
40
+ ),
41
+ selectedTool ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-1 min-w-0", children: [
42
+ /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-6 w-6 rounded bg-primary/10 text-primary", children: /* @__PURE__ */ jsx(Wrench, { className: "h-3 w-3" }) }),
43
+ /* @__PURE__ */ jsx("div", { className: "flex-1 min-w-0", children: /* @__PURE__ */ jsx("p", { className: "text-sm font-medium truncate", children: selectedTool.name }) })
44
+ ] }) : /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-1 min-w-0", children: [
45
+ /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-6 w-6 rounded bg-primary/10 text-primary", children: /* @__PURE__ */ jsx(MessageSquare, { className: "h-3 w-3" }) }),
46
+ /* @__PURE__ */ jsx("div", { className: "flex-1 min-w-0", children: /* @__PURE__ */ jsx("p", { className: "text-sm font-medium truncate", children: "Chat" }) })
47
+ ] })
48
+ ] });
49
+ }
50
+ export {
51
+ CommandHeader
52
+ };
53
+ //# sourceMappingURL=CommandHeader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/frontend/components/CommandPalette/CommandHeader.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { ArrowLeft, Wrench, MessageSquare } from 'lucide-react'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport type { PalettePhase, ToolInfo } from '../../types'\n\ninterface CommandHeaderProps {\n phase: PalettePhase\n selectedTool: ToolInfo | null\n onBack: () => void\n}\n\nexport function CommandHeader({ phase, selectedTool, onBack }: CommandHeaderProps) {\n // Only show header when not in idle phase\n if (phase === 'idle') {\n return null\n }\n\n // Show routing header\n if (phase === 'routing') {\n return (\n <div className=\"flex items-center gap-2 px-3 py-2 border-b bg-muted/30\">\n <button\n type=\"button\"\n onClick={onBack}\n className={cn(\n 'flex items-center justify-center h-6 w-6 rounded-md',\n 'hover:bg-muted transition-colors',\n 'text-muted-foreground hover:text-foreground'\n )}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n <span className=\"text-sm text-muted-foreground\">Processing...</span>\n </div>\n )\n }\n\n // Show chatting/confirming/executing header\n return (\n <div className=\"flex items-center gap-2 px-3 py-2 border-b bg-muted/30\">\n <button\n type=\"button\"\n onClick={onBack}\n className={cn(\n 'flex items-center justify-center h-6 w-6 rounded-md',\n 'hover:bg-muted transition-colors',\n 'text-muted-foreground hover:text-foreground'\n )}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n\n {selectedTool ? (\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <div className=\"flex items-center justify-center h-6 w-6 rounded bg-primary/10 text-primary\">\n <Wrench className=\"h-3 w-3\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{selectedTool.name}</p>\n </div>\n </div>\n ) : (\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <div className=\"flex items-center justify-center h-6 w-6 rounded bg-primary/10 text-primary\">\n <MessageSquare className=\"h-3 w-3\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">Chat</p>\n </div>\n </div>\n )}\n </div>\n )\n}\n"],
5
+ "mappings": ";AAsBM,SAUI,KAVJ;AAnBN,SAAS,WAAW,QAAQ,qBAAqB;AACjD,SAAS,UAAU;AASZ,SAAS,cAAc,EAAE,OAAO,cAAc,OAAO,GAAuB;AAEjF,MAAI,UAAU,QAAQ;AACpB,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,WAAW;AACvB,WACE,qBAAC,SAAI,WAAU,0DACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UAEA,8BAAC,aAAU,WAAU,WAAU;AAAA;AAAA,MACjC;AAAA,MACA,oBAAC,UAAK,WAAU,iCAAgC,2BAAa;AAAA,OAC/D;AAAA,EAEJ;AAGA,SACE,qBAAC,SAAI,WAAU,0DACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QAEA,8BAAC,aAAU,WAAU,WAAU;AAAA;AAAA,IACjC;AAAA,IAEC,eACC,qBAAC,SAAI,WAAU,0CACb;AAAA,0BAAC,SAAI,WAAU,+EACb,8BAAC,UAAO,WAAU,WAAU,GAC9B;AAAA,MACA,oBAAC,SAAI,WAAU,kBACb,8BAAC,OAAE,WAAU,gCAAgC,uBAAa,MAAK,GACjE;AAAA,OACF,IAEA,qBAAC,SAAI,WAAU,0CACb;AAAA,0BAAC,SAAI,WAAU,+EACb,8BAAC,iBAAc,WAAU,WAAU,GACrC;AAAA,MACA,oBAAC,SAAI,WAAU,kBACb,8BAAC,OAAE,WAAU,gCAA+B,kBAAI,GAClD;AAAA,OACF;AAAA,KAEJ;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Command } from "cmdk";
4
+ import { Search, MessageSquare, Loader2 } from "lucide-react";
5
+ import { cn } from "@open-mercato/shared/lib/utils";
6
+ function CommandInput({ value, onValueChange, mode, isLoading, placeholder }) {
7
+ const defaultPlaceholder = mode === "chat" ? "Ask AI..." : "Search commands or ask AI...";
8
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border-b px-4 py-3", children: [
9
+ /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center w-5 h-5 text-muted-foreground", children: isLoading ? /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : mode === "chat" ? /* @__PURE__ */ jsx(MessageSquare, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Search, { className: "h-4 w-4" }) }),
10
+ /* @__PURE__ */ jsx(
11
+ Command.Input,
12
+ {
13
+ value,
14
+ onValueChange,
15
+ placeholder: placeholder || defaultPlaceholder,
16
+ className: cn(
17
+ "flex-1 bg-transparent text-sm outline-none",
18
+ "placeholder:text-muted-foreground"
19
+ ),
20
+ autoFocus: true
21
+ }
22
+ ),
23
+ mode === "chat" && /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground bg-muted px-2 py-0.5 rounded", children: "AI" })
24
+ ] });
25
+ }
26
+ export {
27
+ CommandInput
28
+ };
29
+ //# sourceMappingURL=CommandInput.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/frontend/components/CommandPalette/CommandInput.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { Command } from 'cmdk'\nimport { Search, MessageSquare, Loader2 } from 'lucide-react'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport type { CommandPaletteMode } from '../../types'\n\ninterface CommandInputProps {\n value: string\n onValueChange: (value: string) => void\n mode: CommandPaletteMode\n isLoading?: boolean\n placeholder?: string\n}\n\nexport function CommandInput({ value, onValueChange, mode, isLoading, placeholder }: CommandInputProps) {\n const defaultPlaceholder = mode === 'chat' ? 'Ask AI...' : 'Search commands or ask AI...'\n\n return (\n <div className=\"flex items-center gap-2 border-b px-4 py-3\">\n <div className=\"flex items-center justify-center w-5 h-5 text-muted-foreground\">\n {isLoading ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : mode === 'chat' ? (\n <MessageSquare className=\"h-4 w-4\" />\n ) : (\n <Search className=\"h-4 w-4\" />\n )}\n </div>\n\n <Command.Input\n value={value}\n onValueChange={onValueChange}\n placeholder={placeholder || defaultPlaceholder}\n className={cn(\n 'flex-1 bg-transparent text-sm outline-none',\n 'placeholder:text-muted-foreground'\n )}\n autoFocus\n />\n\n {mode === 'chat' && (\n <span className=\"text-xs text-muted-foreground bg-muted px-2 py-0.5 rounded\">\n AI\n </span>\n )}\n </div>\n )\n}\n"],
5
+ "mappings": ";AAoBI,SAGM,KAHN;AAjBJ,SAAS,eAAe;AACxB,SAAS,QAAQ,eAAe,eAAe;AAC/C,SAAS,UAAU;AAWZ,SAAS,aAAa,EAAE,OAAO,eAAe,MAAM,WAAW,YAAY,GAAsB;AACtG,QAAM,qBAAqB,SAAS,SAAS,cAAc;AAE3D,SACE,qBAAC,SAAI,WAAU,8CACb;AAAA,wBAAC,SAAI,WAAU,kEACZ,sBACC,oBAAC,WAAQ,WAAU,wBAAuB,IACxC,SAAS,SACX,oBAAC,iBAAc,WAAU,WAAU,IAEnC,oBAAC,UAAO,WAAU,WAAU,GAEhC;AAAA,IAEA;AAAA,MAAC,QAAQ;AAAA,MAAR;AAAA,QACC;AAAA,QACA;AAAA,QACA,aAAa,eAAe;AAAA,QAC5B,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA,WAAS;AAAA;AAAA,IACX;AAAA,IAEC,SAAS,UACR,oBAAC,UAAK,WAAU,8DAA6D,gBAE7E;AAAA,KAEJ;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,92 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Command } from "cmdk";
4
+ import {
5
+ Plus,
6
+ Edit,
7
+ Trash,
8
+ Search,
9
+ Eye,
10
+ List,
11
+ Package,
12
+ Users,
13
+ ShoppingCart,
14
+ Lock,
15
+ BookOpen,
16
+ Folder,
17
+ DollarSign,
18
+ ToggleLeft,
19
+ Zap
20
+ } from "lucide-react";
21
+ import { cn } from "@open-mercato/shared/lib/utils";
22
+ import { humanizeToolName } from "../../utils/toolMatcher.js";
23
+ const MODULE_ICONS = {
24
+ customers: Users,
25
+ catalog: Package,
26
+ sales: ShoppingCart,
27
+ search: Search,
28
+ auth: Lock,
29
+ dictionaries: BookOpen,
30
+ directory: Folder,
31
+ currencies: DollarSign,
32
+ feature_toggles: ToggleLeft
33
+ };
34
+ const ACTION_ICONS = {
35
+ create: Plus,
36
+ update: Edit,
37
+ delete: Trash,
38
+ search: Search,
39
+ query: Search,
40
+ get: Eye,
41
+ list: List
42
+ };
43
+ function getIcon(tool) {
44
+ const nameParts = tool.name.split(".");
45
+ const action = nameParts[nameParts.length - 1];
46
+ if (ACTION_ICONS[action]) {
47
+ return ACTION_ICONS[action];
48
+ }
49
+ const module = tool.module || nameParts[0];
50
+ if (MODULE_ICONS[module]) {
51
+ return MODULE_ICONS[module];
52
+ }
53
+ return Zap;
54
+ }
55
+ function CommandItem({ tool, isSelected, onSelect }) {
56
+ const Icon = getIcon(tool);
57
+ const displayName = humanizeToolName(tool.name);
58
+ const module = tool.module || tool.name.split(".")[0];
59
+ return /* @__PURE__ */ jsxs(
60
+ Command.Item,
61
+ {
62
+ value: tool.name,
63
+ onSelect,
64
+ className: cn(
65
+ "flex items-center gap-3 px-3 py-2 cursor-pointer rounded-md",
66
+ "text-sm text-foreground",
67
+ isSelected ? "bg-accent text-accent-foreground" : "hover:bg-accent/50"
68
+ ),
69
+ children: [
70
+ /* @__PURE__ */ jsx(
71
+ "div",
72
+ {
73
+ className: cn(
74
+ "flex items-center justify-center w-8 h-8 rounded-md",
75
+ "bg-muted text-muted-foreground"
76
+ ),
77
+ children: /* @__PURE__ */ jsx(Icon, { className: "h-4 w-4" })
78
+ }
79
+ ),
80
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
81
+ /* @__PURE__ */ jsx("div", { className: "font-medium truncate", children: displayName }),
82
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground truncate", children: tool.description })
83
+ ] }),
84
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground capitalize", children: module })
85
+ ]
86
+ }
87
+ );
88
+ }
89
+ export {
90
+ CommandItem
91
+ };
92
+ //# sourceMappingURL=CommandItem.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/frontend/components/CommandPalette/CommandItem.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { Command } from 'cmdk'\nimport {\n Plus,\n Edit,\n Trash,\n Search,\n Eye,\n List,\n Package,\n Users,\n ShoppingCart,\n Calendar,\n Lock,\n BookOpen,\n Folder,\n DollarSign,\n ToggleLeft,\n Zap,\n} from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport type { ToolInfo } from '../../types'\nimport { humanizeToolName } from '../../utils/toolMatcher'\n\ninterface CommandItemProps {\n tool: ToolInfo\n isSelected: boolean\n onSelect: () => void\n}\n\nconst MODULE_ICONS: Record<string, LucideIcon> = {\n customers: Users,\n catalog: Package,\n sales: ShoppingCart,\n search: Search,\n auth: Lock,\n dictionaries: BookOpen,\n directory: Folder,\n currencies: DollarSign,\n feature_toggles: ToggleLeft,\n}\n\nconst ACTION_ICONS: Record<string, LucideIcon> = {\n create: Plus,\n update: Edit,\n delete: Trash,\n search: Search,\n query: Search,\n get: Eye,\n list: List,\n}\n\nfunction getIcon(tool: ToolInfo): LucideIcon {\n // First try to match action\n const nameParts = tool.name.split('.')\n const action = nameParts[nameParts.length - 1]\n if (ACTION_ICONS[action]) {\n return ACTION_ICONS[action]\n }\n\n // Then try module\n const module = tool.module || nameParts[0]\n if (MODULE_ICONS[module]) {\n return MODULE_ICONS[module]\n }\n\n return Zap\n}\n\nexport function CommandItem({ tool, isSelected, onSelect }: CommandItemProps) {\n const Icon = getIcon(tool)\n const displayName = humanizeToolName(tool.name)\n const module = tool.module || tool.name.split('.')[0]\n\n return (\n <Command.Item\n value={tool.name}\n onSelect={onSelect}\n className={cn(\n 'flex items-center gap-3 px-3 py-2 cursor-pointer rounded-md',\n 'text-sm text-foreground',\n isSelected\n ? 'bg-accent text-accent-foreground'\n : 'hover:bg-accent/50'\n )}\n >\n <div\n className={cn(\n 'flex items-center justify-center w-8 h-8 rounded-md',\n 'bg-muted text-muted-foreground'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium truncate\">{displayName}</div>\n <div className=\"text-xs text-muted-foreground truncate\">\n {tool.description}\n </div>\n </div>\n\n <span className=\"text-xs text-muted-foreground capitalize\">\n {module}\n </span>\n </Command.Item>\n )\n}\n"],
5
+ "mappings": ";AA+FQ,cAGF,YAHE;AA5FR,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,UAAU;AAEnB,SAAS,wBAAwB;AAQjC,MAAM,eAA2C;AAAA,EAC/C,WAAW;AAAA,EACX,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,cAAc;AAAA,EACd,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,iBAAiB;AACnB;AAEA,MAAM,eAA2C;AAAA,EAC/C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AACR;AAEA,SAAS,QAAQ,MAA4B;AAE3C,QAAM,YAAY,KAAK,KAAK,MAAM,GAAG;AACrC,QAAM,SAAS,UAAU,UAAU,SAAS,CAAC;AAC7C,MAAI,aAAa,MAAM,GAAG;AACxB,WAAO,aAAa,MAAM;AAAA,EAC5B;AAGA,QAAM,SAAS,KAAK,UAAU,UAAU,CAAC;AACzC,MAAI,aAAa,MAAM,GAAG;AACxB,WAAO,aAAa,MAAM;AAAA,EAC5B;AAEA,SAAO;AACT;AAEO,SAAS,YAAY,EAAE,MAAM,YAAY,SAAS,GAAqB;AAC5E,QAAM,OAAO,QAAQ,IAAI;AACzB,QAAM,cAAc,iBAAiB,KAAK,IAAI;AAC9C,QAAM,SAAS,KAAK,UAAU,KAAK,KAAK,MAAM,GAAG,EAAE,CAAC;AAEpD,SACE;AAAA,IAAC,QAAQ;AAAA,IAAR;AAAA,MACC,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,aACI,qCACA;AAAA,MACN;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEA,8BAAC,QAAK,WAAU,WAAU;AAAA;AAAA,QAC5B;AAAA,QAEA,qBAAC,SAAI,WAAU,kBACb;AAAA,8BAAC,SAAI,WAAU,wBAAwB,uBAAY;AAAA,UACnD,oBAAC,SAAI,WAAU,0CACZ,eAAK,aACR;AAAA,WACF;AAAA,QAEA,oBAAC,UAAK,WAAU,4CACb,kBACH;AAAA;AAAA;AAAA,EACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,244 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { createPortal } from "react-dom";
5
+ import { Command } from "cmdk";
6
+ import { Loader2, Send } from "lucide-react";
7
+ import { cn } from "@open-mercato/shared/lib/utils";
8
+ import { Button } from "@open-mercato/ui/primitives/button";
9
+ import { Dialog, DialogContent, DialogTitle } from "@open-mercato/ui/primitives/dialog";
10
+ import { VisuallyHidden } from "@radix-ui/react-visually-hidden";
11
+ import { useCommandPaletteContext } from "./CommandPaletteProvider.js";
12
+ import { CommandInput } from "./CommandInput.js";
13
+ import { CommandHeader } from "./CommandHeader.js";
14
+ import { CommandFooter } from "./CommandFooter.js";
15
+ import { ToolChatPage } from "./ToolChatPage.js";
16
+ import { DebugPanel } from "./DebugPanel.js";
17
+ function IdleState() {
18
+ return /* @__PURE__ */ jsxs("div", { className: "py-8 px-4 text-center text-muted-foreground", children: [
19
+ /* @__PURE__ */ jsx("p", { className: "mb-2", children: "Ask me anything or describe what you want to do." }),
20
+ /* @__PURE__ */ jsx("p", { className: "text-sm", children: "Examples:" }),
21
+ /* @__PURE__ */ jsxs("ul", { className: "text-sm mt-2 space-y-1", children: [
22
+ /* @__PURE__ */ jsx("li", { children: '"Search for customers in New York"' }),
23
+ /* @__PURE__ */ jsx("li", { children: '"Create a new product"' }),
24
+ /* @__PURE__ */ jsx("li", { children: '"Show me recent orders"' })
25
+ ] })
26
+ ] });
27
+ }
28
+ function RoutingIndicator() {
29
+ return /* @__PURE__ */ jsxs("div", { className: "py-8 flex items-center justify-center gap-2", children: [
30
+ /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" }),
31
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: "Analyzing request..." })
32
+ ] });
33
+ }
34
+ function CommandPalette() {
35
+ const {
36
+ state,
37
+ isThinking,
38
+ isSessionAuthorized,
39
+ messages,
40
+ pendingToolCalls,
41
+ selectedTool,
42
+ close,
43
+ setInputValue,
44
+ handleSubmit,
45
+ reset,
46
+ sendAgenticMessage,
47
+ approveToolCall,
48
+ rejectToolCall,
49
+ debugEvents,
50
+ showDebug,
51
+ setShowDebug,
52
+ clearDebugEvents,
53
+ pendingQuestion,
54
+ answerQuestion
55
+ } = useCommandPaletteContext();
56
+ const {
57
+ isOpen,
58
+ phase,
59
+ inputValue,
60
+ isLoading,
61
+ isStreaming,
62
+ connectionStatus
63
+ } = state;
64
+ const [localInput, setLocalInput] = React.useState("");
65
+ const [chatInput, setChatInput] = React.useState("");
66
+ const chatInputRef = React.useRef(null);
67
+ React.useEffect(() => {
68
+ if (phase === "idle") {
69
+ setLocalInput("");
70
+ setChatInput("");
71
+ }
72
+ }, [phase]);
73
+ React.useEffect(() => {
74
+ if (phase === "chatting" || phase === "confirming" || phase === "executing") {
75
+ setTimeout(() => chatInputRef.current?.focus(), 50);
76
+ }
77
+ }, [phase]);
78
+ const handleOpenChange = (open) => {
79
+ if (!open) {
80
+ close();
81
+ }
82
+ };
83
+ const handleInputSubmit = async () => {
84
+ const query = localInput.trim();
85
+ if (!query) return;
86
+ setLocalInput("");
87
+ await handleSubmit(query);
88
+ };
89
+ const handleKeyDown = (e) => {
90
+ if (e.key === "Enter" && phase === "idle" && localInput.trim()) {
91
+ e.preventDefault();
92
+ handleInputSubmit();
93
+ }
94
+ };
95
+ const handleChatSubmit = async (e) => {
96
+ e.preventDefault();
97
+ if (!chatInput.trim() || isStreaming) return;
98
+ const content = chatInput;
99
+ setChatInput("");
100
+ await sendAgenticMessage(content);
101
+ };
102
+ const handleChatKeyDown = (e) => {
103
+ if (e.key === "Escape") {
104
+ e.stopPropagation();
105
+ }
106
+ if (e.key === "Enter" && !e.shiftKey) {
107
+ e.preventDefault();
108
+ if (chatInput.trim() && !isStreaming) {
109
+ const content = chatInput;
110
+ setChatInput("");
111
+ sendAgenticMessage(content);
112
+ }
113
+ }
114
+ };
115
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
116
+ isOpen && showDebug && /* @__PURE__ */ jsx("div", { className: "fixed inset-0 z-40 bg-black/50 backdrop-blur-sm pointer-events-none" }),
117
+ /* @__PURE__ */ jsx(Dialog, { open: isOpen, onOpenChange: handleOpenChange, modal: !showDebug, children: /* @__PURE__ */ jsxs(
118
+ DialogContent,
119
+ {
120
+ className: cn(
121
+ "fixed left-1/2 top-[10vh] z-50 -translate-x-1/2",
122
+ "w-full max-w-2xl p-0",
123
+ "rounded-xl border bg-background shadow-2xl",
124
+ "flex flex-col"
125
+ ),
126
+ style: { maxHeight: 500, overflow: "hidden" },
127
+ onKeyDown: handleKeyDown,
128
+ onPointerDownOutside: (e) => {
129
+ if (showDebug) {
130
+ e.preventDefault();
131
+ }
132
+ },
133
+ onInteractOutside: (e) => {
134
+ if (showDebug) {
135
+ e.preventDefault();
136
+ }
137
+ },
138
+ children: [
139
+ /* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(DialogTitle, { children: "AI Command Palette" }) }),
140
+ /* @__PURE__ */ jsxs(Command, { className: "flex flex-col flex-1 min-h-0", shouldFilter: false, children: [
141
+ /* @__PURE__ */ jsx(
142
+ CommandHeader,
143
+ {
144
+ phase,
145
+ selectedTool,
146
+ onBack: reset
147
+ }
148
+ ),
149
+ phase === "idle" && /* @__PURE__ */ jsx(
150
+ CommandInput,
151
+ {
152
+ value: localInput,
153
+ onValueChange: setLocalInput,
154
+ mode: "commands",
155
+ isLoading,
156
+ placeholder: "Ask me anything or describe what you want to do..."
157
+ }
158
+ ),
159
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 min-h-0 overflow-y-auto", children: [
160
+ phase === "idle" && !localInput && /* @__PURE__ */ jsx(IdleState, {}),
161
+ phase === "routing" && /* @__PURE__ */ jsx(RoutingIndicator, {}),
162
+ (phase === "chatting" || phase === "confirming" || phase === "executing") && /* @__PURE__ */ jsx(
163
+ ToolChatPage,
164
+ {
165
+ tool: selectedTool,
166
+ messages,
167
+ pendingToolCalls,
168
+ isStreaming,
169
+ isThinking,
170
+ onApproveToolCall: approveToolCall,
171
+ onRejectToolCall: rejectToolCall,
172
+ pendingQuestion,
173
+ onAnswerQuestion: answerQuestion
174
+ }
175
+ )
176
+ ] }),
177
+ (phase === "chatting" || phase === "confirming" || phase === "executing") && /* @__PURE__ */ jsx("form", { onSubmit: handleChatSubmit, className: "shrink-0 border-t p-3", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
178
+ /* @__PURE__ */ jsx(
179
+ "input",
180
+ {
181
+ ref: chatInputRef,
182
+ type: "text",
183
+ value: chatInput,
184
+ onChange: (e) => setChatInput(e.target.value),
185
+ onKeyDown: handleChatKeyDown,
186
+ placeholder: "Describe what you want to do...",
187
+ className: cn(
188
+ "flex-1 bg-muted rounded-lg px-4 py-2 text-sm outline-none",
189
+ "focus:ring-2 focus:ring-ring",
190
+ "disabled:opacity-50"
191
+ ),
192
+ disabled: isStreaming
193
+ }
194
+ ),
195
+ /* @__PURE__ */ jsx(
196
+ Button,
197
+ {
198
+ type: "submit",
199
+ size: "icon",
200
+ disabled: !chatInput.trim() || isStreaming,
201
+ children: isStreaming ? /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ jsx(Send, { className: "h-4 w-4" })
202
+ }
203
+ )
204
+ ] }) }),
205
+ /* @__PURE__ */ jsx(
206
+ CommandFooter,
207
+ {
208
+ phase,
209
+ connectionStatus,
210
+ isSessionAuthorized,
211
+ showDebug,
212
+ onToggleDebug: () => setShowDebug(!showDebug)
213
+ }
214
+ )
215
+ ] })
216
+ ]
217
+ }
218
+ ) }),
219
+ isOpen && showDebug && typeof document !== "undefined" && createPortal(
220
+ /* @__PURE__ */ jsx(
221
+ "div",
222
+ {
223
+ "data-debug-panel": true,
224
+ className: "fixed z-[9999] bg-gray-900 rounded-xl border border-gray-700 shadow-2xl flex flex-col overflow-hidden",
225
+ style: { top: "80px", right: "20px", width: "400px", minWidth: "400px", maxWidth: "400px", maxHeight: "calc(100vh - 100px)" },
226
+ children: /* @__PURE__ */ jsx(
227
+ DebugPanel,
228
+ {
229
+ events: debugEvents,
230
+ onClear: clearDebugEvents,
231
+ isOpen: true,
232
+ onToggle: () => setShowDebug(false)
233
+ }
234
+ )
235
+ }
236
+ ),
237
+ document.body
238
+ )
239
+ ] });
240
+ }
241
+ export {
242
+ CommandPalette
243
+ };
244
+ //# sourceMappingURL=CommandPalette.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/frontend/components/CommandPalette/CommandPalette.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { Command } from 'cmdk'\nimport { Loader2, Send } from 'lucide-react'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Dialog, DialogContent, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { VisuallyHidden } from '@radix-ui/react-visually-hidden'\nimport { useCommandPaletteContext } from './CommandPaletteProvider'\nimport { CommandInput } from './CommandInput'\nimport { CommandHeader } from './CommandHeader'\nimport { CommandFooter } from './CommandFooter'\nimport { ToolChatPage } from './ToolChatPage'\nimport { DebugPanel } from './DebugPanel'\n\n// Idle state - shown when palette is open but no query submitted\nfunction IdleState() {\n return (\n <div className=\"py-8 px-4 text-center text-muted-foreground\">\n <p className=\"mb-2\">Ask me anything or describe what you want to do.</p>\n <p className=\"text-sm\">Examples:</p>\n <ul className=\"text-sm mt-2 space-y-1\">\n <li>&quot;Search for customers in New York&quot;</li>\n <li>&quot;Create a new product&quot;</li>\n <li>&quot;Show me recent orders&quot;</li>\n </ul>\n </div>\n )\n}\n\n// Routing indicator - shown while fast model analyzes intent\nfunction RoutingIndicator() {\n return (\n <div className=\"py-8 flex items-center justify-center gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span className=\"text-sm text-muted-foreground\">Analyzing request...</span>\n </div>\n )\n}\n\nexport function CommandPalette() {\n const {\n state,\n isThinking,\n isSessionAuthorized,\n messages,\n pendingToolCalls,\n selectedTool,\n close,\n setInputValue,\n handleSubmit,\n reset,\n sendAgenticMessage,\n approveToolCall,\n rejectToolCall,\n debugEvents,\n showDebug,\n setShowDebug,\n clearDebugEvents,\n pendingQuestion,\n answerQuestion,\n } = useCommandPaletteContext()\n\n const {\n isOpen,\n phase,\n inputValue,\n isLoading,\n isStreaming,\n connectionStatus,\n } = state\n\n const [localInput, setLocalInput] = React.useState('')\n const [chatInput, setChatInput] = React.useState('')\n const chatInputRef = React.useRef<HTMLInputElement>(null)\n\n // Reset local input when phase changes to idle\n React.useEffect(() => {\n if (phase === 'idle') {\n setLocalInput('')\n setChatInput('')\n }\n }, [phase])\n\n // Focus chat input when entering chatting phase\n React.useEffect(() => {\n if (phase === 'chatting' || phase === 'confirming' || phase === 'executing') {\n // Small delay to ensure DOM is ready\n setTimeout(() => chatInputRef.current?.focus(), 50)\n }\n }, [phase])\n\n const handleOpenChange = (open: boolean) => {\n if (!open) {\n close()\n }\n }\n\n const handleInputSubmit = async () => {\n const query = localInput.trim()\n if (!query) return\n setLocalInput('')\n await handleSubmit(query)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && phase === 'idle' && localInput.trim()) {\n e.preventDefault()\n handleInputSubmit()\n }\n }\n\n const handleChatSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!chatInput.trim() || isStreaming) return\n\n const content = chatInput\n setChatInput('')\n await sendAgenticMessage(content)\n }\n\n const handleChatKeyDown = (e: React.KeyboardEvent) => {\n // Prevent escape from bubbling to close the palette\n if (e.key === 'Escape') {\n e.stopPropagation()\n }\n // Submit on Enter (not Shift+Enter for multiline)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n if (chatInput.trim() && !isStreaming) {\n const content = chatInput\n setChatInput('')\n sendAgenticMessage(content)\n }\n }\n }\n\n return (\n <>\n {/* Custom blur overlay when debug mode is on (since modal=false removes it) */}\n {isOpen && showDebug && (\n <div className=\"fixed inset-0 z-40 bg-black/50 backdrop-blur-sm pointer-events-none\" />\n )}\n <Dialog open={isOpen} onOpenChange={handleOpenChange} modal={!showDebug}>\n <DialogContent\n className={cn(\n 'fixed left-1/2 top-[10vh] z-50 -translate-x-1/2',\n 'w-full max-w-2xl p-0',\n 'rounded-xl border bg-background shadow-2xl',\n 'flex flex-col'\n )}\n style={{ maxHeight: 500, overflow: 'hidden' }}\n onKeyDown={handleKeyDown}\n onPointerDownOutside={(e) => {\n // Prevent closing on outside click when debug mode is on\n if (showDebug) {\n e.preventDefault()\n }\n }}\n onInteractOutside={(e) => {\n // Prevent closing on outside interaction when debug mode is on\n if (showDebug) {\n e.preventDefault()\n }\n }}\n >\n {/* Visually hidden title for accessibility */}\n <VisuallyHidden>\n <DialogTitle>AI Command Palette</DialogTitle>\n </VisuallyHidden>\n <Command className=\"flex flex-col flex-1 min-h-0\" shouldFilter={false}>\n {/* Header - shows phase/tool info */}\n <CommandHeader\n phase={phase}\n selectedTool={selectedTool}\n onBack={reset}\n />\n\n {/* Input - shown in idle phase */}\n {phase === 'idle' && (\n <CommandInput\n value={localInput}\n onValueChange={setLocalInput}\n mode=\"commands\"\n isLoading={isLoading}\n placeholder=\"Ask me anything or describe what you want to do...\"\n />\n )}\n\n {/* Content area */}\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {phase === 'idle' && !localInput && <IdleState />}\n\n {phase === 'routing' && <RoutingIndicator />}\n\n {(phase === 'chatting' || phase === 'confirming' || phase === 'executing') && (\n <ToolChatPage\n tool={selectedTool}\n messages={messages}\n pendingToolCalls={pendingToolCalls}\n isStreaming={isStreaming}\n isThinking={isThinking}\n onApproveToolCall={approveToolCall}\n onRejectToolCall={rejectToolCall}\n pendingQuestion={pendingQuestion}\n onAnswerQuestion={answerQuestion}\n />\n )}\n </div>\n\n {/* Chat input - shown in chatting phases */}\n {(phase === 'chatting' || phase === 'confirming' || phase === 'executing') && (\n <form onSubmit={handleChatSubmit} className=\"shrink-0 border-t p-3\">\n <div className=\"flex items-center gap-2\">\n <input\n ref={chatInputRef}\n type=\"text\"\n value={chatInput}\n onChange={(e) => setChatInput(e.target.value)}\n onKeyDown={handleChatKeyDown}\n placeholder=\"Describe what you want to do...\"\n className={cn(\n 'flex-1 bg-muted rounded-lg px-4 py-2 text-sm outline-none',\n 'focus:ring-2 focus:ring-ring',\n 'disabled:opacity-50'\n )}\n disabled={isStreaming}\n />\n <Button\n type=\"submit\"\n size=\"icon\"\n disabled={!chatInput.trim() || isStreaming}\n >\n {isStreaming ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n </form>\n )}\n\n {/* Footer with connection status and keyboard hints */}\n <CommandFooter\n phase={phase}\n connectionStatus={connectionStatus}\n isSessionAuthorized={isSessionAuthorized}\n showDebug={showDebug}\n onToggleDebug={() => setShowDebug(!showDebug)}\n />\n </Command>\n </DialogContent>\n </Dialog>\n\n {/* Debug panel - rendered via portal outside the dialog DOM tree */}\n {isOpen && showDebug && typeof document !== 'undefined' && createPortal(\n <div\n data-debug-panel\n className=\"fixed z-[9999] bg-gray-900 rounded-xl border border-gray-700 shadow-2xl flex flex-col overflow-hidden\"\n style={{ top: '80px', right: '20px', width: '400px', minWidth: '400px', maxWidth: '400px', maxHeight: 'calc(100vh - 100px)' }}\n >\n <DebugPanel\n events={debugEvents}\n onClear={clearDebugEvents}\n isOpen={true}\n onToggle={() => setShowDebug(false)}\n />\n </div>,\n document.body\n )}\n </>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { createContext, useContext, useState, useEffect } from "react";
4
+ import { usePageContext } from "../../hooks/usePageContext.js";
5
+ import { useCommandPalette } from "../../hooks/useCommandPalette.js";
6
+ const CommandPaletteContext = createContext(null);
7
+ function CommandPaletteProvider({
8
+ children,
9
+ tenantId,
10
+ organizationId,
11
+ disableKeyboardShortcut = true
12
+ }) {
13
+ const pageContext = usePageContext({ tenantId, organizationId });
14
+ const [selectedEntities, setSelectedEntities] = useState([]);
15
+ useEffect(() => {
16
+ const handleSelectionChange = (event) => {
17
+ setSelectedEntities(event.detail || []);
18
+ };
19
+ window.addEventListener("om:selection-change", handleSelectionChange);
20
+ return () => {
21
+ window.removeEventListener("om:selection-change", handleSelectionChange);
22
+ };
23
+ }, []);
24
+ const commandPalette = useCommandPalette({
25
+ pageContext,
26
+ selectedEntities,
27
+ disableKeyboardShortcut
28
+ });
29
+ return /* @__PURE__ */ jsx(CommandPaletteContext.Provider, { value: commandPalette, children });
30
+ }
31
+ function useCommandPaletteContext() {
32
+ const context = useContext(CommandPaletteContext);
33
+ if (!context) {
34
+ throw new Error("useCommandPaletteContext must be used within CommandPaletteProvider");
35
+ }
36
+ return context;
37
+ }
38
+ export {
39
+ CommandPaletteProvider,
40
+ useCommandPaletteContext
41
+ };
42
+ //# sourceMappingURL=CommandPaletteProvider.js.map