@hailer/mcp 1.1.12 → 1.1.13

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 (271) hide show
  1. package/CHANGELOG.md +0 -7
  2. package/{.claude → dist}/CLAUDE.md +2 -2
  3. package/dist/app.js +18 -5
  4. package/dist/bot/bot-config.d.ts +10 -1
  5. package/dist/bot/bot-config.js +64 -3
  6. package/dist/bot/bot-manager.d.ts +2 -0
  7. package/dist/bot/bot-manager.js +9 -2
  8. package/dist/bot/bot.d.ts +33 -0
  9. package/dist/bot/bot.js +461 -160
  10. package/dist/bot/services/message-classifier.js +17 -0
  11. package/dist/bot/services/permission-guard.d.ts +52 -0
  12. package/dist/bot/services/permission-guard.js +149 -0
  13. package/dist/bot/services/types.d.ts +5 -0
  14. package/dist/bot/services/typing-indicator.d.ts +6 -1
  15. package/dist/bot/services/typing-indicator.js +19 -3
  16. package/dist/cli.js +0 -0
  17. package/dist/config.d.ts +6 -1
  18. package/dist/config.js +43 -0
  19. package/dist/core.js +3 -6
  20. package/dist/lib/discussion-lock.d.ts +42 -0
  21. package/dist/lib/discussion-lock.js +110 -0
  22. package/dist/mcp/UserContextCache.d.ts +5 -0
  23. package/dist/mcp/UserContextCache.js +51 -19
  24. package/dist/mcp/hailer-clients.d.ts +19 -1
  25. package/dist/mcp/hailer-clients.js +158 -24
  26. package/dist/mcp/session-store.d.ts +68 -0
  27. package/dist/mcp/session-store.js +169 -0
  28. package/dist/mcp/signal-handler.js +2 -0
  29. package/dist/mcp/tool-registry.d.ts +17 -4
  30. package/dist/mcp/tool-registry.js +37 -7
  31. package/dist/mcp/tools/activity.js +99 -7
  32. package/dist/mcp/tools/app-scaffold.js +304 -336
  33. package/dist/mcp/tools/bot-config/constants.d.ts +23 -0
  34. package/dist/mcp/tools/bot-config/constants.js +94 -0
  35. package/dist/mcp/tools/bot-config/core.d.ts +253 -0
  36. package/dist/mcp/tools/bot-config/core.js +2456 -0
  37. package/dist/mcp/tools/bot-config/index.d.ts +10 -0
  38. package/dist/mcp/tools/bot-config/index.js +59 -0
  39. package/dist/mcp/tools/bot-config/tools.d.ts +7 -0
  40. package/dist/mcp/tools/bot-config/tools.js +15 -0
  41. package/dist/mcp/tools/bot-config/types.d.ts +50 -0
  42. package/dist/mcp/tools/bot-config/types.js +6 -0
  43. package/dist/mcp/tools/bug-fixer-tools.d.ts +45 -0
  44. package/dist/mcp/tools/bug-fixer-tools.js +1096 -0
  45. package/dist/mcp/tools/company.d.ts +9 -0
  46. package/dist/mcp/tools/company.js +88 -0
  47. package/dist/mcp/tools/discussion.js +68 -0
  48. package/dist/mcp/tools/document.d.ts +11 -0
  49. package/dist/mcp/tools/document.js +741 -0
  50. package/dist/mcp/tools/investigate.d.ts +9 -0
  51. package/dist/mcp/tools/investigate.js +254 -0
  52. package/dist/mcp/tools/workflow-permissions.d.ts +15 -0
  53. package/dist/mcp/tools/workflow-permissions.js +204 -0
  54. package/dist/mcp/tools/workflow.js +57 -18
  55. package/dist/mcp/utils/index.d.ts +2 -0
  56. package/dist/mcp/utils/index.js +12 -1
  57. package/dist/mcp/utils/role-utils.d.ts +74 -0
  58. package/dist/mcp/utils/role-utils.js +151 -0
  59. package/dist/mcp/utils/types.d.ts +43 -1
  60. package/dist/mcp/utils/types.js +14 -0
  61. package/dist/mcp/webhook-handler.d.ts +4 -0
  62. package/dist/mcp/webhook-handler.js +8 -0
  63. package/dist/mcp-server.d.ts +23 -2
  64. package/dist/mcp-server.js +639 -127
  65. package/dist/plugins/vipunen/client.d.ts +150 -0
  66. package/dist/plugins/vipunen/client.js +535 -0
  67. package/dist/plugins/vipunen/config/schema-config.json +19 -0
  68. package/dist/plugins/vipunen/config/schema-doc.json +22 -0
  69. package/dist/plugins/vipunen/index.d.ts +41 -0
  70. package/dist/plugins/vipunen/index.js +88 -0
  71. package/dist/plugins/vipunen/tools.d.ts +26 -0
  72. package/dist/plugins/vipunen/tools.js +501 -0
  73. package/dist/stdio-server.d.ts +14 -0
  74. package/dist/stdio-server.js +101 -0
  75. package/package.json +2 -1
  76. package/.claude/agents/agent-ada-skill-builder.md +0 -94
  77. package/.claude/agents/agent-alejandro-function-fields.md +0 -342
  78. package/.claude/agents/agent-bjorn-config-audit.md +0 -103
  79. package/.claude/agents/agent-builder-agent-creator.md +0 -130
  80. package/.claude/agents/agent-code-simplifier.md +0 -53
  81. package/.claude/agents/agent-dmitri-activity-crud.md +0 -159
  82. package/.claude/agents/agent-giuseppe-app-builder.md +0 -247
  83. package/.claude/agents/agent-gunther-mcp-tools.md +0 -39
  84. package/.claude/agents/agent-helga-workflow-config.md +0 -204
  85. package/.claude/agents/agent-igor-activity-mover-automation.md +0 -125
  86. package/.claude/agents/agent-ingrid-doc-templates.md +0 -261
  87. package/.claude/agents/agent-ivan-monolith.md +0 -154
  88. package/.claude/agents/agent-kenji-data-reader.md +0 -86
  89. package/.claude/agents/agent-lars-code-inspector.md +0 -102
  90. package/.claude/agents/agent-marco-mockup-builder.md +0 -110
  91. package/.claude/agents/agent-marcus-api-documenter.md +0 -323
  92. package/.claude/agents/agent-marketplace-publisher.md +0 -280
  93. package/.claude/agents/agent-marketplace-reviewer.md +0 -309
  94. package/.claude/agents/agent-permissions-handler.md +0 -208
  95. package/.claude/agents/agent-simple-writer.md +0 -48
  96. package/.claude/agents/agent-svetlana-code-review.md +0 -171
  97. package/.claude/agents/agent-tanya-test-runner.md +0 -333
  98. package/.claude/agents/agent-ui-designer.md +0 -100
  99. package/.claude/agents/agent-viktor-sql-insights.md +0 -212
  100. package/.claude/agents/agent-web-search.md +0 -55
  101. package/.claude/agents/agent-yevgeni-discussions.md +0 -45
  102. package/.claude/agents/agent-zara-zapier.md +0 -159
  103. package/.claude/commands/app-squad.md +0 -135
  104. package/.claude/commands/audit-squad.md +0 -158
  105. package/.claude/commands/autoplan.md +0 -563
  106. package/.claude/commands/cleanup-squad.md +0 -98
  107. package/.claude/commands/config-squad.md +0 -106
  108. package/.claude/commands/crud-squad.md +0 -87
  109. package/.claude/commands/data-squad.md +0 -97
  110. package/.claude/commands/debug-squad.md +0 -303
  111. package/.claude/commands/doc-squad.md +0 -65
  112. package/.claude/commands/handoff.md +0 -137
  113. package/.claude/commands/health.md +0 -49
  114. package/.claude/commands/help.md +0 -29
  115. package/.claude/commands/help:agents.md +0 -151
  116. package/.claude/commands/help:commands.md +0 -78
  117. package/.claude/commands/help:faq.md +0 -79
  118. package/.claude/commands/help:plugins.md +0 -50
  119. package/.claude/commands/help:skills.md +0 -93
  120. package/.claude/commands/help:tools.md +0 -75
  121. package/.claude/commands/hotfix-squad.md +0 -112
  122. package/.claude/commands/integration-squad.md +0 -82
  123. package/.claude/commands/janitor-squad.md +0 -167
  124. package/.claude/commands/learn-auto.md +0 -120
  125. package/.claude/commands/learn.md +0 -120
  126. package/.claude/commands/mcp-list.md +0 -27
  127. package/.claude/commands/onboard-squad.md +0 -140
  128. package/.claude/commands/plan-workspace.md +0 -732
  129. package/.claude/commands/prd.md +0 -130
  130. package/.claude/commands/project-status.md +0 -82
  131. package/.claude/commands/publish.md +0 -138
  132. package/.claude/commands/recap.md +0 -69
  133. package/.claude/commands/restore.md +0 -64
  134. package/.claude/commands/review-squad.md +0 -152
  135. package/.claude/commands/save.md +0 -24
  136. package/.claude/commands/stats.md +0 -19
  137. package/.claude/commands/swarm.md +0 -210
  138. package/.claude/commands/tool-builder.md +0 -39
  139. package/.claude/commands/ws-pull.md +0 -44
  140. package/.claude/hooks/_shared-memory.cjs +0 -305
  141. package/.claude/hooks/_utils.cjs +0 -108
  142. package/.claude/hooks/agent-failure-detector.cjs +0 -383
  143. package/.claude/hooks/agent-usage-logger.cjs +0 -204
  144. package/.claude/hooks/app-edit-guard.cjs +0 -494
  145. package/.claude/hooks/auto-learn.cjs +0 -304
  146. package/.claude/hooks/bash-guard.cjs +0 -272
  147. package/.claude/hooks/builder-mode-manager.cjs +0 -354
  148. package/.claude/hooks/bulk-activity-guard.cjs +0 -271
  149. package/.claude/hooks/context-watchdog.cjs +0 -230
  150. package/.claude/hooks/delegation-reminder.cjs +0 -465
  151. package/.claude/hooks/design-system-lint.cjs +0 -271
  152. package/.claude/hooks/post-scaffold-hook.cjs +0 -181
  153. package/.claude/hooks/prompt-guard.cjs +0 -354
  154. package/.claude/hooks/publish-template-guard.cjs +0 -147
  155. package/.claude/hooks/session-start.cjs +0 -35
  156. package/.claude/hooks/shared-memory-writer.cjs +0 -147
  157. package/.claude/hooks/skill-injector.cjs +0 -140
  158. package/.claude/hooks/skill-usage-logger.cjs +0 -258
  159. package/.claude/hooks/src-edit-guard.cjs +0 -240
  160. package/.claude/hooks/sync-marketplace-agents.cjs +0 -346
  161. package/.claude/settings.json +0 -257
  162. package/.claude/skills/SDK-activity-patterns/SKILL.md +0 -428
  163. package/.claude/skills/SDK-document-templates/SKILL.md +0 -1033
  164. package/.claude/skills/SDK-function-fields/SKILL.md +0 -542
  165. package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
  166. package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
  167. package/.claude/skills/SDK-insight-queries/SKILL.md +0 -787
  168. package/.claude/skills/SDK-ws-config-skill/SKILL.md +0 -1139
  169. package/.claude/skills/agent-structure/SKILL.md +0 -98
  170. package/.claude/skills/api-documentation-patterns/SKILL.md +0 -474
  171. package/.claude/skills/chrome-mcp-reference/SKILL.md +0 -370
  172. package/.claude/skills/delegation-routing/SKILL.md +0 -202
  173. package/.claude/skills/frontend-design/SKILL.md +0 -254
  174. package/.claude/skills/hailer-activity-mover/SKILL.md +0 -213
  175. package/.claude/skills/hailer-api-client/SKILL.md +0 -518
  176. package/.claude/skills/hailer-app-builder/SKILL.md +0 -1434
  177. package/.claude/skills/hailer-apps-pictures/SKILL.md +0 -269
  178. package/.claude/skills/hailer-design-system/SKILL.md +0 -235
  179. package/.claude/skills/hailer-monolith-automations/SKILL.md +0 -686
  180. package/.claude/skills/hailer-permissions-system/SKILL.md +0 -121
  181. package/.claude/skills/hailer-project-protocol/SKILL.md +0 -488
  182. package/.claude/skills/hailer-rest-api/SKILL.md +0 -61
  183. package/.claude/skills/hailer-rest-api/hailer-activities.md +0 -184
  184. package/.claude/skills/hailer-rest-api/hailer-admin.md +0 -473
  185. package/.claude/skills/hailer-rest-api/hailer-calendar.md +0 -256
  186. package/.claude/skills/hailer-rest-api/hailer-feed.md +0 -249
  187. package/.claude/skills/hailer-rest-api/hailer-insights.md +0 -195
  188. package/.claude/skills/hailer-rest-api/hailer-messaging.md +0 -276
  189. package/.claude/skills/hailer-rest-api/hailer-workflows.md +0 -283
  190. package/.claude/skills/insight-join-patterns/SKILL.md +0 -174
  191. package/.claude/skills/integration-patterns/SKILL.md +0 -421
  192. package/.claude/skills/json-only-output/SKILL.md +0 -72
  193. package/.claude/skills/lsp-setup/SKILL.md +0 -160
  194. package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
  195. package/.claude/skills/optional-parameters/SKILL.md +0 -72
  196. package/.claude/skills/publish-hailer-app/SKILL.md +0 -244
  197. package/.claude/skills/testing-patterns/SKILL.md +0 -630
  198. package/.claude/skills/tool-builder/SKILL.md +0 -250
  199. package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
  200. package/.claude/skills/tool-response-verification/SKILL.md +0 -92
  201. package/.claude/skills/zapier-hailer-patterns/SKILL.md +0 -581
  202. package/.mcp.json +0 -13
  203. package/.opencode/agent/agent-ada-skill-builder.md +0 -35
  204. package/.opencode/agent/agent-alejandro-function-fields.md +0 -39
  205. package/.opencode/agent/agent-bjorn-config-audit.md +0 -36
  206. package/.opencode/agent/agent-builder-agent-creator.md +0 -39
  207. package/.opencode/agent/agent-code-simplifier.md +0 -31
  208. package/.opencode/agent/agent-dmitri-activity-crud.md +0 -40
  209. package/.opencode/agent/agent-giuseppe-app-builder.md +0 -37
  210. package/.opencode/agent/agent-gunther-mcp-tools.md +0 -39
  211. package/.opencode/agent/agent-helga-workflow-config.md +0 -203
  212. package/.opencode/agent/agent-igor-activity-mover-automation.md +0 -46
  213. package/.opencode/agent/agent-ingrid-doc-templates.md +0 -39
  214. package/.opencode/agent/agent-ivan-monolith.md +0 -46
  215. package/.opencode/agent/agent-kenji-data-reader.md +0 -53
  216. package/.opencode/agent/agent-lars-code-inspector.md +0 -28
  217. package/.opencode/agent/agent-marco-mockup-builder.md +0 -42
  218. package/.opencode/agent/agent-marcus-api-documenter.md +0 -53
  219. package/.opencode/agent/agent-marketplace-publisher.md +0 -44
  220. package/.opencode/agent/agent-marketplace-reviewer.md +0 -42
  221. package/.opencode/agent/agent-permissions-handler.md +0 -50
  222. package/.opencode/agent/agent-simple-writer.md +0 -45
  223. package/.opencode/agent/agent-svetlana-code-review.md +0 -39
  224. package/.opencode/agent/agent-tanya-test-runner.md +0 -57
  225. package/.opencode/agent/agent-ui-designer.md +0 -56
  226. package/.opencode/agent/agent-viktor-sql-insights.md +0 -34
  227. package/.opencode/agent/agent-web-search.md +0 -42
  228. package/.opencode/agent/agent-yevgeni-discussions.md +0 -37
  229. package/.opencode/agent/agent-zara-zapier.md +0 -53
  230. package/.opencode/commands/app-squad.md +0 -135
  231. package/.opencode/commands/audit-squad.md +0 -158
  232. package/.opencode/commands/autoplan.md +0 -563
  233. package/.opencode/commands/cleanup-squad.md +0 -98
  234. package/.opencode/commands/config-squad.md +0 -106
  235. package/.opencode/commands/crud-squad.md +0 -87
  236. package/.opencode/commands/data-squad.md +0 -97
  237. package/.opencode/commands/debug-squad.md +0 -303
  238. package/.opencode/commands/doc-squad.md +0 -65
  239. package/.opencode/commands/handoff.md +0 -137
  240. package/.opencode/commands/health.md +0 -49
  241. package/.opencode/commands/help-agents.md +0 -151
  242. package/.opencode/commands/help-commands.md +0 -32
  243. package/.opencode/commands/help-faq.md +0 -29
  244. package/.opencode/commands/help-plugins.md +0 -28
  245. package/.opencode/commands/help-skills.md +0 -7
  246. package/.opencode/commands/help-tools.md +0 -40
  247. package/.opencode/commands/help.md +0 -28
  248. package/.opencode/commands/hotfix-squad.md +0 -112
  249. package/.opencode/commands/integration-squad.md +0 -82
  250. package/.opencode/commands/janitor-squad.md +0 -167
  251. package/.opencode/commands/learn-auto.md +0 -120
  252. package/.opencode/commands/learn.md +0 -120
  253. package/.opencode/commands/mcp-list.md +0 -27
  254. package/.opencode/commands/onboard-squad.md +0 -140
  255. package/.opencode/commands/plan-workspace.md +0 -732
  256. package/.opencode/commands/prd.md +0 -131
  257. package/.opencode/commands/project-status.md +0 -82
  258. package/.opencode/commands/publish.md +0 -138
  259. package/.opencode/commands/recap.md +0 -69
  260. package/.opencode/commands/restore.md +0 -64
  261. package/.opencode/commands/review-squad.md +0 -152
  262. package/.opencode/commands/save.md +0 -24
  263. package/.opencode/commands/stats.md +0 -19
  264. package/.opencode/commands/swarm.md +0 -210
  265. package/.opencode/commands/tool-builder.md +0 -39
  266. package/.opencode/commands/ws-pull.md +0 -44
  267. package/.opencode/opencode.json +0 -28
  268. package/SESSION-HANDOFF.md +0 -68
  269. package/inbox/2026-03-04-bot-config-patterns.md +0 -24
  270. package/scripts/postinstall.cjs +0 -64
  271. package/scripts/test-hal-tools.ts +0 -154
