@vibesdotdev/client 0.1.0 → 1.0.0-rc.2

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 (239) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +31 -0
  3. package/dist/api-client-plugin.d.ts +4 -0
  4. package/dist/api-client-plugin.d.ts.map +1 -0
  5. package/dist/api-client-plugin.js +20 -0
  6. package/dist/api-client-plugin.js.map +1 -0
  7. package/dist/api-client.impl.d.ts +23 -0
  8. package/dist/api-client.impl.d.ts.map +1 -0
  9. package/dist/api-client.impl.js +47 -0
  10. package/dist/api-client.impl.js.map +1 -0
  11. package/dist/client.consumer.plugin.d.ts +3 -0
  12. package/dist/client.consumer.plugin.d.ts.map +1 -0
  13. package/dist/client.consumer.plugin.js +10 -0
  14. package/dist/client.consumer.plugin.js.map +1 -0
  15. package/dist/cloud.plugin.d.ts +3 -0
  16. package/dist/cloud.plugin.d.ts.map +1 -0
  17. package/dist/cloud.plugin.js +10 -0
  18. package/dist/cloud.plugin.js.map +1 -0
  19. package/dist/config/client.config.descriptor.d.ts +4 -0
  20. package/dist/config/client.config.descriptor.d.ts.map +1 -0
  21. package/dist/config/client.config.descriptor.js +32 -0
  22. package/dist/config/client.config.descriptor.js.map +1 -0
  23. package/dist/config/index.d.ts +3 -0
  24. package/dist/config/index.d.ts.map +1 -0
  25. package/dist/config/index.js +3 -0
  26. package/dist/config/index.js.map +1 -0
  27. package/dist/config/settings.d.ts +9 -0
  28. package/dist/config/settings.d.ts.map +1 -0
  29. package/dist/config/settings.js +25 -0
  30. package/dist/config/settings.js.map +1 -0
  31. package/dist/docs/client.api-request.docs.descriptor.d.ts +4 -0
  32. package/dist/docs/client.api-request.docs.descriptor.d.ts.map +1 -0
  33. package/dist/docs/client.api-request.docs.descriptor.js +71 -0
  34. package/dist/docs/client.api-request.docs.descriptor.js.map +1 -0
  35. package/dist/events/auth-rejected.event.d.ts +35 -0
  36. package/dist/events/auth-rejected.event.d.ts.map +1 -0
  37. package/dist/events/auth-rejected.event.js +36 -0
  38. package/dist/events/auth-rejected.event.js.map +1 -0
  39. package/dist/factory.d.ts +5 -1
  40. package/dist/factory.d.ts.map +1 -1
  41. package/dist/factory.js +16 -17
  42. package/dist/factory.js.map +1 -1
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +2 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/kind-augment.d.ts +11 -0
  48. package/dist/kind-augment.d.ts.map +1 -0
  49. package/dist/kind-augment.js +2 -0
  50. package/dist/kind-augment.js.map +1 -0
  51. package/dist/lib/client/api-diagnostics.d.ts +79 -0
  52. package/dist/lib/client/api-diagnostics.d.ts.map +1 -0
  53. package/dist/lib/client/api-diagnostics.js +111 -0
  54. package/dist/lib/client/api-diagnostics.js.map +1 -0
  55. package/dist/lib/client/configured.d.ts +78 -0
  56. package/dist/lib/client/configured.d.ts.map +1 -0
  57. package/dist/lib/client/configured.js +261 -0
  58. package/dist/lib/client/configured.js.map +1 -0
  59. package/dist/lib/client/internal/auth-headers.d.ts +11 -0
  60. package/dist/lib/client/internal/auth-headers.d.ts.map +1 -0
  61. package/dist/lib/client/internal/auth-headers.js +35 -0
  62. package/dist/lib/client/internal/auth-headers.js.map +1 -0
  63. package/dist/lib/client/internal/base-client.d.ts +5 -2
  64. package/dist/lib/client/internal/base-client.d.ts.map +1 -1
  65. package/dist/lib/client/internal/base-client.js +42 -22
  66. package/dist/lib/client/internal/base-client.js.map +1 -1
  67. package/dist/lib/client/internal/base-helpers.d.ts.map +1 -1
  68. package/dist/lib/client/internal/base-helpers.js +20 -20
  69. package/dist/lib/client/internal/base-helpers.js.map +1 -1
  70. package/dist/lib/client/internal/base-types.d.ts +10 -5
  71. package/dist/lib/client/internal/base-types.d.ts.map +1 -1
  72. package/dist/lib/client/internal/base-types.js +5 -3
  73. package/dist/lib/client/internal/base-types.js.map +1 -1
  74. package/dist/lib/client/internal/client-values.d.ts +43 -0
  75. package/dist/lib/client/internal/client-values.d.ts.map +1 -0
  76. package/dist/lib/client/internal/client-values.js +76 -0
  77. package/dist/lib/client/internal/client-values.js.map +1 -0
  78. package/dist/lib/client/internal/endpoint.d.ts +6 -5
  79. package/dist/lib/client/internal/endpoint.d.ts.map +1 -1
  80. package/dist/lib/client/internal/endpoint.js +3 -0
  81. package/dist/lib/client/internal/endpoint.js.map +1 -1
  82. package/dist/lib/client/internal/generator.d.ts +98 -9
  83. package/dist/lib/client/internal/generator.d.ts.map +1 -1
  84. package/dist/lib/client/internal/generator.js +92 -140
  85. package/dist/lib/client/internal/generator.js.map +1 -1
  86. package/dist/lib/client/internal/request-builder.d.ts +5 -2
  87. package/dist/lib/client/internal/request-builder.d.ts.map +1 -1
  88. package/dist/lib/client/internal/request-builder.js +105 -65
  89. package/dist/lib/client/internal/request-builder.js.map +1 -1
  90. package/dist/lib/client/internal/sse-stream.d.ts +9 -5
  91. package/dist/lib/client/internal/sse-stream.d.ts.map +1 -1
  92. package/dist/lib/client/internal/sse-stream.js +96 -94
  93. package/dist/lib/client/internal/sse-stream.js.map +1 -1
  94. package/dist/lib/client/internal/timeout-signal.d.ts +8 -0
  95. package/dist/lib/client/internal/timeout-signal.d.ts.map +1 -0
  96. package/dist/lib/client/internal/timeout-signal.js +17 -0
  97. package/dist/lib/client/internal/timeout-signal.js.map +1 -0
  98. package/dist/lib/client/internal/transport/http2-fetch.d.ts +8 -0
  99. package/dist/lib/client/internal/transport/http2-fetch.d.ts.map +1 -0
  100. package/dist/lib/client/internal/transport/http2-fetch.js +17 -0
  101. package/dist/lib/client/internal/transport/http2-fetch.js.map +1 -0
  102. package/dist/lib/client/internal/vibes-client.d.ts +17 -8
  103. package/dist/lib/client/internal/vibes-client.d.ts.map +1 -1
  104. package/dist/lib/client/internal/vibes-client.js +127 -67
  105. package/dist/lib/client/internal/vibes-client.js.map +1 -1
  106. package/dist/lib/client/internal/wrap-fetch.d.ts +3 -2
  107. package/dist/lib/client/internal/wrap-fetch.d.ts.map +1 -1
  108. package/dist/lib/client/internal/wrap-fetch.js +14 -33
  109. package/dist/lib/client/internal/wrap-fetch.js.map +1 -1
  110. package/dist/lib/client/runtime-fetch.d.ts +14 -0
  111. package/dist/lib/client/runtime-fetch.d.ts.map +1 -0
  112. package/dist/lib/client/runtime-fetch.js +25 -0
  113. package/dist/lib/client/runtime-fetch.js.map +1 -0
  114. package/dist/lib/client/types.d.ts +18 -9
  115. package/dist/lib/client/types.d.ts.map +1 -1
  116. package/dist/lib/client/types.js +22 -3
  117. package/dist/lib/client/types.js.map +1 -1
  118. package/dist/plugin.d.ts +2 -18
  119. package/dist/plugin.d.ts.map +1 -1
  120. package/dist/plugin.js +7 -74
  121. package/dist/plugin.js.map +1 -1
  122. package/dist/runtime-client.d.ts +10 -0
  123. package/dist/runtime-client.d.ts.map +1 -0
  124. package/dist/runtime-client.js +14 -0
  125. package/dist/runtime-client.js.map +1 -0
  126. package/dist/schemas/auth-rejected.d.ts +12 -0
  127. package/dist/schemas/auth-rejected.d.ts.map +1 -0
  128. package/dist/schemas/auth-rejected.js +11 -0
  129. package/dist/schemas/auth-rejected.js.map +1 -0
  130. package/dist/schemas/sdk-languages.d.ts +47 -0
  131. package/dist/schemas/sdk-languages.d.ts.map +1 -0
  132. package/dist/schemas/sdk-languages.js +75 -0
  133. package/dist/schemas/sdk-languages.js.map +1 -0
  134. package/dist/schemas/settings.d.ts +14 -0
  135. package/dist/schemas/settings.d.ts.map +1 -0
  136. package/dist/schemas/settings.js +10 -0
  137. package/dist/schemas/settings.js.map +1 -0
  138. package/dist/schemas/validated-request.d.ts +19 -0
  139. package/dist/schemas/validated-request.d.ts.map +1 -0
  140. package/dist/schemas/validated-request.js +2 -0
  141. package/dist/schemas/validated-request.js.map +1 -0
  142. package/dist/schemas.d.ts +23 -8
  143. package/dist/schemas.d.ts.map +1 -1
  144. package/dist/schemas.js +8 -2
  145. package/dist/schemas.js.map +1 -1
  146. package/dist/sse-client.d.ts +17 -15
  147. package/dist/sse-client.d.ts.map +1 -1
  148. package/dist/sse-client.js +111 -91
  149. package/dist/sse-client.js.map +1 -1
  150. package/dist/svelte/client-svelte.plugin.d.ts +3 -0
  151. package/dist/svelte/client-svelte.plugin.d.ts.map +1 -0
  152. package/dist/svelte/client-svelte.plugin.js +35 -0
  153. package/dist/svelte/index.d.ts +3 -0
  154. package/dist/svelte/index.d.ts.map +1 -0
  155. package/dist/svelte/index.js +2 -0
  156. package/dist/svelte/styles.css +8 -0
  157. package/dist/svelte/tool-widgets/ApiRequestToolCard.svelte +53 -0
  158. package/dist/svelte/tool-widgets/ApiRequestToolCard.svelte.d.ts +5 -0
  159. package/dist/svelte/tool-widgets/ApiRequestToolCard.svelte.d.ts.map +1 -0
  160. package/dist/svelte/tool-widgets/index.d.ts +2 -0
  161. package/dist/svelte/tool-widgets/index.d.ts.map +1 -0
  162. package/dist/svelte/tool-widgets/index.js +1 -0
  163. package/dist/tools/api-request/api-request.contract.d.ts +19 -0
  164. package/dist/tools/api-request/api-request.contract.d.ts.map +1 -0
  165. package/dist/tools/api-request/api-request.contract.js +110 -0
  166. package/dist/tools/api-request/api-request.contract.js.map +1 -0
  167. package/dist/tools/api-request/api-request.descriptor.d.ts +11 -4
  168. package/dist/tools/api-request/api-request.descriptor.d.ts.map +1 -1
  169. package/dist/tools/api-request/api-request.descriptor.js +8 -5
  170. package/dist/tools/api-request/api-request.descriptor.js.map +1 -1
  171. package/dist/tools/api-request/api-request.impl.cloud.d.ts +15 -0
  172. package/dist/tools/api-request/api-request.impl.cloud.d.ts.map +1 -0
  173. package/dist/tools/api-request/api-request.impl.cloud.js +75 -0
  174. package/dist/tools/api-request/api-request.impl.cloud.js.map +1 -0
  175. package/dist/tools/api-request/api-request.impl.consumer.d.ts +5 -3
  176. package/dist/tools/api-request/api-request.impl.consumer.d.ts.map +1 -1
  177. package/dist/tools/api-request/api-request.impl.consumer.js +27 -33
  178. package/dist/tools/api-request/api-request.impl.consumer.js.map +1 -1
  179. package/dist/tools/api-request/api-request.view.d.ts +29 -0
  180. package/dist/tools/api-request/api-request.view.d.ts.map +1 -0
  181. package/dist/tools/api-request/api-request.view.js +62 -0
  182. package/dist/tools/api-request/api-request.view.js.map +1 -0
  183. package/dist/tools/api-request/schemas/index.d.ts +12 -5
  184. package/dist/tools/api-request/schemas/index.d.ts.map +1 -1
  185. package/dist/tools/api-request/schemas/index.js +24 -6
  186. package/dist/tools/api-request/schemas/index.js.map +1 -1
  187. package/dist/tui/client-tui.plugin.d.ts +3 -0
  188. package/dist/tui/client-tui.plugin.d.ts.map +1 -0
  189. package/dist/tui/client-tui.plugin.js +32 -0
  190. package/dist/tui/client-tui.plugin.js.map +1 -0
  191. package/dist/tui/index.d.ts +2 -0
  192. package/dist/tui/index.d.ts.map +1 -0
  193. package/dist/tui/index.js +2 -0
  194. package/dist/tui/index.js.map +1 -0
  195. package/dist/tui/tool-widgets/ApiRequestToolWidget.impl.tui.d.ts +17 -0
  196. package/dist/tui/tool-widgets/ApiRequestToolWidget.impl.tui.d.ts.map +1 -0
  197. package/dist/tui/tool-widgets/ApiRequestToolWidget.impl.tui.js +28 -0
  198. package/dist/tui/tool-widgets/ApiRequestToolWidget.impl.tui.js.map +1 -0
  199. package/dist/validated-request.d.ts +27 -0
  200. package/dist/validated-request.d.ts.map +1 -0
  201. package/dist/validated-request.js +119 -0
  202. package/dist/validated-request.js.map +1 -0
  203. package/package.json +190 -45
  204. package/SPEC.md +0 -107
  205. package/dist/lib/client/internal/node/http2-fetch.node.d.ts +0 -2
  206. package/dist/lib/client/internal/node/http2-fetch.node.d.ts.map +0 -1
  207. package/dist/lib/client/internal/node/http2-fetch.node.js +0 -131
  208. package/dist/lib/client/internal/node/http2-fetch.node.js.map +0 -1
  209. package/dist/lib/client/node.d.ts +0 -5
  210. package/dist/lib/client/node.d.ts.map +0 -1
  211. package/dist/lib/client/node.js +0 -33
  212. package/dist/lib/client/node.js.map +0 -1
  213. package/dist/tools/api-request/index.d.ts +0 -5
  214. package/dist/tools/api-request/index.d.ts.map +0 -1
  215. package/dist/tools/api-request/index.js +0 -4
  216. package/dist/tools/api-request/index.js.map +0 -1
  217. package/src/factory.ts +0 -114
  218. package/src/index.ts +0 -15
  219. package/src/lib/client/core.ts +0 -13
  220. package/src/lib/client/internal/base-client.ts +0 -107
  221. package/src/lib/client/internal/base-helpers.ts +0 -74
  222. package/src/lib/client/internal/base-types.ts +0 -42
  223. package/src/lib/client/internal/endpoint.ts +0 -51
  224. package/src/lib/client/internal/generator.ts +0 -181
  225. package/src/lib/client/internal/index.ts +0 -4
  226. package/src/lib/client/internal/node/http2-fetch.node.ts +0 -138
  227. package/src/lib/client/internal/request-builder.ts +0 -147
  228. package/src/lib/client/internal/sse-stream.ts +0 -130
  229. package/src/lib/client/internal/vibes-client.ts +0 -167
  230. package/src/lib/client/internal/wrap-fetch.ts +0 -59
  231. package/src/lib/client/node.ts +0 -36
  232. package/src/lib/client/types.ts +0 -156
  233. package/src/plugin.ts +0 -104
  234. package/src/schemas.ts +0 -91
  235. package/src/sse-client.ts +0 -155
  236. package/src/tools/api-request/api-request.descriptor.ts +0 -28
  237. package/src/tools/api-request/api-request.impl.consumer.ts +0 -66
  238. package/src/tools/api-request/index.ts +0 -4
  239. package/src/tools/api-request/schemas/index.ts +0 -29
