@stigmer/react 0.0.92 → 0.0.94

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 (328) hide show
  1. package/README.md +57 -12
  2. package/agent/AgentDetailView.js +7 -7
  3. package/agent/AgentDetailView.js.map +1 -1
  4. package/agent/AgentPicker.js +3 -3
  5. package/agent/AgentPicker.js.map +1 -1
  6. package/api-key/ApiKeyCreatedAlert.js +1 -1
  7. package/api-key/ApiKeyCreatedAlert.js.map +1 -1
  8. package/api-key/ApiKeyListPanel.js +4 -4
  9. package/api-key/ApiKeyListPanel.js.map +1 -1
  10. package/api-key/CreateApiKeyForm.js +1 -1
  11. package/api-key/CreateApiKeyForm.js.map +1 -1
  12. package/attachment/AttachmentChipList.js +2 -2
  13. package/attachment/AttachmentChipList.js.map +1 -1
  14. package/color-mode.d.ts +48 -0
  15. package/color-mode.d.ts.map +1 -0
  16. package/color-mode.js +53 -0
  17. package/color-mode.js.map +1 -0
  18. package/composer/ComposerToolbar.d.ts +6 -2
  19. package/composer/ComposerToolbar.d.ts.map +1 -1
  20. package/composer/ComposerToolbar.js +5 -3
  21. package/composer/ComposerToolbar.js.map +1 -1
  22. package/composer/ConfigureMenu.js +3 -3
  23. package/composer/ConfigureMenu.js.map +1 -1
  24. package/composer/ContextChip.js +1 -1
  25. package/composer/ContextChip.js.map +1 -1
  26. package/composer/ContextPopover.js +1 -1
  27. package/composer/ContextPopover.js.map +1 -1
  28. package/composer/SessionComposer.d.ts +24 -3
  29. package/composer/SessionComposer.d.ts.map +1 -1
  30. package/composer/SessionComposer.js +5 -4
  31. package/composer/SessionComposer.js.map +1 -1
  32. package/environment/CreateEnvironmentForm.js +1 -1
  33. package/environment/CreateEnvironmentForm.js.map +1 -1
  34. package/environment/EnvVarForm.js +2 -2
  35. package/environment/EnvVarForm.js.map +1 -1
  36. package/environment/EnvironmentListPanel.js +2 -2
  37. package/environment/EnvironmentListPanel.js.map +1 -1
  38. package/environment/EnvironmentVariableEditor.js +6 -6
  39. package/environment/EnvironmentVariableEditor.js.map +1 -1
  40. package/error/ErrorMessage.js +1 -1
  41. package/error/ErrorMessage.js.map +1 -1
  42. package/execution/ApprovalCard.js +4 -4
  43. package/execution/ApprovalCard.js.map +1 -1
  44. package/execution/ArtifactCard.js +1 -1
  45. package/execution/ArtifactCard.js.map +1 -1
  46. package/execution/ArtifactPreviewModal.js +4 -4
  47. package/execution/ArtifactPreviewModal.js.map +1 -1
  48. package/execution/FollowUpInput.js +1 -1
  49. package/execution/FollowUpInput.js.map +1 -1
  50. package/execution/McpToolDetail.js +4 -4
  51. package/execution/McpToolDetail.js.map +1 -1
  52. package/execution/MessageEntry.js +1 -1
  53. package/execution/MessageEntry.js.map +1 -1
  54. package/execution/MessageThread.js +1 -1
  55. package/execution/MessageThread.js.map +1 -1
  56. package/execution/SessionVariablesInput.js +4 -4
  57. package/execution/SessionVariablesInput.js.map +1 -1
  58. package/execution/SubAgentSection.js +2 -2
  59. package/execution/SubAgentSection.js.map +1 -1
  60. package/execution/ToolCallDetail.js +2 -2
  61. package/execution/ToolCallDetail.js.map +1 -1
  62. package/execution/ToolCallGroup.js +1 -1
  63. package/execution/ToolCallGroup.js.map +1 -1
  64. package/execution/ToolCallItem.js +2 -2
  65. package/execution/ToolCallItem.js.map +1 -1
  66. package/execution/WriteBackCard.js +3 -3
  67. package/execution/WriteBackCard.js.map +1 -1
  68. package/execution/tool-rendering-primitives.js +3 -3
  69. package/execution/tool-rendering-primitives.js.map +1 -1
  70. package/github/GitHubRepoPicker.js +5 -5
  71. package/github/GitHubRepoPicker.js.map +1 -1
  72. package/iam-policy/GrantAccessForm.js +1 -1
  73. package/iam-policy/GrantAccessForm.js.map +1 -1
  74. package/iam-policy/OrgMembersPanel.js +5 -5
  75. package/iam-policy/OrgMembersPanel.js.map +1 -1
  76. package/identity-provider/CreateIdentityProviderForm.js +3 -3
  77. package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
  78. package/identity-provider/IdentityProviderDetailPanel.js +5 -5
  79. package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
  80. package/identity-provider/IdentityProviderListPanel.js +3 -3
  81. package/identity-provider/IdentityProviderListPanel.js.map +1 -1
  82. package/identity-provider/IdentityProviderWizard.js +7 -7
  83. package/identity-provider/IdentityProviderWizard.js.map +1 -1
  84. package/identity-provider/ProviderPicker.js +2 -2
  85. package/identity-provider/ProviderPicker.js.map +1 -1
  86. package/index.d.ts +8 -4
  87. package/index.d.ts.map +1 -1
  88. package/index.js +7 -3
  89. package/index.js.map +1 -1
  90. package/internal/CloudFeatureNotice.js +1 -1
  91. package/internal/CloudFeatureNotice.js.map +1 -1
  92. package/internal/Tabs.js +1 -1
  93. package/internal/Tabs.js.map +1 -1
  94. package/internal/markdown-components.js +2 -2
  95. package/internal/markdown-components.js.map +1 -1
  96. package/invitation/InvitationCreatedAlert.js +1 -1
  97. package/invitation/InvitationCreatedAlert.js.map +1 -1
  98. package/invitation/InvitationManager.js +5 -5
  99. package/invitation/InvitationManager.js.map +1 -1
  100. package/invitation/InvitationRedemption.js +4 -4
  101. package/invitation/InvitationRedemption.js.map +1 -1
  102. package/library/ResourceCountCard.js +1 -1
  103. package/library/ResourceCountCard.js.map +1 -1
  104. package/library/ResourceListView.js +5 -5
  105. package/library/ResourceListView.js.map +1 -1
  106. package/mcp-server/McpServerConfigPanel.js +5 -5
  107. package/mcp-server/McpServerConfigPanel.js.map +1 -1
  108. package/mcp-server/McpServerConnectDialog.js +4 -4
  109. package/mcp-server/McpServerConnectDialog.js.map +1 -1
  110. package/mcp-server/McpServerDetailView.js +14 -14
  111. package/mcp-server/McpServerDetailView.js.map +1 -1
  112. package/mcp-server/McpServerPicker.js +4 -4
  113. package/mcp-server/McpServerPicker.js.map +1 -1
  114. package/mcp-server/McpToolSelector.js +3 -3
  115. package/mcp-server/McpToolSelector.js.map +1 -1
  116. package/mcp-server/OAuthAppForm.js +1 -1
  117. package/mcp-server/OAuthAppForm.js.map +1 -1
  118. package/models/ModelSelector.js +1 -1
  119. package/models/ModelSelector.js.map +1 -1
  120. package/oauth-app/CreateOAuthAppForm.js +1 -1
  121. package/oauth-app/CreateOAuthAppForm.js.map +1 -1
  122. package/oauth-app/OAuthAppDetailPanel.js +3 -3
  123. package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
  124. package/oauth-app/OAuthAppListPanel.js +2 -2
  125. package/oauth-app/OAuthAppListPanel.js.map +1 -1
  126. package/organization/CreateOrganizationForm.js +1 -1
  127. package/organization/CreateOrganizationForm.js.map +1 -1
  128. package/organization/OrgProfilePanel.js +3 -3
  129. package/organization/OrgProfilePanel.js.map +1 -1
  130. package/package.json +4 -4
  131. package/platform-client/CreatePlatformClientForm.js +2 -2
  132. package/platform-client/CreatePlatformClientForm.js.map +1 -1
  133. package/platform-client/PlatformClientDetailPanel.js +4 -4
  134. package/platform-client/PlatformClientDetailPanel.js.map +1 -1
  135. package/platform-client/PlatformClientListPanel.js +3 -3
  136. package/platform-client/PlatformClientListPanel.js.map +1 -1
  137. package/platform-client/PlatformClientSecretAlert.js +2 -2
  138. package/platform-client/PlatformClientSecretAlert.js.map +1 -1
  139. package/provider.d.ts +39 -2
  140. package/provider.d.ts.map +1 -1
  141. package/provider.js +11 -3
  142. package/provider.js.map +1 -1
  143. package/runner/RunnerListPanel.d.ts +65 -0
  144. package/runner/RunnerListPanel.d.ts.map +1 -0
  145. package/runner/RunnerListPanel.js +237 -0
  146. package/runner/RunnerListPanel.js.map +1 -0
  147. package/runner/RunnerPicker.d.ts +54 -0
  148. package/runner/RunnerPicker.d.ts.map +1 -0
  149. package/runner/RunnerPicker.js +133 -0
  150. package/runner/RunnerPicker.js.map +1 -0
  151. package/runner/__tests__/useDeleteRunner.test.d.ts +2 -0
  152. package/runner/__tests__/useDeleteRunner.test.d.ts.map +1 -0
  153. package/runner/__tests__/useDeleteRunner.test.js +108 -0
  154. package/runner/__tests__/useDeleteRunner.test.js.map +1 -0
  155. package/runner/__tests__/useLaunchLocalRunner.test.d.ts +2 -0
  156. package/runner/__tests__/useLaunchLocalRunner.test.d.ts.map +1 -0
  157. package/runner/__tests__/useLaunchLocalRunner.test.js +143 -0
  158. package/runner/__tests__/useLaunchLocalRunner.test.js.map +1 -0
  159. package/runner/__tests__/useStopRunner.test.d.ts +2 -0
  160. package/runner/__tests__/useStopRunner.test.d.ts.map +1 -0
  161. package/runner/__tests__/useStopRunner.test.js +114 -0
  162. package/runner/__tests__/useStopRunner.test.js.map +1 -0
  163. package/runner/index.d.ts +14 -0
  164. package/runner/index.d.ts.map +1 -0
  165. package/runner/index.js +8 -0
  166. package/runner/index.js.map +1 -0
  167. package/runner/phase.d.ts +30 -0
  168. package/runner/phase.d.ts.map +1 -0
  169. package/runner/phase.js +58 -0
  170. package/runner/phase.js.map +1 -0
  171. package/runner/useDeleteRunner.d.ts +36 -0
  172. package/runner/useDeleteRunner.d.ts.map +1 -0
  173. package/runner/useDeleteRunner.js +42 -0
  174. package/runner/useDeleteRunner.js.map +1 -0
  175. package/runner/useLaunchLocalRunner.d.ts +84 -0
  176. package/runner/useLaunchLocalRunner.d.ts.map +1 -0
  177. package/runner/useLaunchLocalRunner.js +75 -0
  178. package/runner/useLaunchLocalRunner.js.map +1 -0
  179. package/runner/useRunnerList.d.ts +49 -0
  180. package/runner/useRunnerList.d.ts.map +1 -0
  181. package/runner/useRunnerList.js +70 -0
  182. package/runner/useRunnerList.js.map +1 -0
  183. package/runner/useStopRunner.d.ts +53 -0
  184. package/runner/useStopRunner.d.ts.map +1 -0
  185. package/runner/useStopRunner.js +50 -0
  186. package/runner/useStopRunner.js.map +1 -0
  187. package/session/draft.d.ts +53 -0
  188. package/session/draft.d.ts.map +1 -0
  189. package/session/draft.js +45 -0
  190. package/session/draft.js.map +1 -0
  191. package/session/index.d.ts +10 -0
  192. package/session/index.d.ts.map +1 -1
  193. package/session/index.js +5 -0
  194. package/session/index.js.map +1 -1
  195. package/session/useCreateSession.d.ts +8 -0
  196. package/session/useCreateSession.d.ts.map +1 -1
  197. package/session/useCreateSession.js +1 -0
  198. package/session/useCreateSession.js.map +1 -1
  199. package/session/useEditSessionPrep.d.ts +26 -0
  200. package/session/useEditSessionPrep.d.ts.map +1 -0
  201. package/session/useEditSessionPrep.js +83 -0
  202. package/session/useEditSessionPrep.js.map +1 -0
  203. package/session/useNewSessionFlow.d.ts +110 -0
  204. package/session/useNewSessionFlow.d.ts.map +1 -0
  205. package/session/useNewSessionFlow.js +184 -0
  206. package/session/useNewSessionFlow.js.map +1 -0
  207. package/session/usePersistedModel.d.ts +18 -0
  208. package/session/usePersistedModel.d.ts.map +1 -0
  209. package/session/usePersistedModel.js +31 -0
  210. package/session/usePersistedModel.js.map +1 -0
  211. package/session/useSessionPageFlow.d.ts +104 -0
  212. package/session/useSessionPageFlow.d.ts.map +1 -0
  213. package/session/useSessionPageFlow.js +172 -0
  214. package/session/useSessionPageFlow.js.map +1 -0
  215. package/skill/SkillDetailView.js +3 -3
  216. package/skill/SkillDetailView.js.map +1 -1
  217. package/skill/SkillPicker.js +3 -3
  218. package/skill/SkillPicker.js.map +1 -1
  219. package/src/agent/AgentDetailView.tsx +8 -8
  220. package/src/agent/AgentPicker.tsx +3 -3
  221. package/src/api-key/ApiKeyCreatedAlert.tsx +2 -2
  222. package/src/api-key/ApiKeyListPanel.tsx +6 -6
  223. package/src/api-key/CreateApiKeyForm.tsx +2 -2
  224. package/src/attachment/AttachmentChipList.tsx +3 -3
  225. package/src/color-mode.ts +75 -0
  226. package/src/composer/ComposerToolbar.tsx +29 -7
  227. package/src/composer/ConfigureMenu.tsx +6 -6
  228. package/src/composer/ContextChip.tsx +1 -1
  229. package/src/composer/ContextPopover.tsx +2 -2
  230. package/src/composer/SessionComposer.tsx +34 -5
  231. package/src/environment/CreateEnvironmentForm.tsx +3 -3
  232. package/src/environment/EnvVarForm.tsx +6 -6
  233. package/src/environment/EnvironmentListPanel.tsx +3 -3
  234. package/src/environment/EnvironmentVariableEditor.tsx +7 -7
  235. package/src/error/ErrorMessage.tsx +5 -5
  236. package/src/execution/ApprovalCard.tsx +5 -5
  237. package/src/execution/ArtifactCard.tsx +2 -2
  238. package/src/execution/ArtifactPreviewModal.tsx +4 -4
  239. package/src/execution/FollowUpInput.tsx +2 -2
  240. package/src/execution/McpToolDetail.tsx +4 -4
  241. package/src/execution/MessageEntry.tsx +1 -1
  242. package/src/execution/MessageThread.tsx +1 -1
  243. package/src/execution/SessionVariablesInput.tsx +7 -7
  244. package/src/execution/SubAgentSection.tsx +5 -5
  245. package/src/execution/ToolCallDetail.tsx +2 -2
  246. package/src/execution/ToolCallGroup.tsx +3 -3
  247. package/src/execution/ToolCallItem.tsx +4 -4
  248. package/src/execution/WriteBackCard.tsx +5 -5
  249. package/src/execution/tool-rendering-primitives.tsx +5 -5
  250. package/src/github/GitHubRepoPicker.tsx +5 -5
  251. package/src/iam-policy/GrantAccessForm.tsx +2 -2
  252. package/src/iam-policy/OrgMembersPanel.tsx +11 -11
  253. package/src/identity-provider/CreateIdentityProviderForm.tsx +4 -4
  254. package/src/identity-provider/IdentityProviderDetailPanel.tsx +7 -7
  255. package/src/identity-provider/IdentityProviderListPanel.tsx +7 -7
  256. package/src/identity-provider/IdentityProviderWizard.tsx +8 -8
  257. package/src/identity-provider/ProviderPicker.tsx +2 -2
  258. package/src/index.ts +46 -7
  259. package/src/internal/CloudFeatureNotice.tsx +1 -1
  260. package/src/internal/Tabs.tsx +1 -1
  261. package/src/internal/markdown-components.tsx +2 -2
  262. package/src/invitation/InvitationCreatedAlert.tsx +2 -2
  263. package/src/invitation/InvitationManager.tsx +9 -9
  264. package/src/invitation/InvitationRedemption.tsx +11 -11
  265. package/src/library/ResourceCountCard.tsx +1 -1
  266. package/src/library/ResourceListView.tsx +7 -7
  267. package/src/mcp-server/McpServerConfigPanel.tsx +7 -7
  268. package/src/mcp-server/McpServerConnectDialog.tsx +5 -5
  269. package/src/mcp-server/McpServerDetailView.tsx +19 -19
  270. package/src/mcp-server/McpServerPicker.tsx +6 -6
  271. package/src/mcp-server/McpToolSelector.tsx +4 -4
  272. package/src/mcp-server/OAuthAppForm.tsx +3 -3
  273. package/src/models/ModelSelector.tsx +1 -1
  274. package/src/oauth-app/CreateOAuthAppForm.tsx +3 -3
  275. package/src/oauth-app/OAuthAppDetailPanel.tsx +7 -7
  276. package/src/oauth-app/OAuthAppListPanel.tsx +3 -3
  277. package/src/organization/CreateOrganizationForm.tsx +3 -3
  278. package/src/organization/OrgProfilePanel.tsx +4 -5
  279. package/src/platform-client/CreatePlatformClientForm.tsx +6 -6
  280. package/src/platform-client/PlatformClientDetailPanel.tsx +19 -19
  281. package/src/platform-client/PlatformClientListPanel.tsx +7 -7
  282. package/src/platform-client/PlatformClientSecretAlert.tsx +2 -2
  283. package/src/provider.tsx +52 -2
  284. package/src/runner/RunnerListPanel.tsx +725 -0
  285. package/src/runner/RunnerPicker.tsx +319 -0
  286. package/src/runner/__tests__/useDeleteRunner.test.tsx +150 -0
  287. package/src/runner/__tests__/useLaunchLocalRunner.test.tsx +223 -0
  288. package/src/runner/__tests__/useStopRunner.test.tsx +154 -0
  289. package/src/runner/index.ts +34 -0
  290. package/src/runner/phase.ts +62 -0
  291. package/src/runner/useDeleteRunner.ts +67 -0
  292. package/src/runner/useLaunchLocalRunner.ts +139 -0
  293. package/src/runner/useRunnerList.ts +114 -0
  294. package/src/runner/useStopRunner.ts +92 -0
  295. package/src/session/draft.ts +82 -0
  296. package/src/session/index.ts +28 -0
  297. package/src/session/useCreateSession.ts +9 -0
  298. package/src/session/useEditSessionPrep.ts +111 -0
  299. package/src/session/useNewSessionFlow.ts +283 -0
  300. package/src/session/usePersistedModel.ts +41 -0
  301. package/src/session/useSessionPageFlow.ts +280 -0
  302. package/src/skill/SkillDetailView.tsx +5 -5
  303. package/src/skill/SkillPicker.tsx +3 -3
  304. package/src/styles.css +25 -1
  305. package/src/usage/OrgUsagePanel.tsx +4 -4
  306. package/src/workspace/WorkspaceEditor.tsx +78 -66
  307. package/src/workspace/index.ts +0 -8
  308. package/styles.css +1 -1
  309. package/usage/OrgUsagePanel.js +2 -2
  310. package/usage/OrgUsagePanel.js.map +1 -1
  311. package/workspace/WorkspaceEditor.d.ts +28 -3
  312. package/workspace/WorkspaceEditor.d.ts.map +1 -1
  313. package/workspace/WorkspaceEditor.js +24 -25
  314. package/workspace/WorkspaceEditor.js.map +1 -1
  315. package/workspace/index.d.ts +0 -4
  316. package/workspace/index.d.ts.map +1 -1
  317. package/workspace/index.js +0 -2
  318. package/workspace/index.js.map +1 -1
  319. package/src/workspace/FolderBrowser.tsx +0 -579
  320. package/src/workspace/useFolderListing.ts +0 -164
  321. package/workspace/FolderBrowser.d.ts +0 -37
  322. package/workspace/FolderBrowser.d.ts.map +0 -1
  323. package/workspace/FolderBrowser.js +0 -188
  324. package/workspace/FolderBrowser.js.map +0 -1
  325. package/workspace/useFolderListing.d.ts +0 -73
  326. package/workspace/useFolderListing.d.ts.map +0 -1
  327. package/workspace/useFolderListing.js +0 -110
  328. package/workspace/useFolderListing.js.map +0 -1
