@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
@@ -1,27 +1,113 @@
1
+ const DISABLED_TOOL_GROUP = "Disabled";
2
+ const TOOL_GROUP_DEFAULTS = {
3
+ "Accounting Read": "enabled",
4
+ "Accounting Transaction Write": "ask",
5
+ "Accounting Metadata Write": "ask",
6
+ "Comments Read": "enabled",
7
+ "Comments Write": "ask",
8
+ "Xero Read": "disabled",
9
+ "Xero Write": "disabled",
10
+ "Takealot Read": "enabled",
11
+ "Takealot Write": "disabled",
12
+ "Admin Read": "enabled",
13
+ "Admin Write": "ask"
14
+ };
1
15
  function clickyOperationsToTools(operations) {
2
16
  const tools = [];
3
17
  for (const resolved of operations) {
4
- const tool = operationToTool(resolved.operation);
18
+ const tool = operationToTool(resolved.operation, resolved);
5
19
  if (tool) {
6
20
  tools.push(tool);
7
21
  }
8
22
  }
9
23
  return tools;
10
24
  }
11
- function operationToTool(operation) {
25
+ function operationToTool(operation, resolved) {
12
26
  if (!operation.operationId) {
13
27
  return null;
14
28
  }
29
+ if (isCobraHelpOrCompletionOperation(operation, resolved)) {
30
+ return null;
31
+ }
15
32
  const meta = operation["x-clicky"];
33
+ const group = operationToolGroup(operation, resolved);
34
+ if (group === DISABLED_TOOL_GROUP) {
35
+ return null;
36
+ }
16
37
  const description = operation.description ?? operation.summary;
17
38
  return {
18
39
  name: operation.operationId,
19
40
  label: toolLabel(operation),
20
- ...(meta == null ? void 0 : meta.surface) ? { group: meta.surface } : {},
41
+ ...group ? { group, preferenceKey: group, defaultMode: toolDefaultMode(group) } : (meta == null ? void 0 : meta.surface) ? { group: meta.surface } : {},
21
42
  ...description ? { description } : {},
22
43
  inputSchema: buildInputSchema(operation)
23
44
  };
24
45
  }
46
+ function operationToolGroup(operation, resolved) {
47
+ const meta = operation["x-clicky"];
48
+ if (meta == null ? void 0 : meta.group) return meta.group;
49
+ return inferToolGroup(operation, resolved);
50
+ }
51
+ function isCobraHelpOrCompletionOperation(operation, resolved) {
52
+ var _a;
53
+ return commandStartsWithCobraBuiltin(operation.operationId) || commandStartsWithCobraBuiltin((_a = operation["x-clicky"]) == null ? void 0 : _a.command) || pathContainsCobraBuiltin(resolved == null ? void 0 : resolved.path);
54
+ }
55
+ function commandStartsWithCobraBuiltin(raw) {
56
+ if (!raw) return false;
57
+ const normalized = raw.replace(/([a-z\d])([A-Z])/g, "$1 $2").replace(/[/_.-]+/g, " ").trim().toLowerCase();
58
+ const first = normalized.split(/\s+/)[0];
59
+ return first === "completion" || first === "help";
60
+ }
61
+ function pathContainsCobraBuiltin(path) {
62
+ if (!path) return false;
63
+ const parts = path.split("/").filter(Boolean).map((part) => part.toLowerCase());
64
+ const commandParts = parts[0] === "api" && /^v\d+$/.test(parts[1] ?? "") ? parts.slice(2) : parts;
65
+ const first = commandParts[0];
66
+ return first === "completion" || first === "help";
67
+ }
68
+ function inferToolGroup(operation, resolved) {
69
+ var _a;
70
+ const id = operation.operationId ?? "";
71
+ const tags = operation.tags ?? [];
72
+ const path = (resolved == null ? void 0 : resolved.path) ?? "";
73
+ const method = ((_a = resolved == null ? void 0 : resolved.method) == null ? void 0 : _a.toUpperCase()) ?? "";
74
+ const write = isWriteMethod(method);
75
+ if (path.startsWith("/api/v1/provider/") || id.startsWith("provider")) {
76
+ return write ? "Xero Write" : "Xero Read";
77
+ }
78
+ if (path.startsWith("/api/v1/comments") || path.startsWith("/api/v1/comment-messages") || /^(comments|commentMessages|comment)/.test(id)) {
79
+ return write ? "Comments Write" : "Comments Read";
80
+ }
81
+ if (path === "/api/v1/accounts/mapping" || id.startsWith("accountMapping")) {
82
+ return write ? "Accounting Metadata Write" : "Accounting Read";
83
+ }
84
+ if (path === "/api/v1/entity/metadata" || id.startsWith("entityMetadata")) {
85
+ return write ? "Accounting Metadata Write" : "Accounting Read";
86
+ }
87
+ if (path.startsWith("/api/v1/companies/") || id.startsWith("companyBranding")) {
88
+ return write ? "Accounting Metadata Write" : "Accounting Read";
89
+ }
90
+ if (path.startsWith("/api/v1/transactions") || path.startsWith("/api/v1/journals") || /^(transactions|journals)/.test(id)) {
91
+ return write ? "Accounting Transaction Write" : "Accounting Read";
92
+ }
93
+ if (path.startsWith("/api/v1/rules/") || path.startsWith("/api/v1/rates/") || path.startsWith("/api/v1/template/") || path.startsWith("/api/v1/formula/") || tags.some(
94
+ (tag) => ["rules", "rates", "template", "formula"].includes(tag)
95
+ ) || /^(rules|rates|template|formula)/.test(id)) {
96
+ return write && !isReadLikeOperation(id) ? "Admin Write" : "Admin Read";
97
+ }
98
+ return void 0;
99
+ }
100
+ function isWriteMethod(method) {
101
+ return method === "POST" || method === "PUT" || method === "PATCH" || method === "DELETE";
102
+ }
103
+ function isReadLikeOperation(operationId) {
104
+ return /(list|load|render|pdf|eval|context|validate|preview|coverage|entries|get|history|export)/i.test(
105
+ operationId
106
+ );
107
+ }
108
+ function toolDefaultMode(group) {
109
+ return TOOL_GROUP_DEFAULTS[group] ?? "ask";
110
+ }
25
111
  function toolLabel(operation) {
26
112
  var _a, _b;
27
113
  const meta = operation["x-clicky"];
@@ -1 +1 @@
1
- {"version":3,"file":"clickyOperationsToTools.js","sources":["../../../src/data/chat/clickyOperationsToTools.ts"],"sourcesContent":["import type {\n OpenAPIOperation,\n OpenAPIParameter,\n OpenAPISchema,\n ResolvedOperation,\n} from \"../../rpc/types\";\nimport type { ChatToolInputSchema, JSONSchemaProperty, ToolMeta } from \"./types\";\n\n/** Converts a clicky RPC operation catalog into AI-tool metadata for display\n * and request scoping. Execution stays in the Go backend; this maps an\n * operation's `operationId` → tool name, a short `x-clicky` verb/action →\n * label, the `x-clicky` surface → group, `summary`/`description` → description,\n * and `parameters` + `requestBody` → a JSON-Schema input. Operations without an\n * `operationId` are skipped (a tool needs a stable name). */\nexport function clickyOperationsToTools(operations: ResolvedOperation[]): ToolMeta[] {\n const tools: ToolMeta[] = [];\n for (const resolved of operations) {\n const tool = operationToTool(resolved.operation);\n if (tool) {\n tools.push(tool);\n }\n }\n return tools;\n}\n\nexport function operationToTool(operation: OpenAPIOperation): ToolMeta | null {\n if (!operation.operationId) {\n return null;\n }\n const meta = operation[\"x-clicky\"];\n const description = operation.description ?? operation.summary;\n return {\n name: operation.operationId,\n label: toolLabel(operation),\n ...(meta?.surface ? { group: meta.surface } : {}),\n ...(description ? { description } : {}),\n inputSchema: buildInputSchema(operation),\n };\n}\n\n/** A concise popover label: the clicky action/verb (capitalized) when present,\n * else the operation summary, else a humanized operationId. Mirrors the intent\n * of rpc/clickyMetadata.ts `surfaceActionLabel`. */\nfunction toolLabel(operation: OpenAPIOperation): string {\n const meta = operation[\"x-clicky\"];\n const short = meta?.actionName?.trim() || meta?.verb?.trim();\n if (short && short !== \"action\") {\n return short.charAt(0).toUpperCase() + short.slice(1);\n }\n if (operation.summary) {\n return operation.summary;\n }\n return humanize(operation.operationId ?? \"\");\n}\n\nfunction humanize(operationId: string): string {\n const spaced = operationId.replace(/[_-]+/g, \" \").replace(/([a-z\\d])([A-Z])/g, \"$1 $2\");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction buildInputSchema(operation: OpenAPIOperation): ChatToolInputSchema {\n const properties: Record<string, JSONSchemaProperty> = {};\n const required: string[] = [];\n\n for (const param of operation.parameters ?? []) {\n properties[param.name] = parameterToProperty(param);\n if (param.required) {\n required.push(param.name);\n }\n }\n\n const body = requestBodySchema(operation);\n if (body?.properties) {\n for (const [name, schema] of Object.entries(body.properties)) {\n properties[name] = schemaToProperty(schema);\n }\n }\n\n return { type: \"object\", properties, required };\n}\n\nfunction parameterToProperty(param: OpenAPIParameter): JSONSchemaProperty {\n const prop = schemaToProperty(param.schema);\n if (param.description && !prop.description) {\n prop.description = param.description;\n }\n return prop;\n}\n\nfunction schemaToProperty(schema: OpenAPISchema | undefined): JSONSchemaProperty {\n if (!schema) {\n return { type: \"string\" };\n }\n const prop: JSONSchemaProperty = { type: schema.type ?? \"string\" };\n if (schema.description !== undefined) {\n prop.description = schema.description;\n }\n if (schema.enum !== undefined) {\n prop.enum = schema.enum;\n }\n if (schema.default !== undefined) {\n prop.default = schema.default;\n }\n return prop;\n}\n\nfunction requestBodySchema(operation: OpenAPIOperation): OpenAPISchema | undefined {\n const content = operation.requestBody?.content;\n if (!content) {\n return undefined;\n }\n return content[\"application/json\"]?.schema ?? Object.values(content)[0]?.schema;\n}\n"],"names":[],"mappings":"AAcO,SAAS,wBAAwB,YAA6C;AACnF,QAAM,QAAoB,CAAA;AAC1B,aAAW,YAAY,YAAY;AACjC,UAAM,OAAO,gBAAgB,SAAS,SAAS;AAC/C,QAAI,MAAM;AACR,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,WAA8C;AAC5E,MAAI,CAAC,UAAU,aAAa;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,OAAO,UAAU,UAAU;AACjC,QAAM,cAAc,UAAU,eAAe,UAAU;AACvD,SAAO;AAAA,IACL,MAAM,UAAU;AAAA,IAChB,OAAO,UAAU,SAAS;AAAA,IAC1B,IAAI,6BAAM,WAAU,EAAE,OAAO,KAAK,QAAA,IAAY,CAAA;AAAA,IAC9C,GAAI,cAAc,EAAE,YAAA,IAAgB,CAAA;AAAA,IACpC,aAAa,iBAAiB,SAAS;AAAA,EAAA;AAE3C;AAKA,SAAS,UAAU,WAAqC;AA7BjD;AA8BL,QAAM,OAAO,UAAU,UAAU;AACjC,QAAM,UAAQ,kCAAM,eAAN,mBAAkB,aAAU,kCAAM,SAAN,mBAAY;AACtD,MAAI,SAAS,UAAU,UAAU;AAC/B,WAAO,MAAM,OAAO,CAAC,EAAE,gBAAgB,MAAM,MAAM,CAAC;AAAA,EACtD;AACA,MAAI,UAAU,SAAS;AACrB,WAAO,UAAU;AAAA,EACnB;AACA,SAAO,SAAS,UAAU,eAAe,EAAE;AAC7C;AAEA,SAAS,SAAS,aAA6B;AAC7C,QAAM,SAAS,YAAY,QAAQ,UAAU,GAAG,EAAE,QAAQ,qBAAqB,OAAO;AACtF,SAAO,OAAO,OAAO,CAAC,EAAE,gBAAgB,OAAO,MAAM,CAAC;AACxD;AAEA,SAAS,iBAAiB,WAAkD;AAC1E,QAAM,aAAiD,CAAA;AACvD,QAAM,WAAqB,CAAA;AAE3B,aAAW,SAAS,UAAU,cAAc,CAAA,GAAI;AAC9C,eAAW,MAAM,IAAI,IAAI,oBAAoB,KAAK;AAClD,QAAI,MAAM,UAAU;AAClB,eAAS,KAAK,MAAM,IAAI;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,OAAO,kBAAkB,SAAS;AACxC,MAAI,6BAAM,YAAY;AACpB,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,KAAK,UAAU,GAAG;AAC5D,iBAAW,IAAI,IAAI,iBAAiB,MAAM;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,UAAU,YAAY,SAAA;AACvC;AAEA,SAAS,oBAAoB,OAA6C;AACxE,QAAM,OAAO,iBAAiB,MAAM,MAAM;AAC1C,MAAI,MAAM,eAAe,CAAC,KAAK,aAAa;AAC1C,SAAK,cAAc,MAAM;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAAuD;AAC/E,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,MAAM,SAAA;AAAA,EACjB;AACA,QAAM,OAA2B,EAAE,MAAM,OAAO,QAAQ,SAAA;AACxD,MAAI,OAAO,gBAAgB,QAAW;AACpC,SAAK,cAAc,OAAO;AAAA,EAC5B;AACA,MAAI,OAAO,SAAS,QAAW;AAC7B,SAAK,OAAO,OAAO;AAAA,EACrB;AACA,MAAI,OAAO,YAAY,QAAW;AAChC,SAAK,UAAU,OAAO;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,WAAwD;AA5F5E;AA6FL,QAAM,WAAU,eAAU,gBAAV,mBAAuB;AACvC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,WAAO,aAAQ,kBAAkB,MAA1B,mBAA6B,aAAU,YAAO,OAAO,OAAO,EAAE,CAAC,MAAxB,mBAA2B;AAC3E;"}
1
+ {"version":3,"file":"clickyOperationsToTools.js","sources":["../../../src/data/chat/clickyOperationsToTools.ts"],"sourcesContent":["import type {\n OpenAPIOperation,\n OpenAPIParameter,\n OpenAPISchema,\n ResolvedOperation,\n} from \"../../rpc/types\";\nimport type {\n ChatToolInputSchema,\n JSONSchemaProperty,\n ToolMeta,\n ToolMode,\n} from \"./types\";\n\nconst DISABLED_TOOL_GROUP = \"Disabled\";\n\nconst TOOL_GROUP_DEFAULTS: Record<string, ToolMode> = {\n \"Accounting Read\": \"enabled\",\n \"Accounting Transaction Write\": \"ask\",\n \"Accounting Metadata Write\": \"ask\",\n \"Comments Read\": \"enabled\",\n \"Comments Write\": \"ask\",\n \"Xero Read\": \"disabled\",\n \"Xero Write\": \"disabled\",\n \"Takealot Read\": \"enabled\",\n \"Takealot Write\": \"disabled\",\n \"Admin Read\": \"enabled\",\n \"Admin Write\": \"ask\",\n};\n\n/** Converts a clicky RPC operation catalog into AI-tool metadata for display\n * and request scoping. Execution stays in the Go backend; this maps an\n * operation's `operationId` → tool name, a short `x-clicky` verb/action →\n * label, the `x-clicky` surface → group, `summary`/`description` → description,\n * and `parameters` + `requestBody` → a JSON-Schema input. Operations without an\n * `operationId` are skipped (a tool needs a stable name). */\nexport function clickyOperationsToTools(\n operations: ResolvedOperation[],\n): ToolMeta[] {\n const tools: ToolMeta[] = [];\n for (const resolved of operations) {\n const tool = operationToTool(resolved.operation, resolved);\n if (tool) {\n tools.push(tool);\n }\n }\n return tools;\n}\n\nexport function operationToTool(\n operation: OpenAPIOperation,\n resolved?: Pick<ResolvedOperation, \"path\" | \"method\">,\n): ToolMeta | null {\n if (!operation.operationId) {\n return null;\n }\n if (isCobraHelpOrCompletionOperation(operation, resolved)) {\n return null;\n }\n const meta = operation[\"x-clicky\"];\n const group = operationToolGroup(operation, resolved);\n if (group === DISABLED_TOOL_GROUP) {\n return null;\n }\n const description = operation.description ?? operation.summary;\n return {\n name: operation.operationId,\n label: toolLabel(operation),\n ...(group\n ? { group, preferenceKey: group, defaultMode: toolDefaultMode(group) }\n : meta?.surface\n ? { group: meta.surface }\n : {}),\n ...(description ? { description } : {}),\n inputSchema: buildInputSchema(operation),\n };\n}\n\nfunction operationToolGroup(\n operation: OpenAPIOperation,\n resolved?: Pick<ResolvedOperation, \"path\" | \"method\">,\n): string | undefined {\n const meta = operation[\"x-clicky\"];\n if (meta?.group) return meta.group;\n return inferToolGroup(operation, resolved);\n}\n\nfunction isCobraHelpOrCompletionOperation(\n operation: OpenAPIOperation,\n resolved?: Pick<ResolvedOperation, \"path\" | \"method\">,\n): boolean {\n return (\n commandStartsWithCobraBuiltin(operation.operationId) ||\n commandStartsWithCobraBuiltin(operation[\"x-clicky\"]?.command) ||\n pathContainsCobraBuiltin(resolved?.path)\n );\n}\n\nfunction commandStartsWithCobraBuiltin(raw: string | undefined): boolean {\n if (!raw) return false;\n const normalized = raw\n .replace(/([a-z\\d])([A-Z])/g, \"$1 $2\")\n .replace(/[/_.-]+/g, \" \")\n .trim()\n .toLowerCase();\n const first = normalized.split(/\\s+/)[0];\n return first === \"completion\" || first === \"help\";\n}\n\nfunction pathContainsCobraBuiltin(path: string | undefined): boolean {\n if (!path) return false;\n const parts = path\n .split(\"/\")\n .filter(Boolean)\n .map((part) => part.toLowerCase());\n const commandParts =\n parts[0] === \"api\" && /^v\\d+$/.test(parts[1] ?? \"\") ? parts.slice(2) : parts;\n const first = commandParts[0];\n return first === \"completion\" || first === \"help\";\n}\n\nfunction inferToolGroup(\n operation: OpenAPIOperation,\n resolved?: Pick<ResolvedOperation, \"path\" | \"method\">,\n): string | undefined {\n const id = operation.operationId ?? \"\";\n const tags = operation.tags ?? [];\n const path = resolved?.path ?? \"\";\n const method = resolved?.method?.toUpperCase() ?? \"\";\n const write = isWriteMethod(method);\n\n if (path.startsWith(\"/api/v1/provider/\") || id.startsWith(\"provider\")) {\n return write ? \"Xero Write\" : \"Xero Read\";\n }\n if (\n path.startsWith(\"/api/v1/comments\") ||\n path.startsWith(\"/api/v1/comment-messages\") ||\n /^(comments|commentMessages|comment)/.test(id)\n ) {\n return write ? \"Comments Write\" : \"Comments Read\";\n }\n if (path === \"/api/v1/accounts/mapping\" || id.startsWith(\"accountMapping\")) {\n return write ? \"Accounting Metadata Write\" : \"Accounting Read\";\n }\n if (path === \"/api/v1/entity/metadata\" || id.startsWith(\"entityMetadata\")) {\n return write ? \"Accounting Metadata Write\" : \"Accounting Read\";\n }\n if (\n path.startsWith(\"/api/v1/companies/\") ||\n id.startsWith(\"companyBranding\")\n ) {\n return write ? \"Accounting Metadata Write\" : \"Accounting Read\";\n }\n if (\n path.startsWith(\"/api/v1/transactions\") ||\n path.startsWith(\"/api/v1/journals\") ||\n /^(transactions|journals)/.test(id)\n ) {\n return write ? \"Accounting Transaction Write\" : \"Accounting Read\";\n }\n if (\n path.startsWith(\"/api/v1/rules/\") ||\n path.startsWith(\"/api/v1/rates/\") ||\n path.startsWith(\"/api/v1/template/\") ||\n path.startsWith(\"/api/v1/formula/\") ||\n tags.some((tag) =>\n [\"rules\", \"rates\", \"template\", \"formula\"].includes(tag),\n ) ||\n /^(rules|rates|template|formula)/.test(id)\n ) {\n return write && !isReadLikeOperation(id) ? \"Admin Write\" : \"Admin Read\";\n }\n return undefined;\n}\n\nfunction isWriteMethod(method: string): boolean {\n return (\n method === \"POST\" ||\n method === \"PUT\" ||\n method === \"PATCH\" ||\n method === \"DELETE\"\n );\n}\n\nfunction isReadLikeOperation(operationId: string): boolean {\n return /(list|load|render|pdf|eval|context|validate|preview|coverage|entries|get|history|export)/i.test(\n operationId,\n );\n}\n\nfunction toolDefaultMode(group: string): ToolMode {\n return TOOL_GROUP_DEFAULTS[group] ?? \"ask\";\n}\n\n/** A concise popover label: the clicky action/verb (capitalized) when present,\n * else the operation summary, else a humanized operationId. Mirrors the intent\n * of rpc/clickyMetadata.ts `surfaceActionLabel`. */\nfunction toolLabel(operation: OpenAPIOperation): string {\n const meta = operation[\"x-clicky\"];\n const short = meta?.actionName?.trim() || meta?.verb?.trim();\n if (short && short !== \"action\") {\n return short.charAt(0).toUpperCase() + short.slice(1);\n }\n if (operation.summary) {\n return operation.summary;\n }\n return humanize(operation.operationId ?? \"\");\n}\n\nfunction humanize(operationId: string): string {\n const spaced = operationId\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z\\d])([A-Z])/g, \"$1 $2\");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction buildInputSchema(operation: OpenAPIOperation): ChatToolInputSchema {\n const properties: Record<string, JSONSchemaProperty> = {};\n const required: string[] = [];\n\n for (const param of operation.parameters ?? []) {\n properties[param.name] = parameterToProperty(param);\n if (param.required) {\n required.push(param.name);\n }\n }\n\n const body = requestBodySchema(operation);\n if (body?.properties) {\n for (const [name, schema] of Object.entries(body.properties)) {\n properties[name] = schemaToProperty(schema);\n }\n }\n\n return { type: \"object\", properties, required };\n}\n\nfunction parameterToProperty(param: OpenAPIParameter): JSONSchemaProperty {\n const prop = schemaToProperty(param.schema);\n if (param.description && !prop.description) {\n prop.description = param.description;\n }\n return prop;\n}\n\nfunction schemaToProperty(\n schema: OpenAPISchema | undefined,\n): JSONSchemaProperty {\n if (!schema) {\n return { type: \"string\" };\n }\n const prop: JSONSchemaProperty = { type: schema.type ?? \"string\" };\n if (schema.description !== undefined) {\n prop.description = schema.description;\n }\n if (schema.enum !== undefined) {\n prop.enum = schema.enum;\n }\n if (schema.default !== undefined) {\n prop.default = schema.default;\n }\n return prop;\n}\n\nfunction requestBodySchema(\n operation: OpenAPIOperation,\n): OpenAPISchema | undefined {\n const content = operation.requestBody?.content;\n if (!content) {\n return undefined;\n }\n return (\n content[\"application/json\"]?.schema ?? Object.values(content)[0]?.schema\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.cjs","sources":["../../../src/data/chat/types.ts"],"sourcesContent":["import type {\n UIMessage,\n ToolUIPart,\n DynamicToolUIPart,\n ChatStatus,\n ReasoningUIPart,\n FileUIPart,\n} from \"ai\";\nimport type { ReactNode } from \"react\";\n\nexport type { UIMessage, ToolUIPart, DynamicToolUIPart, ChatStatus, ReasoningUIPart, FileUIPart };\n\n/** A selectable chat model, as served by the backend's GET /api/chat/models.\n * `configured` is false for catalogued models whose provider has no API key. */\nexport interface ChatModel {\n id: string;\n provider: string;\n label: string;\n reasoning: boolean;\n configured?: boolean;\n /** Max context tokens — the denominator for a usage gauge. */\n contextWindow?: number;\n}\n\n/** Per-message metadata the backend rides on the SSE `finish` part\n * (`messageMetadata`), applied by the AI SDK to the assistant `UIMessage`. */\nexport interface ChatMessageMetadata {\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n };\n /** This turn's cost in USD. */\n cost?: number;\n /** Cumulative thread cost in USD (when the turn is persisted to a thread). */\n threadCostUsd?: number;\n /** This turn's input-token count, ≈ current context-window occupancy. */\n contextTokens?: number;\n}\n\n/** A flattened usage snapshot a chat surfaces for a gauge: tokens used out of the\n * model's context window, plus cumulative cost. */\nexport interface ChatUsageSummary {\n usedTokens: number;\n maxTokens: number;\n cost?: number;\n messageCount: number;\n modelLabel?: string;\n}\n\n/** A suggested prompt shown on the empty state. A bare string is both the label\n * and the submitted text; the object form separates them. */\nexport type Suggestion = string | { label: string; prompt: string };\n\n/** The label shown for a suggestion. */\nexport function suggestionLabel(s: Suggestion): string {\n return typeof s === \"string\" ? s : s.label;\n}\n\n/** The text submitted when a suggestion is clicked. */\nexport function suggestionPrompt(s: Suggestion): string {\n return typeof s === \"string\" ? s : s.prompt;\n}\n\n/** Returns true for an assistant reasoning (\"thinking\") part. */\nexport function isReasoningPart(part: { type: string }): part is ReasoningUIPart {\n return part.type === \"reasoning\";\n}\n\n/** Returns true for a file/attachment part. */\nexport function isFilePart(part: { type: string }): part is FileUIPart {\n return part.type === \"file\";\n}\n\n/** A tool part as it appears in an assistant UIMessage — either a typed\n * `tool-<name>` part or the generic `dynamic-tool` part. clicky operations\n * surface as dynamic tools, so the chat UI renders both shapes. */\nexport type AnyToolPart = ToolUIPart | DynamicToolUIPart;\n\n/** Tool metadata shared by the chat shell. It both configures the\n * tool-preferences popover (`name`/`label`/`group`) and carries the schema\n * derived from a clicky RPC operation (`description`/`inputSchema`). The Go\n * backend owns execution; the client uses this only for display and to scope\n * which tools a request may call (passed in the transport `body`). */\nexport interface ToolMeta {\n /** Stable tool name sent to the model (the operation id). */\n name: string;\n /** Human-readable label shown in the tool-preferences popover. */\n label: string;\n /** Bucket heading in the popover — the clicky surface for RPC operations. */\n group?: string;\n /** Description shown in tool pickers / tool-call headers. */\n description?: string;\n /** JSON-Schema for the tool's input, assembled from an operation's\n * parameters + request body. Omitted for hand-authored tools. */\n inputSchema?: ChatToolInputSchema;\n}\n\nexport interface ChatToolInputSchema {\n type: \"object\";\n properties: Record<string, JSONSchemaProperty>;\n required: string[];\n}\n\nexport interface JSONSchemaProperty {\n type?: string;\n description?: string;\n enum?: unknown[];\n default?: unknown;\n}\n\n/** Returns true for a `dynamic-tool` part (clicky operations surface this way). */\nexport function isDynamicToolPart(part: { type: string }): part is DynamicToolUIPart {\n return part.type === \"dynamic-tool\";\n}\n\n/** Returns true for a typed `tool-<name>` part. */\nexport function isTypedToolPart(part: { type: string }): part is ToolUIPart {\n return part.type.startsWith(\"tool-\");\n}\n\n/** The display name of a tool part: the explicit `toolName` for dynamic tools,\n * otherwise the suffix after `tool-`. */\nexport function toolPartName(part: AnyToolPart): string {\n if (isDynamicToolPart(part)) {\n return part.toolName;\n }\n return part.type.slice(\"tool-\".length);\n}\n\nexport interface ToolResultRenderArgs {\n part: AnyToolPart;\n toolName: string;\n output: unknown;\n}\n\nexport type ToolResultRenderer = (args: ToolResultRenderArgs) => ReactNode;\n"],"names":[],"mappings":";;AAuDO,SAAS,gBAAgB,GAAuB;AACrD,SAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACvC;AAGO,SAAS,iBAAiB,GAAuB;AACtD,SAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACvC;AAGO,SAAS,gBAAgB,MAAiD;AAC/E,SAAO,KAAK,SAAS;AACvB;AAGO,SAAS,WAAW,MAA4C;AACrE,SAAO,KAAK,SAAS;AACvB;AAwCO,SAAS,kBAAkB,MAAmD;AACnF,SAAO,KAAK,SAAS;AACvB;AAGO,SAAS,gBAAgB,MAA4C;AAC1E,SAAO,KAAK,KAAK,WAAW,OAAO;AACrC;AAIO,SAAS,aAAa,MAA2B;AACtD,MAAI,kBAAkB,IAAI,GAAG;AAC3B,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK,KAAK,MAAM,QAAQ,MAAM;AACvC;;;;;;;;"}
1
+ {"version":3,"file":"types.cjs","sources":["../../../src/data/chat/types.ts"],"sourcesContent":["import type {\n UIMessage,\n ToolUIPart,\n DynamicToolUIPart,\n ChatStatus,\n ReasoningUIPart,\n FileUIPart,\n} from \"ai\";\nimport type { ReactNode } from \"react\";\n\nexport type {\n UIMessage,\n ToolUIPart,\n DynamicToolUIPart,\n ChatStatus,\n ReasoningUIPart,\n FileUIPart,\n};\n\n/** A selectable chat model, as served by the backend's GET /api/chat/models.\n * `configured` is false for catalogued models whose provider has no API key. */\nexport interface ChatModel {\n id: string;\n provider: string;\n label: string;\n reasoning: boolean;\n configured?: boolean;\n /** Max context tokens — the denominator for a usage gauge. */\n contextWindow?: number;\n}\n\n/** Per-message metadata the backend rides on the SSE `finish` part\n * (`messageMetadata`), applied by the AI SDK to the assistant `UIMessage`. */\nexport interface ChatMessageMetadata {\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n };\n /** This turn's cost in USD. */\n cost?: number;\n /** Cumulative thread cost in USD (when the turn is persisted to a thread). */\n threadCostUsd?: number;\n /** This turn's input-token count, ≈ current context-window occupancy. */\n contextTokens?: number;\n}\n\n/** A flattened usage snapshot a chat surfaces for a gauge: tokens used out of the\n * model's context window, plus cumulative cost. */\nexport interface ChatUsageSummary {\n usedTokens: number;\n maxTokens: number;\n cost?: number;\n messageCount: number;\n modelLabel?: string;\n}\n\n/** A suggested prompt shown on the empty state. A bare string is both the label\n * and the submitted text; the object form separates them. */\nexport type Suggestion = string | { label: string; prompt: string };\n\n/** The label shown for a suggestion. */\nexport function suggestionLabel(s: Suggestion): string {\n return typeof s === \"string\" ? s : s.label;\n}\n\n/** The text submitted when a suggestion is clicked. */\nexport function suggestionPrompt(s: Suggestion): string {\n return typeof s === \"string\" ? s : s.prompt;\n}\n\n/** Returns true for an assistant reasoning (\"thinking\") part. */\nexport function isReasoningPart(part: {\n type: string;\n}): part is ReasoningUIPart {\n return part.type === \"reasoning\";\n}\n\n/** Returns true for a file/attachment part. */\nexport function isFilePart(part: { type: string }): part is FileUIPart {\n return part.type === \"file\";\n}\n\n/** A tool part as it appears in an assistant UIMessage — either a typed\n * `tool-<name>` part or the generic `dynamic-tool` part. clicky operations\n * surface as dynamic tools, so the chat UI renders both shapes. */\nexport type AnyToolPart = ToolUIPart | DynamicToolUIPart;\n\n/** Tool metadata shared by the chat shell. It both configures the\n * tool-preferences popover (`name`/`label`/`group`) and carries the schema\n * derived from a clicky RPC operation (`description`/`inputSchema`). The Go\n * backend owns execution; the client uses this only for display and to scope\n * which tools a request may call (passed in the transport `body`). */\nexport type ToolMode = \"enabled\" | \"ask\" | \"disabled\";\n\nexport interface ToolMeta {\n /** Stable tool name sent to the model (the operation id). */\n name: string;\n /** Human-readable label shown in the tool-preferences popover. */\n label: string;\n /** Bucket heading in the popover — the clicky surface for RPC operations. */\n group?: string;\n /** Preference key sent to the backend. Defaults to `name`; group-backed\n * clicky tools set this to the backend tool group. */\n preferenceKey?: string;\n /** Initial preference mode when the chat window first sees this tool. */\n defaultMode?: ToolMode;\n /** Description shown in tool pickers / tool-call headers. */\n description?: string;\n /** JSON-Schema for the tool's input, assembled from an operation's\n * parameters + request body. Omitted for hand-authored tools. */\n inputSchema?: ChatToolInputSchema;\n}\n\nexport interface ChatToolInputSchema {\n type: \"object\";\n properties: Record<string, JSONSchemaProperty>;\n required: string[];\n}\n\nexport interface JSONSchemaProperty {\n type?: string;\n description?: string;\n enum?: unknown[];\n default?: unknown;\n}\n\n/** Returns true for a `dynamic-tool` part (clicky operations surface this way). */\nexport function isDynamicToolPart(part: {\n type: string;\n}): part is DynamicToolUIPart {\n return part.type === \"dynamic-tool\";\n}\n\n/** Returns true for a typed `tool-<name>` part. */\nexport function isTypedToolPart(part: { type: string }): part is ToolUIPart {\n return part.type.startsWith(\"tool-\");\n}\n\n/** The display name of a tool part: the explicit `toolName` for dynamic tools,\n * otherwise the suffix after `tool-`. */\nexport function toolPartName(part: AnyToolPart): string {\n if (isDynamicToolPart(part)) {\n return part.toolName;\n }\n return part.type.slice(\"tool-\".length);\n}\n\nexport interface ToolResultRenderArgs {\n part: AnyToolPart;\n toolName: string;\n output: unknown;\n}\n\nexport type ToolResultRenderer = (args: ToolResultRenderArgs) => ReactNode;\n"],"names":[],"mappings":";;AA8DO,SAAS,gBAAgB,GAAuB;AACrD,SAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACvC;AAGO,SAAS,iBAAiB,GAAuB;AACtD,SAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACvC;AAGO,SAAS,gBAAgB,MAEJ;AAC1B,SAAO,KAAK,SAAS;AACvB;AAGO,SAAS,WAAW,MAA4C;AACrE,SAAO,KAAK,SAAS;AACvB;AA+CO,SAAS,kBAAkB,MAEJ;AAC5B,SAAO,KAAK,SAAS;AACvB;AAGO,SAAS,gBAAgB,MAA4C;AAC1E,SAAO,KAAK,KAAK,WAAW,OAAO;AACrC;AAIO,SAAS,aAAa,MAA2B;AACtD,MAAI,kBAAkB,IAAI,GAAG;AAC3B,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK,KAAK,MAAM,QAAQ,MAAM;AACvC;;;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { UIMessage, ToolUIPart, DynamicToolUIPart, ChatStatus, ReasoningUIPart, FileUIPart } from 'ai';
2
2
  import { ReactNode } from 'react';
3
- export type { UIMessage, ToolUIPart, DynamicToolUIPart, ChatStatus, ReasoningUIPart, FileUIPart };
3
+ export type { UIMessage, ToolUIPart, DynamicToolUIPart, ChatStatus, ReasoningUIPart, FileUIPart, };
4
4
  /** A selectable chat model, as served by the backend's GET /api/chat/models.
5
5
  * `configured` is false for catalogued models whose provider has no API key. */
6
6
  export interface ChatModel {
@@ -63,6 +63,7 @@ export type AnyToolPart = ToolUIPart | DynamicToolUIPart;
63
63
  * derived from a clicky RPC operation (`description`/`inputSchema`). The Go
64
64
  * backend owns execution; the client uses this only for display and to scope
65
65
  * which tools a request may call (passed in the transport `body`). */
66
+ export type ToolMode = "enabled" | "ask" | "disabled";
66
67
  export interface ToolMeta {
67
68
  /** Stable tool name sent to the model (the operation id). */
68
69
  name: string;
@@ -70,6 +71,11 @@ export interface ToolMeta {
70
71
  label: string;
71
72
  /** Bucket heading in the popover — the clicky surface for RPC operations. */
72
73
  group?: string;
74
+ /** Preference key sent to the backend. Defaults to `name`; group-backed
75
+ * clicky tools set this to the backend tool group. */
76
+ preferenceKey?: string;
77
+ /** Initial preference mode when the chat window first sees this tool. */
78
+ defaultMode?: ToolMode;
73
79
  /** Description shown in tool pickers / tool-call headers. */
74
80
  description?: string;
75
81
  /** JSON-Schema for the tool's input, assembled from an operation's
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/data/chat/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/data/chat/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../src/data/chat/types.ts"],"sourcesContent":["import type {\n UIMessage,\n ToolUIPart,\n DynamicToolUIPart,\n ChatStatus,\n ReasoningUIPart,\n FileUIPart,\n} from \"ai\";\nimport type { ReactNode } from \"react\";\n\nexport type { UIMessage, ToolUIPart, DynamicToolUIPart, ChatStatus, ReasoningUIPart, FileUIPart };\n\n/** A selectable chat model, as served by the backend's GET /api/chat/models.\n * `configured` is false for catalogued models whose provider has no API key. */\nexport interface ChatModel {\n id: string;\n provider: string;\n label: string;\n reasoning: boolean;\n configured?: boolean;\n /** Max context tokens — the denominator for a usage gauge. */\n contextWindow?: number;\n}\n\n/** Per-message metadata the backend rides on the SSE `finish` part\n * (`messageMetadata`), applied by the AI SDK to the assistant `UIMessage`. */\nexport interface ChatMessageMetadata {\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n };\n /** This turn's cost in USD. */\n cost?: number;\n /** Cumulative thread cost in USD (when the turn is persisted to a thread). */\n threadCostUsd?: number;\n /** This turn's input-token count, ≈ current context-window occupancy. */\n contextTokens?: number;\n}\n\n/** A flattened usage snapshot a chat surfaces for a gauge: tokens used out of the\n * model's context window, plus cumulative cost. */\nexport interface ChatUsageSummary {\n usedTokens: number;\n maxTokens: number;\n cost?: number;\n messageCount: number;\n modelLabel?: string;\n}\n\n/** A suggested prompt shown on the empty state. A bare string is both the label\n * and the submitted text; the object form separates them. */\nexport type Suggestion = string | { label: string; prompt: string };\n\n/** The label shown for a suggestion. */\nexport function suggestionLabel(s: Suggestion): string {\n return typeof s === \"string\" ? s : s.label;\n}\n\n/** The text submitted when a suggestion is clicked. */\nexport function suggestionPrompt(s: Suggestion): string {\n return typeof s === \"string\" ? s : s.prompt;\n}\n\n/** Returns true for an assistant reasoning (\"thinking\") part. */\nexport function isReasoningPart(part: { type: string }): part is ReasoningUIPart {\n return part.type === \"reasoning\";\n}\n\n/** Returns true for a file/attachment part. */\nexport function isFilePart(part: { type: string }): part is FileUIPart {\n return part.type === \"file\";\n}\n\n/** A tool part as it appears in an assistant UIMessage — either a typed\n * `tool-<name>` part or the generic `dynamic-tool` part. clicky operations\n * surface as dynamic tools, so the chat UI renders both shapes. */\nexport type AnyToolPart = ToolUIPart | DynamicToolUIPart;\n\n/** Tool metadata shared by the chat shell. It both configures the\n * tool-preferences popover (`name`/`label`/`group`) and carries the schema\n * derived from a clicky RPC operation (`description`/`inputSchema`). The Go\n * backend owns execution; the client uses this only for display and to scope\n * which tools a request may call (passed in the transport `body`). */\nexport interface ToolMeta {\n /** Stable tool name sent to the model (the operation id). */\n name: string;\n /** Human-readable label shown in the tool-preferences popover. */\n label: string;\n /** Bucket heading in the popover — the clicky surface for RPC operations. */\n group?: string;\n /** Description shown in tool pickers / tool-call headers. */\n description?: string;\n /** JSON-Schema for the tool's input, assembled from an operation's\n * parameters + request body. Omitted for hand-authored tools. */\n inputSchema?: ChatToolInputSchema;\n}\n\nexport interface ChatToolInputSchema {\n type: \"object\";\n properties: Record<string, JSONSchemaProperty>;\n required: string[];\n}\n\nexport interface JSONSchemaProperty {\n type?: string;\n description?: string;\n enum?: unknown[];\n default?: unknown;\n}\n\n/** Returns true for a `dynamic-tool` part (clicky operations surface this way). */\nexport function isDynamicToolPart(part: { type: string }): part is DynamicToolUIPart {\n return part.type === \"dynamic-tool\";\n}\n\n/** Returns true for a typed `tool-<name>` part. */\nexport function isTypedToolPart(part: { type: string }): part is ToolUIPart {\n return part.type.startsWith(\"tool-\");\n}\n\n/** The display name of a tool part: the explicit `toolName` for dynamic tools,\n * otherwise the suffix after `tool-`. */\nexport function toolPartName(part: AnyToolPart): string {\n if (isDynamicToolPart(part)) {\n return part.toolName;\n }\n return part.type.slice(\"tool-\".length);\n}\n\nexport interface ToolResultRenderArgs {\n part: AnyToolPart;\n toolName: string;\n output: unknown;\n}\n\nexport type ToolResultRenderer = (args: ToolResultRenderArgs) => ReactNode;\n"],"names":[],"mappings":"AAuDO,SAAS,gBAAgB,GAAuB;AACrD,SAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACvC;AAGO,SAAS,iBAAiB,GAAuB;AACtD,SAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACvC;AAGO,SAAS,gBAAgB,MAAiD;AAC/E,SAAO,KAAK,SAAS;AACvB;AAGO,SAAS,WAAW,MAA4C;AACrE,SAAO,KAAK,SAAS;AACvB;AAwCO,SAAS,kBAAkB,MAAmD;AACnF,SAAO,KAAK,SAAS;AACvB;AAGO,SAAS,gBAAgB,MAA4C;AAC1E,SAAO,KAAK,KAAK,WAAW,OAAO;AACrC;AAIO,SAAS,aAAa,MAA2B;AACtD,MAAI,kBAAkB,IAAI,GAAG;AAC3B,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK,KAAK,MAAM,QAAQ,MAAM;AACvC;"}
1
+ {"version":3,"file":"types.js","sources":["../../../src/data/chat/types.ts"],"sourcesContent":["import type {\n UIMessage,\n ToolUIPart,\n DynamicToolUIPart,\n ChatStatus,\n ReasoningUIPart,\n FileUIPart,\n} from \"ai\";\nimport type { ReactNode } from \"react\";\n\nexport type {\n UIMessage,\n ToolUIPart,\n DynamicToolUIPart,\n ChatStatus,\n ReasoningUIPart,\n FileUIPart,\n};\n\n/** A selectable chat model, as served by the backend's GET /api/chat/models.\n * `configured` is false for catalogued models whose provider has no API key. */\nexport interface ChatModel {\n id: string;\n provider: string;\n label: string;\n reasoning: boolean;\n configured?: boolean;\n /** Max context tokens — the denominator for a usage gauge. */\n contextWindow?: number;\n}\n\n/** Per-message metadata the backend rides on the SSE `finish` part\n * (`messageMetadata`), applied by the AI SDK to the assistant `UIMessage`. */\nexport interface ChatMessageMetadata {\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n };\n /** This turn's cost in USD. */\n cost?: number;\n /** Cumulative thread cost in USD (when the turn is persisted to a thread). */\n threadCostUsd?: number;\n /** This turn's input-token count, ≈ current context-window occupancy. */\n contextTokens?: number;\n}\n\n/** A flattened usage snapshot a chat surfaces for a gauge: tokens used out of the\n * model's context window, plus cumulative cost. */\nexport interface ChatUsageSummary {\n usedTokens: number;\n maxTokens: number;\n cost?: number;\n messageCount: number;\n modelLabel?: string;\n}\n\n/** A suggested prompt shown on the empty state. A bare string is both the label\n * and the submitted text; the object form separates them. */\nexport type Suggestion = string | { label: string; prompt: string };\n\n/** The label shown for a suggestion. */\nexport function suggestionLabel(s: Suggestion): string {\n return typeof s === \"string\" ? s : s.label;\n}\n\n/** The text submitted when a suggestion is clicked. */\nexport function suggestionPrompt(s: Suggestion): string {\n return typeof s === \"string\" ? s : s.prompt;\n}\n\n/** Returns true for an assistant reasoning (\"thinking\") part. */\nexport function isReasoningPart(part: {\n type: string;\n}): part is ReasoningUIPart {\n return part.type === \"reasoning\";\n}\n\n/** Returns true for a file/attachment part. */\nexport function isFilePart(part: { type: string }): part is FileUIPart {\n return part.type === \"file\";\n}\n\n/** A tool part as it appears in an assistant UIMessage — either a typed\n * `tool-<name>` part or the generic `dynamic-tool` part. clicky operations\n * surface as dynamic tools, so the chat UI renders both shapes. */\nexport type AnyToolPart = ToolUIPart | DynamicToolUIPart;\n\n/** Tool metadata shared by the chat shell. It both configures the\n * tool-preferences popover (`name`/`label`/`group`) and carries the schema\n * derived from a clicky RPC operation (`description`/`inputSchema`). The Go\n * backend owns execution; the client uses this only for display and to scope\n * which tools a request may call (passed in the transport `body`). */\nexport type ToolMode = \"enabled\" | \"ask\" | \"disabled\";\n\nexport interface ToolMeta {\n /** Stable tool name sent to the model (the operation id). */\n name: string;\n /** Human-readable label shown in the tool-preferences popover. */\n label: string;\n /** Bucket heading in the popover — the clicky surface for RPC operations. */\n group?: string;\n /** Preference key sent to the backend. Defaults to `name`; group-backed\n * clicky tools set this to the backend tool group. */\n preferenceKey?: string;\n /** Initial preference mode when the chat window first sees this tool. */\n defaultMode?: ToolMode;\n /** Description shown in tool pickers / tool-call headers. */\n description?: string;\n /** JSON-Schema for the tool's input, assembled from an operation's\n * parameters + request body. Omitted for hand-authored tools. */\n inputSchema?: ChatToolInputSchema;\n}\n\nexport interface ChatToolInputSchema {\n type: \"object\";\n properties: Record<string, JSONSchemaProperty>;\n required: string[];\n}\n\nexport interface JSONSchemaProperty {\n type?: string;\n description?: string;\n enum?: unknown[];\n default?: unknown;\n}\n\n/** Returns true for a `dynamic-tool` part (clicky operations surface this way). */\nexport function isDynamicToolPart(part: {\n type: string;\n}): part is DynamicToolUIPart {\n return part.type === \"dynamic-tool\";\n}\n\n/** Returns true for a typed `tool-<name>` part. */\nexport function isTypedToolPart(part: { type: string }): part is ToolUIPart {\n return part.type.startsWith(\"tool-\");\n}\n\n/** The display name of a tool part: the explicit `toolName` for dynamic tools,\n * otherwise the suffix after `tool-`. */\nexport function toolPartName(part: AnyToolPart): string {\n if (isDynamicToolPart(part)) {\n return part.toolName;\n }\n return part.type.slice(\"tool-\".length);\n}\n\nexport interface ToolResultRenderArgs {\n part: AnyToolPart;\n toolName: string;\n output: unknown;\n}\n\nexport type ToolResultRenderer = (args: ToolResultRenderArgs) => ReactNode;\n"],"names":[],"mappings":"AA8DO,SAAS,gBAAgB,GAAuB;AACrD,SAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACvC;AAGO,SAAS,iBAAiB,GAAuB;AACtD,SAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACvC;AAGO,SAAS,gBAAgB,MAEJ;AAC1B,SAAO,KAAK,SAAS;AACvB;AAGO,SAAS,WAAW,MAA4C;AACrE,SAAO,KAAK,SAAS;AACvB;AA+CO,SAAS,kBAAkB,MAEJ;AAC5B,SAAO,KAAK,SAAS;AACvB;AAGO,SAAS,gBAAgB,MAA4C;AAC1E,SAAO,KAAK,KAAK,WAAW,OAAO;AACrC;AAIO,SAAS,aAAa,MAA2B;AACtD,MAAI,kBAAkB,IAAI,GAAG;AAC3B,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK,KAAK,MAAM,QAAQ,MAAM;AACvC;"}
@@ -1,5 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const UiCancel = require("../icons/components/UiCancel.cjs");
4
+ const UiWarningTriangle = require("../icons/components/UiWarningTriangle.cjs");
5
+ const UiCircleX = require("../icons/components/UiCircleX.cjs");
6
+ const UiPass = require("../icons/components/UiPass.cjs");
7
+ const UiLoader = require("../icons/components/UiLoader.cjs");
8
+ const UiClock = require("../icons/components/UiClock.cjs");
9
+ const UiCircleOutline = require("../icons/components/UiCircleOutline.cjs");
3
10
  const STATUS_COLORS = {
4
11
  success: "text-green-600 dark:text-green-400",
5
12
  PASS: "text-green-600 dark:text-green-400",
@@ -14,17 +21,17 @@ const STATUS_COLORS = {
14
21
  SKIP: "text-gray-400"
15
22
  };
16
23
  const STATUS_ICONS = {
17
- pending: "codicon:clock",
18
- running: "svg-spinners:ring-resize",
19
- success: "codicon:pass-filled",
20
- PASS: "codicon:pass-filled",
21
- completed: "codicon:pass-filled",
22
- failed: "codicon:error",
23
- FAIL: "codicon:error",
24
- ERR: "codicon:error",
25
- warning: "codicon:warning",
26
- canceled: "codicon:circle-slash",
27
- SKIP: "codicon:circle-slash"
24
+ pending: UiClock.UiClock,
25
+ running: UiLoader.UiLoader,
26
+ success: UiPass.UiPass,
27
+ PASS: UiPass.UiPass,
28
+ completed: UiPass.UiPass,
29
+ failed: UiCircleX.UiCircleX,
30
+ FAIL: UiCircleX.UiCircleX,
31
+ ERR: UiCircleX.UiCircleX,
32
+ warning: UiWarningTriangle.UiWarningTriangle,
33
+ canceled: UiCancel.UiCancel,
34
+ SKIP: UiCancel.UiCancel
28
35
  };
29
36
  const STATUS_BG = {
30
37
  success: "bg-green-100 dark:bg-green-500/20",
@@ -41,7 +48,7 @@ function taskStatusColor(s) {
41
48
  return STATUS_COLORS[s] ?? "text-gray-500";
42
49
  }
43
50
  function taskStatusIcon(s) {
44
- return STATUS_ICONS[s] ?? "codicon:circle-outline";
51
+ return STATUS_ICONS[s] ?? UiCircleOutline.UiCircleOutline;
45
52
  }
46
53
  function taskStatusBg(s) {
47
54
  return STATUS_BG[s] ?? "bg-gray-100 dark:bg-gray-500/20";
@@ -1 +1 @@
1
- {"version":3,"file":"task-status.cjs","sources":["../../src/data/task-status.ts"],"sourcesContent":["import type { ProgressSegment } from \"./ProgressBar\";\nimport type { TaskSnapshot } from \"./TaskSnapshot\";\n\n// Status → presentation maps, ported from clicky's task UI (task/ui/src/utils.ts)\n// so the React and Preact renderers agree on icon/color semantics.\n\nconst STATUS_COLORS: Record<string, string> = {\n success: \"text-green-600 dark:text-green-400\",\n PASS: \"text-green-600 dark:text-green-400\",\n completed: \"text-green-600 dark:text-green-400\",\n failed: \"text-red-600 dark:text-red-400\",\n FAIL: \"text-red-600 dark:text-red-400\",\n ERR: \"text-red-600 dark:text-red-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n running: \"text-blue-600 dark:text-blue-400\",\n pending: \"text-gray-400\",\n canceled: \"text-gray-400\",\n SKIP: \"text-gray-400\",\n};\n\nconst STATUS_ICONS: Record<string, string> = {\n pending: \"codicon:clock\",\n running: \"svg-spinners:ring-resize\",\n success: \"codicon:pass-filled\",\n PASS: \"codicon:pass-filled\",\n completed: \"codicon:pass-filled\",\n failed: \"codicon:error\",\n FAIL: \"codicon:error\",\n ERR: \"codicon:error\",\n warning: \"codicon:warning\",\n canceled: \"codicon:circle-slash\",\n SKIP: \"codicon:circle-slash\",\n};\n\nconst STATUS_BG: Record<string, string> = {\n success: \"bg-green-100 dark:bg-green-500/20\",\n completed: \"bg-green-100 dark:bg-green-500/20\",\n PASS: \"bg-green-100 dark:bg-green-500/20\",\n failed: \"bg-red-100 dark:bg-red-500/20\",\n FAIL: \"bg-red-100 dark:bg-red-500/20\",\n ERR: \"bg-red-100 dark:bg-red-500/20\",\n warning: \"bg-yellow-100 dark:bg-yellow-500/20\",\n running: \"bg-blue-100 dark:bg-blue-500/20\",\n pending: \"bg-gray-100 dark:bg-gray-500/20\",\n};\n\nexport function taskStatusColor(s: string): string {\n return STATUS_COLORS[s] ?? \"text-gray-500\";\n}\n\nexport function taskStatusIcon(s: string): string {\n return STATUS_ICONS[s] ?? \"codicon:circle-outline\";\n}\n\nexport function taskStatusBg(s: string): string {\n return STATUS_BG[s] ?? \"bg-gray-100 dark:bg-gray-500/20\";\n}\n\nexport function logLevelColor(level: string): string {\n switch (level) {\n case \"error\":\n return \"text-red-500\";\n case \"warn\":\n return \"text-yellow-600 dark:text-yellow-400\";\n case \"debug\":\n return \"text-gray-400\";\n default:\n return \"text-gray-500\";\n }\n}\n\n// taskSegments builds the colored progress-bar segments for a set of counts, in\n// the canonical clicky order (passed, warnings, failed, running, pending).\nexport function taskSegments(counts: {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n}): ProgressSegment[] {\n return [\n { count: counts.ok, color: \"bg-green-500\", label: \"passed\" },\n { count: counts.warn, color: \"bg-yellow-400\", label: \"warnings\" },\n { count: counts.fail, color: \"bg-red-500\", label: \"failed\" },\n { count: counts.run, color: \"bg-blue-500\", label: \"running\" },\n { count: counts.pending, color: \"bg-gray-300\", label: \"pending\" },\n ];\n}\n\n// bucketTasks tallies the child tasks of a group by status bucket.\nexport function bucketTasks(tasks: TaskSnapshot[]): {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n} {\n let ok = 0;\n let warn = 0;\n let fail = 0;\n let run = 0;\n let pending = 0;\n for (const t of tasks) {\n switch (t.status) {\n case \"success\":\n case \"PASS\":\n ok += 1;\n break;\n case \"warning\":\n warn += 1;\n break;\n case \"failed\":\n case \"FAIL\":\n case \"ERR\":\n fail += 1;\n break;\n case \"running\":\n run += 1;\n break;\n case \"pending\":\n pending += 1;\n break;\n default:\n ok += 1; // SKIP / canceled / completed count as done\n }\n }\n return { ok, warn, fail, run, pending };\n}\n"],"names":[],"mappings":";;AAMA,MAAM,gBAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR;AAEA,MAAM,eAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR;AAEA,MAAM,YAAoC;AAAA,EACxC,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;AAEO,SAAS,gBAAgB,GAAmB;AACjD,SAAO,cAAc,CAAC,KAAK;AAC7B;AAEO,SAAS,eAAe,GAAmB;AAChD,SAAO,aAAa,CAAC,KAAK;AAC5B;AAEO,SAAS,aAAa,GAAmB;AAC9C,SAAO,UAAU,CAAC,KAAK;AACzB;AAEO,SAAS,cAAc,OAAuB;AACnD,UAAQ,OAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAIO,SAAS,aAAa,QAMP;AACpB,SAAO;AAAA,IACL,EAAE,OAAO,OAAO,IAAI,OAAO,gBAAgB,OAAO,SAAA;AAAA,IAClD,EAAE,OAAO,OAAO,MAAM,OAAO,iBAAiB,OAAO,WAAA;AAAA,IACrD,EAAE,OAAO,OAAO,MAAM,OAAO,cAAc,OAAO,SAAA;AAAA,IAClD,EAAE,OAAO,OAAO,KAAK,OAAO,eAAe,OAAO,UAAA;AAAA,IAClD,EAAE,OAAO,OAAO,SAAS,OAAO,eAAe,OAAO,UAAA;AAAA,EAAU;AAEpE;AAGO,SAAS,YAAY,OAM1B;AACA,MAAI,KAAK;AACT,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,MAAM;AACV,MAAI,UAAU;AACd,aAAW,KAAK,OAAO;AACrB,YAAQ,EAAE,QAAA;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AACH,cAAM;AACN;AAAA,MACF,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,mBAAW;AACX;AAAA,MACF;AACE,cAAM;AAAA,IAAA;AAAA,EAEZ;AACA,SAAO,EAAE,IAAI,MAAM,MAAM,KAAK,QAAA;AAChC;;;;;;;"}
1
+ {"version":3,"file":"task-status.cjs","sources":["../../src/data/task-status.ts"],"sourcesContent":["import {\n UiCancel,\n UiCircleOutline,\n UiCircleX,\n UiClock,\n UiLoader,\n UiPass,\n UiWarningTriangle,\n} from \"../icons\";\nimport type { StaticIconComponent } from \"./Icon\";\nimport type { ProgressSegment } from \"./ProgressBar\";\nimport type { TaskSnapshot } from \"./TaskSnapshot\";\n\n// Status → presentation maps, ported from clicky's task UI (task/ui/src/utils.ts)\n// so the React and Preact renderers agree on icon/color semantics.\n\nconst STATUS_COLORS: Record<string, string> = {\n success: \"text-green-600 dark:text-green-400\",\n PASS: \"text-green-600 dark:text-green-400\",\n completed: \"text-green-600 dark:text-green-400\",\n failed: \"text-red-600 dark:text-red-400\",\n FAIL: \"text-red-600 dark:text-red-400\",\n ERR: \"text-red-600 dark:text-red-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n running: \"text-blue-600 dark:text-blue-400\",\n pending: \"text-gray-400\",\n canceled: \"text-gray-400\",\n SKIP: \"text-gray-400\",\n};\n\n// Status → generated Ui* icon component. Rendered via <Icon icon={…}>; the\n// `running` glyph is spun with `animate-spin` at the call sites.\nconst STATUS_ICONS: Record<string, StaticIconComponent> = {\n pending: UiClock,\n running: UiLoader,\n success: UiPass,\n PASS: UiPass,\n completed: UiPass,\n failed: UiCircleX,\n FAIL: UiCircleX,\n ERR: UiCircleX,\n warning: UiWarningTriangle,\n canceled: UiCancel,\n SKIP: UiCancel,\n};\n\nconst STATUS_BG: Record<string, string> = {\n success: \"bg-green-100 dark:bg-green-500/20\",\n completed: \"bg-green-100 dark:bg-green-500/20\",\n PASS: \"bg-green-100 dark:bg-green-500/20\",\n failed: \"bg-red-100 dark:bg-red-500/20\",\n FAIL: \"bg-red-100 dark:bg-red-500/20\",\n ERR: \"bg-red-100 dark:bg-red-500/20\",\n warning: \"bg-yellow-100 dark:bg-yellow-500/20\",\n running: \"bg-blue-100 dark:bg-blue-500/20\",\n pending: \"bg-gray-100 dark:bg-gray-500/20\",\n};\n\nexport function taskStatusColor(s: string): string {\n return STATUS_COLORS[s] ?? \"text-gray-500\";\n}\n\nexport function taskStatusIcon(s: string): StaticIconComponent {\n return STATUS_ICONS[s] ?? UiCircleOutline;\n}\n\nexport function taskStatusBg(s: string): string {\n return STATUS_BG[s] ?? \"bg-gray-100 dark:bg-gray-500/20\";\n}\n\nexport function logLevelColor(level: string): string {\n switch (level) {\n case \"error\":\n return \"text-red-500\";\n case \"warn\":\n return \"text-yellow-600 dark:text-yellow-400\";\n case \"debug\":\n return \"text-gray-400\";\n default:\n return \"text-gray-500\";\n }\n}\n\n// taskSegments builds the colored progress-bar segments for a set of counts, in\n// the canonical clicky order (passed, warnings, failed, running, pending).\nexport function taskSegments(counts: {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n}): ProgressSegment[] {\n return [\n { count: counts.ok, color: \"bg-green-500\", label: \"passed\" },\n { count: counts.warn, color: \"bg-yellow-400\", label: \"warnings\" },\n { count: counts.fail, color: \"bg-red-500\", label: \"failed\" },\n { count: counts.run, color: \"bg-blue-500\", label: \"running\" },\n { count: counts.pending, color: \"bg-gray-300\", label: \"pending\" },\n ];\n}\n\n// bucketTasks tallies the child tasks of a group by status bucket.\nexport function bucketTasks(tasks: TaskSnapshot[]): {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n} {\n let ok = 0;\n let warn = 0;\n let fail = 0;\n let run = 0;\n let pending = 0;\n for (const t of tasks) {\n switch (t.status) {\n case \"success\":\n case \"PASS\":\n ok += 1;\n break;\n case \"warning\":\n warn += 1;\n break;\n case \"failed\":\n case \"FAIL\":\n case \"ERR\":\n fail += 1;\n break;\n case \"running\":\n run += 1;\n break;\n case \"pending\":\n pending += 1;\n break;\n default:\n ok += 1; // SKIP / canceled / completed count as done\n }\n }\n return { ok, warn, fail, run, pending };\n}\n"],"names":["UiClock","UiLoader","UiPass","UiCircleX","UiWarningTriangle","UiCancel","UiCircleOutline"],"mappings":";;;;;;;;;AAgBA,MAAM,gBAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR;AAIA,MAAM,eAAoD;AAAA,EACxD,SAASA,QAAAA;AAAAA,EACT,SAASC,SAAAA;AAAAA,EACT,SAASC,OAAAA;AAAAA,EACT,MAAMA,OAAAA;AAAAA,EACN,WAAWA,OAAAA;AAAAA,EACX,QAAQC,UAAAA;AAAAA,EACR,MAAMA,UAAAA;AAAAA,EACN,KAAKA,UAAAA;AAAAA,EACL,SAASC,kBAAAA;AAAAA,EACT,UAAUC,SAAAA;AAAAA,EACV,MAAMA,SAAAA;AACR;AAEA,MAAM,YAAoC;AAAA,EACxC,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;AAEO,SAAS,gBAAgB,GAAmB;AACjD,SAAO,cAAc,CAAC,KAAK;AAC7B;AAEO,SAAS,eAAe,GAAgC;AAC7D,SAAO,aAAa,CAAC,KAAKC,gBAAAA;AAC5B;AAEO,SAAS,aAAa,GAAmB;AAC9C,SAAO,UAAU,CAAC,KAAK;AACzB;AAEO,SAAS,cAAc,OAAuB;AACnD,UAAQ,OAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAIO,SAAS,aAAa,QAMP;AACpB,SAAO;AAAA,IACL,EAAE,OAAO,OAAO,IAAI,OAAO,gBAAgB,OAAO,SAAA;AAAA,IAClD,EAAE,OAAO,OAAO,MAAM,OAAO,iBAAiB,OAAO,WAAA;AAAA,IACrD,EAAE,OAAO,OAAO,MAAM,OAAO,cAAc,OAAO,SAAA;AAAA,IAClD,EAAE,OAAO,OAAO,KAAK,OAAO,eAAe,OAAO,UAAA;AAAA,IAClD,EAAE,OAAO,OAAO,SAAS,OAAO,eAAe,OAAO,UAAA;AAAA,EAAU;AAEpE;AAGO,SAAS,YAAY,OAM1B;AACA,MAAI,KAAK;AACT,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,MAAM;AACV,MAAI,UAAU;AACd,aAAW,KAAK,OAAO;AACrB,YAAQ,EAAE,QAAA;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AACH,cAAM;AACN;AAAA,MACF,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,mBAAW;AACX;AAAA,MACF;AACE,cAAM;AAAA,IAAA;AAAA,EAEZ;AACA,SAAO,EAAE,IAAI,MAAM,MAAM,KAAK,QAAA;AAChC;;;;;;;"}
@@ -1,7 +1,8 @@
1
+ import { StaticIconComponent } from './Icon';
1
2
  import { ProgressSegment } from './ProgressBar';
2
3
  import { TaskSnapshot } from './TaskSnapshot';
3
4
  export declare function taskStatusColor(s: string): string;
4
- export declare function taskStatusIcon(s: string): string;
5
+ export declare function taskStatusIcon(s: string): StaticIconComponent;
5
6
  export declare function taskStatusBg(s: string): string;
6
7
  export declare function logLevelColor(level: string): string;
7
8
  export declare function taskSegments(counts: {
@@ -1 +1 @@
1
- {"version":3,"file":"task-status.d.ts","sourceRoot":"","sources":["../../src/data/task-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA6CnD,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWnD;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,eAAe,EAAE,CAQpB;AAGD,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,CA+BA"}
1
+ {"version":3,"file":"task-status.d.ts","sourceRoot":"","sources":["../../src/data/task-status.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA+CnD,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAE7D;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWnD;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,eAAe,EAAE,CAQpB;AAGD,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,CA+BA"}
@@ -1,3 +1,10 @@
1
+ import { UiCancel } from "../icons/components/UiCancel.js";
2
+ import { UiWarningTriangle } from "../icons/components/UiWarningTriangle.js";
3
+ import { UiCircleX } from "../icons/components/UiCircleX.js";
4
+ import { UiPass } from "../icons/components/UiPass.js";
5
+ import { UiLoader } from "../icons/components/UiLoader.js";
6
+ import { UiClock } from "../icons/components/UiClock.js";
7
+ import { UiCircleOutline } from "../icons/components/UiCircleOutline.js";
1
8
  const STATUS_COLORS = {
2
9
  success: "text-green-600 dark:text-green-400",
3
10
  PASS: "text-green-600 dark:text-green-400",
@@ -12,17 +19,17 @@ const STATUS_COLORS = {
12
19
  SKIP: "text-gray-400"
13
20
  };
14
21
  const STATUS_ICONS = {
15
- pending: "codicon:clock",
16
- running: "svg-spinners:ring-resize",
17
- success: "codicon:pass-filled",
18
- PASS: "codicon:pass-filled",
19
- completed: "codicon:pass-filled",
20
- failed: "codicon:error",
21
- FAIL: "codicon:error",
22
- ERR: "codicon:error",
23
- warning: "codicon:warning",
24
- canceled: "codicon:circle-slash",
25
- SKIP: "codicon:circle-slash"
22
+ pending: UiClock,
23
+ running: UiLoader,
24
+ success: UiPass,
25
+ PASS: UiPass,
26
+ completed: UiPass,
27
+ failed: UiCircleX,
28
+ FAIL: UiCircleX,
29
+ ERR: UiCircleX,
30
+ warning: UiWarningTriangle,
31
+ canceled: UiCancel,
32
+ SKIP: UiCancel
26
33
  };
27
34
  const STATUS_BG = {
28
35
  success: "bg-green-100 dark:bg-green-500/20",
@@ -39,7 +46,7 @@ function taskStatusColor(s) {
39
46
  return STATUS_COLORS[s] ?? "text-gray-500";
40
47
  }
41
48
  function taskStatusIcon(s) {
42
- return STATUS_ICONS[s] ?? "codicon:circle-outline";
49
+ return STATUS_ICONS[s] ?? UiCircleOutline;
43
50
  }
44
51
  function taskStatusBg(s) {
45
52
  return STATUS_BG[s] ?? "bg-gray-100 dark:bg-gray-500/20";
@@ -1 +1 @@
1
- {"version":3,"file":"task-status.js","sources":["../../src/data/task-status.ts"],"sourcesContent":["import type { ProgressSegment } from \"./ProgressBar\";\nimport type { TaskSnapshot } from \"./TaskSnapshot\";\n\n// Status → presentation maps, ported from clicky's task UI (task/ui/src/utils.ts)\n// so the React and Preact renderers agree on icon/color semantics.\n\nconst STATUS_COLORS: Record<string, string> = {\n success: \"text-green-600 dark:text-green-400\",\n PASS: \"text-green-600 dark:text-green-400\",\n completed: \"text-green-600 dark:text-green-400\",\n failed: \"text-red-600 dark:text-red-400\",\n FAIL: \"text-red-600 dark:text-red-400\",\n ERR: \"text-red-600 dark:text-red-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n running: \"text-blue-600 dark:text-blue-400\",\n pending: \"text-gray-400\",\n canceled: \"text-gray-400\",\n SKIP: \"text-gray-400\",\n};\n\nconst STATUS_ICONS: Record<string, string> = {\n pending: \"codicon:clock\",\n running: \"svg-spinners:ring-resize\",\n success: \"codicon:pass-filled\",\n PASS: \"codicon:pass-filled\",\n completed: \"codicon:pass-filled\",\n failed: \"codicon:error\",\n FAIL: \"codicon:error\",\n ERR: \"codicon:error\",\n warning: \"codicon:warning\",\n canceled: \"codicon:circle-slash\",\n SKIP: \"codicon:circle-slash\",\n};\n\nconst STATUS_BG: Record<string, string> = {\n success: \"bg-green-100 dark:bg-green-500/20\",\n completed: \"bg-green-100 dark:bg-green-500/20\",\n PASS: \"bg-green-100 dark:bg-green-500/20\",\n failed: \"bg-red-100 dark:bg-red-500/20\",\n FAIL: \"bg-red-100 dark:bg-red-500/20\",\n ERR: \"bg-red-100 dark:bg-red-500/20\",\n warning: \"bg-yellow-100 dark:bg-yellow-500/20\",\n running: \"bg-blue-100 dark:bg-blue-500/20\",\n pending: \"bg-gray-100 dark:bg-gray-500/20\",\n};\n\nexport function taskStatusColor(s: string): string {\n return STATUS_COLORS[s] ?? \"text-gray-500\";\n}\n\nexport function taskStatusIcon(s: string): string {\n return STATUS_ICONS[s] ?? \"codicon:circle-outline\";\n}\n\nexport function taskStatusBg(s: string): string {\n return STATUS_BG[s] ?? \"bg-gray-100 dark:bg-gray-500/20\";\n}\n\nexport function logLevelColor(level: string): string {\n switch (level) {\n case \"error\":\n return \"text-red-500\";\n case \"warn\":\n return \"text-yellow-600 dark:text-yellow-400\";\n case \"debug\":\n return \"text-gray-400\";\n default:\n return \"text-gray-500\";\n }\n}\n\n// taskSegments builds the colored progress-bar segments for a set of counts, in\n// the canonical clicky order (passed, warnings, failed, running, pending).\nexport function taskSegments(counts: {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n}): ProgressSegment[] {\n return [\n { count: counts.ok, color: \"bg-green-500\", label: \"passed\" },\n { count: counts.warn, color: \"bg-yellow-400\", label: \"warnings\" },\n { count: counts.fail, color: \"bg-red-500\", label: \"failed\" },\n { count: counts.run, color: \"bg-blue-500\", label: \"running\" },\n { count: counts.pending, color: \"bg-gray-300\", label: \"pending\" },\n ];\n}\n\n// bucketTasks tallies the child tasks of a group by status bucket.\nexport function bucketTasks(tasks: TaskSnapshot[]): {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n} {\n let ok = 0;\n let warn = 0;\n let fail = 0;\n let run = 0;\n let pending = 0;\n for (const t of tasks) {\n switch (t.status) {\n case \"success\":\n case \"PASS\":\n ok += 1;\n break;\n case \"warning\":\n warn += 1;\n break;\n case \"failed\":\n case \"FAIL\":\n case \"ERR\":\n fail += 1;\n break;\n case \"running\":\n run += 1;\n break;\n case \"pending\":\n pending += 1;\n break;\n default:\n ok += 1; // SKIP / canceled / completed count as done\n }\n }\n return { ok, warn, fail, run, pending };\n}\n"],"names":[],"mappings":"AAMA,MAAM,gBAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR;AAEA,MAAM,eAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR;AAEA,MAAM,YAAoC;AAAA,EACxC,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;AAEO,SAAS,gBAAgB,GAAmB;AACjD,SAAO,cAAc,CAAC,KAAK;AAC7B;AAEO,SAAS,eAAe,GAAmB;AAChD,SAAO,aAAa,CAAC,KAAK;AAC5B;AAEO,SAAS,aAAa,GAAmB;AAC9C,SAAO,UAAU,CAAC,KAAK;AACzB;AAEO,SAAS,cAAc,OAAuB;AACnD,UAAQ,OAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAIO,SAAS,aAAa,QAMP;AACpB,SAAO;AAAA,IACL,EAAE,OAAO,OAAO,IAAI,OAAO,gBAAgB,OAAO,SAAA;AAAA,IAClD,EAAE,OAAO,OAAO,MAAM,OAAO,iBAAiB,OAAO,WAAA;AAAA,IACrD,EAAE,OAAO,OAAO,MAAM,OAAO,cAAc,OAAO,SAAA;AAAA,IAClD,EAAE,OAAO,OAAO,KAAK,OAAO,eAAe,OAAO,UAAA;AAAA,IAClD,EAAE,OAAO,OAAO,SAAS,OAAO,eAAe,OAAO,UAAA;AAAA,EAAU;AAEpE;AAGO,SAAS,YAAY,OAM1B;AACA,MAAI,KAAK;AACT,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,MAAM;AACV,MAAI,UAAU;AACd,aAAW,KAAK,OAAO;AACrB,YAAQ,EAAE,QAAA;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AACH,cAAM;AACN;AAAA,MACF,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,mBAAW;AACX;AAAA,MACF;AACE,cAAM;AAAA,IAAA;AAAA,EAEZ;AACA,SAAO,EAAE,IAAI,MAAM,MAAM,KAAK,QAAA;AAChC;"}
1
+ {"version":3,"file":"task-status.js","sources":["../../src/data/task-status.ts"],"sourcesContent":["import {\n UiCancel,\n UiCircleOutline,\n UiCircleX,\n UiClock,\n UiLoader,\n UiPass,\n UiWarningTriangle,\n} from \"../icons\";\nimport type { StaticIconComponent } from \"./Icon\";\nimport type { ProgressSegment } from \"./ProgressBar\";\nimport type { TaskSnapshot } from \"./TaskSnapshot\";\n\n// Status → presentation maps, ported from clicky's task UI (task/ui/src/utils.ts)\n// so the React and Preact renderers agree on icon/color semantics.\n\nconst STATUS_COLORS: Record<string, string> = {\n success: \"text-green-600 dark:text-green-400\",\n PASS: \"text-green-600 dark:text-green-400\",\n completed: \"text-green-600 dark:text-green-400\",\n failed: \"text-red-600 dark:text-red-400\",\n FAIL: \"text-red-600 dark:text-red-400\",\n ERR: \"text-red-600 dark:text-red-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n running: \"text-blue-600 dark:text-blue-400\",\n pending: \"text-gray-400\",\n canceled: \"text-gray-400\",\n SKIP: \"text-gray-400\",\n};\n\n// Status → generated Ui* icon component. Rendered via <Icon icon={…}>; the\n// `running` glyph is spun with `animate-spin` at the call sites.\nconst STATUS_ICONS: Record<string, StaticIconComponent> = {\n pending: UiClock,\n running: UiLoader,\n success: UiPass,\n PASS: UiPass,\n completed: UiPass,\n failed: UiCircleX,\n FAIL: UiCircleX,\n ERR: UiCircleX,\n warning: UiWarningTriangle,\n canceled: UiCancel,\n SKIP: UiCancel,\n};\n\nconst STATUS_BG: Record<string, string> = {\n success: \"bg-green-100 dark:bg-green-500/20\",\n completed: \"bg-green-100 dark:bg-green-500/20\",\n PASS: \"bg-green-100 dark:bg-green-500/20\",\n failed: \"bg-red-100 dark:bg-red-500/20\",\n FAIL: \"bg-red-100 dark:bg-red-500/20\",\n ERR: \"bg-red-100 dark:bg-red-500/20\",\n warning: \"bg-yellow-100 dark:bg-yellow-500/20\",\n running: \"bg-blue-100 dark:bg-blue-500/20\",\n pending: \"bg-gray-100 dark:bg-gray-500/20\",\n};\n\nexport function taskStatusColor(s: string): string {\n return STATUS_COLORS[s] ?? \"text-gray-500\";\n}\n\nexport function taskStatusIcon(s: string): StaticIconComponent {\n return STATUS_ICONS[s] ?? UiCircleOutline;\n}\n\nexport function taskStatusBg(s: string): string {\n return STATUS_BG[s] ?? \"bg-gray-100 dark:bg-gray-500/20\";\n}\n\nexport function logLevelColor(level: string): string {\n switch (level) {\n case \"error\":\n return \"text-red-500\";\n case \"warn\":\n return \"text-yellow-600 dark:text-yellow-400\";\n case \"debug\":\n return \"text-gray-400\";\n default:\n return \"text-gray-500\";\n }\n}\n\n// taskSegments builds the colored progress-bar segments for a set of counts, in\n// the canonical clicky order (passed, warnings, failed, running, pending).\nexport function taskSegments(counts: {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n}): ProgressSegment[] {\n return [\n { count: counts.ok, color: \"bg-green-500\", label: \"passed\" },\n { count: counts.warn, color: \"bg-yellow-400\", label: \"warnings\" },\n { count: counts.fail, color: \"bg-red-500\", label: \"failed\" },\n { count: counts.run, color: \"bg-blue-500\", label: \"running\" },\n { count: counts.pending, color: \"bg-gray-300\", label: \"pending\" },\n ];\n}\n\n// bucketTasks tallies the child tasks of a group by status bucket.\nexport function bucketTasks(tasks: TaskSnapshot[]): {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n} {\n let ok = 0;\n let warn = 0;\n let fail = 0;\n let run = 0;\n let pending = 0;\n for (const t of tasks) {\n switch (t.status) {\n case \"success\":\n case \"PASS\":\n ok += 1;\n break;\n case \"warning\":\n warn += 1;\n break;\n case \"failed\":\n case \"FAIL\":\n case \"ERR\":\n fail += 1;\n break;\n case \"running\":\n run += 1;\n break;\n case \"pending\":\n pending += 1;\n break;\n default:\n ok += 1; // SKIP / canceled / completed count as done\n }\n }\n return { ok, warn, fail, run, pending };\n}\n"],"names":[],"mappings":";;;;;;;AAgBA,MAAM,gBAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR;AAIA,MAAM,eAAoD;AAAA,EACxD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR;AAEA,MAAM,YAAoC;AAAA,EACxC,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;AAEO,SAAS,gBAAgB,GAAmB;AACjD,SAAO,cAAc,CAAC,KAAK;AAC7B;AAEO,SAAS,eAAe,GAAgC;AAC7D,SAAO,aAAa,CAAC,KAAK;AAC5B;AAEO,SAAS,aAAa,GAAmB;AAC9C,SAAO,UAAU,CAAC,KAAK;AACzB;AAEO,SAAS,cAAc,OAAuB;AACnD,UAAQ,OAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAIO,SAAS,aAAa,QAMP;AACpB,SAAO;AAAA,IACL,EAAE,OAAO,OAAO,IAAI,OAAO,gBAAgB,OAAO,SAAA;AAAA,IAClD,EAAE,OAAO,OAAO,MAAM,OAAO,iBAAiB,OAAO,WAAA;AAAA,IACrD,EAAE,OAAO,OAAO,MAAM,OAAO,cAAc,OAAO,SAAA;AAAA,IAClD,EAAE,OAAO,OAAO,KAAK,OAAO,eAAe,OAAO,UAAA;AAAA,IAClD,EAAE,OAAO,OAAO,SAAS,OAAO,eAAe,OAAO,UAAA;AAAA,EAAU;AAEpE;AAGO,SAAS,YAAY,OAM1B;AACA,MAAI,KAAK;AACT,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,MAAM;AACV,MAAI,UAAU;AACd,aAAW,KAAK,OAAO;AACrB,YAAQ,EAAE,QAAA;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AACH,cAAM;AACN;AAAA,MACF,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,mBAAW;AACX;AAAA,MACF;AACE,cAAM;AAAA,IAAA;AAAA,EAEZ;AACA,SAAO,EAAE,IAAI,MAAM,MAAM,KAAK,QAAA;AAChC;"}
@@ -11,10 +11,17 @@ export declare const runningTests: Test[];
11
11
  */
12
12
  export declare const largeDetailTests: Test[];
13
13
  /**
14
- * A very large forest (4 roots × depth 4 × breadth 4 several hundred nodes)
15
- * whose every leaf carries the LargePayloads-sized detail (deep object +
16
- * 500-row array + 800-line log). Used for the dialog stress test: a long
17
- * scrolling tree on the left and very large detail payloads on the right.
14
+ * A large forest (4 roots × depth 3 × breadth 4 = 340 nodes / 256 leaves) whose
15
+ * every leaf carries the LargePayloads-sized detail (deep object + 500-row array
16
+ * + 800-line log). Used for the dialog stress test: a long scrolling tree on the
17
+ * left and very large detail payloads on the right.
18
+ *
19
+ * Depth is 3, not 4: at depth 4 (~1024 leaves) the jsdom unit test auto-expands
20
+ * the failing branches and renders the whole tree, which OOM'd CI's
21
+ * memory-constrained shared vitest worker (a STACK_TRACE_ERROR on the "very
22
+ * large tree" test) once this package's suite grew. 340 nodes still scrolls and
23
+ * stresses the detail panes while staying within the worker's budget; the
24
+ * browser story renders the same fixture without the jsdom memory ceiling.
18
25
  */
19
26
  export declare const largeTreeTests: Test[];
20
27
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"TestRunner.fixtures.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/TestRunner.fixtures.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAIpC,mFAAmF;AACnF,eAAO,MAAM,cAAc,EAAE,IAAI,EAmFhC,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,YAAY,EAAE,IAAI,EA+B9B,CAAC;AAsCF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,IAAI,EA0BlC,CAAC;AA0DF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,IAAI,EAEhC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,eA0C1B,CAAC"}
1
+ {"version":3,"file":"TestRunner.fixtures.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/TestRunner.fixtures.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAIpC,mFAAmF;AACnF,eAAO,MAAM,cAAc,EAAE,IAAI,EAmFhC,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,YAAY,EAAE,IAAI,EA+B9B,CAAC;AAsCF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,IAAI,EA0BlC,CAAC;AA0DF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,EAAE,IAAI,EAEhC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,eA0C1B,CAAC"}
@@ -15,9 +15,9 @@ function detectMode() {
15
15
  }
16
16
  function getVersionInfo() {
17
17
  return {
18
- commit: read(() => "5fdb78d", ""),
19
- tag: read(() => "clicky-ui@0.3.5", ""),
20
- date: read(() => "2026-06-25T18:30:23.847Z", ""),
18
+ commit: read(() => "7b72fcb", ""),
19
+ tag: read(() => "clicky-ui@0.3.6", ""),
20
+ date: read(() => "2026-06-29T05:08:37.021Z", ""),
21
21
  dirty: read(() => true, false),
22
22
  mode: detectMode()
23
23
  };
@@ -13,9 +13,9 @@ function detectMode() {
13
13
  }
14
14
  function getVersionInfo() {
15
15
  return {
16
- commit: read(() => "5fdb78d", ""),
17
- tag: read(() => "clicky-ui@0.3.5", ""),
18
- date: read(() => "2026-06-25T18:30:09.843Z", ""),
16
+ commit: read(() => "7b72fcb", ""),
17
+ tag: read(() => "clicky-ui@0.3.6", ""),
18
+ date: read(() => "2026-06-29T05:08:20.947Z", ""),
19
19
  dirty: read(() => true, false),
20
20
  mode: detectMode()
21
21
  };
package/dist/data.cjs CHANGED
@@ -62,6 +62,9 @@ const TaskSnapshot = require("./data/TaskSnapshot.cjs");
62
62
  const taskStatus = require("./data/task-status.cjs");
63
63
  const TaskProgress = require("./data/TaskProgress.cjs");
64
64
  const TaskManager = require("./data/TaskManager.cjs");
65
+ const PromptDialog = require("./data/PromptDialog.cjs");
66
+ const PromptBanner = require("./data/PromptBanner.cjs");
67
+ const usePrompts = require("./hooks/use-prompts.cjs");
65
68
  const DiagnosticsTree = require("./data/diagnostics/DiagnosticsTree.cjs");
66
69
  const DiagnosticsDetailPanel = require("./data/diagnostics/DiagnosticsDetailPanel.cjs");
67
70
  const utils = require("./data/diagnostics/utils.cjs");
@@ -453,6 +456,10 @@ exports.taskStatusColor = taskStatus.taskStatusColor;
453
456
  exports.taskStatusIcon = taskStatus.taskStatusIcon;
454
457
  exports.TaskProgress = TaskProgress.TaskProgress;
455
458
  exports.TaskManager = TaskManager.TaskManager;
459
+ exports.PromptDialog = PromptDialog.PromptDialog;
460
+ exports.PromptBanner = PromptBanner.PromptBanner;
461
+ exports.answerPrompt = usePrompts.answerPrompt;
462
+ exports.usePrompts = usePrompts.usePrompts;
456
463
  exports.DiagnosticsTree = DiagnosticsTree.DiagnosticsTree;
457
464
  exports.DiagnosticsDetailPanel = DiagnosticsDetailPanel.DiagnosticsDetailPanel;
458
465
  exports.countProcesses = utils.countProcesses;
package/dist/data.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"data.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"data.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/data.d.ts CHANGED
@@ -63,6 +63,9 @@ export { type LogEntry, type TaskSnapshot, type TaskRunMeta, isTerminalStatus, a
63
63
  export { taskStatusColor, taskStatusIcon, taskStatusBg, logLevelColor, taskSegments, bucketTasks, } from './data/task-status';
64
64
  export { TaskProgress, type TaskProgressProps } from './data/TaskProgress';
65
65
  export { TaskManager, type TaskManagerProps } from './data/TaskManager';
66
+ export { PromptDialog, type PromptDialogProps } from './data/PromptDialog';
67
+ export { PromptBanner, type PromptBannerProps } from './data/PromptBanner';
68
+ export { usePrompts, answerPrompt, type PromptSnapshot, type PromptFilter, } from './hooks/use-prompts';
66
69
  export { DiagnosticsTree, type DiagnosticsTreeProps } from './data/diagnostics/DiagnosticsTree';
67
70
  export { DiagnosticsDetailPanel, type DiagnosticsDetailPanelProps, } from './data/diagnostics/DiagnosticsDetailPanel';
68
71
  export type { ProcessNode, StackCapture, RunMeta } from './data/diagnostics/types';
@@ -1 +1 @@
1
- {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"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"}