@jiggai/kitchen 0.3.1 → 0.3.3

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 (307) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +2 -2
  3. package/.next/server/app/_global-error.html +2 -2
  4. package/.next/server/app/_global-error.rsc +1 -1
  5. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  6. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  10. package/.next/server/app/_not-found.html +1 -1
  11. package/.next/server/app/_not-found.rsc +1 -1
  12. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  13. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  14. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  18. package/.next/server/app/channels.html +2 -2
  19. package/.next/server/app/channels.rsc +1 -1
  20. package/.next/server/app/channels.segments/_full.segment.rsc +1 -1
  21. package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
  22. package/.next/server/app/channels.segments/_index.segment.rsc +1 -1
  23. package/.next/server/app/channels.segments/_tree.segment.rsc +1 -1
  24. package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +1 -1
  25. package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
  26. package/.next/server/app/cron-jobs.html +1 -1
  27. package/.next/server/app/cron-jobs.rsc +1 -1
  28. package/.next/server/app/cron-jobs.segments/_full.segment.rsc +1 -1
  29. package/.next/server/app/cron-jobs.segments/_head.segment.rsc +1 -1
  30. package/.next/server/app/cron-jobs.segments/_index.segment.rsc +1 -1
  31. package/.next/server/app/cron-jobs.segments/_tree.segment.rsc +1 -1
  32. package/.next/server/app/cron-jobs.segments/cron-jobs/__PAGE__.segment.rsc +1 -1
  33. package/.next/server/app/cron-jobs.segments/cron-jobs.segment.rsc +1 -1
  34. package/.next/server/app/goals/new.html +2 -2
  35. package/.next/server/app/goals/new.rsc +1 -1
  36. package/.next/server/app/goals/new.segments/_full.segment.rsc +1 -1
  37. package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
  38. package/.next/server/app/goals/new.segments/_index.segment.rsc +1 -1
  39. package/.next/server/app/goals/new.segments/_tree.segment.rsc +1 -1
  40. package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +1 -1
  41. package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
  42. package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
  43. package/.next/server/app/goals.html +1 -1
  44. package/.next/server/app/goals.rsc +1 -1
  45. package/.next/server/app/goals.segments/_full.segment.rsc +1 -1
  46. package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
  47. package/.next/server/app/goals.segments/_index.segment.rsc +1 -1
  48. package/.next/server/app/goals.segments/_tree.segment.rsc +1 -1
  49. package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +1 -1
  50. package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
  51. package/.next/server/app/settings.html +1 -1
  52. package/.next/server/app/settings.rsc +1 -1
  53. package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  54. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  55. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  56. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  57. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  58. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  59. package/.next/server/pages/404.html +1 -1
  60. package/.next/server/pages/500.html +2 -2
  61. package/package.json +1 -2
  62. package/src/app/HomeClient.tsx +0 -207
  63. package/src/app/agents/[agentId]/agent-editor-tabs.tsx +0 -298
  64. package/src/app/agents/[agentId]/agent-editor.tsx +0 -468
  65. package/src/app/agents/[agentId]/page.tsx +0 -32
  66. package/src/app/api/__tests__/agents-add-route.test.ts +0 -143
  67. package/src/app/api/__tests__/agents-file-route.test.ts +0 -117
  68. package/src/app/api/__tests__/agents-files-route.test.ts +0 -61
  69. package/src/app/api/__tests__/agents-id-route.test.ts +0 -104
  70. package/src/app/api/__tests__/agents-identity-route.test.ts +0 -92
  71. package/src/app/api/__tests__/agents-route.test.ts +0 -54
  72. package/src/app/api/__tests__/agents-skills-install-route.test.ts +0 -131
  73. package/src/app/api/__tests__/agents-skills-route.test.ts +0 -64
  74. package/src/app/api/__tests__/agents-update-route.test.ts +0 -95
  75. package/src/app/api/__tests__/channels-bindings-route.test.ts +0 -143
  76. package/src/app/api/__tests__/cron-delete-route.test.ts +0 -93
  77. package/src/app/api/__tests__/cron-job-route.test.ts +0 -78
  78. package/src/app/api/__tests__/cron-jobs-route.test.ts +0 -116
  79. package/src/app/api/__tests__/cron-recipe-installed-route.test.ts +0 -114
  80. package/src/app/api/__tests__/gateway-restart-route.test.ts +0 -36
  81. package/src/app/api/__tests__/goals-promote-route.test.ts +0 -200
  82. package/src/app/api/__tests__/goals-route.test.ts +0 -184
  83. package/src/app/api/__tests__/ids-check-route.test.ts +0 -188
  84. package/src/app/api/__tests__/marketplace-recipes-route.test.ts +0 -123
  85. package/src/app/api/__tests__/recipes-clone-route.test.ts +0 -221
  86. package/src/app/api/__tests__/recipes-delete-route.test.ts +0 -248
  87. package/src/app/api/__tests__/recipes-id-route.test.ts +0 -166
  88. package/src/app/api/__tests__/recipes-route.test.ts +0 -57
  89. package/src/app/api/__tests__/recipes-team-agents-route.test.ts +0 -135
  90. package/src/app/api/__tests__/scaffold-route.test.ts +0 -173
  91. package/src/app/api/__tests__/settings-cron-installation-route.test.ts +0 -82
  92. package/src/app/api/__tests__/skills-available-route.test.ts +0 -47
  93. package/src/app/api/__tests__/swarms-start-route.test.ts +0 -79
  94. package/src/app/api/__tests__/swarms-status-route.test.ts +0 -42
  95. package/src/app/api/__tests__/teams-file-route.test.ts +0 -129
  96. package/src/app/api/__tests__/teams-files-route.test.ts +0 -57
  97. package/src/app/api/__tests__/teams-meta-route.test.ts +0 -113
  98. package/src/app/api/__tests__/teams-orchestrator-install-route.test.ts +0 -66
  99. package/src/app/api/__tests__/teams-orchestrator-route.test.ts +0 -59
  100. package/src/app/api/__tests__/teams-remove-team-route.test.ts +0 -122
  101. package/src/app/api/__tests__/teams-skills-install-route.test.ts +0 -78
  102. package/src/app/api/__tests__/teams-skills-route.test.ts +0 -73
  103. package/src/app/api/__tests__/teams-workflow-runs-route.test.ts +0 -85
  104. package/src/app/api/__tests__/teams-workflows-route.test.ts +0 -110
  105. package/src/app/api/__tests__/tickets-move-route.test.ts +0 -60
  106. package/src/app/api/agents/[id]/route.ts +0 -83
  107. package/src/app/api/agents/add/route.ts +0 -114
  108. package/src/app/api/agents/file/route.ts +0 -45
  109. package/src/app/api/agents/files/route.ts +0 -23
  110. package/src/app/api/agents/identity/route.ts +0 -41
  111. package/src/app/api/agents/route.ts +0 -22
  112. package/src/app/api/agents/skills/install/route.ts +0 -34
  113. package/src/app/api/agents/skills/route.ts +0 -39
  114. package/src/app/api/agents/update/route.ts +0 -52
  115. package/src/app/api/channels/bindings/route.ts +0 -63
  116. package/src/app/api/cron/__tests__/helpers.test.ts +0 -164
  117. package/src/app/api/cron/delete/route.ts +0 -23
  118. package/src/app/api/cron/helpers.ts +0 -172
  119. package/src/app/api/cron/job/route.ts +0 -22
  120. package/src/app/api/cron/jobs/route.ts +0 -52
  121. package/src/app/api/cron/recipe-installed/route.ts +0 -65
  122. package/src/app/api/gateway/restart/route.ts +0 -20
  123. package/src/app/api/goals/[id]/promote/route.ts +0 -119
  124. package/src/app/api/goals/[id]/route.ts +0 -54
  125. package/src/app/api/goals/route.ts +0 -44
  126. package/src/app/api/ids/check/route.ts +0 -113
  127. package/src/app/api/marketplace/recipes/[slug]/route.ts +0 -16
  128. package/src/app/api/marketplace/recipes/route.ts +0 -22
  129. package/src/app/api/recipes/[id]/route.ts +0 -62
  130. package/src/app/api/recipes/clone/route.ts +0 -106
  131. package/src/app/api/recipes/custom-team/route.ts +0 -193
  132. package/src/app/api/recipes/delete/helpers.ts +0 -65
  133. package/src/app/api/recipes/delete/route.ts +0 -73
  134. package/src/app/api/recipes/route.ts +0 -21
  135. package/src/app/api/recipes/team-agents/__tests__/helpers.test.ts +0 -156
  136. package/src/app/api/recipes/team-agents/helpers.ts +0 -151
  137. package/src/app/api/recipes/team-agents/route.ts +0 -80
  138. package/src/app/api/scaffold/__tests__/helpers.test.ts +0 -186
  139. package/src/app/api/scaffold/helpers.ts +0 -214
  140. package/src/app/api/scaffold/route.ts +0 -95
  141. package/src/app/api/settings/cron-installation/route.ts +0 -58
  142. package/src/app/api/skills/available/route.ts +0 -23
  143. package/src/app/api/swarms/start/route.ts +0 -100
  144. package/src/app/api/swarms/status/route.ts +0 -31
  145. package/src/app/api/teams/[teamId]/tickets/assign/route.ts +0 -105
  146. package/src/app/api/teams/[teamId]/tickets/assignees/route.ts +0 -27
  147. package/src/app/api/teams/[teamId]/tickets/delete/route.ts +0 -55
  148. package/src/app/api/teams/[teamId]/tickets/move/route.ts +0 -70
  149. package/src/app/api/teams/[teamId]/tickets/move-to-goals/route.ts +0 -56
  150. package/src/app/api/teams/file/route.ts +0 -46
  151. package/src/app/api/teams/files/route.ts +0 -63
  152. package/src/app/api/teams/memory/route.ts +0 -250
  153. package/src/app/api/teams/meta/route.ts +0 -43
  154. package/src/app/api/teams/orchestrator/install/route.ts +0 -129
  155. package/src/app/api/teams/orchestrator/route.ts +0 -216
  156. package/src/app/api/teams/remove-team/route.ts +0 -37
  157. package/src/app/api/teams/skills/install/route.ts +0 -18
  158. package/src/app/api/teams/skills/route.ts +0 -25
  159. package/src/app/api/teams/workflow-runs/route.ts +0 -534
  160. package/src/app/api/teams/workflow-templates/route.ts +0 -71
  161. package/src/app/api/teams/workflows/route.ts +0 -55
  162. package/src/app/api/tickets/assign/route.ts +0 -94
  163. package/src/app/api/tickets/assignees/route.ts +0 -24
  164. package/src/app/api/tickets/move/route.ts +0 -69
  165. package/src/app/channels/channels-client.tsx +0 -271
  166. package/src/app/channels/page.tsx +0 -5
  167. package/src/app/cron-jobs/cron-jobs-client.tsx +0 -243
  168. package/src/app/cron-jobs/page.tsx +0 -34
  169. package/src/app/favicon.ico +0 -0
  170. package/src/app/global-error.tsx +0 -50
  171. package/src/app/globals.css +0 -153
  172. package/src/app/goals/[id]/goal-editor.tsx +0 -162
  173. package/src/app/goals/[id]/page.tsx +0 -6
  174. package/src/app/goals/goals-client.tsx +0 -201
  175. package/src/app/goals/new/page.tsx +0 -81
  176. package/src/app/goals/page.tsx +0 -10
  177. package/src/app/layout.tsx +0 -53
  178. package/src/app/manifest.ts +0 -15
  179. package/src/app/not-found.tsx +0 -8
  180. package/src/app/page.tsx +0 -33
  181. package/src/app/recipes/CreateAgentModal.tsx +0 -156
  182. package/src/app/recipes/CreateCustomTeamModal.tsx +0 -375
  183. package/src/app/recipes/CreateModalShell.tsx +0 -55
  184. package/src/app/recipes/CreateTeamModal.tsx +0 -91
  185. package/src/app/recipes/[id]/RecipeEditor/RecipeEditorCreateModal.tsx +0 -72
  186. package/src/app/recipes/[id]/RecipeEditor/RecipeEditorPanel.tsx +0 -216
  187. package/src/app/recipes/[id]/RecipeEditor/index.tsx +0 -271
  188. package/src/app/recipes/[id]/RecipeEditor/recipe-editor-utils.ts +0 -46
  189. package/src/app/recipes/[id]/RecipeEditor/types.ts +0 -52
  190. package/src/app/recipes/[id]/page.tsx +0 -37
  191. package/src/app/recipes/page.tsx +0 -101
  192. package/src/app/recipes/recipes-client.tsx +0 -620
  193. package/src/app/settings/page.tsx +0 -26
  194. package/src/app/settings/settings-client.tsx +0 -91
  195. package/src/app/teams/[teamId]/CloneTeamModal.tsx +0 -116
  196. package/src/app/teams/[teamId]/OrchestratorPanel.tsx +0 -255
  197. package/src/app/teams/[teamId]/OrchestratorSetupModal.tsx +0 -184
  198. package/src/app/teams/[teamId]/PublishChangesModal.tsx +0 -43
  199. package/src/app/teams/[teamId]/page.tsx +0 -49
  200. package/src/app/teams/[teamId]/team-editor/TeamAgentsTab.tsx +0 -145
  201. package/src/app/teams/[teamId]/team-editor/TeamCronTab.tsx +0 -72
  202. package/src/app/teams/[teamId]/team-editor/TeamFilesTab.tsx +0 -74
  203. package/src/app/teams/[teamId]/team-editor/TeamMemoryTab.tsx +0 -349
  204. package/src/app/teams/[teamId]/team-editor/TeamRecipeTab.tsx +0 -151
  205. package/src/app/teams/[teamId]/team-editor/TeamSkillsTab.tsx +0 -68
  206. package/src/app/teams/[teamId]/team-editor/index.tsx +0 -558
  207. package/src/app/teams/[teamId]/team-editor/team-editor-data.ts +0 -255
  208. package/src/app/teams/[teamId]/team-editor/team-editor-utils.ts +0 -78
  209. package/src/app/teams/[teamId]/team-editor/types.ts +0 -34
  210. package/src/app/teams/[teamId]/tickets/[ticket]/page.tsx +0 -35
  211. package/src/app/teams/[teamId]/tickets/page.tsx +0 -15
  212. package/src/app/teams/[teamId]/workflows/[workflowId]/WorkflowCanvas.tsx +0 -111
  213. package/src/app/teams/[teamId]/workflows/[workflowId]/page.tsx +0 -27
  214. package/src/app/teams/[teamId]/workflows/[workflowId]/workflows-editor-client.tsx +0 -1608
  215. package/src/app/teams/[teamId]/workflows/page.tsx +0 -40
  216. package/src/app/teams/[teamId]/workflows/workflows-client.tsx +0 -494
  217. package/src/app/tickets/TicketDetailClient.tsx +0 -147
  218. package/src/app/tickets/TicketsBoardClient.tsx +0 -200
  219. package/src/app/tickets/[ticket]/TicketAssignControl.tsx +0 -112
  220. package/src/app/tickets/[ticket]/page.tsx +0 -36
  221. package/src/app/tickets/page.tsx +0 -10
  222. package/src/components/AppShell.tsx +0 -286
  223. package/src/components/ConfirmationModal.tsx +0 -81
  224. package/src/components/DeleteEntityModal.tsx +0 -41
  225. package/src/components/ErrorBoundary.tsx +0 -70
  226. package/src/components/FileListWithOptionalToggle.tsx +0 -86
  227. package/src/components/GoalFormFields.tsx +0 -163
  228. package/src/components/ScaffoldOverlay.tsx +0 -78
  229. package/src/components/ThemeToggle.tsx +0 -53
  230. package/src/components/ToastProvider.tsx +0 -163
  231. package/src/components/__tests__/ConfirmationModal.test.tsx +0 -109
  232. package/src/components/__tests__/ErrorBoundary.test.tsx +0 -39
  233. package/src/components/__tests__/FileListWithOptionalToggle.test.tsx +0 -109
  234. package/src/components/__tests__/GoalFormFields.test.tsx +0 -117
  235. package/src/components/delete-modals.tsx +0 -59
  236. package/src/components/icons.tsx +0 -48
  237. package/src/lib/__tests__/agent-workspace.test.ts +0 -44
  238. package/src/lib/__tests__/agents.test.ts +0 -36
  239. package/src/lib/__tests__/api-route-helpers.test.ts +0 -188
  240. package/src/lib/__tests__/cron.test.ts +0 -45
  241. package/src/lib/__tests__/editor-utils.test.ts +0 -38
  242. package/src/lib/__tests__/errors.test.ts +0 -15
  243. package/src/lib/__tests__/exec.test.ts +0 -13
  244. package/src/lib/__tests__/fetch-json.test.ts +0 -118
  245. package/src/lib/__tests__/gateway.test.ts +0 -234
  246. package/src/lib/__tests__/goal-promote.test.ts +0 -39
  247. package/src/lib/__tests__/goals-client.test.ts +0 -26
  248. package/src/lib/__tests__/goals.test.ts +0 -275
  249. package/src/lib/__tests__/json.test.ts +0 -15
  250. package/src/lib/__tests__/kitchen-api.test.ts +0 -32
  251. package/src/lib/__tests__/marketplace.test.ts +0 -116
  252. package/src/lib/__tests__/openclaw.test.ts +0 -129
  253. package/src/lib/__tests__/paths.test.ts +0 -136
  254. package/src/lib/__tests__/poll.test.ts +0 -26
  255. package/src/lib/__tests__/recipe-clone.test.ts +0 -85
  256. package/src/lib/__tests__/recipe-team-agents.test.ts +0 -70
  257. package/src/lib/__tests__/recipes.test.ts +0 -199
  258. package/src/lib/__tests__/scaffold-client.test.ts +0 -106
  259. package/src/lib/__tests__/scaffold.test.ts +0 -64
  260. package/src/lib/__tests__/slugify.test.ts +0 -23
  261. package/src/lib/__tests__/tickets.test.ts +0 -158
  262. package/src/lib/__tests__/type-guards.test.ts +0 -18
  263. package/src/lib/__tests__/use-slugified-id.test.tsx +0 -120
  264. package/src/lib/agent-workspace.ts +0 -14
  265. package/src/lib/agents.ts +0 -17
  266. package/src/lib/api-route-helpers.ts +0 -157
  267. package/src/lib/cron.ts +0 -40
  268. package/src/lib/editor-utils.ts +0 -18
  269. package/src/lib/errors.ts +0 -7
  270. package/src/lib/exec.ts +0 -4
  271. package/src/lib/fetch-json.ts +0 -29
  272. package/src/lib/gateway.ts +0 -100
  273. package/src/lib/goal-promote.ts +0 -27
  274. package/src/lib/goals-client.ts +0 -69
  275. package/src/lib/goals.ts +0 -171
  276. package/src/lib/json.ts +0 -10
  277. package/src/lib/kitchen-api.ts +0 -19
  278. package/src/lib/marketplace.ts +0 -46
  279. package/src/lib/openclaw.ts +0 -59
  280. package/src/lib/paths.ts +0 -69
  281. package/src/lib/poll.ts +0 -18
  282. package/src/lib/recipe-clone.ts +0 -42
  283. package/src/lib/recipe-team-agents.ts +0 -30
  284. package/src/lib/recipes.ts +0 -95
  285. package/src/lib/scaffold-client.ts +0 -31
  286. package/src/lib/scaffold.ts +0 -37
  287. package/src/lib/slugify.ts +0 -25
  288. package/src/lib/swarms.ts +0 -25
  289. package/src/lib/tickets.ts +0 -192
  290. package/src/lib/type-guards.ts +0 -3
  291. package/src/lib/use-slugified-id.ts +0 -35
  292. package/src/lib/workflows/README.md +0 -11
  293. package/src/lib/workflows/__tests__/storage.test.ts +0 -129
  294. package/src/lib/workflows/__tests__/validate.test.ts +0 -92
  295. package/src/lib/workflows/api-handlers.ts +0 -35
  296. package/src/lib/workflows/readdir.ts +0 -23
  297. package/src/lib/workflows/runs-storage.ts +0 -59
  298. package/src/lib/workflows/runs-types.ts +0 -42
  299. package/src/lib/workflows/storage.ts +0 -70
  300. package/src/lib/workflows/templates/index.ts +0 -1
  301. package/src/lib/workflows/templates/marketing-cadence-v1.ts +0 -142
  302. package/src/lib/workflows/types.ts +0 -48
  303. package/src/lib/workflows/validate.ts +0 -92
  304. package/src/proxy.ts +0 -28
  305. /package/.next/static/{z86RoqzzXXrWnpi229zP6 → Jrrrm9HH5bKkSrQhe1j93}/_buildManifest.js +0 -0
  306. /package/.next/static/{z86RoqzzXXrWnpi229zP6 → Jrrrm9HH5bKkSrQhe1j93}/_clientMiddlewareManifest.json +0 -0
  307. /package/.next/static/{z86RoqzzXXrWnpi229zP6 → Jrrrm9HH5bKkSrQhe1j93}/_ssgManifest.js +0 -0
