@flanksource/clicky-ui 0.3.6 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/README.md +42 -0
  2. package/dist/components/DateField.d.ts +1 -1
  3. package/dist/components/DatePicker.d.ts +1 -1
  4. package/dist/components/DateTimePicker.d.ts +1 -1
  5. package/dist/components/FormLookupProvider.cjs +12 -0
  6. package/dist/components/FormLookupProvider.cjs.map +1 -0
  7. package/dist/components/FormLookupProvider.d.ts +7 -0
  8. package/dist/components/FormLookupProvider.d.ts.map +1 -0
  9. package/dist/components/FormLookupProvider.js +12 -0
  10. package/dist/components/FormLookupProvider.js.map +1 -0
  11. package/dist/components/JsonSchemaForm.cjs +2 -2
  12. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  13. package/dist/components/JsonSchemaForm.js +1 -1
  14. package/dist/components/JsonSchemaForm.js.map +1 -1
  15. package/dist/components/ListMenu.cjs +145 -0
  16. package/dist/components/ListMenu.cjs.map +1 -0
  17. package/dist/components/ListMenu.d.ts +54 -0
  18. package/dist/components/ListMenu.d.ts.map +1 -0
  19. package/dist/components/ListMenu.js +145 -0
  20. package/dist/components/ListMenu.js.map +1 -0
  21. package/dist/components/MdxEditorField.cjs +128 -0
  22. package/dist/components/MdxEditorField.cjs.map +1 -0
  23. package/dist/components/MdxEditorField.d.ts +4 -0
  24. package/dist/components/MdxEditorField.d.ts.map +1 -0
  25. package/dist/components/MdxEditorField.js +106 -0
  26. package/dist/components/MdxEditorField.js.map +1 -0
  27. package/dist/components/MdxEditorToolbar.cjs +76 -0
  28. package/dist/components/MdxEditorToolbar.cjs.map +1 -0
  29. package/dist/components/MdxEditorToolbar.d.ts +8 -0
  30. package/dist/components/MdxEditorToolbar.d.ts.map +1 -0
  31. package/dist/components/MdxEditorToolbar.js +76 -0
  32. package/dist/components/MdxEditorToolbar.js.map +1 -0
  33. package/dist/components/button-variants.d.ts +1 -1
  34. package/dist/components/button.d.ts +1 -1
  35. package/dist/components/form-lookup-context.cjs +1 -8
  36. package/dist/components/form-lookup-context.cjs.map +1 -1
  37. package/dist/components/form-lookup-context.d.ts +1 -5
  38. package/dist/components/form-lookup-context.d.ts.map +1 -1
  39. package/dist/components/form-lookup-context.js +1 -8
  40. package/dist/components/form-lookup-context.js.map +1 -1
  41. package/dist/components/jotai-bindings-core.cjs +197 -0
  42. package/dist/components/jotai-bindings-core.cjs.map +1 -0
  43. package/dist/components/jotai-bindings-core.d.ts +45 -0
  44. package/dist/components/jotai-bindings-core.d.ts.map +1 -0
  45. package/dist/components/jotai-bindings-core.js +197 -0
  46. package/dist/components/jotai-bindings-core.js.map +1 -0
  47. package/dist/components/jotai-bindings.cjs +17 -0
  48. package/dist/components/jotai-bindings.cjs.map +1 -0
  49. package/dist/components/jotai-bindings.d.ts +4 -0
  50. package/dist/components/jotai-bindings.d.ts.map +1 -0
  51. package/dist/components/jotai-bindings.js +17 -0
  52. package/dist/components/jotai-bindings.js.map +1 -0
  53. package/dist/components/json-schema-form-fields.cjs +37 -0
  54. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  55. package/dist/components/json-schema-form-fields.d.ts +6 -0
  56. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  57. package/dist/components/json-schema-form-fields.js +38 -1
  58. package/dist/components/json-schema-form-fields.js.map +1 -1
  59. package/dist/components/json-schema-form-render.cjs +3 -1
  60. package/dist/components/json-schema-form-render.cjs.map +1 -1
  61. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  62. package/dist/components/json-schema-form-render.js +4 -2
  63. package/dist/components/json-schema-form-render.js.map +1 -1
  64. package/dist/components/json-schema-form-resolve.cjs +9 -0
  65. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  66. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  67. package/dist/components/json-schema-form-resolve.js +9 -0
  68. package/dist/components/json-schema-form-resolve.js.map +1 -1
  69. package/dist/components/json-schema-form-types.d.ts +4 -1
  70. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  71. package/dist/components/mdx-editor-field-plugins.cjs +124 -0
  72. package/dist/components/mdx-editor-field-plugins.cjs.map +1 -0
  73. package/dist/components/mdx-editor-field-plugins.d.ts +6 -0
  74. package/dist/components/mdx-editor-field-plugins.d.ts.map +1 -0
  75. package/dist/components/mdx-editor-field-plugins.js +124 -0
  76. package/dist/components/mdx-editor-field-plugins.js.map +1 -0
  77. package/dist/components/mdx-editor-options.d.ts +77 -0
  78. package/dist/components/mdx-editor-options.d.ts.map +1 -0
  79. package/dist/components/use-list-menu-selection.cjs +77 -0
  80. package/dist/components/use-list-menu-selection.cjs.map +1 -0
  81. package/dist/components/use-list-menu-selection.d.ts +40 -0
  82. package/dist/components/use-list-menu-selection.d.ts.map +1 -0
  83. package/dist/components/use-list-menu-selection.js +77 -0
  84. package/dist/components/use-list-menu-selection.js.map +1 -0
  85. package/dist/components.cjs +10 -1
  86. package/dist/components.cjs.map +1 -1
  87. package/dist/components.d.ts +4 -1
  88. package/dist/components.d.ts.map +1 -1
  89. package/dist/components.js +10 -1
  90. package/dist/components.js.map +1 -1
  91. package/dist/data/MarkdownEditor.model.d.ts +1 -1
  92. package/dist/data/PromptBanner.cjs +199 -0
  93. package/dist/data/PromptBanner.cjs.map +1 -0
  94. package/dist/data/PromptBanner.d.ts +17 -0
  95. package/dist/data/PromptBanner.d.ts.map +1 -0
  96. package/dist/data/PromptBanner.js +199 -0
  97. package/dist/data/PromptBanner.js.map +1 -0
  98. package/dist/data/PromptBanner.model.cjs +132 -0
  99. package/dist/data/PromptBanner.model.cjs.map +1 -0
  100. package/dist/data/PromptBanner.model.d.ts +23 -0
  101. package/dist/data/PromptBanner.model.d.ts.map +1 -0
  102. package/dist/data/PromptBanner.model.js +132 -0
  103. package/dist/data/PromptBanner.model.js.map +1 -0
  104. package/dist/data/PromptDialog.cjs +43 -0
  105. package/dist/data/PromptDialog.cjs.map +1 -0
  106. package/dist/data/PromptDialog.d.ts +14 -0
  107. package/dist/data/PromptDialog.d.ts.map +1 -0
  108. package/dist/data/PromptDialog.js +43 -0
  109. package/dist/data/PromptDialog.js.map +1 -0
  110. package/dist/data/TaskManager.cjs +8 -1
  111. package/dist/data/TaskManager.cjs.map +1 -1
  112. package/dist/data/TaskManager.d.ts.map +1 -1
  113. package/dist/data/TaskManager.js +8 -1
  114. package/dist/data/TaskManager.js.map +1 -1
  115. package/dist/data/TaskProgress.cjs +15 -2
  116. package/dist/data/TaskProgress.cjs.map +1 -1
  117. package/dist/data/TaskProgress.d.ts +0 -10
  118. package/dist/data/TaskProgress.d.ts.map +1 -1
  119. package/dist/data/TaskProgress.js +15 -2
  120. package/dist/data/TaskProgress.js.map +1 -1
  121. package/dist/data/ai/ChatWindow.cjs +53 -9
  122. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  123. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  124. package/dist/data/ai/ChatWindow.js +53 -9
  125. package/dist/data/ai/ChatWindow.js.map +1 -1
  126. package/dist/data/ai/ToolPreferences.cjs +232 -39
  127. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  128. package/dist/data/ai/ToolPreferences.d.ts +4 -7
  129. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  130. package/dist/data/ai/ToolPreferences.js +234 -41
  131. package/dist/data/ai/ToolPreferences.js.map +1 -1
  132. package/dist/data/chat/clickyOperationsToTools.cjs +89 -3
  133. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
  134. package/dist/data/chat/clickyOperationsToTools.d.ts +1 -1
  135. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
  136. package/dist/data/chat/clickyOperationsToTools.js +89 -3
  137. package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
  138. package/dist/data/chat/types.cjs.map +1 -1
  139. package/dist/data/chat/types.d.ts +7 -1
  140. package/dist/data/chat/types.d.ts.map +1 -1
  141. package/dist/data/chat/types.js.map +1 -1
  142. package/dist/data/task-status.cjs +19 -12
  143. package/dist/data/task-status.cjs.map +1 -1
  144. package/dist/data/task-status.d.ts +2 -1
  145. package/dist/data/task-status.d.ts.map +1 -1
  146. package/dist/data/task-status.js +19 -12
  147. package/dist/data/task-status.js.map +1 -1
  148. package/dist/data/test-runner/TestRunner.fixtures.d.ts +11 -4
  149. package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
  150. package/dist/data/version-info.cjs +3 -3
  151. package/dist/data/version-info.js +3 -3
  152. package/dist/data.cjs +7 -0
  153. package/dist/data.cjs.map +1 -1
  154. package/dist/data.d.ts +3 -0
  155. package/dist/data.d.ts.map +1 -1
  156. package/dist/data.js +7 -0
  157. package/dist/data.js.map +1 -1
  158. package/dist/hooks/use-prompts.cjs +83 -0
  159. package/dist/hooks/use-prompts.cjs.map +1 -0
  160. package/dist/hooks/use-prompts.d.ts +43 -0
  161. package/dist/hooks/use-prompts.d.ts.map +1 -0
  162. package/dist/hooks/use-prompts.js +83 -0
  163. package/dist/hooks/use-prompts.js.map +1 -0
  164. package/dist/hooks.cjs +3 -0
  165. package/dist/hooks.cjs.map +1 -1
  166. package/dist/hooks.d.ts +1 -0
  167. package/dist/hooks.d.ts.map +1 -1
  168. package/dist/hooks.js +3 -0
  169. package/dist/hooks.js.map +1 -1
  170. package/dist/index.cjs +17 -1
  171. package/dist/index.cjs.map +1 -1
  172. package/dist/index.js +17 -1
  173. package/dist/index.js.map +1 -1
  174. package/dist/jotai.cjs +9 -0
  175. package/dist/jotai.cjs.map +1 -0
  176. package/dist/jotai.d.ts +4 -0
  177. package/dist/jotai.d.ts.map +1 -0
  178. package/dist/jotai.js +9 -0
  179. package/dist/jotai.js.map +1 -0
  180. package/dist/lib/utils.cjs +18 -1
  181. package/dist/lib/utils.cjs.map +1 -1
  182. package/dist/lib/utils.d.ts.map +1 -1
  183. package/dist/lib/utils.js +18 -1
  184. package/dist/lib/utils.js.map +1 -1
  185. package/dist/mdx-editor.cjs +5 -0
  186. package/dist/mdx-editor.cjs.map +1 -0
  187. package/dist/mdx-editor.css +2 -0
  188. package/dist/mdx-editor.d.ts +2 -0
  189. package/dist/mdx-editor.d.ts.map +1 -0
  190. package/dist/mdx-editor.js +5 -0
  191. package/dist/mdx-editor.js.map +1 -0
  192. package/dist/rpc/apiClient.cjs +1 -1
  193. package/dist/rpc/apiClient.cjs.map +1 -1
  194. package/dist/rpc/apiClient.js +1 -1
  195. package/dist/rpc/apiClient.js.map +1 -1
  196. package/dist/rpc/surfaceIconMap.cjs +12 -1
  197. package/dist/rpc/surfaceIconMap.cjs.map +1 -1
  198. package/dist/rpc/surfaceIconMap.d.ts.map +1 -1
  199. package/dist/rpc/surfaceIconMap.js +12 -1
  200. package/dist/rpc/surfaceIconMap.js.map +1 -1
  201. package/dist/rpc/types.cjs.map +1 -1
  202. package/dist/rpc/types.d.ts +1 -0
  203. package/dist/rpc/types.d.ts.map +1 -1
  204. package/dist/rpc/types.js.map +1 -1
  205. package/dist/styles.css +1 -1
  206. package/oxlint-plugins/README.md +148 -0
  207. package/oxlint-plugins/clicky-ui-no-adhoc-overlay.js +88 -0
  208. package/oxlint-plugins/clicky-ui-prefer-components.js +46 -0
  209. package/oxlint-plugins/clicky-ui-prefer-icons.js +121 -0
  210. package/oxlint-plugins/clicky-ui-prefer-tailwind.js +98 -0
  211. package/oxlint-plugins/clicky-ui-prefer-theme.js +134 -0
  212. package/oxlint-plugins/clicky-ui-shared.js +132 -0
  213. package/oxlint-plugins/clicky-ui.js +34 -0
  214. package/oxlint-plugins/no-iconify-names.js +37 -0
  215. package/package.json +21 -1
