@hailer/mcp 1.1.16 → 1.1.17-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/.claude/CLAUDE.md +117 -320
  2. package/.claude/commands/app-squad.md +86 -90
  3. package/.claude/commands/audit-squad.md +19 -19
  4. package/.claude/commands/autoplan.md +3 -3
  5. package/.claude/commands/cleanup-squad.md +16 -16
  6. package/.claude/commands/config-squad.md +30 -30
  7. package/.claude/commands/crud-squad.md +23 -23
  8. package/.claude/commands/data-squad.md +21 -21
  9. package/.claude/commands/debug-squad.md +44 -44
  10. package/.claude/commands/doc-squad.md +16 -16
  11. package/.claude/commands/help:agents.md +130 -99
  12. package/.claude/commands/help:commands.md +15 -15
  13. package/.claude/commands/help:faq.md +17 -17
  14. package/.claude/commands/help:plugins.md +1 -1
  15. package/.claude/commands/help:skills.md +18 -24
  16. package/.claude/commands/hotfix-squad.md +22 -22
  17. package/.claude/commands/integration-squad.md +22 -22
  18. package/.claude/commands/janitor-squad.md +31 -31
  19. package/.claude/commands/learn-auto.md +5 -5
  20. package/.claude/commands/learn.md +12 -20
  21. package/.claude/commands/onboard-squad.md +39 -49
  22. package/.claude/commands/plan-workspace.md +2 -2
  23. package/.claude/commands/publish.md +32 -37
  24. package/.claude/commands/review-squad.md +27 -27
  25. package/.claude/commands/stats.md +26 -12
  26. package/.claude/commands/swarm.md +25 -25
  27. package/.claude/skills/chrome-mcp-reference/SKILL.md +5 -0
  28. package/.claude/skills/hailer-api-client/SKILL.md +55 -16
  29. package/.claude/skills/hailer-app-builder/SKILL.md +4 -270
  30. package/.claude/skills/hailer-apps-pictures/SKILL.md +3 -3
  31. package/.claude/skills/hailer-design-system/SKILL.md +96 -4
  32. package/.claude/skills/hailer-monolith-automations/SKILL.md +138 -116
  33. package/.claude/skills/hailer-permissions-system/SKILL.md +6 -9
  34. package/.claude/skills/hailer-project-protocol/SKILL.md +20 -110
  35. package/.claude/skills/integration-patterns/SKILL.md +6 -6
  36. package/.claude/skills/lsp-setup/SKILL.md +8 -9
  37. package/.claude/skills/sdk-activity-patterns/SKILL.md +238 -0
  38. package/.claude/skills/{SDK-document-templates → sdk-document-templates}/SKILL.md +13 -340
  39. package/.claude/skills/{SDK-function-fields → sdk-function-fields}/SKILL.md +8 -40
  40. package/.claude/skills/{SDK-insight-queries → sdk-insight-queries}/SKILL.md +114 -392
  41. package/.claude/skills/{SDK-ws-config-skill → sdk-ws-config-skill}/SKILL.md +79 -310
  42. package/.claude/skills/zapier-hailer-patterns/SKILL.md +84 -361
  43. package/.opencode/package-lock.json +117 -0
  44. package/CLAUDE.md +5 -358
  45. package/dist/app.d.ts.map +1 -1
  46. package/dist/app.js +10 -127
  47. package/dist/app.js.map +1 -1
  48. package/dist/bot/bot-manager.d.ts +3 -14
  49. package/dist/bot/bot-manager.d.ts.map +1 -1
  50. package/dist/bot/bot-manager.js +13 -4
  51. package/dist/bot/bot-manager.js.map +1 -1
  52. package/dist/bot/bot.d.ts +23 -102
  53. package/dist/bot/bot.d.ts.map +1 -1
  54. package/dist/bot/bot.js +356 -1212
  55. package/dist/bot/bot.js.map +1 -1
  56. package/dist/bot/services/bot-permissions.d.ts +50 -0
  57. package/dist/bot/services/bot-permissions.d.ts.map +1 -0
  58. package/dist/bot/services/bot-permissions.js +198 -0
  59. package/dist/bot/services/bot-permissions.js.map +1 -0
  60. package/dist/bot/services/index.d.ts +4 -2
  61. package/dist/bot/services/index.d.ts.map +1 -1
  62. package/dist/bot/services/index.js +10 -5
  63. package/dist/bot/services/index.js.map +1 -1
  64. package/dist/bot/services/message-classifier.d.ts +1 -1
  65. package/dist/bot/services/message-classifier.d.ts.map +1 -1
  66. package/dist/bot/services/message-classifier.js.map +1 -1
  67. package/dist/bot/services/signal-router.d.ts +32 -0
  68. package/dist/bot/services/signal-router.d.ts.map +1 -0
  69. package/dist/bot/services/signal-router.js +132 -0
  70. package/dist/bot/services/signal-router.js.map +1 -0
  71. package/dist/bot/services/system-prompt.d.ts +12 -0
  72. package/dist/bot/services/system-prompt.d.ts.map +1 -0
  73. package/dist/bot/services/system-prompt.js +93 -0
  74. package/dist/bot/services/system-prompt.js.map +1 -0
  75. package/dist/bot/services/types.d.ts +7 -34
  76. package/dist/bot/services/types.d.ts.map +1 -1
  77. package/dist/bot/services/types.js +0 -3
  78. package/dist/bot/services/types.js.map +1 -1
  79. package/dist/bot/services/workspace-refresh.d.ts +47 -0
  80. package/dist/bot/services/workspace-refresh.d.ts.map +1 -0
  81. package/dist/bot/services/workspace-refresh.js +154 -0
  82. package/dist/bot/services/workspace-refresh.js.map +1 -0
  83. package/dist/bot-config/constants.d.ts +0 -36
  84. package/dist/bot-config/constants.d.ts.map +1 -1
  85. package/dist/bot-config/constants.js +1 -76
  86. package/dist/bot-config/constants.js.map +1 -1
  87. package/dist/bot-config/context.d.ts +2 -42
  88. package/dist/bot-config/context.d.ts.map +1 -1
  89. package/dist/bot-config/context.js +13 -134
  90. package/dist/bot-config/context.js.map +1 -1
  91. package/dist/bot-config/index.d.ts +6 -15
  92. package/dist/bot-config/index.d.ts.map +1 -1
  93. package/dist/bot-config/index.js +5 -80
  94. package/dist/bot-config/index.js.map +1 -1
  95. package/dist/bot-config/loader.d.ts +16 -4
  96. package/dist/bot-config/loader.d.ts.map +1 -1
  97. package/dist/bot-config/loader.js +187 -96
  98. package/dist/bot-config/loader.js.map +1 -1
  99. package/dist/bot-config/persistence.d.ts +1 -52
  100. package/dist/bot-config/persistence.d.ts.map +1 -1
  101. package/dist/bot-config/persistence.js +3 -213
  102. package/dist/bot-config/persistence.js.map +1 -1
  103. package/dist/bot-config/state.d.ts +0 -41
  104. package/dist/bot-config/state.d.ts.map +1 -1
  105. package/dist/bot-config/state.js +0 -151
  106. package/dist/bot-config/state.js.map +1 -1
  107. package/dist/bot-config/tools.d.ts +1 -1
  108. package/dist/bot-config/tools.js +27 -27
  109. package/dist/bot-config/tools.js.map +1 -1
  110. package/dist/bot-config/types.d.ts +39 -32
  111. package/dist/bot-config/types.d.ts.map +1 -1
  112. package/dist/bot-config/types.js +0 -3
  113. package/dist/bot-config/types.js.map +1 -1
  114. package/dist/bot-config/webhooks.d.ts +0 -4
  115. package/dist/bot-config/webhooks.d.ts.map +1 -1
  116. package/dist/bot-config/webhooks.js +0 -13
  117. package/dist/bot-config/webhooks.js.map +1 -1
  118. package/dist/commands/seed-config.js +16 -31
  119. package/dist/commands/seed-config.js.map +1 -1
  120. package/dist/config.d.ts +0 -9
  121. package/dist/config.d.ts.map +1 -1
  122. package/dist/config.js +0 -15
  123. package/dist/config.js.map +1 -1
  124. package/dist/mcp/hailer-clients.js +2 -2
  125. package/dist/mcp/hailer-clients.js.map +1 -1
  126. package/dist/mcp/tool-registry.d.ts +10 -115
  127. package/dist/mcp/tool-registry.d.ts.map +1 -1
  128. package/dist/mcp/tool-registry.js +39 -363
  129. package/dist/mcp/tool-registry.js.map +1 -1
  130. package/dist/mcp/tools/activity.d.ts +3 -0
  131. package/dist/mcp/tools/activity.d.ts.map +1 -1
  132. package/dist/mcp/tools/activity.js +8 -1
  133. package/dist/mcp/tools/activity.js.map +1 -1
  134. package/dist/mcp/tools/app-core.d.ts +3 -0
  135. package/dist/mcp/tools/app-core.d.ts.map +1 -1
  136. package/dist/mcp/tools/app-core.js +9 -2
  137. package/dist/mcp/tools/app-core.js.map +1 -1
  138. package/dist/mcp/tools/app-marketplace.d.ts +3 -0
  139. package/dist/mcp/tools/app-marketplace.d.ts.map +1 -1
  140. package/dist/mcp/tools/app-marketplace.js +13 -1
  141. package/dist/mcp/tools/app-marketplace.js.map +1 -1
  142. package/dist/mcp/tools/app-member.d.ts +3 -0
  143. package/dist/mcp/tools/app-member.d.ts.map +1 -1
  144. package/dist/mcp/tools/app-member.js +6 -1
  145. package/dist/mcp/tools/app-member.js.map +1 -1
  146. package/dist/mcp/tools/app-scaffold.d.ts +3 -0
  147. package/dist/mcp/tools/app-scaffold.d.ts.map +1 -1
  148. package/dist/mcp/tools/app-scaffold.js +15 -11
  149. package/dist/mcp/tools/app-scaffold.js.map +1 -1
  150. package/dist/mcp/tools/company.d.ts +3 -0
  151. package/dist/mcp/tools/company.d.ts.map +1 -1
  152. package/dist/mcp/tools/company.js +5 -1
  153. package/dist/mcp/tools/company.js.map +1 -1
  154. package/dist/mcp/tools/discussion.d.ts +3 -0
  155. package/dist/mcp/tools/discussion.d.ts.map +1 -1
  156. package/dist/mcp/tools/discussion.js +13 -2
  157. package/dist/mcp/tools/discussion.js.map +1 -1
  158. package/dist/mcp/tools/file.d.ts +3 -0
  159. package/dist/mcp/tools/file.d.ts.map +1 -1
  160. package/dist/mcp/tools/file.js +6 -1
  161. package/dist/mcp/tools/file.js.map +1 -1
  162. package/dist/mcp/tools/index.d.ts +7 -0
  163. package/dist/mcp/tools/index.d.ts.map +1 -0
  164. package/dist/mcp/tools/index.js +34 -0
  165. package/dist/mcp/tools/index.js.map +1 -0
  166. package/dist/mcp/tools/insight.d.ts +3 -0
  167. package/dist/mcp/tools/insight.d.ts.map +1 -1
  168. package/dist/mcp/tools/insight.js +18 -8
  169. package/dist/mcp/tools/insight.js.map +1 -1
  170. package/dist/mcp/tools/user.d.ts +3 -0
  171. package/dist/mcp/tools/user.d.ts.map +1 -1
  172. package/dist/mcp/tools/user.js +6 -1
  173. package/dist/mcp/tools/user.js.map +1 -1
  174. package/dist/mcp/tools/workflow-permissions.d.ts +3 -0
  175. package/dist/mcp/tools/workflow-permissions.d.ts.map +1 -1
  176. package/dist/mcp/tools/workflow-permissions.js +8 -1
  177. package/dist/mcp/tools/workflow-permissions.js.map +1 -1
  178. package/dist/mcp/tools/workflow.d.ts +3 -0
  179. package/dist/mcp/tools/workflow.d.ts.map +1 -1
  180. package/dist/mcp/tools/workflow.js +29 -28
  181. package/dist/mcp/tools/workflow.js.map +1 -1
  182. package/dist/mcp/utils/index.d.ts +4 -11
  183. package/dist/mcp/utils/index.d.ts.map +1 -1
  184. package/dist/mcp/utils/index.js +5 -36
  185. package/dist/mcp/utils/index.js.map +1 -1
  186. package/dist/mcp/utils/role-utils.d.ts +0 -32
  187. package/dist/mcp/utils/role-utils.d.ts.map +1 -1
  188. package/dist/mcp/utils/role-utils.js +0 -73
  189. package/dist/mcp/utils/role-utils.js.map +1 -1
  190. package/dist/mcp/utils/tool-helpers.d.ts +0 -25
  191. package/dist/mcp/utils/tool-helpers.d.ts.map +1 -1
  192. package/dist/mcp/utils/tool-helpers.js +0 -34
  193. package/dist/mcp/utils/tool-helpers.js.map +1 -1
  194. package/dist/mcp/webhook-handler.d.ts +4 -34
  195. package/dist/mcp/webhook-handler.d.ts.map +1 -1
  196. package/dist/mcp/webhook-handler.js +57 -74
  197. package/dist/mcp/webhook-handler.js.map +1 -1
  198. package/dist/mcp-server.d.ts.map +1 -1
  199. package/dist/mcp-server.js +3 -78
  200. package/dist/mcp-server.js.map +1 -1
  201. package/package.json +1 -2
  202. package/.claude/agents/agent-ada-skill-builder.md +0 -94
  203. package/.claude/agents/agent-alejandro-function-fields.md +0 -342
  204. package/.claude/agents/agent-bjorn-config-audit.md +0 -103
  205. package/.claude/agents/agent-builder-agent-creator.md +0 -130
  206. package/.claude/agents/agent-code-simplifier.md +0 -53
  207. package/.claude/agents/agent-dmitri-activity-crud.md +0 -159
  208. package/.claude/agents/agent-giuseppe-app-builder.md +0 -208
  209. package/.claude/agents/agent-gunther-mcp-tools.md +0 -39
  210. package/.claude/agents/agent-helga-workflow-config.md +0 -204
  211. package/.claude/agents/agent-igor-activity-mover-automation.md +0 -125
  212. package/.claude/agents/agent-ingrid-doc-templates.md +0 -261
  213. package/.claude/agents/agent-ivan-monolith.md +0 -154
  214. package/.claude/agents/agent-kenji-data-reader.md +0 -86
  215. package/.claude/agents/agent-lars-code-inspector.md +0 -102
  216. package/.claude/agents/agent-marco-mockup-builder.md +0 -110
  217. package/.claude/agents/agent-marcus-api-documenter.md +0 -323
  218. package/.claude/agents/agent-marketplace-publisher.md +0 -280
  219. package/.claude/agents/agent-marketplace-reviewer.md +0 -309
  220. package/.claude/agents/agent-permissions-handler.md +0 -208
  221. package/.claude/agents/agent-simple-writer.md +0 -48
  222. package/.claude/agents/agent-svetlana-code-review.md +0 -171
  223. package/.claude/agents/agent-tanya-test-runner.md +0 -333
  224. package/.claude/agents/agent-ui-designer.md +0 -100
  225. package/.claude/agents/agent-viktor-sql-insights.md +0 -212
  226. package/.claude/agents/agent-web-search.md +0 -55
  227. package/.claude/agents/agent-yevgeni-discussions.md +0 -45
  228. package/.claude/agents/agent-zara-zapier.md +0 -159
  229. package/.claude/skills/SDK-activity-patterns/SKILL.md +0 -428
  230. package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
  231. package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
  232. package/.claude/skills/agent-structure/SKILL.md +0 -98
  233. package/.claude/skills/delegation-routing/SKILL.md +0 -202
  234. package/.claude/skills/frontend-design/SKILL.md +0 -254
  235. package/.claude/skills/hailer-activity-mover/SKILL.md +0 -213
  236. package/.claude/skills/hailer-rest-api/SKILL.md +0 -61
  237. package/.claude/skills/hailer-rest-api/hailer-activities.md +0 -184
  238. package/.claude/skills/hailer-rest-api/hailer-admin.md +0 -473
  239. package/.claude/skills/hailer-rest-api/hailer-calendar.md +0 -256
  240. package/.claude/skills/hailer-rest-api/hailer-feed.md +0 -249
  241. package/.claude/skills/hailer-rest-api/hailer-insights.md +0 -195
  242. package/.claude/skills/hailer-rest-api/hailer-messaging.md +0 -276
  243. package/.claude/skills/hailer-rest-api/hailer-workflows.md +0 -283
  244. package/.claude/skills/insight-join-patterns/SKILL.md +0 -174
  245. package/.claude/skills/json-only-output/SKILL.md +0 -72
  246. package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
  247. package/.claude/skills/optional-parameters/SKILL.md +0 -72
  248. package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
  249. package/.claude/skills/tool-response-verification/SKILL.md +0 -92
  250. package/.opencode/agent/agent-ada-skill-builder.md +0 -35
  251. package/.opencode/agent/agent-alejandro-function-fields.md +0 -39
  252. package/.opencode/agent/agent-bjorn-config-audit.md +0 -36
  253. package/.opencode/agent/agent-builder-agent-creator.md +0 -39
  254. package/.opencode/agent/agent-code-simplifier.md +0 -31
  255. package/.opencode/agent/agent-dmitri-activity-crud.md +0 -40
  256. package/.opencode/agent/agent-giuseppe-app-builder.md +0 -37
  257. package/.opencode/agent/agent-gunther-mcp-tools.md +0 -39
  258. package/.opencode/agent/agent-helga-workflow-config.md +0 -204
  259. package/.opencode/agent/agent-igor-activity-mover-automation.md +0 -46
  260. package/.opencode/agent/agent-ingrid-doc-templates.md +0 -39
  261. package/.opencode/agent/agent-ivan-monolith.md +0 -46
  262. package/.opencode/agent/agent-kenji-data-reader.md +0 -53
  263. package/.opencode/agent/agent-lars-code-inspector.md +0 -28
  264. package/.opencode/agent/agent-marco-mockup-builder.md +0 -42
  265. package/.opencode/agent/agent-marcus-api-documenter.md +0 -53
  266. package/.opencode/agent/agent-marketplace-publisher.md +0 -44
  267. package/.opencode/agent/agent-marketplace-reviewer.md +0 -42
  268. package/.opencode/agent/agent-permissions-handler.md +0 -50
  269. package/.opencode/agent/agent-simple-writer.md +0 -45
  270. package/.opencode/agent/agent-svetlana-code-review.md +0 -39
  271. package/.opencode/agent/agent-tanya-test-runner.md +0 -57
  272. package/.opencode/agent/agent-ui-designer.md +0 -56
  273. package/.opencode/agent/agent-viktor-sql-insights.md +0 -34
  274. package/.opencode/agent/agent-web-search.md +0 -42
  275. package/.opencode/agent/agent-yevgeni-discussions.md +0 -37
  276. package/.opencode/agent/agent-zara-zapier.md +0 -53
  277. package/.opencode/commands/app-squad.md +0 -135
  278. package/.opencode/commands/audit-squad.md +0 -158
  279. package/.opencode/commands/autoplan.md +0 -563
  280. package/.opencode/commands/cleanup-squad.md +0 -98
  281. package/.opencode/commands/config-squad.md +0 -106
  282. package/.opencode/commands/crud-squad.md +0 -87
  283. package/.opencode/commands/data-squad.md +0 -97
  284. package/.opencode/commands/debug-squad.md +0 -303
  285. package/.opencode/commands/doc-squad.md +0 -65
  286. package/.opencode/commands/handoff.md +0 -137
  287. package/.opencode/commands/health.md +0 -49
  288. package/.opencode/commands/help-agents.md +0 -151
  289. package/.opencode/commands/help-commands.md +0 -32
  290. package/.opencode/commands/help-faq.md +0 -29
  291. package/.opencode/commands/help-plugins.md +0 -28
  292. package/.opencode/commands/help-skills.md +0 -7
  293. package/.opencode/commands/help-tools.md +0 -40
  294. package/.opencode/commands/help.md +0 -28
  295. package/.opencode/commands/hotfix-squad.md +0 -112
  296. package/.opencode/commands/integration-squad.md +0 -82
  297. package/.opencode/commands/janitor-squad.md +0 -167
  298. package/.opencode/commands/learn-auto.md +0 -120
  299. package/.opencode/commands/learn.md +0 -120
  300. package/.opencode/commands/mcp-list.md +0 -27
  301. package/.opencode/commands/onboard-squad.md +0 -140
  302. package/.opencode/commands/plan-workspace.md +0 -732
  303. package/.opencode/commands/prd.md +0 -131
  304. package/.opencode/commands/project-status.md +0 -82
  305. package/.opencode/commands/publish.md +0 -138
  306. package/.opencode/commands/recap.md +0 -69
  307. package/.opencode/commands/restore.md +0 -64
  308. package/.opencode/commands/review-squad.md +0 -152
  309. package/.opencode/commands/save.md +0 -24
  310. package/.opencode/commands/stats.md +0 -19
  311. package/.opencode/commands/swarm.md +0 -210
  312. package/.opencode/commands/tool-builder.md +0 -39
  313. package/.opencode/commands/ws-pull.md +0 -44
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: zapier-hailer-patterns
3
3
  description: Patterns for building Zapier integrations with Hailer REST API
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  triggers: When building Zapier automations, webhook triggers, or API integrations
6
6
  ---