package/SPEC.md DELETED
@@ -1,107 +0,0 @@
1
- # Client Package SPEC
2
-
3
- **Status:** Production
4
- **Package:** `@vibesdotdev/client`
5
- **Location:** `packages/client`
6
-
7
- ## Overview
8
-
9
- Base API client with runtime kind integration and per-app client factories. Wraps `@vibesdotdev/kit`'s VibesClient with a standardized `ApiClientImplementation` interface and registers `api/client` as a runtime kind for descriptor-based client resolution.
10
-
11
- ## Architecture
12
-
13
- ```
14
- +-----------------------------------------------------------------------+
15
- | Client Package |
16
- +-----------------------------------------------------------------------+
17
- | FACTORY |
18
- | ------- |
19
- | vibesApiClient(config) -> Create API client from config |
20
- | fromVibesClient(client) -> Wrap existing VibesClient |
21
- | ApiClientConfig -> baseUrl, auth, fetch, timeout, headers |
22
- +-----------------------------------------------------------------------+
23
- | SCHEMAS |
24
- | ------- |
25
- | ApiClientDescriptor -> Runtime descriptor for api/client kind |
26
- | kind: 'api/client' -> Runtime kind identifier |
27
- | baseUrl, timeout, debug -> Per-client configuration |
28
- | ApiClientImplementation -> Standard interface: get/post/put/delete |
29
- | ApiRequestOptions -> query, headers, timeout, params |
30
- +-----------------------------------------------------------------------+
31
- | RUNTIME PLUGIN |
32
- | -------------- |
33
- | clientPlugin -> Registers 'api/client' kind |
34
- | DefaultApiClient -> Default implementation from descriptor |
35
- | Runtime query: |
36
- | runtime.query('api/client').withId('auth').resolve() |
37
- +-----------------------------------------------------------------------+
38
- ```
39
-
40
- ## Key Exports
41
-
42
- ### Factory (`@vibesdotdev/client` or `@vibesdotdev/client/factory`)
43
- - `vibesApiClient(config?)` -- Create new API client instance
44
- - `fromVibesClient(client)` -- Wrap existing VibesClient
45
- - `ApiClientConfig` -- Configuration type
46
-
47
- ### Schemas (`@vibesdotdev/client/schemas`)
48
- - `ApiClientDescriptor` -- Runtime descriptor interface
49
- - `ApiClientDescriptorSchema` -- Zod validation schema
50
- - `ApiClientImplementation` -- Standard client interface (get/post/put/delete/request)
51
- - `ApiRequestOptions` -- Per-request options (query, headers, timeout, params)
52
-
53
- ### Plugin (`@vibesdotdev/client/plugin`)
54
- - `clientPlugin` -- Runtime plugin registering `api/client` kind
55
- - Enables `runtime.query('api/client').withId('auth').resolve()`
56
-
57
- ## ApiClientImplementation Interface
58
-
59
- ```typescript
60
- interface ApiClientImplementation {
61
- get<T>(endpoint: string, options?: ApiRequestOptions): Promise<T>;
62
- post<T>(endpoint: string, body?: unknown, options?: ApiRequestOptions): Promise<T>;
63
- put<T>(endpoint: string, body?: unknown, options?: ApiRequestOptions): Promise<T>;
64
- delete<T>(endpoint: string, options?: ApiRequestOptions): Promise<T>;
65
- request<T>(endpoint: string, options?: ApiRequestOptions & { method?: string; body?: unknown }): Promise<T>;
66
- }
67
- ```
68
-
69
- ## Runtime Integration
70
-
71
- The plugin registers `api/client` as a runtime kind. Apps register descriptors:
72
-
73
- ```typescript
74
- // auth-client.client-api.descriptor.ts
75
- export default {
76
- id: 'auth',
77
- kind: 'api/client',
78
- baseUrl: 'https://auth.vibes.dev',
79
- timeout: 10000
80
- };
81
- ```
82
-
83
- Other packages resolve clients via the runtime:
84
-
85
- ```typescript
86
- const authClient = await runtime.query('api/client').withId('auth').resolve();
87
- const session = await authClient.get('/api/session');
88
- ```
89
-
90
- ## Done Means
91
-
92
- - [ ] `vibesApiClient` creates working clients with proper auth, headers, and timeout
93
- - [ ] `fromVibesClient` correctly wraps VibesClient to ApiClientImplementation
94
- - [ ] Custom headers hook applies headers to all requests
95
- - [ ] Runtime plugin registers `api/client` kind and resolves descriptors
96
- - [ ] DefaultApiClient constructs from descriptor config (baseUrl, timeout, debug)
97
- - [ ] All HTTP methods (GET, POST, PUT, DELETE, generic request) work correctly
98
- - [ ] ApiRequestOptions supports query params, custom headers, and timeout override
99
- - [ ] Error handling propagates HTTP errors with useful context
100
- - [ ] Tests cover factory creation, plugin registration, and request lifecycle
101
-
102
- ## Dependencies
103
-
104
- - `@vibesdotdev/kit` -- VibesClient base class and client types
105
- - `@vibesdotdev/runtime` -- Runtime plugin registration and kind system
106
- - `@vibesdotdev/logging` -- Structured logging
107
- - `zod` -- Schema validation for descriptors
@@ -1,2 +0,0 @@
1
- export declare function createHttp2Fetch(baseUrl: string): (input: Parameters<typeof fetch>[0], init?: RequestInit) => Promise<Response>;
2
- //# sourceMappingURL=http2-fetch.node.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http2-fetch.node.d.ts","sourceRoot":"","sources":["../../../../../src/lib/client/internal/node/http2-fetch.node.ts"],"names":[],"mappings":"AAGA,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,MAAM,GACb,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAoI/E"}
@@ -1,131 +0,0 @@
1
- import { getRuntimeEnv } from '@vibesdotdev/runtime';
2
- import { connect as http2Connect } from 'node:http2';
3
- export function createHttp2Fetch(baseUrl) {
4
- const sessions = new Map();
5
- const rejectUnauthorized = getRuntimeEnv('REJECT_UNAUTHORIZED') !== 'false';
6
- return (input, init) => {
7
- const url = typeof input === 'string'
8
- ? new URL(input, baseUrl)
9
- : input instanceof URL
10
- ? input
11
- : new URL(input.url, baseUrl);
12
- const method = init?.method?.toUpperCase() || 'GET';
13
- const headers = new Headers(init?.headers);
14
- const sessionKey = `${url.protocol}//${url.host}`;
15
- let session = sessions.get(sessionKey);
16
- if (!session || session.destroyed || session.closed) {
17
- try {
18
- session = http2Connect(url.origin, { rejectUnauthorized });
19
- sessions.set(sessionKey, session);
20
- session.on('close', () => sessions.delete(sessionKey));
21
- session.on('error', (error) => {
22
- if (sessions.has(sessionKey)) {
23
- console.warn('[http2] Session error:', error.message);
24
- }
25
- sessions.delete(sessionKey);
26
- });
27
- }
28
- catch {
29
- return fetch(url.toString(), init);
30
- }
31
- }
32
- return new Promise((resolve, reject) => {
33
- try {
34
- const http2Headers = {
35
- ':method': method,
36
- ':path': `${url.pathname}${url.search}`,
37
- ':scheme': url.protocol.replace(':', ''),
38
- ':authority': url.host
39
- };
40
- headers.forEach((value, key) => {
41
- http2Headers[key.toLowerCase()] = value;
42
- });
43
- const req = session.request(http2Headers);
44
- let settled = false;
45
- const abort = () => {
46
- if (settled)
47
- return;
48
- settled = true;
49
- try {
50
- req.close();
51
- req.destroy();
52
- }
53
- catch {
54
- // ignore
55
- }
56
- const error = new Error('Request aborted');
57
- error.name = 'AbortError';
58
- reject(error);
59
- };
60
- const signal = init?.signal;
61
- if (signal) {
62
- if (signal.aborted) {
63
- abort();
64
- return;
65
- }
66
- signal.addEventListener('abort', abort, { once: true });
67
- }
68
- const cleanupAbort = () => {
69
- if (!signal)
70
- return;
71
- signal.removeEventListener('abort', abort);
72
- };
73
- if (init?.body) {
74
- if (typeof init.body === 'string') {
75
- req.write(init.body);
76
- }
77
- else if (init.body instanceof Buffer) {
78
- req.write(init.body);
79
- }
80
- }
81
- req.end();
82
- const chunks = [];
83
- const responseHeaders = new Headers();
84
- let statusCode = 200;
85
- req.on('response', (headers) => {
86
- const statusValue = headers[':status'];
87
- statusCode =
88
- parseInt(Array.isArray(statusValue) ? statusValue[0] : String(statusValue ?? 200)) ||
89
- 200;
90
- for (const [key, value] of Object.entries(headers)) {
91
- if (key.startsWith(':') || value === undefined)
92
- continue;
93
- if (Array.isArray(value))
94
- value.forEach((v) => responseHeaders.append(key, v));
95
- else
96
- responseHeaders.set(key, String(value));
97
- }
98
- });
99
- req.on('data', (chunk) => {
100
- if (typeof chunk === 'string') {
101
- chunks.push(Buffer.from(chunk));
102
- return;
103
- }
104
- chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(new Uint8Array(chunk)));
105
- });
106
- req.on('end', () => {
107
- if (settled)
108
- return;
109
- settled = true;
110
- cleanupAbort();
111
- const body = Buffer.concat(chunks);
112
- resolve(new Response(body, {
113
- status: statusCode,
114
- headers: responseHeaders
115
- }));
116
- });
117
- req.on('error', (error) => {
118
- if (settled)
119
- return;
120
- settled = true;
121
- cleanupAbort();
122
- reject(error);
123
- });
124
- }
125
- catch (error) {
126
- reject(error);
127
- }
128
- });
129
- };
130
- }
131
- //# sourceMappingURL=http2-fetch.node.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http2-fetch.node.js","sourceRoot":"","sources":["../../../../../src/lib/client/internal/node/http2-fetch.node.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import type { ClientConfig } from './types.ts';
2
- import { VibesClient } from './internal/vibes-client.ts';
3
- export { createHttp2Fetch } from './internal/node/http2-fetch.node.ts';
4
- export declare function createCLIClient(config?: Partial<ClientConfig>): Promise<VibesClient>;
5
- //# sourceMappingURL=node.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/lib/client/node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAoBvE,wBAAsB,eAAe,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAW1F"}
@@ -1,33 +0,0 @@
1
- import { getRuntimeEnv } from '@vibesdotdev/runtime';
2
- import { VibesClient } from "./internal/vibes-client.js";
3
- export { createHttp2Fetch } from "./internal/node/http2-fetch.node.js";
4
- async function resolveNodeFetch(baseUrl) {
5
- const isHttps = baseUrl.startsWith('https://');
6
- const isLocal = baseUrl.includes('.local') || baseUrl.includes('localhost') || baseUrl.includes('127.0.0.1');
7
- if (isHttps && isLocal) {
8
- try {
9
- if (!getRuntimeEnv('REJECT_UNAUTHORIZED')) {
10
- globalThis.process?.['env'] && (globalThis.process.env.REJECT_UNAUTHORIZED = 'false');
11
- }
12
- const { createHttp2Fetch } = await import('./internal/node/http2-fetch.node.js');
13
- return createHttp2Fetch(baseUrl);
14
- }
15
- catch {
16
- // Fallback to regular fetch if h2 module unavailable
17
- }
18
- }
19
- return globalThis.fetch;
20
- }
21
- export async function createCLIClient(config) {
22
- const baseUrl = config?.baseUrl || getRuntimeEnv('VIBES_API_URL') || 'http://localhost:5173';
23
- const fetchImpl = config?.fetch || (await resolveNodeFetch(baseUrl));
24
- const clientConfig = {
25
- baseUrl,
26
- auth: config?.auth || { type: 'none' },
27
- fetch: fetchImpl,
28
- debug: getRuntimeEnv('VIBES_DEBUG') === 'true',
29
- ...config
30
- };
31
- return new VibesClient(clientConfig);
32
- }
33
- //# sourceMappingURL=node.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/lib/client/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAEvE,KAAK,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,OAAO,GACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9F,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC;YACJ,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBAC3C,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,OAAO,CAAC,CAAC;YACvF,CAAC;YACD,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,qCAAqC,CAAC,CAAC;YACjF,OAAO,gBAAgB,CAAC,OAAO,CAAuC,CAAC;QACxE,CAAC;QAAC,MAAM,CAAC;YACR,qDAAqD;QACtD,CAAC;IACF,CAAC;IACD,OAAO,UAAU,CAAC,KAAK,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAA8B;IACnE,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,aAAa,CAAC,eAAe,CAAC,IAAI,uBAAuB,CAAC;IAC7F,MAAM,SAAS,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,MAAM,YAAY,GAAiB;QAClC,OAAO;QACP,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;QACtC,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,KAAK,MAAM;QAC9C,GAAG,MAAM;KACT,CAAC;IACF,OAAO,IAAI,WAAW,CAAC,YAAY,CAAC,CAAC;AACtC,CAAC"}
@@ -1,5 +0,0 @@
1
- export { default as apiRequestToolDescriptor } from './api-request.descriptor.ts';
2
- export { default as apiRequestToolImplementation } from './api-request.impl.consumer.ts';
3
- export { apiRequestInputSchema, apiRequestOutputSchema } from './schemas/index.ts';
4
- export type { ApiRequestInput, ApiRequestOutput } from './schemas/index.ts';
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/api-request/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACnF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,4 +0,0 @@
1
- export { default as apiRequestToolDescriptor } from "./api-request.descriptor.js";
2
- export { default as apiRequestToolImplementation } from "./api-request.impl.consumer.js";
3
- export { apiRequestInputSchema, apiRequestOutputSchema } from "./schemas/index.js";
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/api-request/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC"}
package/src/factory.ts DELETED
@@ -1,114 +0,0 @@
1
- import { VibesClient } from './lib/client/core.ts';
2
- import type { ClientConfig, AuthConfig } from './lib/client/types.ts';
3
- import type {
4
- ApiClientImplementation,
5
- ApiRequestOptions,
6
- ApiStreamEvent,
7
- ApiStreamOptions
8
- } from './schemas.ts';
9
-
10
- export interface ApiClientConfig {
11
- /** Unique identifier for this client instance */
12
- id?: string;
13
- /** Base URL for API requests */
14
- baseUrl?: string;
15
- /** Authentication configuration */
16
- auth?: AuthConfig;
17
- /** Custom fetch implementation */
18
- fetch?: typeof fetch;
19
- /** Request timeout in milliseconds */
20
- timeout?: number;
21
- /** Enable debug logging */
22
- debug?: boolean;
23
- /** Custom headers applied to all requests */
24
- headers?: Record<string, string>;
25
- }
26
-
27
- /**
28
- * Wrap a VibesClient to satisfy the ApiClientImplementation interface.
29
- */
30
- function wrapVibesClient(client: VibesClient): ApiClientImplementation {
31
- return {
32
- get<T = unknown>(endpoint: string, options?: ApiRequestOptions): Promise<T> {
33
- return client.get<T>(endpoint, { method: 'GET', path: endpoint, ...options });
34
- },
35
- post<T = unknown>(endpoint: string, body?: unknown, options?: ApiRequestOptions): Promise<T> {
36
- return client.post<T>(endpoint, body, { method: 'POST', path: endpoint, ...options });
37
- },
38
- put<T = unknown>(endpoint: string, body?: unknown, options?: ApiRequestOptions): Promise<T> {
39
- return client.put<T>(endpoint, body, { method: 'PUT', path: endpoint, ...options });
40
- },
41
- patch<T = unknown>(endpoint: string, body?: unknown, options?: ApiRequestOptions): Promise<T> {
42
- return client.request<T>(endpoint, { method: 'PATCH', body, ...options });
43
- },
44
- delete<T = unknown>(endpoint: string, options?: ApiRequestOptions): Promise<T> {
45
- return client.delete<T>(endpoint, { method: 'DELETE', path: endpoint, ...options });
46
- },
47
- request<T = unknown>(
48
- endpoint: string,
49
- options?: ApiRequestOptions & { method?: string; body?: unknown }
50
- ): Promise<T> {
51
- return client.request<T>(endpoint, {
52
- method: options?.method ?? 'GET',
53
- ...options
54
- });
55
- },
56
- stream<T = unknown>(
57
- endpoint: string,
58
- options?: ApiStreamOptions
59
- ): AsyncIterableIterator<ApiStreamEvent<T>> {
60
- return client.stream<T>(endpoint, {
61
- method: options?.method ?? 'POST',
62
- body: options?.body,
63
- headers: options?.headers,
64
- params: options?.params,
65
- query: options?.query,
66
- timeout: options?.timeout
67
- }) as AsyncIterableIterator<ApiStreamEvent<T>>;
68
- }
69
- };
70
- }
71
-
72
- /**
73
- * Create an API client instance.
74
- *
75
- * @example
76
- * ```ts
77
- * const client = vibesApiClient({ baseUrl: 'https://api.vibes.dev' });
78
- * const data = await client.get('/users');
79
- * ```
80
- */
81
- export function vibesApiClient(config: ApiClientConfig = {}): ApiClientImplementation {
82
- const clientConfig: ClientConfig = {
83
- baseUrl: config.baseUrl,
84
- auth: config.auth,
85
- fetch: config.fetch,
86
- timeout: config.timeout,
87
- debug: config.debug
88
- };
89
-
90
- if (config.headers && Object.keys(config.headers).length > 0) {
91
- const headers = config.headers;
92
- clientConfig.hooks = {
93
- beforeRequest: async (request: Request): Promise<Request> => {
94
- const updated = new Headers(request.headers);
95
- for (const [key, value] of Object.entries(headers)) {
96
- if (value !== undefined) {
97
- updated.set(key, value);
98
- }
99
- }
100
- return new Request(request, { headers: updated });
101
- }
102
- };
103
- }
104
-
105
- const vibes = new VibesClient(clientConfig);
106
- return wrapVibesClient(vibes);
107
- }
108
-
109
- /**
110
- * Create an API client from an existing VibesClient instance.
111
- */
112
- export function fromVibesClient(client: VibesClient): ApiClientImplementation {
113
- return wrapVibesClient(client);
114
- }
package/src/index.ts DELETED
@@ -1,15 +0,0 @@
1
- export { vibesApiClient, fromVibesClient } from './factory.ts';
2
- export type { ApiClientConfig } from './factory.ts';
3
- export type {
4
- ApiClientDescriptor,
5
- ApiClientImplementation,
6
- ApiRequestOptions,
7
- ApiStreamOptions,
8
- ApiStreamEvent
9
- } from './schemas.ts';
10
- export { ApiClientDescriptorSchema } from './schemas.ts';
11
- export { default as clientPlugin } from './plugin.ts';
12
- export { SSEClient, createSSEClient } from './sse-client.ts';
13
- export type { SSEClientOptions, SSEConnectionStatus } from './sse-client.ts';
14
- export { VibesClient } from './lib/client/core.ts';
15
- export type { ClientConfig, AuthConfig, ClientHooks, ClientError } from './lib/client/types.ts';
@@ -1,13 +0,0 @@
1
- export { VibesClient } from './internal/vibes-client.ts';
2
- export type { SSEEvent } from './internal/sse-stream.ts';
3
- export type {
4
- ClientConfig,
5
- AuthConfig,
6
- ClientHooks,
7
- ClientUser,
8
- RequestOptions
9
- } from './types.ts';
10
- export { ClientError } from './types.ts';
11
- export { BaseAPIClient } from './internal/base-client.ts';
12
- export type { BaseAPIConfig, EndpointOptions } from './internal/base-types.ts';
13
- export { Endpoint } from './internal/endpoint.ts';
@@ -1,107 +0,0 @@
1
- import { type BaseAPIConfig, type EndpointOptions, APIError } from './base-types.ts';
2
- import { buildHeaders, buildUrl, createApiError } from './base-helpers.ts';
3
- import { Endpoint } from './endpoint.ts';
4
-
5
- export abstract class BaseAPIClient {
6
- protected config: Required<Omit<BaseAPIConfig, 'auth'>> & {
7
- auth: BaseAPIConfig['auth'];
8
- };
9
- private abortControllers = new Set<AbortController>();
10
-
11
- constructor(config: BaseAPIConfig) {
12
- const merged: Required<Omit<BaseAPIConfig, 'auth'>> & {
13
- auth: BaseAPIConfig['auth'];
14
- } = {
15
- baseUrl: config.baseUrl,
16
- fetch: (config.fetch || globalThis.fetch?.bind(globalThis)) as typeof fetch,
17
- headers: config.headers || {},
18
- timeout: config.timeout || 30000,
19
- debug: config.debug || false,
20
- hooks: config.hooks || {},
21
- auth: config.auth ?? null
22
- };
23
- if (!merged.fetch)
24
- throw new Error('Fetch is not available. Please provide a fetch implementation.');
25
- this.config = merged;
26
- }
27
-
28
- protected endpoint(path: string): Endpoint {
29
- const cleanPath = path.startsWith('/') ? path : `/${path}`;
30
- return new Endpoint(this, cleanPath);
31
- }
32
-
33
- async request<T = unknown>(
34
- request: {
35
- method: string;
36
- path: string;
37
- body?: unknown;
38
- } & EndpointOptions<T>
39
- ): Promise<T> {
40
- const url = buildUrl(this.config.baseUrl, request.path, request.query);
41
- const controller = new AbortController();
42
- this.abortControllers.add(controller);
43
- try {
44
- const authForHeaders = this.config.auth ?? { type: 'none' as const };
45
- const headers = await buildHeaders({
46
- auth: authForHeaders,
47
- headers: { ...this.config.headers, ...request.headers },
48
- includeJsonDefaults: request.body !== undefined
49
- });
50
- const init: RequestInit = {
51
- method: request.method,
52
- headers,
53
- signal: controller.signal
54
- };
55
- const timeout = setTimeout(() => controller.abort(), request.timeout ?? this.config.timeout);
56
- if (request.body !== undefined) init.body = JSON.stringify(request.body);
57
- let req = new Request(url.toString(), init);
58
- if (this.config.hooks?.beforeRequest) req = await this.config.hooks.beforeRequest(req);
59
- const response = await this.config.fetch(req, init);
60
- clearTimeout(timeout);
61
- const finalResponse = this.config.hooks?.afterResponse
62
- ? await this.config.hooks.afterResponse(response)
63
- : response;
64
- if (!finalResponse.ok) {
65
- const error = await createApiError(finalResponse, req);
66
- if (this.config.hooks?.onError) await this.config.hooks.onError(error);
67
- throw error;
68
- }
69
- let data: unknown;
70
- if (finalResponse.status === 204 || finalResponse.headers.get('Content-Length') === '0')
71
- data = undefined;
72
- else if (finalResponse.headers.get('Content-Type')?.includes('application/json'))
73
- data = await finalResponse.json();
74
- else data = await finalResponse.text();
75
- if (request.transform) data = request.transform(data);
76
- if (request.schema) {
77
- const result = request.schema.safeParse(data);
78
- if (!result.success) {
79
- throw new APIError(
80
- `Response validation failed: ${result.error.message}`,
81
- 422,
82
- finalResponse,
83
- req,
84
- data
85
- );
86
- }
87
- return result.data;
88
- }
89
- return data as T;
90
- } finally {
91
- this.abortControllers.delete(controller);
92
- }
93
- }
94
-
95
- cancelAll(): void {
96
- for (const controller of this.abortControllers) controller.abort();
97
- this.abortControllers.clear();
98
- }
99
-
100
- setAuth(auth: BaseAPIConfig['auth']): void {
101
- this.config.auth = auth ?? null;
102
- }
103
-
104
- updateConfig(config: Partial<BaseAPIConfig>): void {
105
- Object.assign(this.config, config);
106
- }
107
- }
@@ -1,74 +0,0 @@
1
- import { type BaseAPIConfig, type EndpointOptions, APIError } from './base-types.ts';
2
-
3
- export function buildUrl(baseUrl: string, path: string, query?: EndpointOptions['query']): URL {
4
- const url = new URL(path, baseUrl);
5
- if (query) {
6
- for (const [key, value] of Object.entries(query)) {
7
- if (value === undefined) continue;
8
- if (Array.isArray(value)) value.forEach((v) => url.searchParams.append(key, String(v)));
9
- else url.searchParams.set(key, String(value));
10
- }
11
- }
12
- return url;
13
- }
14
-
15
- export async function buildHeaders(args: {
16
- auth: NonNullable<BaseAPIConfig['auth']>;
17
- headers: Record<string, string>;
18
- includeJsonDefaults: boolean;
19
- }): Promise<Headers> {
20
- const requestHeaders = new Headers(args.headers);
21
- if (args.includeJsonDefaults && !requestHeaders.has('Content-Type')) {
22
- requestHeaders.set('Content-Type', 'application/json');
23
- }
24
- if (!requestHeaders.has('Accept')) requestHeaders.set('Accept', 'application/json');
25
-
26
- const auth = args.auth;
27
- if (auth) {
28
- const token = auth.credentials || (await auth.provider?.());
29
- if (token) {
30
- switch (auth.type) {
31
- case 'bearer':
32
- requestHeaders.set('Authorization', `Bearer ${token}`);
33
- break;
34
- case 'apiKey': {
35
- const headerName = auth.headerName || 'X-API-Key';
36
- requestHeaders.set(headerName, token);
37
- break;
38
- }
39
- case 'basic':
40
- requestHeaders.set('Authorization', `Basic ${token}`);
41
- break;
42
- case 'custom':
43
- if (auth.headerName && auth.prefix) {
44
- requestHeaders.set(auth.headerName, `${auth.prefix} ${token}`);
45
- }
46
- break;
47
- }
48
- }
49
- }
50
- return requestHeaders;
51
- }
52
-
53
- export async function createApiError(response: Response, request: Request): Promise<APIError> {
54
- let message = `${response.status} ${response.statusText}`;
55
- let body: unknown;
56
- try {
57
- const contentType = response.headers.get('Content-Type');
58
- if (contentType?.includes('application/json')) {
59
- body = await response.json();
60
- if (typeof body === 'object' && body !== null) {
61
- const errorBody = body as { message?: unknown; error?: unknown };
62
- if (typeof errorBody.message === 'string') message = errorBody.message;
63
- else if (typeof errorBody.error === 'string') message = errorBody.error;
64
- else if (errorBody.error !== undefined) message = JSON.stringify(errorBody.error);
65
- }
66
- } else {
67
- const text = await response.text();
68
- if (text) { message = text; body = text; }
69
- }
70
- } catch {
71
- // ignore parsing errors
72
- }
73
- return new APIError(message, response.status, response, request, body);
74
- }