@@ -28,8 +28,11 @@ export { SecretKeySelector, type SecretKeySelectorProps, type SecretKind, type S
28
28
  export { ThemeSwitcher, type ThemeSwitcherProps } from './components/theme-switcher';
29
29
  export { DensitySwitcher, type DensitySwitcherProps } from './components/density-switcher';
30
30
  export { IconMenuPicker, type IconMenuPickerProps, type IconMenuOption, } from './components/icon-menu-picker';
31
+ export { ListMenu, ListMenuActionBar, ListMenuHeader, ListMenuItem, ListMenuSection, type ListMenuAction, type ListMenuActionBarProps, type ListMenuHeaderProps, type ListMenuItemProps, type ListMenuProps, type ListMenuSectionProps, } from './components/ListMenu';
32
+ export { useListMenuSelection, type ListMenuSelection, type UseListMenuSelectionOptions, } from './components/use-list-menu-selection';
31
33
  export { JsonSchemaForm } from './components/JsonSchemaForm';
32
- export { FormLookupProvider, useLookupFetcher, resolveLookupScope, } from './components/form-lookup-context';
34
+ export { FormLookupProvider } from './components/FormLookupProvider';
35
+ export { useLookupFetcher, resolveLookupScope } from './components/form-lookup-context';
33
36
  export { DEFAULT_FORM_SIZE } from './components/json-schema-form-size';
34
37
  export type { FormSize } from './components/json-schema-form-size';
35
38
  export { DEFAULT_PREFERENCES_STORAGE_KEY, readPreferences, writePreferences, } from './components/json-schema-form-preferences';
@@ -1 +1 @@
1
- {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"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"}
@@ -28,8 +28,11 @@ import { SecretKeySelector } from "./components/SecretKeySelector.js";
28
28
  import { ThemeSwitcher } from "./components/theme-switcher.js";
29
29
  import { DensitySwitcher } from "./components/density-switcher.js";
30
30
  import { IconMenuPicker } from "./components/icon-menu-picker.js";
31
+ import { ListMenu, ListMenuActionBar, ListMenuHeader, ListMenuItem, ListMenuSection } from "./components/ListMenu.js";
32
+ import { useListMenuSelection } from "./components/use-list-menu-selection.js";
31
33
  import { JsonSchemaForm } from "./components/JsonSchemaForm.js";
32
- import { FormLookupProvider, resolveLookupScope, useLookupFetcher } from "./components/form-lookup-context.js";
34
+ import { FormLookupProvider } from "./components/FormLookupProvider.js";
35
+ import { resolveLookupScope, useLookupFetcher } from "./components/form-lookup-context.js";
33
36
  import { DEFAULT_FORM_SIZE } from "./components/json-schema-form-size.js";
34
37
  import { DEFAULT_PREFERENCES_STORAGE_KEY, readPreferences, writePreferences } from "./components/json-schema-form-preferences.js";
35
38
  import { effectiveProperties, isOpenStringMap, matchesIf, resolveControl } from "./components/json-schema-form-resolve.js";
@@ -70,6 +73,11 @@ export {
70
73
  IconButton,
71
74
  IconMenuPicker,
72
75
  JsonSchemaForm,
76
+ ListMenu,
77
+ ListMenuActionBar,
78
+ ListMenuHeader,
79
+ ListMenuItem,
80
+ ListMenuSection,
73
81
  Loading,
74
82
  LoadingDots,
75
83
  Modal,
@@ -106,6 +114,7 @@ export {
106
114
  resolveLookupScope,
107
115
  templateValuePre,
108
116
  useForm,
117
+ useListMenuSelection,
109
118
  useLookupFetcher,
110
119
  useModalStack,
111
120
  useToast,
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -34,5 +34,5 @@ export type MarkdownEditorPreviewHeaders = HeadersInit | ((request: {
34
34
  format: MarkdownEditorPreviewFormat;
35
35
  }) => HeadersInit | undefined);
36
36
  export declare function buildMarkdownPreviewUrl(endpoint: string, format: MarkdownEditorPreviewFormat): string;
37
- export declare function clickyFormatForMarkdownPreview(format: MarkdownEditorPreviewFormat): "html" | "json" | "markdown" | "csv" | "pdf" | "excel" | "clicky-json";
37
+ export declare function clickyFormatForMarkdownPreview(format: MarkdownEditorPreviewFormat): "html" | "markdown" | "json" | "csv" | "pdf" | "excel" | "clicky-json";
38
38
  //# sourceMappingURL=MarkdownEditor.model.d.ts.map
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const button = require("../components/button.cjs");
6
+ const Icon = require("./Icon.cjs");
7
+ const utils = require("../lib/utils.cjs");
8
+ const usePrompts = require("../hooks/use-prompts.cjs");
9
+ const PromptDialog = require("./PromptDialog.cjs");
10
+ const PromptBanner_model = require("./PromptBanner.model.cjs");
11
+ const UiQuestion = require("../icons/components/UiQuestion.cjs");
12
+ const UiRobotAi = require("../icons/components/UiRobotAi.cjs");
13
+ const UiClose = require("../icons/components/UiClose.cjs");
14
+ const UiCheck = require("../icons/components/UiCheck.cjs");
15
+ const UiHourglass = require("../icons/components/UiHourglass.cjs");
16
+ const UiComment = require("../icons/components/UiComment.cjs");
17
+ function PromptBanner({
18
+ basePath = "/api/todos",
19
+ enabled,
20
+ title,
21
+ className,
22
+ inlineActions = "auto",
23
+ showSummary = true,
24
+ historyLimit = 5,
25
+ state: _ignoredState,
26
+ ...filter
27
+ }) {
28
+ const { prompts, pending } = usePrompts.usePrompts({
29
+ ...filter,
30
+ basePath,
31
+ ...enabled !== void 0 ? { enabled } : {},
32
+ ...showSummary ? {} : { state: "pending" }
33
+ });
34
+ const [active, setActive] = react.useState(null);
35
+ const [comment, setComment] = react.useState("");
36
+ const [resolving, setResolving] = react.useState(null);
37
+ const [error, setError] = react.useState(null);
38
+ const next = pending[0];
39
+ const activePrompt = active ?? next;
40
+ const inlineSpec = react.useMemo(
41
+ () => inlineActions === "auto" && activePrompt ? PromptBanner_model.analyzePromptInlineActions(activePrompt) : null,
42
+ [activePrompt, inlineActions]
43
+ );
44
+ const summary = react.useMemo(() => PromptBanner_model.summarizePrompts(prompts), [prompts]);
45
+ const recent = prompts.slice(0, Math.max(0, historyLimit));
46
+ react.useEffect(() => {
47
+ setComment(activePrompt ? PromptBanner_model.initialPromptComment(activePrompt, inlineSpec) : "");
48
+ setError(null);
49
+ setResolving(null);
50
+ }, [activePrompt == null ? void 0 : activePrompt.id, inlineSpec]);
51
+ if (showSummary ? prompts.length === 0 : !next) return null;
52
+ const headline = title ?? (pending.length > 1 ? `${pending.length} questions need your input` : (next == null ? void 0 : next.title) ?? "No pending prompts");
53
+ const resolveInline = async (decision) => {
54
+ if (!activePrompt || !inlineSpec) return;
55
+ setResolving(decision);
56
+ setError(null);
57
+ try {
58
+ await usePrompts.answerPrompt(basePath, activePrompt.id, {
59
+ values: PromptBanner_model.buildPromptInlineValues(activePrompt, inlineSpec, decision, comment)
60
+ });
61
+ setActive(null);
62
+ } catch (e) {
63
+ setError(e instanceof Error ? e.message : String(e));
64
+ } finally {
65
+ setResolving(null);
66
+ }
67
+ };
68
+ const commentRequiredButEmpty = Boolean((inlineSpec == null ? void 0 : inlineSpec.commentRequired) && comment.trim().length === 0);
69
+ return /* @__PURE__ */ jsxRuntime.jsxs(
70
+ "section",
71
+ {
72
+ "aria-label": "Prompt requests",
73
+ className: utils.cn(
74
+ "rounded-md border border-border bg-card px-3 py-2 text-card-foreground",
75
+ className
76
+ ),
77
+ children: [
78
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [
79
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [
80
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-2", children: [
81
+ /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: next ? UiQuestion.UiQuestion : UiRobotAi.UiRobotAi, className: "mt-0.5 size-4 shrink-0" }),
82
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
83
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "truncate text-sm font-medium", children: headline }),
84
+ (next == null ? void 0 : next.description) ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 line-clamp-2 text-xs opacity-80", children: next.description }) : null
85
+ ] })
86
+ ] }),
87
+ showSummary ? /* @__PURE__ */ jsxRuntime.jsx(PromptSummaryCounts, { summary }) : null
88
+ ] }),
89
+ next ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-2", children: inlineSpec ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
90
+ inlineSpec.commentField ? /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex min-w-0 flex-col gap-1 text-xs", children: [
91
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: inlineSpec.commentLabel ?? "Comment" }),
92
+ /* @__PURE__ */ jsxRuntime.jsx(
93
+ "textarea",
94
+ {
95
+ className: "min-h-16 w-full resize-y rounded-md border border-input bg-background px-2 py-1.5 text-sm text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
96
+ placeholder: "Add a short note",
97
+ value: comment,
98
+ onChange: (event) => setComment(event.target.value)
99
+ }
100
+ )
101
+ ] }) : null,
102
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center justify-end gap-2", children: [
103
+ error ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mr-auto text-xs text-red-600 dark:text-red-300", children: error }) : null,
104
+ /* @__PURE__ */ jsxRuntime.jsxs(
105
+ button.Button,
106
+ {
107
+ size: "sm",
108
+ variant: "outline",
109
+ type: "button",
110
+ loading: resolving === "reject",
111
+ disabled: resolving !== null || commentRequiredButEmpty,
112
+ onClick: () => void resolveInline("reject"),
113
+ className: "gap-1.5",
114
+ children: [
115
+ /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiClose.UiClose, className: "size-3.5" }),
116
+ "Reject"
117
+ ]
118
+ }
119
+ ),
120
+ /* @__PURE__ */ jsxRuntime.jsxs(
121
+ button.Button,
122
+ {
123
+ size: "sm",
124
+ type: "button",
125
+ loading: resolving === "approve",
126
+ disabled: resolving !== null || commentRequiredButEmpty,
127
+ onClick: () => void resolveInline("approve"),
128
+ className: "gap-1.5",
129
+ children: [
130
+ /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiCheck.UiCheck, className: "size-3.5" }),
131
+ "Approve"
132
+ ]
133
+ }
134
+ ),
135
+ /* @__PURE__ */ jsxRuntime.jsx(button.Button, { size: "sm", variant: "ghost", type: "button", onClick: () => setActive(next), children: "More" })
136
+ ] })
137
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-end", children: /* @__PURE__ */ jsxRuntime.jsx(button.Button, { size: "sm", type: "button", onClick: () => setActive(next), children: "Answer" }) }) }) : null,
138
+ showSummary && recent.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(PromptHistory, { prompts: recent, activeId: next == null ? void 0 : next.id }) : null
139
+ ] }),
140
+ active ? /* @__PURE__ */ jsxRuntime.jsx(
141
+ PromptDialog.PromptDialog,
142
+ {
143
+ prompt: active,
144
+ basePath,
145
+ open: true,
146
+ onClose: () => setActive(null),
147
+ onResolved: () => setActive(null)
148
+ }
149
+ ) : null
150
+ ]
151
+ }
152
+ );
153
+ }
154
+ function PromptSummaryCounts({ summary }) {
155
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 flex-wrap items-center gap-x-3 gap-y-1 text-xs opacity-85", children: [
156
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1 font-medium", children: [
157
+ /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiHourglass.UiHourglass, className: "size-3.5" }),
158
+ summary.pending,
159
+ " pending"
160
+ ] }),
161
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
162
+ summary.answered,
163
+ " answered"
164
+ ] }),
165
+ (summary.cancelled > 0 || summary.expired > 0) && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
166
+ summary.cancelled + summary.expired,
167
+ " closed"
168
+ ] })
169
+ ] });
170
+ }
171
+ function PromptHistory({ prompts, activeId }) {
172
+ return /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "divide-y divide-border overflow-hidden rounded-md border border-border bg-background text-xs", children: prompts.map((prompt) => /* @__PURE__ */ jsxRuntime.jsxs(
173
+ "li",
174
+ {
175
+ className: utils.cn("flex min-w-0 items-start gap-2 px-2 py-1.5", prompt.id === activeId && "bg-muted/60"),
176
+ children: [
177
+ /* @__PURE__ */ jsxRuntime.jsx(PromptStateIcon, { prompt }),
178
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
179
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
180
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate font-medium text-foreground", children: prompt.title }),
181
+ prompt.kind ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 text-muted-foreground", children: prompt.kind }) : null
182
+ ] }),
183
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 truncate text-muted-foreground", children: PromptBanner_model.summarizePromptAnswer(prompt) })
184
+ ] })
185
+ ]
186
+ },
187
+ prompt.id
188
+ )) });
189
+ }
190
+ function PromptStateIcon({ prompt }) {
191
+ if (prompt.state === "answered") return /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiCheck.UiCheck, className: "mt-0.5 size-3.5 shrink-0 text-emerald-600" });
192
+ if (prompt.state === "cancelled" || prompt.state === "expired") {
193
+ return /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiClose.UiClose, className: "mt-0.5 size-3.5 shrink-0 text-rose-600" });
194
+ }
195
+ if (prompt.kind === "comment") return /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiComment.UiComment, className: "mt-0.5 size-3.5 shrink-0" });
196
+ return /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiHourglass.UiHourglass, className: "mt-0.5 size-3.5 shrink-0" });
197
+ }
198
+ exports.PromptBanner = PromptBanner;
199
+ //# sourceMappingURL=PromptBanner.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptBanner.cjs","sources":["../../src/data/PromptBanner.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"./Icon\";\nimport { UiCheck, UiClose, UiComment, UiHourglass, UiQuestion, UiRobotAi } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport { answerPrompt, usePrompts, type PromptFilter, type PromptSnapshot } from \"../hooks/use-prompts\";\nimport { PromptDialog } from \"./PromptDialog\";\nimport {\n analyzePromptInlineActions,\n buildPromptInlineValues,\n initialPromptComment,\n summarizePromptAnswer,\n summarizePrompts,\n type PromptInlineDecision,\n} from \"./PromptBanner.model\";\n\nexport interface PromptBannerProps extends PromptFilter {\n /** Base path the prompt API is mounted under, e.g. \"/api/todos\". */\n basePath?: string | undefined;\n enabled?: boolean | undefined;\n /** Override the headline; defaults to a count-aware message. */\n title?: string | undefined;\n className?: string | undefined;\n /** Render approve/reject quick actions when the prompt schema supports them. */\n inlineActions?: \"auto\" | false | undefined;\n /** Show compact counts and recent prompt outcomes, not only the current pending prompt. */\n showSummary?: boolean | undefined;\n /** Maximum recent prompts shown in the summary list. */\n historyLimit?: number | undefined;\n}\n\n// PromptBanner subscribes to pending prompts for a scope (owner / session label)\n// and surfaces them as an inline affordance, opening a PromptDialog to answer.\n// Mount it scoped to a todo (owner) at the top of a detail page, or to a session\n// (labels.session) inside a session view using the same component and filters.\nexport function PromptBanner({\n basePath = \"/api/todos\",\n enabled,\n title,\n className,\n inlineActions = \"auto\",\n showSummary = true,\n historyLimit = 5,\n state: _ignoredState,\n ...filter\n}: PromptBannerProps) {\n const { prompts, pending } = usePrompts({\n ...filter,\n basePath,\n ...(enabled !== undefined ? { enabled } : {}),\n ...(showSummary ? {} : { state: \"pending\" }),\n });\n const [active, setActive] = useState<PromptSnapshot | null>(null);\n const [comment, setComment] = useState(\"\");\n const [resolving, setResolving] = useState<PromptInlineDecision | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const next = pending[0];\n const activePrompt = active ?? next;\n const inlineSpec = useMemo(\n () => (inlineActions === \"auto\" && activePrompt ? analyzePromptInlineActions(activePrompt) : null),\n [activePrompt, inlineActions],\n );\n const summary = useMemo(() => summarizePrompts(prompts), [prompts]);\n const recent = prompts.slice(0, Math.max(0, historyLimit));\n\n useEffect(() => {\n setComment(activePrompt ? initialPromptComment(activePrompt, inlineSpec) : \"\");\n setError(null);\n setResolving(null);\n }, [activePrompt?.id, inlineSpec]);\n\n if (showSummary ? prompts.length === 0 : !next) return null;\n const headline =\n title ??\n (pending.length > 1\n ? `${pending.length} questions need your input`\n : next?.title ?? \"No pending prompts\");\n\n const resolveInline = async (decision: PromptInlineDecision) => {\n if (!activePrompt || !inlineSpec) return;\n setResolving(decision);\n setError(null);\n try {\n await answerPrompt(basePath, activePrompt.id, {\n values: buildPromptInlineValues(activePrompt, inlineSpec, decision, comment),\n });\n setActive(null);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setResolving(null);\n }\n };\n\n const commentRequiredButEmpty = Boolean(inlineSpec?.commentRequired && comment.trim().length === 0);\n\n return (\n <section\n aria-label=\"Prompt requests\"\n className={cn(\n \"rounded-md border border-border bg-card px-3 py-2 text-card-foreground\",\n className,\n )}\n >\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"flex min-w-0 flex-1 items-start gap-2\">\n <Icon icon={next ? UiQuestion : UiRobotAi} className=\"mt-0.5 size-4 shrink-0\" />\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">{headline}</div>\n {next?.description ? (\n <div className=\"mt-0.5 line-clamp-2 text-xs opacity-80\">{next.description}</div>\n ) : null}\n </div>\n </div>\n {showSummary ? <PromptSummaryCounts summary={summary} /> : null}\n </div>\n\n {next ? (\n <div className=\"flex flex-col gap-2\">\n {inlineSpec ? (\n <div className=\"flex flex-col gap-2\">\n {inlineSpec.commentField ? (\n <label className=\"flex min-w-0 flex-col gap-1 text-xs\">\n <span className=\"font-medium\">{inlineSpec.commentLabel ?? \"Comment\"}</span>\n <textarea\n className=\"min-h-16 w-full resize-y rounded-md border border-input bg-background px-2 py-1.5 text-sm text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n placeholder=\"Add a short note\"\n value={comment}\n onChange={(event) => setComment(event.target.value)}\n />\n </label>\n ) : null}\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n {error ? <span className=\"mr-auto text-xs text-red-600 dark:text-red-300\">{error}</span> : null}\n <Button\n size=\"sm\"\n variant=\"outline\"\n type=\"button\"\n loading={resolving === \"reject\"}\n disabled={resolving !== null || commentRequiredButEmpty}\n onClick={() => void resolveInline(\"reject\")}\n className=\"gap-1.5\"\n >\n <Icon icon={UiClose} className=\"size-3.5\" />\n Reject\n </Button>\n <Button\n size=\"sm\"\n type=\"button\"\n loading={resolving === \"approve\"}\n disabled={resolving !== null || commentRequiredButEmpty}\n onClick={() => void resolveInline(\"approve\")}\n className=\"gap-1.5\"\n >\n <Icon icon={UiCheck} className=\"size-3.5\" />\n Approve\n </Button>\n <Button size=\"sm\" variant=\"ghost\" type=\"button\" onClick={() => setActive(next)}>\n More\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"flex items-center justify-end\">\n <Button size=\"sm\" type=\"button\" onClick={() => setActive(next)}>\n Answer\n </Button>\n </div>\n )}\n </div>\n ) : null}\n\n {showSummary && recent.length > 0 ? <PromptHistory prompts={recent} activeId={next?.id} /> : null}\n </div>\n {active ? (\n <PromptDialog\n prompt={active}\n basePath={basePath}\n open={true}\n onClose={() => setActive(null)}\n onResolved={() => setActive(null)}\n />\n ) : null}\n </section>\n );\n}\n\nfunction PromptSummaryCounts({ summary }: { summary: ReturnType<typeof summarizePrompts> }) {\n return (\n <div className=\"flex shrink-0 flex-wrap items-center gap-x-3 gap-y-1 text-xs opacity-85\">\n <span className=\"inline-flex items-center gap-1 font-medium\">\n <Icon icon={UiHourglass} className=\"size-3.5\" />\n {summary.pending} pending\n </span>\n <span>{summary.answered} answered</span>\n {(summary.cancelled > 0 || summary.expired > 0) && (\n <span>{summary.cancelled + summary.expired} closed</span>\n )}\n </div>\n );\n}\n\nfunction PromptHistory({ prompts, activeId }: { prompts: PromptSnapshot[]; activeId?: string | undefined }) {\n return (\n <ol className=\"divide-y divide-border overflow-hidden rounded-md border border-border bg-background text-xs\">\n {prompts.map((prompt) => (\n <li\n key={prompt.id}\n className={cn(\"flex min-w-0 items-start gap-2 px-2 py-1.5\", prompt.id === activeId && \"bg-muted/60\")}\n >\n <PromptStateIcon prompt={prompt} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate font-medium text-foreground\">{prompt.title}</span>\n {prompt.kind ? <span className=\"shrink-0 text-muted-foreground\">{prompt.kind}</span> : null}\n </div>\n <div className=\"mt-0.5 truncate text-muted-foreground\">{summarizePromptAnswer(prompt)}</div>\n </div>\n </li>\n ))}\n </ol>\n );\n}\n\nfunction PromptStateIcon({ prompt }: { prompt: PromptSnapshot }) {\n if (prompt.state === \"answered\") return <Icon icon={UiCheck} className=\"mt-0.5 size-3.5 shrink-0 text-emerald-600\" />;\n if (prompt.state === \"cancelled\" || prompt.state === \"expired\") {\n return <Icon icon={UiClose} className=\"mt-0.5 size-3.5 shrink-0 text-rose-600\" />;\n }\n if (prompt.kind === \"comment\") return <Icon icon={UiComment} className=\"mt-0.5 size-3.5 shrink-0\" />;\n return <Icon icon={UiHourglass} className=\"mt-0.5 size-3.5 shrink-0\" />;\n}\n"],"names":["usePrompts","useState","useMemo","analyzePromptInlineActions","summarizePrompts","useEffect","initialPromptComment","answerPrompt","buildPromptInlineValues","jsxs","cn","jsx","Icon","UiQuestion","UiRobotAi","Button","UiClose","UiCheck","PromptDialog","UiHourglass","summarizePromptAnswer","UiComment"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { PromptFilter } from '../hooks/use-prompts';
2
+ export interface PromptBannerProps extends PromptFilter {
3
+ /** Base path the prompt API is mounted under, e.g. "/api/todos". */
4
+ basePath?: string | undefined;
5
+ enabled?: boolean | undefined;
6
+ /** Override the headline; defaults to a count-aware message. */
7
+ title?: string | undefined;
8
+ className?: string | undefined;
9
+ /** Render approve/reject quick actions when the prompt schema supports them. */
10
+ inlineActions?: "auto" | false | undefined;
11
+ /** Show compact counts and recent prompt outcomes, not only the current pending prompt. */
12
+ showSummary?: boolean | undefined;
13
+ /** Maximum recent prompts shown in the summary list. */
14
+ historyLimit?: number | undefined;
15
+ }
16
+ export declare function PromptBanner({ basePath, enabled, title, className, inlineActions, showSummary, historyLimit, state: _ignoredState, ...filter }: PromptBannerProps): import("react/jsx-runtime").JSX.Element | null;
17
+ //# sourceMappingURL=PromptBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptBanner.d.ts","sourceRoot":"","sources":["../../src/data/PromptBanner.tsx"],"names":[],"mappings":"AAKA,OAAO,EAA4B,KAAK,YAAY,EAAuB,MAAM,sBAAsB,CAAC;AAWxG,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;IAC3C,2FAA2F;IAC3F,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAMD,wBAAgB,YAAY,CAAC,EAC3B,QAAuB,EACvB,OAAO,EACP,KAAK,EACL,SAAS,EACT,aAAsB,EACtB,WAAkB,EAClB,YAAgB,EAChB,KAAK,EAAE,aAAa,EACpB,GAAG,MAAM,EACV,EAAE,iBAAiB,kDA8InB"}
@@ -0,0 +1,199 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useState, useMemo, useEffect } from "react";
3
+ import { Button } from "../components/button.js";
4
+ import { Icon } from "./Icon.js";
5
+ import { cn } from "../lib/utils.js";
6
+ import { usePrompts, answerPrompt } from "../hooks/use-prompts.js";
7
+ import { PromptDialog } from "./PromptDialog.js";
8
+ import { analyzePromptInlineActions, summarizePrompts, initialPromptComment, buildPromptInlineValues, summarizePromptAnswer } from "./PromptBanner.model.js";
9
+ import { UiQuestion } from "../icons/components/UiQuestion.js";
10
+ import { UiRobotAi } from "../icons/components/UiRobotAi.js";
11
+ import { UiClose } from "../icons/components/UiClose.js";
12
+ import { UiCheck } from "../icons/components/UiCheck.js";
13
+ import { UiHourglass } from "../icons/components/UiHourglass.js";
14
+ import { UiComment } from "../icons/components/UiComment.js";
15
+ function PromptBanner({
16
+ basePath = "/api/todos",
17
+ enabled,
18
+ title,
19
+ className,
20
+ inlineActions = "auto",
21
+ showSummary = true,
22
+ historyLimit = 5,
23
+ state: _ignoredState,
24
+ ...filter
25
+ }) {
26
+ const { prompts, pending } = usePrompts({
27
+ ...filter,
28
+ basePath,
29
+ ...enabled !== void 0 ? { enabled } : {},
30
+ ...showSummary ? {} : { state: "pending" }
31
+ });
32
+ const [active, setActive] = useState(null);
33
+ const [comment, setComment] = useState("");
34
+ const [resolving, setResolving] = useState(null);
35
+ const [error, setError] = useState(null);
36
+ const next = pending[0];
37
+ const activePrompt = active ?? next;
38
+ const inlineSpec = useMemo(
39
+ () => inlineActions === "auto" && activePrompt ? analyzePromptInlineActions(activePrompt) : null,
40
+ [activePrompt, inlineActions]
41
+ );
42
+ const summary = useMemo(() => summarizePrompts(prompts), [prompts]);
43
+ const recent = prompts.slice(0, Math.max(0, historyLimit));
44
+ useEffect(() => {
45
+ setComment(activePrompt ? initialPromptComment(activePrompt, inlineSpec) : "");
46
+ setError(null);
47
+ setResolving(null);
48
+ }, [activePrompt == null ? void 0 : activePrompt.id, inlineSpec]);
49
+ if (showSummary ? prompts.length === 0 : !next) return null;
50
+ const headline = title ?? (pending.length > 1 ? `${pending.length} questions need your input` : (next == null ? void 0 : next.title) ?? "No pending prompts");
51
+ const resolveInline = async (decision) => {
52
+ if (!activePrompt || !inlineSpec) return;
53
+ setResolving(decision);
54
+ setError(null);
55
+ try {
56
+ await answerPrompt(basePath, activePrompt.id, {
57
+ values: buildPromptInlineValues(activePrompt, inlineSpec, decision, comment)
58
+ });
59
+ setActive(null);
60
+ } catch (e) {
61
+ setError(e instanceof Error ? e.message : String(e));
62
+ } finally {
63
+ setResolving(null);
64
+ }
65
+ };
66
+ const commentRequiredButEmpty = Boolean((inlineSpec == null ? void 0 : inlineSpec.commentRequired) && comment.trim().length === 0);
67
+ return /* @__PURE__ */ jsxs(
68
+ "section",
69
+ {
70
+ "aria-label": "Prompt requests",
71
+ className: cn(
72
+ "rounded-md border border-border bg-card px-3 py-2 text-card-foreground",
73
+ className
74
+ ),
75
+ children: [
76
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
77
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [
78
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-2", children: [
79
+ /* @__PURE__ */ jsx(Icon, { icon: next ? UiQuestion : UiRobotAi, className: "mt-0.5 size-4 shrink-0" }),
80
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
81
+ /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-medium", children: headline }),
82
+ (next == null ? void 0 : next.description) ? /* @__PURE__ */ jsx("div", { className: "mt-0.5 line-clamp-2 text-xs opacity-80", children: next.description }) : null
83
+ ] })
84
+ ] }),
85
+ showSummary ? /* @__PURE__ */ jsx(PromptSummaryCounts, { summary }) : null
86
+ ] }),
87
+ next ? /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: inlineSpec ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
88
+ inlineSpec.commentField ? /* @__PURE__ */ jsxs("label", { className: "flex min-w-0 flex-col gap-1 text-xs", children: [
89
+ /* @__PURE__ */ jsx("span", { className: "font-medium", children: inlineSpec.commentLabel ?? "Comment" }),
90
+ /* @__PURE__ */ jsx(
91
+ "textarea",
92
+ {
93
+ className: "min-h-16 w-full resize-y rounded-md border border-input bg-background px-2 py-1.5 text-sm text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
94
+ placeholder: "Add a short note",
95
+ value: comment,
96
+ onChange: (event) => setComment(event.target.value)
97
+ }
98
+ )
99
+ ] }) : null,
100
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-end gap-2", children: [
101
+ error ? /* @__PURE__ */ jsx("span", { className: "mr-auto text-xs text-red-600 dark:text-red-300", children: error }) : null,
102
+ /* @__PURE__ */ jsxs(
103
+ Button,
104
+ {
105
+ size: "sm",
106
+ variant: "outline",
107
+ type: "button",
108
+ loading: resolving === "reject",
109
+ disabled: resolving !== null || commentRequiredButEmpty,
110
+ onClick: () => void resolveInline("reject"),
111
+ className: "gap-1.5",
112
+ children: [
113
+ /* @__PURE__ */ jsx(Icon, { icon: UiClose, className: "size-3.5" }),
114
+ "Reject"
115
+ ]
116
+ }
117
+ ),
118
+ /* @__PURE__ */ jsxs(
119
+ Button,
120
+ {
121
+ size: "sm",
122
+ type: "button",
123
+ loading: resolving === "approve",
124
+ disabled: resolving !== null || commentRequiredButEmpty,
125
+ onClick: () => void resolveInline("approve"),
126
+ className: "gap-1.5",
127
+ children: [
128
+ /* @__PURE__ */ jsx(Icon, { icon: UiCheck, className: "size-3.5" }),
129
+ "Approve"
130
+ ]
131
+ }
132
+ ),
133
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: "ghost", type: "button", onClick: () => setActive(next), children: "More" })
134
+ ] })
135
+ ] }) : /* @__PURE__ */ jsx("div", { className: "flex items-center justify-end", children: /* @__PURE__ */ jsx(Button, { size: "sm", type: "button", onClick: () => setActive(next), children: "Answer" }) }) }) : null,
136
+ showSummary && recent.length > 0 ? /* @__PURE__ */ jsx(PromptHistory, { prompts: recent, activeId: next == null ? void 0 : next.id }) : null
137
+ ] }),
138
+ active ? /* @__PURE__ */ jsx(
139
+ PromptDialog,
140
+ {
141
+ prompt: active,
142
+ basePath,
143
+ open: true,
144
+ onClose: () => setActive(null),
145
+ onResolved: () => setActive(null)
146
+ }
147
+ ) : null
148
+ ]
149
+ }
150
+ );
151
+ }
152
+ function PromptSummaryCounts({ summary }) {
153
+ return /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 flex-wrap items-center gap-x-3 gap-y-1 text-xs opacity-85", children: [
154
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 font-medium", children: [
155
+ /* @__PURE__ */ jsx(Icon, { icon: UiHourglass, className: "size-3.5" }),
156
+ summary.pending,
157
+ " pending"
158
+ ] }),
159
+ /* @__PURE__ */ jsxs("span", { children: [
160
+ summary.answered,
161
+ " answered"
162
+ ] }),
163
+ (summary.cancelled > 0 || summary.expired > 0) && /* @__PURE__ */ jsxs("span", { children: [
164
+ summary.cancelled + summary.expired,
165
+ " closed"
166
+ ] })
167
+ ] });
168
+ }
169
+ function PromptHistory({ prompts, activeId }) {
170
+ return /* @__PURE__ */ jsx("ol", { className: "divide-y divide-border overflow-hidden rounded-md border border-border bg-background text-xs", children: prompts.map((prompt) => /* @__PURE__ */ jsxs(
171
+ "li",
172
+ {
173
+ className: cn("flex min-w-0 items-start gap-2 px-2 py-1.5", prompt.id === activeId && "bg-muted/60"),
174
+ children: [
175
+ /* @__PURE__ */ jsx(PromptStateIcon, { prompt }),
176
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
177
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
178
+ /* @__PURE__ */ jsx("span", { className: "truncate font-medium text-foreground", children: prompt.title }),
179
+ prompt.kind ? /* @__PURE__ */ jsx("span", { className: "shrink-0 text-muted-foreground", children: prompt.kind }) : null
180
+ ] }),
181
+ /* @__PURE__ */ jsx("div", { className: "mt-0.5 truncate text-muted-foreground", children: summarizePromptAnswer(prompt) })
182
+ ] })
183
+ ]
184
+ },
185
+ prompt.id
186
+ )) });
187
+ }
188
+ function PromptStateIcon({ prompt }) {
189
+ if (prompt.state === "answered") return /* @__PURE__ */ jsx(Icon, { icon: UiCheck, className: "mt-0.5 size-3.5 shrink-0 text-emerald-600" });
190
+ if (prompt.state === "cancelled" || prompt.state === "expired") {
191
+ return /* @__PURE__ */ jsx(Icon, { icon: UiClose, className: "mt-0.5 size-3.5 shrink-0 text-rose-600" });
192
+ }
193
+ if (prompt.kind === "comment") return /* @__PURE__ */ jsx(Icon, { icon: UiComment, className: "mt-0.5 size-3.5 shrink-0" });
194
+ return /* @__PURE__ */ jsx(Icon, { icon: UiHourglass, className: "mt-0.5 size-3.5 shrink-0" });
195
+ }
196
+ export {
197
+ PromptBanner
198
+ };
199
+ //# sourceMappingURL=PromptBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptBanner.js","sources":["../../src/data/PromptBanner.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"./Icon\";\nimport { UiCheck, UiClose, UiComment, UiHourglass, UiQuestion, UiRobotAi } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport { answerPrompt, usePrompts, type PromptFilter, type PromptSnapshot } from \"../hooks/use-prompts\";\nimport { PromptDialog } from \"./PromptDialog\";\nimport {\n analyzePromptInlineActions,\n buildPromptInlineValues,\n initialPromptComment,\n summarizePromptAnswer,\n summarizePrompts,\n type PromptInlineDecision,\n} from \"./PromptBanner.model\";\n\nexport interface PromptBannerProps extends PromptFilter {\n /** Base path the prompt API is mounted under, e.g. \"/api/todos\". */\n basePath?: string | undefined;\n enabled?: boolean | undefined;\n /** Override the headline; defaults to a count-aware message. */\n title?: string | undefined;\n className?: string | undefined;\n /** Render approve/reject quick actions when the prompt schema supports them. */\n inlineActions?: \"auto\" | false | undefined;\n /** Show compact counts and recent prompt outcomes, not only the current pending prompt. */\n showSummary?: boolean | undefined;\n /** Maximum recent prompts shown in the summary list. */\n historyLimit?: number | undefined;\n}\n\n// PromptBanner subscribes to pending prompts for a scope (owner / session label)\n// and surfaces them as an inline affordance, opening a PromptDialog to answer.\n// Mount it scoped to a todo (owner) at the top of a detail page, or to a session\n// (labels.session) inside a session view using the same component and filters.\nexport function PromptBanner({\n basePath = \"/api/todos\",\n enabled,\n title,\n className,\n inlineActions = \"auto\",\n showSummary = true,\n historyLimit = 5,\n state: _ignoredState,\n ...filter\n}: PromptBannerProps) {\n const { prompts, pending } = usePrompts({\n ...filter,\n basePath,\n ...(enabled !== undefined ? { enabled } : {}),\n ...(showSummary ? {} : { state: \"pending\" }),\n });\n const [active, setActive] = useState<PromptSnapshot | null>(null);\n const [comment, setComment] = useState(\"\");\n const [resolving, setResolving] = useState<PromptInlineDecision | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const next = pending[0];\n const activePrompt = active ?? next;\n const inlineSpec = useMemo(\n () => (inlineActions === \"auto\" && activePrompt ? analyzePromptInlineActions(activePrompt) : null),\n [activePrompt, inlineActions],\n );\n const summary = useMemo(() => summarizePrompts(prompts), [prompts]);\n const recent = prompts.slice(0, Math.max(0, historyLimit));\n\n useEffect(() => {\n setComment(activePrompt ? initialPromptComment(activePrompt, inlineSpec) : \"\");\n setError(null);\n setResolving(null);\n }, [activePrompt?.id, inlineSpec]);\n\n if (showSummary ? prompts.length === 0 : !next) return null;\n const headline =\n title ??\n (pending.length > 1\n ? `${pending.length} questions need your input`\n : next?.title ?? \"No pending prompts\");\n\n const resolveInline = async (decision: PromptInlineDecision) => {\n if (!activePrompt || !inlineSpec) return;\n setResolving(decision);\n setError(null);\n try {\n await answerPrompt(basePath, activePrompt.id, {\n values: buildPromptInlineValues(activePrompt, inlineSpec, decision, comment),\n });\n setActive(null);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setResolving(null);\n }\n };\n\n const commentRequiredButEmpty = Boolean(inlineSpec?.commentRequired && comment.trim().length === 0);\n\n return (\n <section\n aria-label=\"Prompt requests\"\n className={cn(\n \"rounded-md border border-border bg-card px-3 py-2 text-card-foreground\",\n className,\n )}\n >\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"flex min-w-0 flex-1 items-start gap-2\">\n <Icon icon={next ? UiQuestion : UiRobotAi} className=\"mt-0.5 size-4 shrink-0\" />\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">{headline}</div>\n {next?.description ? (\n <div className=\"mt-0.5 line-clamp-2 text-xs opacity-80\">{next.description}</div>\n ) : null}\n </div>\n </div>\n {showSummary ? <PromptSummaryCounts summary={summary} /> : null}\n </div>\n\n {next ? (\n <div className=\"flex flex-col gap-2\">\n {inlineSpec ? (\n <div className=\"flex flex-col gap-2\">\n {inlineSpec.commentField ? (\n <label className=\"flex min-w-0 flex-col gap-1 text-xs\">\n <span className=\"font-medium\">{inlineSpec.commentLabel ?? \"Comment\"}</span>\n <textarea\n className=\"min-h-16 w-full resize-y rounded-md border border-input bg-background px-2 py-1.5 text-sm text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n placeholder=\"Add a short note\"\n value={comment}\n onChange={(event) => setComment(event.target.value)}\n />\n </label>\n ) : null}\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n {error ? <span className=\"mr-auto text-xs text-red-600 dark:text-red-300\">{error}</span> : null}\n <Button\n size=\"sm\"\n variant=\"outline\"\n type=\"button\"\n loading={resolving === \"reject\"}\n disabled={resolving !== null || commentRequiredButEmpty}\n onClick={() => void resolveInline(\"reject\")}\n className=\"gap-1.5\"\n >\n <Icon icon={UiClose} className=\"size-3.5\" />\n Reject\n </Button>\n <Button\n size=\"sm\"\n type=\"button\"\n loading={resolving === \"approve\"}\n disabled={resolving !== null || commentRequiredButEmpty}\n onClick={() => void resolveInline(\"approve\")}\n className=\"gap-1.5\"\n >\n <Icon icon={UiCheck} className=\"size-3.5\" />\n Approve\n </Button>\n <Button size=\"sm\" variant=\"ghost\" type=\"button\" onClick={() => setActive(next)}>\n More\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"flex items-center justify-end\">\n <Button size=\"sm\" type=\"button\" onClick={() => setActive(next)}>\n Answer\n </Button>\n </div>\n )}\n </div>\n ) : null}\n\n {showSummary && recent.length > 0 ? <PromptHistory prompts={recent} activeId={next?.id} /> : null}\n </div>\n {active ? (\n <PromptDialog\n prompt={active}\n basePath={basePath}\n open={true}\n onClose={() => setActive(null)}\n onResolved={() => setActive(null)}\n />\n ) : null}\n </section>\n );\n}\n\nfunction PromptSummaryCounts({ summary }: { summary: ReturnType<typeof summarizePrompts> }) {\n return (\n <div className=\"flex shrink-0 flex-wrap items-center gap-x-3 gap-y-1 text-xs opacity-85\">\n <span className=\"inline-flex items-center gap-1 font-medium\">\n <Icon icon={UiHourglass} className=\"size-3.5\" />\n {summary.pending} pending\n </span>\n <span>{summary.answered} answered</span>\n {(summary.cancelled > 0 || summary.expired > 0) && (\n <span>{summary.cancelled + summary.expired} closed</span>\n )}\n </div>\n );\n}\n\nfunction PromptHistory({ prompts, activeId }: { prompts: PromptSnapshot[]; activeId?: string | undefined }) {\n return (\n <ol className=\"divide-y divide-border overflow-hidden rounded-md border border-border bg-background text-xs\">\n {prompts.map((prompt) => (\n <li\n key={prompt.id}\n className={cn(\"flex min-w-0 items-start gap-2 px-2 py-1.5\", prompt.id === activeId && \"bg-muted/60\")}\n >\n <PromptStateIcon prompt={prompt} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate font-medium text-foreground\">{prompt.title}</span>\n {prompt.kind ? <span className=\"shrink-0 text-muted-foreground\">{prompt.kind}</span> : null}\n </div>\n <div className=\"mt-0.5 truncate text-muted-foreground\">{summarizePromptAnswer(prompt)}</div>\n </div>\n </li>\n ))}\n </ol>\n );\n}\n\nfunction PromptStateIcon({ prompt }: { prompt: PromptSnapshot }) {\n if (prompt.state === \"answered\") return <Icon icon={UiCheck} className=\"mt-0.5 size-3.5 shrink-0 text-emerald-600\" />;\n if (prompt.state === \"cancelled\" || prompt.state === \"expired\") {\n return <Icon icon={UiClose} className=\"mt-0.5 size-3.5 shrink-0 text-rose-600\" />;\n }\n if (prompt.kind === \"comment\") return <Icon icon={UiComment} className=\"mt-0.5 size-3.5 shrink-0\" />;\n return <Icon icon={UiHourglass} className=\"mt-0.5 size-3.5 shrink-0\" />;\n}\n"],"names":[],"mappings":"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"}