7
7
 
@@ -60,20 +60,24 @@ This notebook contains:
60
60
 
61
61
  **Also check:** "Hailer REST-api" notebook (ID: `68e4e3fd-6ed6-4e0b-b624-672773ba4142`) for API endpoint details.
62
62
 
63
- ## Quick Reference
63
+ ---
64
+
65
+ ## Authentication
64
66
 
65
- ### Authentication
66
67
  ```
67
68
  POST https://api.hailer.com/api/login
68
69
  Body: {"0": "email", "1": "password"}
69
70
  Returns: Session key → use as "hlrkey" header
70
71
  ```
71
72
 
72
- ### Webhook Triggers
73
- - Configured per-phase in Hailer (not per-workflow)
74
- - Set `webhooksEnabled: true` and `webhookUrl` on phase
73
+ ---
74
+
75
+ ## Webhook Payload Structure
76
+
77
+ Webhooks are configured per-phase in Hailer (not per-workflow): set `webhooksEnabled: true` and `webhookUrl` on the phase.
78
+
79
+ **⚠️ NEVER use SDK enums in automations.** Webhooks receive raw MongoDB ObjectIds, not SDK enum names. Use real IDs from the workspace or extract from payload.
75
80
 
76
- **CRITICAL: Webhook Payload Structure**
77
81
  ```typescript
78
82
  {
79
83
  _id: string; // Activity ID (MongoDB ObjectId)
@@ -89,18 +93,19 @@ Returns: Session key → use as "hlrkey" header
89
93
  }
90
94
  ```