@@ -1,15 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { errorMessage } from "../errors";
3
-
4
- describe("errorMessage", () => {
5
- it("returns message for Error instances", () => {
6
- expect(errorMessage(new Error("foo"))).toBe("foo");
7
- });
8
-
9
- it("returns string for non-Error values", () => {
10
- expect(errorMessage("bar")).toBe("bar");
11
- expect(errorMessage(42)).toBe("42");
12
- expect(errorMessage(null)).toBe("null");
13
- expect(errorMessage(undefined)).toBe("undefined");
14
- });
15
- });
@@ -1,13 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { execFileAsync } from "../exec";
3
-
4
- describe("exec", () => {
5
- it("exports execFileAsync as a function", () => {
6
- expect(typeof execFileAsync).toBe("function");
7
- });
8
-
9
- it("invokes and returns stdout", async () => {
10
- const result = await execFileAsync("echo", ["hello"], { encoding: "utf8" });
11
- expect(result.stdout).toBe("hello\n");
12
- });
13
- });
@@ -1,118 +0,0 @@
1
- import { describe, expect, it, vi, beforeEach } from "vitest";
2
- import { fetchAll, fetchJson, fetchJsonWithStatus } from "../fetch-json";
3
-
4
- describe("fetchAll", () => {
5
- beforeEach(() => {
6
- vi.stubGlobal(
7
- "fetch",
8
- vi.fn((url: string) =>
9
- Promise.resolve({
10
- ok: true,
11
- text: () => Promise.resolve(`{"url":"${url}"}`),
12
- json: () => Promise.resolve({ url }),
13
- } as Response)
14
- )
15
- );
16
- });
17
-
18
- it("fetches multiple URLs in parallel with cache no-store", async () => {
19
- const responses = await fetchAll(["https://a.com", "https://b.com"]);
20
- expect(responses).toHaveLength(2);
21
- expect(fetch).toHaveBeenCalledTimes(2);
22
- expect(fetch).toHaveBeenCalledWith("https://a.com", { cache: "no-store" });
23
- expect(fetch).toHaveBeenCalledWith("https://b.com", { cache: "no-store" });
24
- });
25
- });
26
-
27
- describe("fetchJson", () => {
28
- beforeEach(() => {
29
- vi.stubGlobal(
30
- "fetch",
31
- vi.fn((url: string) => {
32
- if (url.includes("/ok")) {
33
- return Promise.resolve({
34
- ok: true,
35
- json: () => Promise.resolve({ data: "success" }),
36
- } as Response);
37
- }
38
- if (url.includes("/error")) {
39
- return Promise.resolve({
40
- ok: false,
41
- status: 400,
42
- json: () => Promise.resolve({ error: "Bad request" }),
43
- } as Response);
44
- }
45
- return Promise.resolve({
46
- ok: false,
47
- status: 500,
48
- json: () => Promise.resolve({}),
49
- } as Response);
50
- })
51
- );
52
- });
53
-
54
- it("returns parsed JSON on success", async () => {
55
- const result = await fetchJson<{ data: string }>("https://example.com/ok");
56
- expect(result).toEqual({ data: "success" });
57
- });
58
-
59
- it("throws with error message on !res.ok", async () => {
60
- await expect(fetchJson("https://example.com/error")).rejects.toThrow("Bad request");
61
- });
62
-
63
- it("throws generic message when error field missing", async () => {
64
- await expect(fetchJson("https://example.com/other")).rejects.toThrow("Request failed");
65
- });
66
- });
67
-
68
- describe("fetchJsonWithStatus", () => {
69
- beforeEach(() => {
70
- vi.stubGlobal(
71
- "fetch",
72
- vi.fn((url: string) => {
73
- if (url.includes("/ok")) {
74
- return Promise.resolve({
75
- ok: true,
76
- json: () => Promise.resolve({ data: "success" }),
77
- } as Response);
78
- }
79
- if (url.includes("/409")) {
80
- return Promise.resolve({
81
- ok: false,
82
- status: 409,
83
- json: () => Promise.resolve({ error: "Conflict" }),
84
- } as Response);
85
- }
86
- return Promise.resolve({
87
- ok: false,
88
- status: 500,
89
- json: () => Promise.resolve({}),
90
- } as Response);
91
- })
92
- );
93
- });
94
-
95
- it("returns { ok: true, data } on success", async () => {
96
- const result = await fetchJsonWithStatus<{ data: string }>("https://example.com/ok");
97
- expect(result.ok).toBe(true);
98
- if (result.ok) expect(result.data).toEqual({ data: "success" });
99
- });
100
-
101
- it("returns { ok: false, status, error } on HTTP error", async () => {
102
- const result = await fetchJsonWithStatus("https://example.com/409");
103
- expect(result.ok).toBe(false);
104
- if (!result.ok) {
105
- expect(result.status).toBe(409);
106
- expect(result.error).toBe("Conflict");
107
- }
108
- });
109
-
110
- it("returns generic error when error field missing", async () => {
111
- const result = await fetchJsonWithStatus("https://example.com/other");
112
- expect(result.ok).toBe(false);
113
- if (!result.ok) {
114
- expect(result.status).toBe(500);
115
- expect(result.error).toBe("Request failed");
116
- }
117
- });
118
- });
@@ -1,234 +0,0 @@
1
- import { describe, expect, it, vi, beforeEach } from "vitest";
2
- import { toolsInvoke, gatewayConfigGet, gatewayConfigPatch, getContentText } from "../gateway";
3
-
4
- vi.mock("@/lib/paths", () => ({
5
- readOpenClawConfig: vi.fn(),
6
- }));
7
-
8
- import { readOpenClawConfig } from "@/lib/paths";
9
-
10
- const mockFetch = vi.hoisted(() => vi.fn());
11
-
12
- describe("gateway", () => {
13
- beforeEach(() => {
14
- vi.stubGlobal("fetch", mockFetch);
15
- vi.mocked(readOpenClawConfig).mockReset();
16
- mockFetch.mockReset();
17
- vi.stubEnv("OPENCLAW_GATEWAY_HTTP_URL", "");
18
- vi.stubEnv("OPENCLAW_GATEWAY_URL", "");
19
- vi.stubEnv("OPENCLAW_GATEWAY_TOKEN", "");
20
- });
21
-
22
- describe("toolsInvoke", () => {
23
- it("returns result when ok", async () => {
24
- vi.mocked(readOpenClawConfig).mockResolvedValue({
25
- gateway: { port: 18789, auth: { token: "test-token" } },
26
- });
27
- mockFetch.mockResolvedValue({
28
- ok: true,
29
- json: async () => ({ ok: true, result: { foo: "bar" } }),
30
- });
31
-
32
- const r = await toolsInvoke({ tool: "test", action: "run" });
33
- expect(r).toEqual({ foo: "bar" });
34
- expect(mockFetch).toHaveBeenCalledWith(
35
- "http://127.0.0.1:18789/tools/invoke",
36
- expect.objectContaining({
37
- method: "POST",
38
- headers: expect.objectContaining({ authorization: "Bearer test-token" }),
39
- body: JSON.stringify({ tool: "test", action: "run" }),
40
- })
41
- );
42
- });
43
-
44
- it("throws when res.ok false", async () => {
45
- vi.mocked(readOpenClawConfig).mockResolvedValue({
46
- gateway: { auth: { token: "t" } },
47
- });
48
- mockFetch.mockResolvedValue({
49
- ok: false,
50
- status: 500,
51
- json: async () => ({ ok: false, error: "Server error" }),
52
- });
53
-
54
- await expect(toolsInvoke({ tool: "x" })).rejects.toThrow("Server error");
55
- });
56
-
57
- it("throws when json.ok false", async () => {
58
- vi.mocked(readOpenClawConfig).mockResolvedValue({
59
- gateway: { auth: { token: "t" } },
60
- });
61
- mockFetch.mockResolvedValue({
62
- ok: true,
63
- json: async () => ({ ok: false, error: { message: "Tool failed" } }),
64
- });
65
-
66
- await expect(toolsInvoke({ tool: "x" })).rejects.toThrow("Tool failed");
67
- });
68
-
69
- it("throws when token missing", async () => {
70
- vi.mocked(readOpenClawConfig).mockResolvedValue({});
71
-
72
- await expect(toolsInvoke({ tool: "x" })).rejects.toThrow("Missing gateway token");
73
- });
74
-
75
- it("uses config token when env and config both set", async () => {
76
- vi.stubEnv("OPENCLAW_GATEWAY_TOKEN", "env-token");
77
- vi.mocked(readOpenClawConfig).mockResolvedValue({
78
- gateway: { auth: { token: "config-token" } },
79
- });
80
- mockFetch.mockResolvedValue({
81
- ok: true,
82
- json: async () => ({ ok: true, result: {} }),
83
- });
84
-
85
- await toolsInvoke({ tool: "x" });
86
- expect(mockFetch).toHaveBeenCalledWith(
87
- expect.any(String),
88
- expect.objectContaining({
89
- headers: expect.objectContaining({ authorization: "Bearer config-token" }),
90
- })
91
- );
92
- });
93
- });
94
-
95
- describe("getContentText", () => {
96
- it("returns text from content item with type text", () => {
97
- expect(getContentText([{ type: "text", text: "hello" }])).toBe("hello");
98
- });
99
- it("returns undefined when no text item", () => {
100
- expect(getContentText([{ type: "other" }])).toBeUndefined();
101
- expect(getContentText([])).toBeUndefined();
102
- expect(getContentText(undefined)).toBeUndefined();
103
- });
104
- });
105
-
106
- describe("gatewayConfigGet", () => {
107
- it("returns raw and hash from tool result", async () => {
108
- vi.mocked(readOpenClawConfig).mockResolvedValue({
109
- gateway: { auth: { token: "t" } },
110
- });
111
- const payload = {
112
- content: [
113
- {
114
- type: "text",
115
- text: JSON.stringify({
116
- ok: true,
117
- result: { raw: '{"key":"val"}', hash: "abc123" },
118
- }),
119
- },
120
- ],
121
- };
122
- mockFetch.mockResolvedValue({
123
- ok: true,
124
- json: async () => ({ ok: true, result: payload }),
125
- });
126
-
127
- const r = await gatewayConfigGet();
128
- expect(r).toEqual({ raw: '{"key":"val"}', hash: "abc123" });
129
- });
130
-
131
- it("throws when text payload missing", async () => {
132
- vi.mocked(readOpenClawConfig).mockResolvedValue({
133
- gateway: { auth: { token: "t" } },
134
- });
135
- mockFetch.mockResolvedValue({
136
- ok: true,
137
- json: async () => ({
138
- ok: true,
139
- result: { content: [{ type: "other" }] },
140
- }),
141
- });
142
-
143
- await expect(gatewayConfigGet()).rejects.toThrow("gateway config.get: missing text payload");
144
- });
145
-
146
- it("throws when result.raw missing", async () => {
147
- vi.mocked(readOpenClawConfig).mockResolvedValue({
148
- gateway: { auth: { token: "t" } },
149
- });
150
- mockFetch.mockResolvedValue({
151
- ok: true,
152
- json: async () => ({
153
- ok: true,
154
- result: {
155
- content: [
156
- {
157
- type: "text",
158
- text: JSON.stringify({ ok: true, result: { hash: "x" } }),
159
- },
160
- ],
161
- },
162
- }),
163
- });
164
-
165
- await expect(gatewayConfigGet()).rejects.toThrow("gateway config.get: missing result.raw");
166
- });
167
-
168
- it("throws when result.hash missing", async () => {
169
- vi.mocked(readOpenClawConfig).mockResolvedValue({
170
- gateway: { auth: { token: "t" } },
171
- });
172
- mockFetch.mockResolvedValue({
173
- ok: true,
174
- json: async () => ({
175
- ok: true,
176
- result: {
177
- content: [
178
- {
179
- type: "text",
180
- text: JSON.stringify({ ok: true, result: { raw: "{}" } }),
181
- },
182
- ],
183
- },
184
- }),
185
- });
186
-
187
- await expect(gatewayConfigGet()).rejects.toThrow("gateway config.get: missing result.hash");
188
- });
189
- });
190
-
191
- describe("gatewayConfigPatch", () => {
192
- it("calls toolsInvoke with patch and baseHash", async () => {
193
- vi.mocked(readOpenClawConfig).mockResolvedValue({
194
- gateway: { auth: { token: "t" } },
195
- });
196
- let callCount = 0;
197
- mockFetch.mockImplementation(async () => {
198
- callCount++;
199
- if (callCount === 1) {
200
- return {
201
- ok: true,
202
- json: async () => ({
203
- ok: true,
204
- result: {
205
- content: [
206
- {
207
- type: "text",
208
- text: JSON.stringify({
209
- ok: true,
210
- result: { raw: "{}", hash: "h1" },
211
- }),
212
- },
213
- ],
214
- },
215
- }),
216
- };
217
- }
218
- return {
219
- ok: true,
220
- json: async () => ({ ok: true, result: {} }),
221
- };
222
- });
223
-
224
- await gatewayConfigPatch({ newKey: "val" }, "Custom note");
225
-
226
- expect(mockFetch).toHaveBeenCalledTimes(2);
227
- const patchCall = mockFetch.mock.calls[1];
228
- const body = JSON.parse(patchCall[1].body as string);
229
- expect(body.args?.action).toBe("config.patch");
230
- expect(body.args?.baseHash).toBe("h1");
231
- expect(body.args?.note).toBe("Custom note");
232
- });
233
- });
234
- });
@@ -1,39 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { slugifyFilePart, ensureWorkflowInstructions } from "../goal-promote";
3
-
4
- describe("goal-promote", () => {
5
- describe("slugifyFilePart", () => {
6
- it("lowercases and hyphenates", () => {
7
- expect(slugifyFilePart("My Goal Title")).toBe("my-goal-title");
8
- });
9
-
10
- it("strips leading and trailing hyphens", () => {
11
- expect(slugifyFilePart(" --foo-- ")).toBe("foo");
12
- });
13
-
14
- it("truncates to 80 chars", () => {
15
- const long = "a".repeat(100);
16
- expect(slugifyFilePart(long).length).toBe(80);
17
- });
18
-
19
- it("handles empty input", () => {
20
- expect(slugifyFilePart("")).toBe("");
21
- });
22
- });
23
-
24
- describe("ensureWorkflowInstructions", () => {
25
- it("returns body unchanged when marker present", () => {
26
- const body = "Content\n<!-- goal-workflow -->\nMore";
27
- expect(ensureWorkflowInstructions(body)).toBe(body);
28
- });
29
-
30
- it("appends workflow snippet when marker missing", () => {
31
- const body = "## Existing";
32
- const result = ensureWorkflowInstructions(body);
33
- expect(result).toContain("## Existing");
34
- expect(result).toContain("## Workflow");
35
- expect(result).toContain("<!-- goal-workflow -->");
36
- expect(result).toContain("Promote to inbox");
37
- });
38
- });
39
- });
@@ -1,26 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { parseCommaList } from "../goals-client";
3
-
4
- describe("goals-client", () => {
5
- describe("parseCommaList", () => {
6
- it("parses comma-separated string into trimmed array", () => {
7
- expect(parseCommaList("a, b, c")).toEqual(["a", "b", "c"]);
8
- });
9
-
10
- it("filters empty strings", () => {
11
- expect(parseCommaList("a,,b, ,c")).toEqual(["a", "b", "c"]);
12
- });
13
-
14
- it("returns empty array for empty string", () => {
15
- expect(parseCommaList("")).toEqual([]);
16
- });
17
-
18
- it("trims whitespace", () => {
19
- expect(parseCommaList(" x , y ")).toEqual(["x", "y"]);
20
- });
21
-
22
- it("handles single item", () => {
23
- expect(parseCommaList("only")).toEqual(["only"]);
24
- });
25
- });
26
- });