@@ -0,0 +1,143 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { describe, it, expect, vi, beforeEach } from "vitest";
3
+ import { renderHook, act } from "@testing-library/react";
4
+ import { create } from "@bufbuild/protobuf";
5
+ import { timestampFromDate } from "@bufbuild/protobuf/wkt";
6
+ import { CreateLaunchTokenResponseSchema } from "@stigmer/protos/ai/stigmer/agentic/runner/v1/io_pb";
7
+ import { StigmerContext } from "../../context";
8
+ import { useLaunchLocalRunner } from "../useLaunchLocalRunner";
9
+ function buildMockClient(overrides = {}) {
10
+ return {
11
+ runner: {
12
+ createLaunchToken: overrides.createLaunchToken ?? vi.fn(),
13
+ },
14
+ };
15
+ }
16
+ function makeWrapper(client) {
17
+ return ({ children }) => (_jsx(StigmerContext.Provider, { value: client, children: children }));
18
+ }
19
+ describe("useLaunchLocalRunner", () => {
20
+ const ORG = "test-org";
21
+ let createLaunchToken;
22
+ let client;
23
+ beforeEach(() => {
24
+ createLaunchToken = vi.fn();
25
+ client = buildMockClient({ createLaunchToken });
26
+ });
27
+ it("creates a token and opens the stigmer:// URL on success", async () => {
28
+ const response = create(CreateLaunchTokenResponseSchema, {
29
+ token: "tok_abc123",
30
+ expiresAt: timestampFromDate(new Date()),
31
+ });
32
+ createLaunchToken.mockResolvedValueOnce(response);
33
+ const openUrl = vi.fn();
34
+ const { result } = renderHook(() => useLaunchLocalRunner({ openUrl }), { wrapper: makeWrapper(client) });
35
+ expect(result.current.isLaunching).toBe(false);
36
+ expect(result.current.error).toBeNull();
37
+ let launchResult;
38
+ await act(async () => {
39
+ launchResult = await result.current.launch({ org: ORG });
40
+ });
41
+ expect(createLaunchToken).toHaveBeenCalledOnce();
42
+ expect(openUrl).toHaveBeenCalledOnce();
43
+ expect(openUrl).toHaveBeenCalledWith(`stigmer://launch-runner?token=${encodeURIComponent("tok_abc123")}`);
44
+ expect(launchResult.url).toBe(`stigmer://launch-runner?token=${encodeURIComponent("tok_abc123")}`);
45
+ expect(launchResult.expiresAt).toBeInstanceOf(Date);
46
+ expect(result.current.isLaunching).toBe(false);
47
+ expect(result.current.error).toBeNull();
48
+ });
49
+ it("URL-encodes tokens with special characters", async () => {
50
+ const response = create(CreateLaunchTokenResponseSchema, {
51
+ token: "tok/with+special=chars&more",
52
+ });
53
+ createLaunchToken.mockResolvedValueOnce(response);
54
+ const openUrl = vi.fn();
55
+ const { result } = renderHook(() => useLaunchLocalRunner({ openUrl }), { wrapper: makeWrapper(client) });
56
+ await act(async () => {
57
+ await result.current.launch({ org: ORG });
58
+ });
59
+ const url = openUrl.mock.calls[0][0];
60
+ expect(url).toContain(encodeURIComponent("tok/with+special=chars&more"));
61
+ expect(url).not.toContain("&more");
62
+ });
63
+ it("uses the custom openUrl callback", async () => {
64
+ const response = create(CreateLaunchTokenResponseSchema, {
65
+ token: "tok_custom",
66
+ });
67
+ createLaunchToken.mockResolvedValueOnce(response);
68
+ const customOpen = vi.fn();
69
+ const { result } = renderHook(() => useLaunchLocalRunner({ openUrl: customOpen }), { wrapper: makeWrapper(client) });
70
+ await act(async () => {
71
+ await result.current.launch({ org: ORG });
72
+ });
73
+ expect(customOpen).toHaveBeenCalledOnce();
74
+ expect(customOpen.mock.calls[0][0]).toMatch(/^stigmer:\/\//);
75
+ });
76
+ it("returns undefined expiresAt when the server omits it", async () => {
77
+ const response = create(CreateLaunchTokenResponseSchema, {
78
+ token: "tok_no_expiry",
79
+ });
80
+ createLaunchToken.mockResolvedValueOnce(response);
81
+ const openUrl = vi.fn();
82
+ const { result } = renderHook(() => useLaunchLocalRunner({ openUrl }), { wrapper: makeWrapper(client) });
83
+ let launchResult;
84
+ await act(async () => {
85
+ launchResult = await result.current.launch({ org: ORG });
86
+ });
87
+ expect(launchResult.expiresAt).toBeUndefined();
88
+ });
89
+ it("sets error and rethrows when createLaunchToken fails", async () => {
90
+ const rpcError = new Error("token creation failed");
91
+ createLaunchToken.mockRejectedValueOnce(rpcError);
92
+ const openUrl = vi.fn();
93
+ const { result } = renderHook(() => useLaunchLocalRunner({ openUrl }), { wrapper: makeWrapper(client) });
94
+ await act(async () => {
95
+ await expect(result.current.launch({ org: ORG })).rejects.toThrow("token creation failed");
96
+ });
97
+ expect(result.current.error).toBeInstanceOf(Error);
98
+ expect(result.current.error.message).toBe("token creation failed");
99
+ expect(result.current.isLaunching).toBe(false);
100
+ expect(openUrl).not.toHaveBeenCalled();
101
+ });
102
+ it("handles non-Error rejection values", async () => {
103
+ createLaunchToken.mockRejectedValueOnce("string error");
104
+ const openUrl = vi.fn();
105
+ const { result } = renderHook(() => useLaunchLocalRunner({ openUrl }), { wrapper: makeWrapper(client) });
106
+ await act(async () => {
107
+ await expect(result.current.launch({ org: ORG })).rejects.toBe("string error");
108
+ });
109
+ expect(result.current.error).toBeInstanceOf(Error);
110
+ expect(result.current.error.message).toBe("string error");
111
+ });
112
+ it("clears error via clearError", async () => {
113
+ createLaunchToken.mockRejectedValueOnce(new Error("fail"));
114
+ const openUrl = vi.fn();
115
+ const { result } = renderHook(() => useLaunchLocalRunner({ openUrl }), { wrapper: makeWrapper(client) });
116
+ await act(async () => {
117
+ await result.current.launch({ org: ORG }).catch(() => { });
118
+ });
119
+ expect(result.current.error).not.toBeNull();
120
+ act(() => {
121
+ result.current.clearError();
122
+ });
123
+ expect(result.current.error).toBeNull();
124
+ });
125
+ it("resets previous error on a new successful launch", async () => {
126
+ createLaunchToken.mockRejectedValueOnce(new Error("first fail"));
127
+ const openUrl = vi.fn();
128
+ const { result } = renderHook(() => useLaunchLocalRunner({ openUrl }), { wrapper: makeWrapper(client) });
129
+ await act(async () => {
130
+ await result.current.launch({ org: ORG }).catch(() => { });
131
+ });
132
+ expect(result.current.error).not.toBeNull();
133
+ const response = create(CreateLaunchTokenResponseSchema, {
134
+ token: "tok_retry",
135
+ });
136
+ createLaunchToken.mockResolvedValueOnce(response);
137
+ await act(async () => {
138
+ await result.current.launch({ org: ORG });
139
+ });
140
+ expect(result.current.error).toBeNull();
141
+ });
142
+ });
143
+ //# sourceMappingURL=useLaunchLocalRunner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLaunchLocalRunner.test.js","sourceRoot":"","sources":["../../../src/runner/__tests__/useLaunchLocalRunner.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useStopRunner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStopRunner.test.d.ts","sourceRoot":"","sources":["../../../src/runner/__tests__/useStopRunner.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,114 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { describe, it, expect, vi, beforeEach } from "vitest";
3
+ import { renderHook, act } from "@testing-library/react";
4
+ import { create } from "@bufbuild/protobuf";
5
+ import { RunnerSchema, RunnerStatusSchema, } from "@stigmer/protos/ai/stigmer/agentic/runner/v1/api_pb";
6
+ import { RunnerPhase } from "@stigmer/protos/ai/stigmer/agentic/runner/v1/enum_pb";
7
+ import { ApiResourceMetadataSchema } from "@stigmer/protos/ai/stigmer/commons/apiresource/metadata_pb";
8
+ import { StigmerContext } from "../../context";
9
+ import { useStopRunner } from "../useStopRunner";
10
+ function makeRunner(id, phase) {
11
+ const runner = create(RunnerSchema);
12
+ runner.metadata = create(ApiResourceMetadataSchema);
13
+ runner.metadata.id = id;
14
+ runner.status = create(RunnerStatusSchema);
15
+ runner.status.phase = phase;
16
+ return runner;
17
+ }
18
+ function buildMockClient(overrides = {}) {
19
+ return {
20
+ runner: {
21
+ stop: overrides.stop ?? vi.fn(),
22
+ },
23
+ };
24
+ }
25
+ function makeWrapper(client) {
26
+ return ({ children }) => (_jsx(StigmerContext.Provider, { value: client, children: children }));
27
+ }
28
+ describe("useStopRunner", () => {
29
+ let stopMock;
30
+ let client;
31
+ beforeEach(() => {
32
+ stopMock = vi.fn();
33
+ client = buildMockClient({ stop: stopMock });
34
+ });
35
+ it("calls runner.stop with correct proto message and returns the runner", async () => {
36
+ const stoppedRunner = makeRunner("rnr_1", RunnerPhase.STOPPED);
37
+ stopMock.mockResolvedValueOnce(stoppedRunner);
38
+ const { result } = renderHook(() => useStopRunner(), {
39
+ wrapper: makeWrapper(client),
40
+ });
41
+ expect(result.current.isStopping).toBe(false);
42
+ expect(result.current.error).toBeNull();
43
+ let returned;
44
+ await act(async () => {
45
+ returned = await result.current.stop({
46
+ runnerId: "rnr_1",
47
+ reason: "user requested",
48
+ });
49
+ });
50
+ expect(stopMock).toHaveBeenCalledOnce();
51
+ const protoArg = stopMock.mock.calls[0][0];
52
+ expect(protoArg.runnerId).toBe("rnr_1");
53
+ expect(protoArg.reason).toBe("user requested");
54
+ expect(returned).toBe(stoppedRunner);
55
+ expect(result.current.isStopping).toBe(false);
56
+ expect(result.current.error).toBeNull();
57
+ });
58
+ it("defaults reason to empty string when omitted", async () => {
59
+ const stoppedRunner = makeRunner("rnr_2", RunnerPhase.STOPPED);
60
+ stopMock.mockResolvedValueOnce(stoppedRunner);
61
+ const { result } = renderHook(() => useStopRunner(), {
62
+ wrapper: makeWrapper(client),
63
+ });
64
+ await act(async () => {
65
+ await result.current.stop({ runnerId: "rnr_2" });
66
+ });
67
+ const protoArg = stopMock.mock.calls[0][0];
68
+ expect(protoArg.reason).toBe("");
69
+ });
70
+ it("sets error and rethrows on failure", async () => {
71
+ const rpcError = new Error("runner not found");
72
+ stopMock.mockRejectedValueOnce(rpcError);
73
+ const { result } = renderHook(() => useStopRunner(), {
74
+ wrapper: makeWrapper(client),
75
+ });
76
+ await act(async () => {
77
+ await expect(result.current.stop({ runnerId: "rnr_missing" })).rejects.toThrow("runner not found");
78
+ });
79
+ expect(result.current.error).toBeInstanceOf(Error);
80
+ expect(result.current.error.message).toBe("runner not found");
81
+ expect(result.current.isStopping).toBe(false);
82
+ });
83
+ it("clears error via clearError", async () => {
84
+ stopMock.mockRejectedValueOnce(new Error("fail"));
85
+ const { result } = renderHook(() => useStopRunner(), {
86
+ wrapper: makeWrapper(client),
87
+ });
88
+ await act(async () => {
89
+ await result.current.stop({ runnerId: "rnr_1" }).catch(() => { });
90
+ });
91
+ expect(result.current.error).not.toBeNull();
92
+ act(() => {
93
+ result.current.clearError();
94
+ });
95
+ expect(result.current.error).toBeNull();
96
+ });
97
+ it("resets previous error on a new successful stop", async () => {
98
+ stopMock.mockRejectedValueOnce(new Error("first fail"));
99
+ const { result } = renderHook(() => useStopRunner(), {
100
+ wrapper: makeWrapper(client),
101
+ });
102
+ await act(async () => {
103
+ await result.current.stop({ runnerId: "rnr_1" }).catch(() => { });
104
+ });
105
+ expect(result.current.error).not.toBeNull();
106
+ const stoppedRunner = makeRunner("rnr_1", RunnerPhase.STOPPED);
107
+ stopMock.mockResolvedValueOnce(stoppedRunner);
108
+ await act(async () => {
109
+ await result.current.stop({ runnerId: "rnr_1" });
110
+ });
111
+ expect(result.current.error).toBeNull();
112
+ });
113
+ });
114
+ //# sourceMappingURL=useStopRunner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStopRunner.test.js","sourceRoot":"","sources":["../../../src/runner/__tests__/useStopRunner.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export { useRunnerList } from "./useRunnerList";
2
+ export type { UseRunnerListOptions, UseRunnerListReturn, } from "./useRunnerList";
3
+ export { useLaunchLocalRunner } from "./useLaunchLocalRunner";
4
+ export type { UseLaunchLocalRunnerOptions, UseLaunchLocalRunnerReturn, LaunchLocalRunnerResult, } from "./useLaunchLocalRunner";
5
+ export { useStopRunner } from "./useStopRunner";
6
+ export type { StopRunnerInput, UseStopRunnerReturn, } from "./useStopRunner";
7
+ export { useDeleteRunner } from "./useDeleteRunner";
8
+ export type { UseDeleteRunnerReturn } from "./useDeleteRunner";
9
+ export { RunnerPicker } from "./RunnerPicker";
10
+ export type { RunnerPickerProps } from "./RunnerPicker";
11
+ export { RunnerListPanel } from "./RunnerListPanel";
12
+ export type { RunnerListPanelProps } from "./RunnerListPanel";
13
+ export { phaseLabel, phaseDotColor, isActivePhase, PHASE_SORT_ORDER, } from "./phase";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EACV,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EACV,2BAA2B,EAC3B,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EACV,eAAe,EACf,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EACL,UAAU,EACV,aAAa,EACb,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { useRunnerList } from "./useRunnerList";
2
+ export { useLaunchLocalRunner } from "./useLaunchLocalRunner";
3
+ export { useStopRunner } from "./useStopRunner";
4
+ export { useDeleteRunner } from "./useDeleteRunner";
5
+ export { RunnerPicker } from "./RunnerPicker";
6
+ export { RunnerListPanel } from "./RunnerListPanel";
7
+ export { phaseLabel, phaseDotColor, isActivePhase, PHASE_SORT_ORDER, } from "./phase";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAO9D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMhD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EACL,UAAU,EACV,aAAa,EACb,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { RunnerPhase } from "@stigmer/protos/ai/stigmer/agentic/runner/v1/enum_pb";
2
+ /**
3
+ * Sort order for runner phases — active phases first, then by severity.
4
+ *
5
+ * Used by both {@link RunnerPicker} and {@link RunnerListPanel} to present
6
+ * runners in a consistent, predictable order across all UI surfaces.
7
+ */
8
+ export declare const PHASE_SORT_ORDER: Record<RunnerPhase, number>;
9
+ /**
10
+ * Human-readable label for a runner phase.
11
+ *
12
+ * Returns title-case labels suitable for both compact indicators
13
+ * ("Ready") and full-row display ("Stopped").
14
+ */
15
+ export declare function phaseLabel(phase: RunnerPhase): string;
16
+ /**
17
+ * Tailwind `bg-*` class for the small colored dot indicator.
18
+ *
19
+ * - Ready → `bg-success` (green)
20
+ * - Busy → `bg-warning` (amber)
21
+ * - Others → `bg-muted-foreground` (neutral)
22
+ */
23
+ export declare function phaseDotColor(phase: RunnerPhase): string;
24
+ /**
25
+ * Whether the runner is in an active (workload-accepting) phase.
26
+ *
27
+ * Active = `READY` or `BUSY`. Inactive = everything else.
28
+ */
29
+ export declare function isActivePhase(phase: RunnerPhase): boolean;
30
+ //# sourceMappingURL=phase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase.d.ts","sourceRoot":"","sources":["../../src/runner/phase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sDAAsD,CAAC;AAEnF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAOxD,CAAC;AAWF;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAErD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CASxD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAEzD"}
@@ -0,0 +1,58 @@
1
+ import { RunnerPhase } from "@stigmer/protos/ai/stigmer/agentic/runner/v1/enum_pb";
2
+ /**
3
+ * Sort order for runner phases — active phases first, then by severity.
4
+ *
5
+ * Used by both {@link RunnerPicker} and {@link RunnerListPanel} to present
6
+ * runners in a consistent, predictable order across all UI surfaces.
7
+ */
8
+ export const PHASE_SORT_ORDER = {
9
+ [RunnerPhase.READY]: 0,
10
+ [RunnerPhase.BUSY]: 1,
11
+ [RunnerPhase.PENDING]: 2,
12
+ [RunnerPhase.STOPPED]: 3,
13
+ [RunnerPhase.FAILED]: 4,
14
+ [RunnerPhase.UNSPECIFIED]: 5,
15
+ };
16
+ const LABELS = {
17
+ [RunnerPhase.READY]: "Ready",
18
+ [RunnerPhase.BUSY]: "Busy",
19
+ [RunnerPhase.PENDING]: "Pending",
20
+ [RunnerPhase.STOPPED]: "Stopped",
21
+ [RunnerPhase.FAILED]: "Failed",
22
+ [RunnerPhase.UNSPECIFIED]: "Unknown",
23
+ };
24
+ /**
25
+ * Human-readable label for a runner phase.
26
+ *
27
+ * Returns title-case labels suitable for both compact indicators
28
+ * ("Ready") and full-row display ("Stopped").
29
+ */
30
+ export function phaseLabel(phase) {
31
+ return LABELS[phase] ?? "Unknown";
32
+ }
33
+ /**
34
+ * Tailwind `bg-*` class for the small colored dot indicator.
35
+ *
36
+ * - Ready → `bg-success` (green)
37
+ * - Busy → `bg-warning` (amber)
38
+ * - Others → `bg-muted-foreground` (neutral)
39
+ */
40
+ export function phaseDotColor(phase) {
41
+ switch (phase) {
42
+ case RunnerPhase.READY:
43
+ return "bg-success";
44
+ case RunnerPhase.BUSY:
45
+ return "bg-warning";
46
+ default:
47
+ return "bg-muted-foreground";
48
+ }
49
+ }
50
+ /**
51
+ * Whether the runner is in an active (workload-accepting) phase.
52
+ *
53
+ * Active = `READY` or `BUSY`. Inactive = everything else.
54
+ */
55
+ export function isActivePhase(phase) {
56
+ return phase === RunnerPhase.READY || phase === RunnerPhase.BUSY;
57
+ }
58
+ //# sourceMappingURL=phase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase.js","sourceRoot":"","sources":["../../src/runner/phase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sDAAsD,CAAC;AAEnF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAgC;IAC3D,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;IACtB,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;IACrB,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;IACxB,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;IACxB,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;IACvB,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,GAAgC;IAC1C,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,OAAO;IAC5B,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM;IAC1B,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS;IAChC,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS;IAChC,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC9B,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,SAAS;CACrC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,KAAkB;IAC3C,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;AACpC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAkB;IAC9C,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,WAAW,CAAC,KAAK;YACpB,OAAO,YAAY,CAAC;QACtB,KAAK,WAAW,CAAC,IAAI;YACnB,OAAO,YAAY,CAAC;QACtB;YACE,OAAO,qBAAqB,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAkB;IAC9C,OAAO,KAAK,KAAK,WAAW,CAAC,KAAK,IAAI,KAAK,KAAK,WAAW,CAAC,IAAI,CAAC;AACnE,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { Runner } from "@stigmer/protos/ai/stigmer/agentic/runner/v1/api_pb";
2
+ /** Return value of {@link useDeleteRunner}. */
3
+ export interface UseDeleteRunnerReturn {
4
+ /**
5
+ * Delete a runner by its resource ID. Resolves with the deleted
6
+ * {@link Runner} for confirmation display.
7
+ *
8
+ * The deletion is permanent — any sessions bound to this runner will
9
+ * fall back to auto-provisioning on their next execution.
10
+ */
11
+ readonly deleteRunner: (id: string) => Promise<Runner>;
12
+ /** `true` while the delete request is in flight. */
13
+ readonly isDeleting: boolean;
14
+ /** Error from the last failed delete, or `null` when healthy. */
15
+ readonly error: Error | null;
16
+ /** Reset `error` to `null`. */
17
+ readonly clearError: () => void;
18
+ }
19
+ /**
20
+ * Mutation hook that wraps `runner.delete()` with loading and error
21
+ * state.
22
+ *
23
+ * Deletes a runner by its resource ID. Returns the deleted
24
+ * {@link Runner} on success so callers can confirm which runner was
25
+ * removed (e.g., in a toast or undo prompt).
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * const { deleteRunner, isDeleting, error } = useDeleteRunner();
30
+ *
31
+ * await deleteRunner("rnr_abc123");
32
+ * refetch(); // refresh the runner list
33
+ * ```
34
+ */
35
+ export declare function useDeleteRunner(): UseDeleteRunnerReturn;
36
+ //# sourceMappingURL=useDeleteRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDeleteRunner.d.ts","sourceRoot":"","sources":["../../src/runner/useDeleteRunner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qDAAqD,CAAC;AAIlF,+CAA+C;AAC/C,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,+BAA+B;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;CACjC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,IAAI,qBAAqB,CAyBvD"}
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import { useCallback, useState } from "react";
3
+ import { useStigmer } from "../hooks";
4
+ import { toError } from "../internal/toError";
5
+ /**
6
+ * Mutation hook that wraps `runner.delete()` with loading and error
7
+ * state.
8
+ *
9
+ * Deletes a runner by its resource ID. Returns the deleted
10
+ * {@link Runner} on success so callers can confirm which runner was
11
+ * removed (e.g., in a toast or undo prompt).
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * const { deleteRunner, isDeleting, error } = useDeleteRunner();
16
+ *
17
+ * await deleteRunner("rnr_abc123");
18
+ * refetch(); // refresh the runner list
19
+ * ```
20
+ */
21
+ export function useDeleteRunner() {
22
+ const stigmer = useStigmer();
23
+ const [isDeleting, setIsDeleting] = useState(false);
24
+ const [error, setError] = useState(null);
25
+ const clearError = useCallback(() => setError(null), []);
26
+ const deleteRunner = useCallback(async (id) => {
27
+ setIsDeleting(true);
28
+ setError(null);
29
+ try {
30
+ return await stigmer.runner.delete(id);
31
+ }
32
+ catch (err) {
33
+ setError(toError(err));
34
+ throw err;
35
+ }
36
+ finally {
37
+ setIsDeleting(false);
38
+ }
39
+ }, [stigmer]);
40
+ return { deleteRunner, isDeleting, error, clearError };
41
+ }
42
+ //# sourceMappingURL=useDeleteRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDeleteRunner.js","sourceRoot":"","sources":["../../src/runner/useDeleteRunner.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAoB9C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzD,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EAAE,EAAU,EAAmB,EAAE;QACpC,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACzD,CAAC"}
@@ -0,0 +1,84 @@
1
+ /** Options for {@link useLaunchLocalRunner}. */
2
+ export interface UseLaunchLocalRunnerOptions {
3
+ /**
4
+ * Custom handler for opening the `stigmer://` URL.
5
+ *
6
+ * Defaults to `window.location.href` assignment, which is the standard
7
+ * browser pattern for dispatching custom URL schemes to the OS. The
8
+ * browser does not navigate away — it hands the scheme to the OS and
9
+ * the page stays on screen.
10
+ *
11
+ * Override this when embedding in non-standard environments (Electron,
12
+ * iframe, React Native WebView) where the default browser mechanism
13
+ * does not apply.
14
+ */
15
+ readonly openUrl?: (url: string) => void;
16
+ }
17
+ /** Result returned by a successful {@link UseLaunchLocalRunnerReturn.launch} call. */
18
+ export interface LaunchLocalRunnerResult {
19
+ /** The `stigmer://launch-runner?token=...` URL that was opened. */
20
+ readonly url: string;
21
+ /**
22
+ * Absolute expiry time of the launch token. The desktop app must
23
+ * exchange the token before this time (typically 60 seconds).
24
+ */
25
+ readonly expiresAt: Date | undefined;
26
+ }
27
+ /** Return value of {@link useLaunchLocalRunner}. */
28
+ export interface UseLaunchLocalRunnerReturn {
29
+ /**
30
+ * Create a one-time launch token and open the `stigmer://` URL to
31
+ * trigger the desktop app (or CLI fallback) to start a local runner.
32
+ *
33
+ * Resolves with the constructed URL and token expiry on success.
34
+ * The caller cannot detect whether the desktop app received the URL —
35
+ * use {@link useRunnerList} with `refetch()` to poll for the runner
36
+ * appearing in the list.
37
+ */
38
+ readonly launch: (input: {
39
+ org: string;
40
+ }) => Promise<LaunchLocalRunnerResult>;
41
+ /** `true` while the token creation and URL dispatch are in flight. */
42
+ readonly isLaunching: boolean;
43
+ /** Error from the last failed launch attempt, or `null` when healthy. */
44
+ readonly error: Error | null;
45
+ /** Reset `error` to `null`. */
46
+ readonly clearError: () => void;
47
+ }
48
+ /**
49
+ * Behavior hook that initiates a browser-to-desktop runner launch.
50
+ *
51
+ * Orchestrates two steps:
52
+ * 1. Calls `stigmer.runner.createLaunchToken({ org })` to mint a
53
+ * one-time, 60-second token backed by the caller's credentials.
54
+ * 2. Opens `stigmer://launch-runner?token={token}` so the OS dispatches
55
+ * to the Stigmer Desktop app (which exchanges the token for a JWT
56
+ * and starts a local runner via its CLI sidecar).
57
+ *
58
+ * The hook reports success when the URL is opened. It does **not**
59
+ * detect whether the desktop app is installed or whether the runner
60
+ * actually started — those are observable via `useRunnerList`.
61
+ *
62
+ * @example
63
+ * ```tsx
64
+ * function LaunchButton({ org }: { org: string }) {
65
+ * const { launch, isLaunching, error } = useLaunchLocalRunner();
66
+ *
67
+ * return (
68
+ * <button onClick={() => launch({ org })} disabled={isLaunching}>
69
+ * {isLaunching ? "Launching…" : "Launch Local Runner"}
70
+ * </button>
71
+ * );
72
+ * }
73
+ * ```
74
+ *
75
+ * @example
76
+ * ```tsx
77
+ * // Custom URL handler for non-browser environments
78
+ * const { launch } = useLaunchLocalRunner({
79
+ * openUrl: (url) => nativeBridge.openExternal(url),
80
+ * });
81
+ * ```
82
+ */
83
+ export declare function useLaunchLocalRunner(options?: UseLaunchLocalRunnerOptions): UseLaunchLocalRunnerReturn;
84
+ //# sourceMappingURL=useLaunchLocalRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLaunchLocalRunner.d.ts","sourceRoot":"","sources":["../../src/runner/useLaunchLocalRunner.ts"],"names":[],"mappings":"AAeA,gDAAgD;AAChD,MAAM,WAAW,2BAA2B;IAC1C;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED,sFAAsF;AACtF,MAAM,WAAW,uBAAuB;IACtC,mEAAmE;IACnE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,IAAI,GAAG,SAAS,CAAC;CACtC;AAED,oDAAoD;AACpD,MAAM,WAAW,0BAA0B;IACzC;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC9E,sEAAsE;IACtE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,+BAA+B;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,CAAC,EAAE,2BAA2B,GACpC,0BAA0B,CAsC5B"}