91
95
 
92
- **Finding field values - two methods:**
96
+ **Finding field values:**
93
97
  ```javascript
94
- // Method 1: By key (if field has key property - preferred when available)
98
+ // Method 1: By key (preferred when available)
95
99
  const tagValue = fields.find(f => f.key === 'tag')?.value;
96
100
 
97
101
  // Method 2: By fieldId (always works - use real MongoDB IDs)
98
102
  const tagValue = fields.find(f => f.id === '507f1f77bcf86cd799439011')?.value;
99
103
  ```
100
104
 
101
- **⚠️ NEVER use SDK enums in automations.** Webhooks receive raw MongoDB ObjectIds, not SDK enum names. Use real IDs from the workspace or extract from payload.
105
+ ---
106
+
107
+ ## Activity Creation
102
108
 
103
- ### Activity Creation
104
109
  ```
105
110
  POST https://api.hailer.com/api/v3/activity/create
106
111
  Headers: Content-Type: application/json, hlrkey: <session_key>
@@ -115,28 +120,13 @@ Body: {
115
120
  }
116
121
  ```
117
122
 
118
- ### Field Types
119
- | Type | Format |
120
- |------|--------|
121
- | text/textarea | String |
122
- | date | Timestamp in milliseconds |
123
- | users | 24-char userId |
124
- | activitylink | 24-char activityId |
125
- | textpredefinedoptions | Exact option string |
126
-
127
- ### Zapier Tips
128
- - **Always set `return_raw_response: true`** in Custom Request steps - this gives you the full JSON response for parsing in subsequent code steps
129
- - Webhook payloads use `id` (not `_id`) for field identifiers
130
- - Use Code steps to parse and transform data between API calls
131
- - Search fields by `key` property when available (e.g., `f.key === 'user'`) for more readable code
132
- - **For Dataset workflows:** `phaseId` must be in the OPTIONS object (third parameter "2"), not in the activity object
133
-
134
- ### Zapier Import/Export JSON Format
135
-
136
- Zaps can be exported and imported as JSON files. This is useful for:
137
- - Version controlling automations in git
138
- - Sharing zap templates between projects
139
- - Backing up zap configurations
123
+ **For Dataset workflows:** `phaseId` must be in the OPTIONS object (third parameter "2"), not in the activity object.
124
+
125
+ ---
126
+
127
+ ## Zapier Import/Export JSON Format
128
+
129
+ Zaps can be exported and imported as JSON files — useful for version control and sharing.
140
130
 