@@ -1,269 +0,0 @@
1
- ---
2
- name: hailer-apps-pictures
3
- description: Pattern for fetching and displaying images from Hailer in React apps
4
- version: 1.0.0
5
- triggers: When building Hailer apps that need to display images from activities or insights
6
- ---
7
-
8
- # Hailer Apps Image Handling
9
-
10
- Pattern for fetching and displaying images from Hailer in React apps.
11
-
12
- ## Image URL Format
13
-
14
- Hailer serves images from this endpoint:
15
- ```
16
- https://api.hailer.com/image/hires/{imageId}
17
- ```
18
-
19
- ### URL Patterns
20
-
21
- **Correct formats (use these):**
22
- - `https://api.hailer.com/image/hires/{imageId}` - High-resolution images, works without authentication
23
- - `https://api.hailer.com/image/thumbnail/{imageId}` - Thumbnail version for lists/grids
24
-
25
- **Wrong formats (don't use):**
26
- - `https://app.hailer.com/api/files/{imageId}` - CORS issues in browsers
27
- - `https://api.hailer.com/files/{imageId}` - Authentication required, may fail in apps
28
- - `https://api.hailer.com/image/{imageId}` - Missing size parameter
29
-
30
- ### Utility Function
31
-
32
- ```typescript
33
- function getImageUrl(imageId: string, size: 'hires' | 'thumbnail' = 'hires'): string {
34
- return `https://api.hailer.com/image/${size}/${imageId}`;
35
- }
36
-
37
- // Usage
38
- const url = getImageUrl('abc123', 'hires'); // https://api.hailer.com/image/hires/abc123
39
- const thumbUrl = getImageUrl('abc123', 'thumbnail'); // https://api.hailer.com/image/thumbnail/abc123
40
- ```
41
-
42
- ### Extracting imageId from Activity Fields
43
-
44
- Image IDs typically come from file fields in activities. Extract them from the activity structure:
45
-
46
- ```typescript
47
- // From a file field in an activity
48
- const fileField = activity.fields.image_file; // e.g., { id: "file_xyz", name: "photo.jpg" }
49
- const imageId = fileField?.id;
50
-
51
- // From insight data with embedded URLs
52
- const imageUrl = item.mainProductImageUrl; // e.g., "https://api.hailer.com/image/hires/abc123"
53
- const imageId = imageUrl.split('/').pop(); // Extract from end of URL
54
-
55
- // From JSON array of IDs
56
- const imageIds = JSON.parse(item.allPictures); // ["id1", "id2", "id3"]
57
- ```
58
-
59
- ## Data Structure
60
-
61
- Product/activity images typically come from insights with two fields:
62
-
63
- ```typescript
64
- interface WithImages {
65
- mainProductImageUrl: string; // Full URL to main image
66
- allPictures: string; // JSON string: '["id1", "id2", "id3"]'
67
- }
68
- ```
69
-
70
- ## HailerImage Component
71
-
72
- Create a wrapper component for CORS handling and error states:
73
-
74
- ```tsx
75
- // components/HailerImage.tsx
76
- import { Image, ImageProps, Icon } from '@chakra-ui/react';
77
- import { FaImage } from 'react-icons/fa6';
78
- import { useState, useEffect } from 'react';
79
- import { useHailer } from '../hailer/use-hailer';
80
-
81
- interface HailerImageProps extends Omit<ImageProps, 'src'> {
82
- hailerImageUrl?: string;
83
- fallbackIcon?: boolean;
84
- }
85
-
86
- export const HailerImage = ({
87
- hailerImageUrl,
88
- fallbackIcon = true,
89
- alt = 'Image',
90
- ...imageProps
91
- }: HailerImageProps) => {
92
- const { inside, hailer } = useHailer(); // ← CORRECT: Destructure from useHailer()
93
- const [blobUrl, setBlobUrl] = useState<string | null>(null);
94
- const [isLoading, setIsLoading] = useState(true);
95
- const [isError, setIsError] = useState(false);
96
-
97
- useEffect(() => {
98
- const loadImage = async () => {
99
- if (!hailerImageUrl) {
100
- setIsError(true);
101
- setIsLoading(false);
102
- return;
103
- }
104
-
105
- if (!hailer?.ready) {
106
- setIsLoading(true);
107
- return;
108
- }
109
-
110
- try {
111
- const isHailerApiUrl = hailerImageUrl.includes('api.hailer.com');
112
- const isLocalDevelopment = window.location.hostname === 'localhost';
113
-
114
- if (isLocalDevelopment && isHailerApiUrl) {
115
- // CORS blocks api.hailer.com in localhost
116
- console.log('Local development: Hailer images blocked by CORS. Will work in production.');
117
- setIsError(true);
118
- setIsLoading(false);
119
- return;
120
- }
121
-
122
- setBlobUrl(hailerImageUrl);
123
- setIsError(false);
124
- } catch (error) {
125
- console.error('Error loading image from Hailer:', error);
126
- setIsError(true);
127
- } finally {
128
- setIsLoading(false);
129
- }
130
- };
131
-
132
- loadImage();
133
-
134
- return () => {
135
- if (blobUrl) {
136
- URL.revokeObjectURL(blobUrl);
137
- }
138
- };
139
- }, [hailerImageUrl, hailer?.ready]);
140
-
141
- if (isLoading || isError || !blobUrl) {
142
- return fallbackIcon ? (
143
- <Icon as={FaImage} color="gray.200" {...imageProps} />
144
- ) : null;
145
- }
146
-
147
- return (
148
- <Image
149
- {...imageProps}
150
- src={blobUrl}
151
- alt={alt}
152
- onError={() => setIsError(true)}
153
- />
154
- );
155
- };
156
- ```
157
-
158
- ## Usage: Single Image
159
-
160
- ```tsx
161
- <HailerImage
162
- hailerImageUrl={product.mainProductImageUrl}
163
- loading="lazy"
164
- objectFit="cover"
165
- maxW="100%"
166
- h="auto"
167
- aspectRatio={1}
168
- alt="Product image"
169
- />
170
- ```
171
-
172
- ## Usage: Image Carousel
173
-
174
- For multiple images stored as JSON array of IDs:
175
-
176
- ```tsx
177
- const ProductImageCarousel = ({ allPictures, mainImageUrl }: Props) => {
178
- const [currentIndex, setCurrentIndex] = useState(0);
179
-
180
- // Parse JSON string to array of IDs
181
- const imageIds = useMemo(() => {
182
- if (!allPictures) return [];
183
- try {
184
- const parsed = JSON.parse(allPictures);
185
- return Array.isArray(parsed) ? parsed : [];
186
- } catch {
187
- return [];
188
- }
189
- }, [allPictures]);
190
-
191
- const hasMultiple = imageIds.length > 1;
192
-
193
- // Construct URL from ID
194
- const getCurrentUrl = () => {
195
- if (imageIds.length === 0) return mainImageUrl || '';
196
- const id = imageIds[currentIndex];
197
- return id ? `https://api.hailer.com/image/hires/${id}` : mainImageUrl || '';
198
- };
199
-
200
- const goNext = () => setCurrentIndex(i => (i + 1) % imageIds.length);
201
- const goPrev = () => setCurrentIndex(i => (i - 1 + imageIds.length) % imageIds.length);
202
-
203
- return (
204
- <Box position="relative">
205
- <Image src={getCurrentUrl()} alt="Product" objectFit="contain" />
206
-
207
- {hasMultiple && (
208
- <>
209
- <IconButton
210
- icon={<FaChevronLeft />}
211
- onClick={goPrev}
212
- position="absolute"
213
- left={2}
214
- top="50%"
215
- transform="translateY(-50%)"
216
- />
217
- <IconButton
218
- icon={<FaChevronRight />}
219
- onClick={goNext}
220
- position="absolute"
221
- right={2}
222
- top="50%"
223
- transform="translateY(-50%)"
224
- />
225
- <Text textAlign="center">
226
- {currentIndex + 1} / {imageIds.length}
227
- </Text>
228
- </>
229
- )}
230
- </Box>
231
- );
232
- };
233
- ```
234
-
235
- ## Fetching Image Data from Insights
236
-
237
- ```typescript
238
- // In App.tsx or data fetching hook
239
- const fetchProducts = async () => {
240
- const data = await hailer.api.public.insight.dataAsObject(PRODUCT_INSIGHT_KEY);
241
-
242
- return data.map(item => ({
243
- // ... other fields
244
- mainProductImageUrl: item.mainProductImageUrl || '',
245
- allPictures: item.allPictures || '[]',
246
- }));
247
- };
248
- ```
249
-
250
- ## Key Points
251
-
252
- | Aspect | Details |
253
- |--------|---------|
254
- | **URL Format** | `https://api.hailer.com/image/hires/{imageId}` |
255
- | **CORS** | Blocked in localhost, works in production |
256
- | **Fallback** | Use `FaImage` icon from react-icons/fa6 |
257
- | **Performance** | Use `loading="lazy"` for catalog images |
258
- | **Multiple Images** | Store as JSON array of IDs, construct URLs on demand |
259
- | **Memory** | Revoke blob URLs on component cleanup |
260
-
261
- ## Dependencies
262
-
263
- ```json
264
- {
265
- "@chakra-ui/react": "^2.x",
266
- "react-icons": "^5.x",
267
- "@hailer/app-sdk": "^2.x"
268
- }
269
- ```
@@ -1,235 +0,0 @@
1
- ---
2
- name: hailer-design-system
3
- description: Chakra UI v2 theme, colors, icons, and component patterns for Hailer apps
4
- version: 1.0.0
5
- triggers: Build app, UI components, styling, theme, colors, icons, buttons, forms
6
- ---
7
-
8
- # Hailer Design System
9
-
10
- Chakra UI v2 with custom Hailer theme.
11
-
12
- **Full reference:** Read `docs/design-system/HAILER_DESIGN_SYSTEM.md` for comprehensive documentation (all icons, all components, full examples).
13
-
14
- ## Setup
15
-
16
- ```tsx
17
- import { ChakraProvider } from '@chakra-ui/react';
18
- import { theme } from './design-system/theme/theme';
19
-
20
- <ChakraProvider theme={theme}>
21
- <App />
22
- </ChakraProvider>
23
- ```
24
-
25
- ## Design System Location
26
-
27
- Copy from reference before building any app:
28
- ```bash
29
- cp -r ../[source-project]/src/design-system ./src/design-system
30
- ```
31
-
32
- ---
33
-
34
- ## Colors
35
-
36
- **Let theme handle colors automatically.** Rarely specify manually.
37
-
38
- | Use | Color |
39
- |-----|-------|
40
- | Primary action | `colorScheme="green"` |
41
- | Secondary action | `colorScheme="blue"` |
42
- | Destructive | `colorScheme="red"` |
43
- | Neutral | `colorScheme="gray"` |
44
-
45
- **Semantic tokens (auto light/dark):**
46
- - `subtleText` - Muted text
47
- - `bodyText` - Main text
48
- - `chakra-body-bg` - Page background
49
-
50
- ---
51
-
52
- ## Buttons
53
-
54
- **Variants:**
55
- - `solid` (default) - For 1-2 button groups
56
- - `outline` - For 3+ buttons in a series
57
- - `ghost` - Subtle secondary actions
58
-
59
- **Critical rules:**
60
- - Max 2 color schemes per button group
61
- - Right-align button groups (`justify="flex-end"`)
62
- - Primary action on the RIGHT
63
- - Add Hailer icon to primary button
64
-
65
- ```tsx
66
- // Two buttons - correct
67
- <HStack spacing={3} justify="flex-end">
68
- <Button colorScheme="gray">Cancel</Button>
69
- <Button colorScheme="green">Save</Button>
70
- </HStack>
71
-
72
- // 3+ buttons - use outline
73
- <HStack spacing={3}>
74
- <Button variant="outline" colorScheme="green" leftIcon={<HailerPlus />}>Create</Button>
75
- <Button variant="outline" colorScheme="gray">Export</Button>
76
- <Button variant="outline" colorScheme="gray">Filter</Button>
77
- </HStack>
78
- ```
79
-
80
- ---
81
-
82
- ## Icons
83
-
84
- **CRITICAL: Only use Hailer icons. Never external libraries.**
85
-
86
- ```tsx
87
- import { HailerPlus, HailerSettings } from './design-system/theme/icons';
88
-
89
- <HailerPlus boxSize={6} />
90
- <Button leftIcon={<HailerPlus />}>Add</Button>
91
- <IconButton icon={<HailerSettings />} aria-label="Settings" />
92
- ```
93
-
94
- **Common icons:**
95
- - Actions: `HailerPlus`, `HailerEdit`, `HailerTrash`, `HailerSave`
96
- - Navigation: `HailerChevron`, `HailerMenu`, `HailerSearch`
97
- - Status: `HailerWarning`, `HailerInfo`, `HailerTick`
98
- - Objects: `HailerUser`, `HailerCalendar`, `HailerFile`, `HailerActivities`
99
-
100
- ---
101
-
102
- ## Typography
103
-
104
- | Size | Use |
105
- |------|-----|
106
- | `2xl` | Page title |
107
- | `xl` | Section header |
108
- | `lg` | Subsection |
109
- | `md` | Card headers |
110
- | `sm` | Labels |
111
-
112
- ```tsx
113
- <Heading size="2xl">Page Title</Heading>
114
- <Text fontSize="sm" color="subtleText">Caption</Text>
115
- ```
116
-
117
- ---
118
-
119
- ## Spacing
120
-
121
- ```tsx
122
- <Box p={8} maxW="1400px" mx="auto"> // Page container
123
- <VStack spacing={6} align="stretch"> // Section spacing
124
- {/* Content */}
125
- </VStack>
126
- </Box>
127
- ```
128
-
129
- ---
130
-
131
- ## Forms
132
-
133
- ```tsx
134
- <FormControl isInvalid={hasError}>
135
- <FormLabel>Field Label</FormLabel>
136
- <Input placeholder="Enter text..." />
137
- <FormHelperText>Helper text</FormHelperText>
138
- <FormErrorMessage>Error message</FormErrorMessage>
139
- </FormControl>
140
- ```
141
-
142
- **Selection controls:** Only green colorScheme for Checkbox, Radio, Switch.
143
-
144
- ---
145
-
146
- ## Tables
147
-
148
- **CRITICAL: Use Chakra Table components, not HTML.**
149
-
150
- ```tsx
151
- <TableContainer>
152
- <Table variant="simple" size="md">
153
- <Thead>
154
- <Tr>
155
- <Th>Name</Th>
156
- <Th isNumeric>Count</Th>
157
- </Tr>
158
- </Thead>
159
- <Tbody>
160
- <Tr>
161
- <Td>Item</Td>
162
- <Td isNumeric>42</Td>
163
- </Tr>
164
- </Tbody>
165
- </Table>
166
- </TableContainer>
167
- ```
168
-
169
- ---
170
-
171
- ## Modals
172
-
173
- ```tsx
174
- <Modal isOpen={isOpen} onClose={onClose} size="md">
175
- <ModalOverlay />
176
- <ModalContent>
177
- <ModalHeader>Title</ModalHeader>
178
- <ModalCloseButton />
179
- <ModalBody>Content</ModalBody>
180
- <ModalFooter>
181
- <Button onClick={onClose}>Cancel</Button>
182
- <Button colorScheme="green">Save</Button>
183
- </ModalFooter>
184
- </ModalContent>
185
- </Modal>
186
- ```
187
-
188
- ---
189
-
190
- ## Feedback
191
-
192
- **Toast:**
193
- ```tsx
194
- toast({
195
- description: "Your changes have been saved.",
196
- status: "success",
197
- duration: 3000,
198
- isClosable: true
199
- });
200
- ```
201
-
202
- **Alert:**
203
- ```tsx
204
- <Alert status="error">
205
- <AlertIcon />
206
- <AlertDescription>Something went wrong.</AlertDescription>
207
- </Alert>
208
- ```
209
-
210
- ---
211
-
212
- ## Stats
213
-
214
- **Always use Stat components, not manual Box/Text:**
215
-
216
- ```tsx
217
- <Stat>
218
- <StatLabel>Total Users</StatLabel>
219
- <StatNumber>1,234</StatNumber>
220
- <StatHelpText>
221
- <StatArrow type="increase" />
222
- 23%
223
- </StatHelpText>
224
- </Stat>
225
- ```
226
-
227
- ---
228
-
229
- ## Content Tone
230
-
231
- - Clear, supportive, human
232
- - Use contractions ("you're", "we'll")
233
- - Never blame the user
234
- - Warm success messages: "Your changes have been saved."
235
- - Helpful errors: "We couldn't save your changes. Please try again."