141
131
  **Top-level structure:**
142
132
  ```json
@@ -160,33 +150,74 @@ Zaps can be exported and imported as JSON files. This is useful for:
160
150
  "id": 1,
161
151
  "paused": false,
162
152
  "type_of": "read", // "read" = trigger, "write" = action
163
- "params": {}, // Step-specific parameters
153
+ "params": {},
164
154
  "meta": { "$editor": { "has_automatic_issues": false }, "timezone": "Europe/Helsinki" },
165
155
  "triple_stores": { "copied_from": null, "created_by": null, "polling_interval_override": 0, "block_and_release_limit_override": 0, "spread_tasks": 1 },
166
156
  "parent_id": null, // null for trigger, previous node id for actions
167
157
  "root_id": null, // null for trigger, 1 for all actions
168
- "action": "hook_raw", // Action type (see below)
158
+ "action": "hook_raw",
169
159
  "selected_api": "WebHookCLIAPI@1.0.29",
170
160
  "title": "Step title",
171
161
  "authentication_id": null
172
162
  }
173
163
  ```
174
164
 
175
- **Action types:**
176
- | action | selected_api | Purpose |
177
- |--------|--------------|---------|
178
- | `hook_raw` | WebHookCLIAPI@1.0.29 | Catch Webhook trigger |
179
- | `post` | WebHookCLIAPI@1.0.29 | POST request |
180
- | `custom` | WebHookCLIAPI@1.0.29 | Custom Request (GET/POST/PUT) |
181
- | `01929fad-d3dd-...` | CodeCLIAPI@1.0.1 | Run JavaScript code |
182
-
183
- **Data references between steps:**
184
- Use `{{node_id__field}}` syntax:
185
- - `{{1__raw_body}}` - Raw body from trigger
186
- - `{{2__results}}` - Results from node 2 (e.g., session key from login)
187
- - `{{3__payload}}` - Output field from code step
188
-
189
- **Example: Webhook Login Code Create Activity**
165
+ **Data references between steps** use `{{node_id__field}}` syntax:
166
+ - `{{1__raw_body}}` Raw body from trigger
167
+ - `{{2__results}}` — Results from node 2 (e.g., session key from login)
168
+ - `{{3__payload}}` Output field from code step
169
+
170
+ ---
171
+
172
+ ## Zapier Built-in Tools Reference
173
+
174
+ ### Webhooks by Zapier (`WebHookCLIAPI@1.0.29`)
175
+
176
+ | Action | `action` value | Purpose |
177
+ |--------|---------------|---------|
178
+ | Catch Hook (trigger) | `hook_raw` | Receive webhook from Hailer phase |
179
+ | Custom Request | `custom` | Any HTTP request (GET/POST/PUT) |
180
+ | POST | `post` | Simple POST |
181
+ | GET | `get` | Simple GET |
182
+
183
+ Custom Request key params: `method`, `url`, `headers`, `data`, `unflatten`, `return_raw_response`
184
+
185
+ ### Code by Zapier (`CodeCLIAPI@1.0.1`)
186
+
187
+ Run JavaScript: `action: "01929fad-d3dd-62c2-52ed-7868d5fcc691"`. Access inputs via `inputData.varName`, return named outputs: `return { payload, email, id }`. `fetch` available for additional API calls.
188
+
189
+ ### Filter by Zapier (`FilterAPI`)
190
+
191
+ `type_of: "filter"`, `action: "filter"`. Match types: `icontains`, `inot_contains`, `iexact`, `inot_exact`, `is_set`, `not_set`, `greater_than`, `less_than`
192
+
193
+ ### Paths by Zapier (`BranchingAPI`)
194
+
195
+ `action: "branch"`, `type_of: "branching"`. Use `branches[]` with `filter_criteria` per path.
196
+
197
+ ### Formatter by Zapier (`ZapierFormatterCLIAPI@1.0.7`)
198
+
199
+ `datetime_line_item` (dates), `text_line_item` (strings), `util_line_item` (lookup/pick). **Note:** Hailer uses milliseconds, Zapier's `X` format is seconds — divide by 1000 in Code step.
200
+
201
+ ### Delay by Zapier (`DelayCLIAPI@1.1.1`)
202
+
203
+ `action: "delay_for"`, params: `delay_for_value`, `delay_for_unit` (minutes/hours/days)
204
+
205
+ ### Looping by Zapier (`ZapierLoopingCLIAPI@1.2.6`)
206
+
207
+ `action: "loop_values_line_items"` — iterate over arrays. Access outputs as `{{node__fieldname}}`.
208
+
209
+ ### Sub-Zap by Zapier (`SubZapCLIAPI@0.11.2`)
210
+
211
+ `start_subzap` (trigger in sub-zap), `call_subzap` (call from parent), `return_subzap` (return data). Useful for reusable auth logic.
212
+
213
+ ### Storage by Zapier (`StorageCLIAPI@1.2.1`)
214
+
215
+ `get_multiple_values`, `list_push`, `set_value`. Useful for deduplication, last-sync timestamps, counters.
216
+
217
+ ---
218
+
219
+ ## Annotated Full Example: Webhook → Login → Code → Create Activity
220
+
190
221
  ```json
191
222
  {
192
223
  "metadata": { "version": 2 },
@@ -221,7 +252,7 @@ Use `{{node_id__field}}` syntax:
221
252
  "selected_api": "CodeCLIAPI@1.0.1",
222
253
  "title": "Build payload", "parent_id": 2, "root_id": 1,
223
254
  "params": {
224
- "code": "const body = JSON.parse(inputData.rawBody);\\nconst payload = { \"0\": \"workflowId\", \"1\": { ... } };\\nreturn { payload: JSON.stringify(payload) };",
255
+ "code": "const body = JSON.parse(inputData.rawBody);\\nconst payload = { \"0\": \"workflowId\", \"1\": { name: body.name, phaseId: \"phaseId\", fields: {} } };\\nreturn { payload: JSON.stringify(payload) };",
225
256
  "input": { "rawBody": "{{1__raw_body}}" }
226
257
  },
227
258
  "paused": false, "authentication_id": null,
@@ -233,7 +264,7 @@ Use `{{node_id__field}}` syntax:
233
264
  "selected_api": "WebHookCLIAPI@1.0.29",
234
265
  "title": "Create activity", "parent_id": 3, "root_id": 1,
235
266
  "params": {
236
- "method": "POST", "unflatten": "yes", "return_raw_response": "no",
267
+ "method": "POST", "unflatten": "yes", "return_raw_response": "yes",
237
268
  "url": "https://api.hailer.com/api/v3/activity/create",
238
269
  "headers": { "Content-Type": "application/json", "hlrkey": "{{2__results}}" },
239
270
  "data": "{{3__payload}}"
@@ -247,296 +278,7 @@ Use `{{node_id__field}}` syntax:
247
278
  }
248
279
  ```
249
280
 
250
- **See also:** `sdk-projects/pohjaset/automations/` for real-world examples with annotations
251
-
252
- ---
253
-
254
- ## Zapier Built-in Tools Reference
255
-
256
- These are Zapier's native apps - no external service needed. Essential for Hailer integrations.
257
-
258
- ### Webhooks by Zapier
259
- **API:** `WebHookCLIAPI@1.0.29`
260
-
261
- | Trigger/Action | Purpose | Key Params |
262
- |----------------|---------|------------|
263
- | **Catch Hook** (trigger) | Receive webhook from Hailer phase | `action: "hook_raw"` |
264
- | **Catch Raw Hook** (trigger) | Same, preserves raw body | `action: "hook_raw"` |
265
- | **Custom Request** (action) | Any HTTP request | `action: "custom"`, `method`, `url`, `headers`, `data` |
266
- | **POST** (action) | Simple POST | `action: "post"`, `url`, `data` |
267
- | **GET** (action) | Simple GET | `action: "get"`, `url` |
268
- | **PUT** (action) | Simple PUT | `action: "put"`, `url`, `data` |
269
-
270
- **Custom Request params:**
271
- ```json
272
- {
273
- "method": "POST",
274
- "url": "https://api.hailer.com/api/v3/activity/create",
275
- "headers": { "Content-Type": "application/json", "hlrkey": "{{2__results}}" },
276
- "data": "{{3__payload}}",
277
- "unflatten": "yes",
278
- "return_raw_response": "yes"
279
- }
280
- ```
281
-
282
- ### Code by Zapier
283
- **API:** `CodeCLIAPI@1.0.1`
284
-
285
- | Action | Purpose | Key Params |
286
- |--------|---------|------------|
287
- | **Run JavaScript** | Transform data, build payloads | `action: "01929fad-d3dd-62c2-52ed-7868d5fcc691"` |
288
- | **Run Python** | Same, Python syntax | Different action UUID |
289
-
290
- **JavaScript params:**
291
- ```json
292
- {
293
- "code": "const data = JSON.parse(inputData.rawBody);\\nreturn { result: data.field };",
294
- "input": { "rawBody": "{{1__raw_body}}", "sessionKey": "{{2__results}}" }
295
- }
296
- ```
297
-
298
- **Code tips:**
299
- - Access inputs via `inputData.variableName`
300
- - Return object with named outputs: `return { payload, email, id };`
301
- - Can use `fetch` for additional API calls (async supported)
302
- - Output fields available as `{{node__fieldname}}`
303
-
304
- ### Filter by Zapier
305
- **API:** `FilterAPI` (legacy, still works)
306
-
307
- Conditionally continue or stop the Zap. Note: `type_of` is `"filter"` (not "write").
308
-
309
- | Action | Purpose |
310
- |--------|---------|
311
- | `filter` | Only continue if conditions match |
312
-
313
- **Params:**
314
- ```json
315
- {
316
- "selected_api": "FilterAPI",
317
- "action": "filter",
318
- "type_of": "filter",
319
- "params": {
320
- "filter_criteria": [
321
- {
322
- "id": 4699009700892223,
323
- "group": 4153161264351725,
324
- "key": "{{1__status}}",
325
- "value": "approved",
326
- "match": "icontains",
327
- "action": "continue"
328
- }
329
- ]
330
- }
331
- }
332
- ```
333
-
334
- **Match types:** `icontains`, `inot_contains`, `iexact`, `inot_exact`, `is_set`, `not_set`, `greater_than`, `less_than`
335
-
336
- ### Paths by Zapier
337
- **API:** `BranchingAPI` (419 uses found)
338
-
339
- Conditional branching - different actions based on conditions. Note: Uses `BranchingAPI` not `PathsCLIAPI`.
340
-
341
- ```json
342
- {
343
- "selected_api": "BranchingAPI",
344
- "action": "branch",
345
- "type_of": "branching",
346
- "params": {
347
- "branches": [
348
- {
349
- "name": "Path A - Approved",
350
- "filter_criteria": [
351
- { "key": "{{1__status}}", "value": "approved", "match": "iexact" }
352
- ]
353
- },
354
- {
355
- "name": "Path B - Rejected",
356
- "filter_criteria": [
357
- { "key": "{{1__status}}", "value": "rejected", "match": "iexact" }
358
- ]
359
- }
360
- ]
361
- }
362
- }
363
- ```
364
-
365
- ### Formatter by Zapier
366
- **API:** `ZapierFormatterCLIAPI@1.0.7`
367
-
368
- Transform text, dates, numbers without code.
369
-
370
- | Action | Purpose |
371
- |--------|---------|
372
- | `datetime_line_item` | Format dates |
373
- | `text_line_item` | Manipulate strings |
374
- | `util_line_item` | Utilities (lookup, pick) |
375
-
376
- **Date format (useful for Hailer timestamps):**
377
- ```json
378
- {
379
- "selected_api": "ZapierFormatterCLIAPI@1.0.7",
380
- "action": "datetime_line_item",
381
- "type_of": "write",
382
- "params": {
383
- "transform": "date.formatting",
384
- "to_timezone": "UTC",
385
- "from_timezone": "UTC",
386
- "inputs": "{{1__timestamp}}",
387
- "to_format": "YYYY-MM-DD"
388
- }
389
- }
390
- ```
391
-
392
- **Text transform:**
393
- ```json
394
- {
395
- "selected_api": "ZapierFormatterCLIAPI@1.0.7",
396
- "action": "text_line_item",
397
- "type_of": "write",
398
- "params": {
399
- "transform": "text.replace",
400
- "inputs": "{{1__email}}",
401
- "find": "@old-domain.com",
402
- "replace": "@new-domain.com"
403
- }
404
- }
405
- ```
406
- Note: Hailer uses milliseconds, Zapier's `X` is seconds - divide by 1000 in Code step or use date formatting.
407
-
408
- ### Delay by Zapier
409
- **API:** `DelayCLIAPI@1.1.1`
410
-
411
- Pause execution.
412
-
413
- | Action | Purpose |
414
- |--------|---------|
415
- | `delay_for` | Wait specific duration |
416
-
417
- ```json
418
- {
419
- "selected_api": "DelayCLIAPI@1.1.1",
420
- "action": "delay_for",
421
- "type_of": "write",
422
- "params": {
423
- "delay_for_value": "5",
424
- "delay_for_unit": "minutes"
425
- }
426
- }
427
- ```
428
-
429
- ### Looping by Zapier
430
- **API:** `ZapierLoopingCLIAPI@1.2.6`
431
-
432
- Iterate over arrays (e.g., process multiple activities).
433
-
434
- | Action | Purpose |
435
- |--------|---------|
436
- | `loop_values_line_items` | Loop over line items (objects) |
437
- | `loop_values_numbers` | Loop over number range |
438
- | `loop_values_text` | Loop over text items |
439
-
440
- ```json
441
- {
442
- "selected_api": "ZapierLoopingCLIAPI@1.2.6",
443
- "action": "loop_values_line_items",
444
- "type_of": "write",
445
- "params": {
446
- "trim_whitespace": "True",
447
- "iteration_start": "1",
448
- "iteration_limit": "500",
449
- "loop_values": {
450
- "activityId": "{{1__activities[]_id}}",
451
- "name": "{{1__activities[]name}}",
452
- "status": "{{1__activities[]currentPhase}}"
453
- }
454
- }
455
- }
456
- ```
457
-
458
- Access loop outputs: `{{node__activityId}}`, `{{node__name}}`, etc.
459
-
460
- ### Sub-Zap by Zapier
461
- **API:** `SubZapCLIAPI@0.11.2`
462
-
463
- Call another Zap as a subroutine.
464
-
465
- | Action | Purpose |
466
- |--------|---------|
467
- | `start_subzap` | Trigger (receives call from parent) |
468
- | `call_subzap` | Call another Zap, wait for response |
469
- | `return_subzap` | Return data to caller |
470
-
471
- **Trigger (in sub-zap):**
472
- ```json
473
- {
474
- "selected_api": "SubZapCLIAPI@0.11.2",
475
- "action": "start_subzap",
476
- "type_of": "read",
477
- "params": {
478
- "input_list": ["activityId", "sessionKey", "workflowId"]
479
- }
480
- }
481
- ```
482
-
483
- **Call (from parent zap):**
484
- ```json
485
- {
486
- "selected_api": "SubZapCLIAPI@0.11.2",
487
- "action": "call_subzap",
488
- "type_of": "write",
489
- "params": {
490
- "account_id": "5024683",
491
- "zap_id": "202514585",
492
- "activityId": "{{1__activityId}}",
493
- "sessionKey": "{{2__results}}",
494
- "workflowId": "{{3__workflowId}}"
495
- }
496
- }
497
- ```
498
-
499
- Useful for reusable logic (e.g., "Login to Hailer" sub-zap).
500
-
501
- ### Storage by Zapier
502
- **API:** `StorageCLIAPI@1.2.1`
503
-
504
- Store and retrieve values across Zap runs.
505
-
506
- | Action | Purpose |
507
- |--------|---------|
508
- | `get_multiple_values` | Retrieve stored values |
509
- | `list_push` | Add to list |
510
- | `set_value` | Store key-value pair |
511
-
512
- **Get values:**
513
- ```json
514
- {
515
- "selected_api": "StorageCLIAPI@1.2.1",
516
- "action": "get_multiple_values",
517
- "type_of": "search",
518
- "params": {
519
- "_zap_search_success_on_miss": true,
520
- "keys": ["{{1__activityId}}", "lastSyncTimestamp"]
521
- }
522
- }
523
- ```
524
-
525
- **Push to list:**
526
- ```json
527
- {
528
- "selected_api": "StorageCLIAPI@1.2.1",
529
- "action": "list_push",
530
- "type_of": "write",
531
- "params": {
532
- "key": "processedIds",
533
- "value": "{{1__activityId}}",
534
- "location": "tail"
535
- }
536
- }
537
- ```
538
-
539
- Useful for: tracking last sync timestamp, deduplication, counters.
281
+ **See also:** `sdk-projects/pohjaset/automations/` for real-world annotated examples
540
282
 
541
283
  ---
542
284
 
@@ -549,7 +291,6 @@ Useful for: tracking last sync timestamp, deduplication, counters.
549
291
  | **Branching Logic** | Catch Hook → Paths → (different actions per path) |
550
292
  | **Batch Processing** | Catch Hook → Looping → Custom Request |
551
293
  | **Scheduled Sync** | Schedule trigger → Custom Request (list) → Looping → Custom Request (update) |
552
- | **Date Formatting** | Catch Hook → Formatter (date) → Code → Custom Request |
553
294
  | **Reusable Auth** | Sub-Zap for login → Return session key |
554
295
 
555
296
  ---
@@ -561,21 +302,3 @@ Useful for: tracking last sync timestamp, deduplication, counters.
561
302
  3. **Design the zap flow**: Trigger → (optional code step) → API action
562
303
  4. **Create annotated documentation** for future reference
563
304
  5. **Store zap JSON** in project's `automations/` folder
564
-
565
- ## Common Zap Patterns
566
-
567
- ### Hailer Webhook → Hailer Action
568
- 1. Catch Hook (webhook from Hailer phase)
569
- 2. Login to get session key
570
- 3. Code step to build payload
571
- 4. Custom Request to Hailer API
572
-
573
- ### External Trigger → Hailer
574
- 1. Trigger from external app (Gmail, Slack, etc.)
575
- 2. Login to Hailer
576
- 3. Create/Update activity via API
577
-
578
- ### Hailer → External Action
579
- 1. Catch Hook from Hailer
580
- 2. Transform data if needed
581
- 3. Send to external API (Slack, Email, etc.)
@@ -0,0 +1,117 @@
1
+ {
2
+ "name": ".opencode",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "dependencies": {
8
+ "@opencode-ai/plugin": "1.3.17"
9
+ }
10
+ },
11
+ "node_modules/@opencode-ai/plugin": {
12
+ "version": "1.3.17",
13
+ "resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.3.17.tgz",
14
+ "integrity": "sha512-N5lckFtYvEu2R8K1um//MIOTHsJHniF2kHoPIWPCrxKG5Jpismt1ISGzIiU3aKI2ht/9VgcqKPC5oZFLdmpxPw==",
15
+ "license": "MIT",
16
+ "dependencies": {
17
+ "@opencode-ai/sdk": "1.3.17",
18
+ "zod": "4.1.8"
19
+ },
20
+ "peerDependencies": {
21
+ "@opentui/core": ">=0.1.96",
22
+ "@opentui/solid": ">=0.1.96"
23
+ },
24
+ "peerDependenciesMeta": {
25
+ "@opentui/core": {
26
+ "optional": true
27
+ },
28
+ "@opentui/solid": {
29
+ "optional": true
30
+ }
31
+ }
32
+ },
33
+ "node_modules/@opencode-ai/sdk": {
34
+ "version": "1.3.17",
35
+ "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.3.17.tgz",
36
+ "integrity": "sha512-2+MGgu7wynqTBwxezR01VAGhILXlpcHDY/pF7SWB87WOgLt3kD55HjKHNj6PWxyY8n575AZolR95VUC3gtwfmA==",
37
+ "license": "MIT",
38
+ "dependencies": {
39
+ "cross-spawn": "7.0.6"
40
+ }
41
+ },
42
+ "node_modules/cross-spawn": {
43
+ "version": "7.0.6",
44
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
45
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
46
+ "license": "MIT",
47
+ "dependencies": {
48
+ "path-key": "^3.1.0",
49
+ "shebang-command": "^2.0.0",
50
+ "which": "^2.0.1"
51
+ },
52
+ "engines": {
53
+ "node": ">= 8"
54
+ }
55
+ },
56
+ "node_modules/isexe": {
57
+ "version": "2.0.0",
58
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
59
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
60
+ "license": "ISC"
61
+ },
62
+ "node_modules/path-key": {
63
+ "version": "3.1.1",
64
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
65
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
66
+ "license": "MIT",
67
+ "engines": {
68
+ "node": ">=8"
69
+ }
70
+ },
71
+ "node_modules/shebang-command": {
72
+ "version": "2.0.0",
73
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
74
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
75
+ "license": "MIT",
76
+ "dependencies": {
77
+ "shebang-regex": "^3.0.0"
78
+ },
79
+ "engines": {
80
+ "node": ">=8"
81
+ }
82
+ },
83
+ "node_modules/shebang-regex": {
84
+ "version": "3.0.0",
85
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
86
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
87
+ "license": "MIT",
88
+ "engines": {
89
+ "node": ">=8"
90
+ }
91
+ },
92
+ "node_modules/which": {
93
+ "version": "2.0.2",
94
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
95
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
96
+ "license": "ISC",
97
+ "dependencies": {
98
+ "isexe": "^2.0.0"
99
+ },
100
+ "bin": {
101
+ "node-which": "bin/node-which"
102
+ },
103
+ "engines": {
104
+ "node": ">= 8"
105
+ }
106
+ },
107
+ "node_modules/zod": {
108
+ "version": "4.1.8",
109
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.8.tgz",
110
+ "integrity": "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==",
111
+ "license": "MIT",
112
+ "funding": {
113
+ "url": "https://github.com/sponsors/colinhacks"
114
+ }
115
+ }
116
+ }
117
+ }