@openviking/react 0.1.2 → 0.1.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.
- package/dist/1~0.js +506 -0
- package/dist/2~0.js +122 -0
- package/dist/{g~0.js → 30~0.js} +292 -167
- package/dist/client/index.d.ts +2 -1
- package/dist/client/paths.d.ts +64 -0
- package/dist/client/response.d.ts +31 -0
- package/dist/client/sse.d.ts +39 -0
- package/dist/client/stream.d.ts +26 -0
- package/dist/client/types.d.ts +104 -0
- package/dist/client.js +1 -239
- package/dist/components/agent-connect/style.css +2 -2
- package/dist/components/file-browser-entries/file-browser-entries-icons.d.ts +18 -0
- package/dist/components/file-browser-entries/file-browser-entries.d.ts +14 -0
- package/dist/components/file-browser-entries/index.d.ts +1 -0
- package/dist/components/file-browser-entries/style.css +155 -0
- package/dist/components/file-browser-entries/style.js +0 -0
- package/dist/components/file-browser-entries/types.d.ts +45 -0
- package/dist/components/file-browser-entries.js +1 -0
- package/dist/components/file-preview/file-preview-directory.d.ts +32 -0
- package/dist/components/file-preview/file-preview-header.d.ts +21 -3
- package/dist/components/file-preview/file-preview-panels.d.ts +41 -0
- package/dist/components/file-preview/file-preview-state.d.ts +10 -3
- package/dist/components/file-preview/file-preview.d.ts +2 -1
- package/dist/components/file-preview/level-selection.d.ts +25 -0
- package/dist/components/file-preview/style.css +76 -3
- package/dist/components/file-preview/types.d.ts +100 -1
- package/dist/components/file-preview/use-directory-level.d.ts +30 -0
- package/dist/components/file-preview/use-file-preview-actions-context.d.ts +6 -2
- package/dist/components/file-preview/use-file-preview-actions.d.ts +1 -1
- package/dist/components/file-preview.js +1 -1
- package/dist/components/file-tree/file-tree-info-tooltip.d.ts +7 -7
- package/dist/components/file-tree/file-tree-row-context.d.ts +0 -5
- package/dist/components/file-tree/file-tree-row-shared.d.ts +9 -2
- package/dist/components/file-tree/file-tree-tooltip-surface.d.ts +8 -8
- package/dist/components/file-tree/style.css +71 -34
- package/dist/components/file-tree/types.d.ts +20 -0
- package/dist/components/scope-switcher/style.css +2 -2
- package/dist/components/style.css +312 -47
- package/dist/components/tui/style.css +2 -2
- package/dist/components/viking-bot/style.css +2 -2
- package/dist/file-preview-viewer~0.js +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/l~0.js +1464 -25
- package/dist/modules/console/style.css +2 -2
- package/dist/modules/file-browser/file-browser-detail-icons.d.ts +10 -0
- package/dist/modules/file-browser/file-browser-detail.d.ts +33 -0
- package/dist/modules/file-browser/file-browser-empty.d.ts +3 -0
- package/dist/modules/file-browser/file-browser-failure.d.ts +22 -0
- package/dist/modules/file-browser/file-browser-icons.d.ts +18 -0
- package/dist/modules/file-browser/file-browser-labels.d.ts +28 -0
- package/dist/modules/file-browser/file-browser-layout.d.ts +27 -0
- package/dist/modules/file-browser/file-browser-toolbar.d.ts +18 -0
- package/dist/modules/file-browser/file-browser-tree-pane.d.ts +30 -0
- package/dist/modules/file-browser/file-browser.d.ts +14 -5
- package/dist/modules/file-browser/find-result.d.ts +24 -0
- package/dist/modules/file-browser/fs-directories.d.ts +33 -0
- package/dist/modules/file-browser/fs-file-kind.d.ts +19 -0
- package/dist/modules/file-browser/fs-icon.d.ts +17 -0
- package/dist/modules/file-browser/fs-model.d.ts +106 -0
- package/dist/modules/file-browser/fs-page.d.ts +16 -0
- package/dist/modules/file-browser/fs-path.d.ts +16 -0
- package/dist/modules/file-browser/fs-read-directory.d.ts +20 -0
- package/dist/modules/file-browser/fs-scope.d.ts +22 -0
- package/dist/modules/file-browser/fs-stat.d.ts +25 -0
- package/dist/modules/file-browser/index.d.ts +3 -1
- package/dist/modules/file-browser/style.css +4927 -35
- package/dist/modules/file-browser/tree-info-copy.d.ts +15 -0
- package/dist/modules/file-browser/tree-info-copy.zh-CN.d.ts +15 -0
- package/dist/modules/file-browser/types.d.ts +189 -44
- package/dist/modules/file-browser/use-container-width.d.ts +17 -0
- package/dist/modules/file-browser/use-file-browser.d.ts +49 -0
- package/dist/modules/file-browser/use-fs-preview.d.ts +51 -0
- package/dist/modules/file-browser/use-fs-search.d.ts +35 -0
- package/dist/modules/file-browser/use-fs-tree.d.ts +43 -0
- package/dist/modules/file-browser/use-request-scope.d.ts +39 -0
- package/dist/modules/file-browser.js +1 -1
- package/dist/modules/scope-cascade/style.css +2 -2
- package/dist/modules/style.css +4933 -41
- package/dist/n~0.js +178 -74
- package/dist/o~0.js +103 -0
- package/dist/shared/components/divider/divider.d.ts +18 -0
- package/dist/shared/components/divider/index.d.ts +1 -0
- package/dist/shared/components/divider/types.d.ts +35 -0
- package/dist/shared/components/overlay/types.d.ts +7 -0
- package/dist/shared/components/{tooltip/use-tooltip-position.d.ts → overlay/use-overlay-position.d.ts} +6 -6
- package/dist/shared/components/popover/index.d.ts +1 -0
- package/dist/shared/components/popover/popover.d.ts +23 -0
- package/dist/shared/components/popover/types.d.ts +50 -0
- package/dist/shared/components/resizable/clamp.d.ts +13 -0
- package/dist/shared/components/resizable/index.d.ts +2 -0
- package/dist/shared/components/resizable/resizable-handle.d.ts +25 -0
- package/dist/shared/components/resizable/types.d.ts +48 -0
- package/dist/shared/components/tooltip/types.d.ts +5 -5
- package/dist/style.css +5345 -188
- package/package.json +6 -1
- package/dist/components/file-tree/file-tree-tooltip.d.ts +0 -17
- package/dist/modules/file-browser/file-browser-toolbar-button.d.ts +0 -10
package/dist/1~0.js
ADDED
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useMemo } from "react";
|
|
3
|
+
class OvClientError extends Error {
|
|
4
|
+
code;
|
|
5
|
+
statusCode;
|
|
6
|
+
details;
|
|
7
|
+
requestId;
|
|
8
|
+
responseBody;
|
|
9
|
+
constructor(options){
|
|
10
|
+
super(options.message, void 0 === options.cause ? void 0 : {
|
|
11
|
+
cause: options.cause
|
|
12
|
+
});
|
|
13
|
+
this.name = 'OvClientError';
|
|
14
|
+
this.code = options.code;
|
|
15
|
+
this.statusCode = options.statusCode;
|
|
16
|
+
this.details = options.details;
|
|
17
|
+
this.requestId = options.requestId;
|
|
18
|
+
this.responseBody = options.responseBody;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function isOvClientError(value) {
|
|
22
|
+
return value instanceof OvClientError;
|
|
23
|
+
}
|
|
24
|
+
const IDENTITY_HEADERS = {
|
|
25
|
+
apiKey: 'X-API-Key',
|
|
26
|
+
accountId: 'X-OpenViking-Account',
|
|
27
|
+
userId: 'X-OpenViking-User',
|
|
28
|
+
resourceId: 'V-Resource-Id'
|
|
29
|
+
};
|
|
30
|
+
async function evaluate(value) {
|
|
31
|
+
if (void 0 === value) return;
|
|
32
|
+
return 'function' == typeof value ? await value() : value;
|
|
33
|
+
}
|
|
34
|
+
async function resolveIdentityLayer(options) {
|
|
35
|
+
const layer = {};
|
|
36
|
+
for (const field of Object.keys(IDENTITY_HEADERS)){
|
|
37
|
+
const value = await evaluate(options?.[field]);
|
|
38
|
+
if (void 0 !== value) layer[field] = value;
|
|
39
|
+
}
|
|
40
|
+
return layer;
|
|
41
|
+
}
|
|
42
|
+
function mergeIdentityLayers(far, near) {
|
|
43
|
+
return {
|
|
44
|
+
...far,
|
|
45
|
+
...near
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function toHeaders(layer) {
|
|
49
|
+
const out = {};
|
|
50
|
+
for (const field of Object.keys(IDENTITY_HEADERS)){
|
|
51
|
+
const value = layer[field]?.trim();
|
|
52
|
+
if (value) out[IDENTITY_HEADERS[field].toLowerCase()] = value;
|
|
53
|
+
}
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
function resolveClientOptions(options, identity) {
|
|
57
|
+
return {
|
|
58
|
+
baseURL: options.baseURL ?? '',
|
|
59
|
+
credentials: options.credentials ?? 'same-origin',
|
|
60
|
+
headers: toHeaders(identity),
|
|
61
|
+
signal: options.signal
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function resolveRequestOptions(local, parent, mergedLayer) {
|
|
65
|
+
const headers = {
|
|
66
|
+
...parent.headers
|
|
67
|
+
};
|
|
68
|
+
for (const field of Object.keys(IDENTITY_HEADERS)){
|
|
69
|
+
const value = mergedLayer[field];
|
|
70
|
+
if (void 0 === value) continue;
|
|
71
|
+
const name = IDENTITY_HEADERS[field].toLowerCase();
|
|
72
|
+
if (value.trim()) headers[name] = value;
|
|
73
|
+
else delete headers[name];
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
baseURL: local?.baseURL ?? parent.baseURL,
|
|
77
|
+
credentials: parent.credentials,
|
|
78
|
+
headers,
|
|
79
|
+
signal: local?.signal ?? parent.signal
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function joinUrl(baseURL, path) {
|
|
83
|
+
const prefix = baseURL.replace(/\/+$/, '');
|
|
84
|
+
return `${prefix}${path.startsWith('/') ? path : `/${path}`}`;
|
|
85
|
+
}
|
|
86
|
+
function buildQuery(query) {
|
|
87
|
+
if (!query) return '';
|
|
88
|
+
const params = new URLSearchParams();
|
|
89
|
+
for (const [key, value] of Object.entries(query))if (null != value) {
|
|
90
|
+
if (Array.isArray(value)) {
|
|
91
|
+
for (const item of value)params.append(key, String(item));
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
params.set(key, String(value));
|
|
95
|
+
}
|
|
96
|
+
const text = params.toString();
|
|
97
|
+
return text ? `?${text}` : '';
|
|
98
|
+
}
|
|
99
|
+
function mergeProviderConfig(inherited, local) {
|
|
100
|
+
const declared = {};
|
|
101
|
+
if (void 0 !== local.apiKey) declared.apiKey = local.apiKey;
|
|
102
|
+
if (void 0 !== local.accountId) declared.accountId = local.accountId;
|
|
103
|
+
if (void 0 !== local.userId) declared.userId = local.userId;
|
|
104
|
+
if (void 0 !== local.resourceId) declared.resourceId = local.resourceId;
|
|
105
|
+
return {
|
|
106
|
+
baseURL: local.baseURL ?? inherited?.baseURL,
|
|
107
|
+
credentials: local.credentials ?? inherited?.credentials,
|
|
108
|
+
signal: local.signal ?? inherited?.signal,
|
|
109
|
+
fetch: local.fetch ?? inherited?.fetch,
|
|
110
|
+
identity: {
|
|
111
|
+
...inherited?.identity,
|
|
112
|
+
...declared
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function isRecord(value) {
|
|
117
|
+
return 'object' == typeof value && null !== value && !Array.isArray(value);
|
|
118
|
+
}
|
|
119
|
+
function readEnvelope(value) {
|
|
120
|
+
return isRecord(value) ? value : {};
|
|
121
|
+
}
|
|
122
|
+
function parseJson(raw) {
|
|
123
|
+
if (!raw.trim()) return;
|
|
124
|
+
try {
|
|
125
|
+
return JSON.parse(raw);
|
|
126
|
+
} catch {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function isAbortError(error) {
|
|
131
|
+
return isRecord(error) && ('AbortError' === error.name || 'ABORT_ERR' === error.code);
|
|
132
|
+
}
|
|
133
|
+
function normalizeTransportError(error, signal) {
|
|
134
|
+
if (isAbortError(error) || signal?.aborted) throw error;
|
|
135
|
+
throw new OvClientError({
|
|
136
|
+
code: 'NETWORK_ERROR',
|
|
137
|
+
message: error instanceof Error ? error.message : 'Network request failed',
|
|
138
|
+
cause: error
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
async function readText(response, signal) {
|
|
142
|
+
try {
|
|
143
|
+
return await response.text();
|
|
144
|
+
} catch (error) {
|
|
145
|
+
normalizeTransportError(error, signal);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async function readBlob(response, signal) {
|
|
149
|
+
try {
|
|
150
|
+
return await response.blob();
|
|
151
|
+
} catch (error) {
|
|
152
|
+
normalizeTransportError(error, signal);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function toClientError(response, body, fallbackCode) {
|
|
156
|
+
const envelope = readEnvelope(body);
|
|
157
|
+
return new OvClientError({
|
|
158
|
+
code: envelope.error?.code ?? fallbackCode ?? `HTTP_${response.status}`,
|
|
159
|
+
message: envelope.error?.message ?? response.statusText,
|
|
160
|
+
statusCode: response.status,
|
|
161
|
+
details: envelope.error?.details,
|
|
162
|
+
requestId: response.headers.get('x-request-id') ?? void 0,
|
|
163
|
+
responseBody: body
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
function throwIfErrorEnvelope(response, body) {
|
|
167
|
+
const envelope = readEnvelope(body);
|
|
168
|
+
if ('error' !== envelope.status) return;
|
|
169
|
+
throw toClientError(response, body, 'UNKNOWN');
|
|
170
|
+
}
|
|
171
|
+
function parseEvent(lines) {
|
|
172
|
+
let data;
|
|
173
|
+
let event;
|
|
174
|
+
let id;
|
|
175
|
+
let retry;
|
|
176
|
+
for (const line of lines){
|
|
177
|
+
if (!line || line.startsWith(':')) continue;
|
|
178
|
+
const colon = line.indexOf(':');
|
|
179
|
+
const field = colon < 0 ? line : line.slice(0, colon);
|
|
180
|
+
let value = colon < 0 ? '' : line.slice(colon + 1);
|
|
181
|
+
if (value.startsWith(' ')) value = value.slice(1);
|
|
182
|
+
if ('data' === field) data = void 0 === data ? value : `${data}\n${value}`;
|
|
183
|
+
else if ('event' === field) event = value;
|
|
184
|
+
else if ('id' === field) id = value;
|
|
185
|
+
else if ('retry' === field) {
|
|
186
|
+
const parsed = Number.parseInt(value, 10);
|
|
187
|
+
if (Number.isFinite(parsed)) retry = parsed;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (void 0 === data && void 0 === event && void 0 === id) return;
|
|
191
|
+
const result = {
|
|
192
|
+
data: data ?? ''
|
|
193
|
+
};
|
|
194
|
+
if (void 0 !== event) result.event = event;
|
|
195
|
+
if (void 0 !== id) result.id = id;
|
|
196
|
+
if (void 0 !== retry) result.retry = retry;
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
function createDecoder() {
|
|
200
|
+
if ("u" > typeof TextDecoderStream) return new TextDecoderStream();
|
|
201
|
+
const decoder = new TextDecoder('utf-8');
|
|
202
|
+
return new TransformStream({
|
|
203
|
+
transform (bytes, controller) {
|
|
204
|
+
controller.enqueue(decoder.decode(bytes, {
|
|
205
|
+
stream: true
|
|
206
|
+
}));
|
|
207
|
+
},
|
|
208
|
+
flush (controller) {
|
|
209
|
+
const rest = decoder.decode();
|
|
210
|
+
if (rest) controller.enqueue(rest);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
function decodeEventStream(body) {
|
|
215
|
+
let line = '';
|
|
216
|
+
let block = [];
|
|
217
|
+
let skipLf = false;
|
|
218
|
+
return body.pipeThrough(createDecoder()).pipeThrough(new TransformStream({
|
|
219
|
+
transform (chunk, controller) {
|
|
220
|
+
const finishLine = ()=>{
|
|
221
|
+
if ('' === line) {
|
|
222
|
+
const parsed = parseEvent(block);
|
|
223
|
+
block = [];
|
|
224
|
+
if (parsed) controller.enqueue(parsed);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
block.push(line);
|
|
228
|
+
line = '';
|
|
229
|
+
};
|
|
230
|
+
for (const char of chunk)if ('\r' === char) {
|
|
231
|
+
finishLine();
|
|
232
|
+
skipLf = true;
|
|
233
|
+
} else if ('\n' === char) if (skipLf) skipLf = false;
|
|
234
|
+
else finishLine();
|
|
235
|
+
else {
|
|
236
|
+
skipLf = false;
|
|
237
|
+
line += char;
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
flush (controller) {
|
|
241
|
+
if ('' !== line) block.push(line);
|
|
242
|
+
line = '';
|
|
243
|
+
const parsed = parseEvent(block);
|
|
244
|
+
block = [];
|
|
245
|
+
if (parsed) controller.enqueue(parsed);
|
|
246
|
+
}
|
|
247
|
+
}));
|
|
248
|
+
}
|
|
249
|
+
const EVENT_STREAM = 'text/event-stream';
|
|
250
|
+
async function openStream(spec, { send, resolveFor, defaults }) {
|
|
251
|
+
const controller = new AbortController();
|
|
252
|
+
let releaseAbort;
|
|
253
|
+
const aborted = new Promise((resolve)=>{
|
|
254
|
+
releaseAbort = ()=>resolve('aborted');
|
|
255
|
+
});
|
|
256
|
+
const stop = ()=>{
|
|
257
|
+
releaseAbort?.();
|
|
258
|
+
controller.abort();
|
|
259
|
+
};
|
|
260
|
+
const resolved = await resolveFor(defaults, spec.options);
|
|
261
|
+
const callerSignals = [
|
|
262
|
+
resolved.signal,
|
|
263
|
+
spec.options?.signal
|
|
264
|
+
].filter((candidate)=>Boolean(candidate));
|
|
265
|
+
let onCallerAbort = ()=>stop();
|
|
266
|
+
const forward = ()=>onCallerAbort();
|
|
267
|
+
for (const callerSignal of callerSignals){
|
|
268
|
+
if (callerSignal.aborted) {
|
|
269
|
+
forward();
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
callerSignal.addEventListener('abort', forward, {
|
|
273
|
+
once: true
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
const detach = ()=>{
|
|
277
|
+
for (const callerSignal of callerSignals)callerSignal.removeEventListener('abort', forward);
|
|
278
|
+
};
|
|
279
|
+
let response;
|
|
280
|
+
try {
|
|
281
|
+
({ response } = await send(spec, {
|
|
282
|
+
accept: EVENT_STREAM,
|
|
283
|
+
...spec.headers
|
|
284
|
+
}, controller.signal, resolved));
|
|
285
|
+
} catch (error) {
|
|
286
|
+
detach();
|
|
287
|
+
throw error;
|
|
288
|
+
}
|
|
289
|
+
let body;
|
|
290
|
+
try {
|
|
291
|
+
if (!response.ok) {
|
|
292
|
+
const raw = await readText(response, controller.signal);
|
|
293
|
+
throw toClientError(response, parseJson(raw) ?? raw);
|
|
294
|
+
}
|
|
295
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
296
|
+
if (!contentType.includes(EVENT_STREAM) || !response.body) {
|
|
297
|
+
const envelope = parseJson(await readText(response, controller.signal));
|
|
298
|
+
if (void 0 !== envelope) throwIfErrorEnvelope(response, envelope);
|
|
299
|
+
throw new OvClientError({
|
|
300
|
+
code: 'UNEXPECTED_CONTENT_TYPE',
|
|
301
|
+
message: `Expected ${EVENT_STREAM}, got ${contentType || 'no content type'}`,
|
|
302
|
+
statusCode: response.status,
|
|
303
|
+
requestId: response.headers.get('x-request-id') ?? void 0,
|
|
304
|
+
responseBody: envelope
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
body = response.body;
|
|
308
|
+
} catch (error) {
|
|
309
|
+
detach();
|
|
310
|
+
throw error;
|
|
311
|
+
}
|
|
312
|
+
const reader = decodeEventStream(body).getReader();
|
|
313
|
+
let released = false;
|
|
314
|
+
const release = ()=>{
|
|
315
|
+
if (released) return;
|
|
316
|
+
released = true;
|
|
317
|
+
detach();
|
|
318
|
+
reader.cancel().catch(()=>{});
|
|
319
|
+
};
|
|
320
|
+
onCallerAbort = ()=>{
|
|
321
|
+
stop();
|
|
322
|
+
release();
|
|
323
|
+
};
|
|
324
|
+
if (controller.signal.aborted) release();
|
|
325
|
+
async function* iterate() {
|
|
326
|
+
try {
|
|
327
|
+
for(;;){
|
|
328
|
+
const next = await Promise.race([
|
|
329
|
+
reader.read(),
|
|
330
|
+
aborted
|
|
331
|
+
]);
|
|
332
|
+
if ('aborted' === next) return;
|
|
333
|
+
if (next.done) return;
|
|
334
|
+
yield next.value;
|
|
335
|
+
}
|
|
336
|
+
} catch (error) {
|
|
337
|
+
if (isAbortError(error)) return;
|
|
338
|
+
throw error;
|
|
339
|
+
} finally{
|
|
340
|
+
release();
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return {
|
|
344
|
+
abort: ()=>{
|
|
345
|
+
stop();
|
|
346
|
+
release();
|
|
347
|
+
},
|
|
348
|
+
[Symbol.asyncIterator]: iterate
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
async function client_resolveFor(defaults, override) {
|
|
352
|
+
const baseLayer = await resolveIdentityLayer(defaults);
|
|
353
|
+
const localLayer = await resolveIdentityLayer(override);
|
|
354
|
+
const parent = resolveClientOptions(defaults, baseLayer);
|
|
355
|
+
return resolveRequestOptions(override, parent, mergeIdentityLayers(baseLayer, localLayer));
|
|
356
|
+
}
|
|
357
|
+
function buildRequest(effective, spec, headers) {
|
|
358
|
+
const hasBody = void 0 !== spec.body;
|
|
359
|
+
return {
|
|
360
|
+
url: joinUrl(effective.baseURL, spec.path) + buildQuery(spec.query),
|
|
361
|
+
init: {
|
|
362
|
+
method: spec.method,
|
|
363
|
+
headers: hasBody ? {
|
|
364
|
+
'content-type': 'application/json',
|
|
365
|
+
...headers
|
|
366
|
+
} : headers,
|
|
367
|
+
body: hasBody ? JSON.stringify(spec.body) : void 0,
|
|
368
|
+
credentials: effective.credentials
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
function createOvClient(options = {}) {
|
|
373
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
374
|
+
if (!fetchImpl) throw new Error('createOvClient needs a fetch implementation. Pass `fetch` on platforms without a global one.');
|
|
375
|
+
const defaults = options;
|
|
376
|
+
async function send(spec, headers, signal, resolved) {
|
|
377
|
+
const effective = resolved ?? await client_resolveFor(defaults, spec.options);
|
|
378
|
+
const { url, init } = buildRequest(effective, spec, {
|
|
379
|
+
...headers,
|
|
380
|
+
...effective.headers
|
|
381
|
+
});
|
|
382
|
+
const active = signal ?? effective.signal;
|
|
383
|
+
try {
|
|
384
|
+
return {
|
|
385
|
+
response: await fetchImpl(url, {
|
|
386
|
+
...init,
|
|
387
|
+
signal: active
|
|
388
|
+
}),
|
|
389
|
+
effective
|
|
390
|
+
};
|
|
391
|
+
} catch (error) {
|
|
392
|
+
normalizeTransportError(error, active);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
async function requestJson(spec) {
|
|
396
|
+
const { response, effective } = await send(spec);
|
|
397
|
+
const raw = await readText(response, effective.signal);
|
|
398
|
+
const parsed = parseJson(raw);
|
|
399
|
+
const body = void 0 !== parsed ? parsed : raw.trim() ? raw : void 0;
|
|
400
|
+
if (!response.ok) throw toClientError(response, body);
|
|
401
|
+
throwIfErrorEnvelope(response, body);
|
|
402
|
+
const envelope = readEnvelope(body);
|
|
403
|
+
return {
|
|
404
|
+
result: 'result' in envelope ? envelope.result : body,
|
|
405
|
+
hasMore: true === envelope.has_more
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
const client = {
|
|
409
|
+
get baseURL () {
|
|
410
|
+
return defaults.baseURL ?? '';
|
|
411
|
+
},
|
|
412
|
+
async request (spec) {
|
|
413
|
+
if ('blob' === spec.responseType) {
|
|
414
|
+
const { response, effective } = await send(spec);
|
|
415
|
+
if (!response.ok) {
|
|
416
|
+
const raw = await readText(response, effective.signal);
|
|
417
|
+
throw toClientError(response, parseJson(raw) ?? raw);
|
|
418
|
+
}
|
|
419
|
+
return await readBlob(response, effective.signal);
|
|
420
|
+
}
|
|
421
|
+
const { result } = await requestJson(spec);
|
|
422
|
+
return result;
|
|
423
|
+
},
|
|
424
|
+
requestEnvelope (spec) {
|
|
425
|
+
if ('blob' === spec.responseType) return Promise.reject(new OvClientError({
|
|
426
|
+
code: 'INVALID_REQUEST',
|
|
427
|
+
message: 'requestEnvelope does not support responseType: blob'
|
|
428
|
+
}));
|
|
429
|
+
return requestJson(spec);
|
|
430
|
+
},
|
|
431
|
+
stream (spec) {
|
|
432
|
+
return openStream(spec, {
|
|
433
|
+
send,
|
|
434
|
+
resolveFor: client_resolveFor,
|
|
435
|
+
defaults
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
};
|
|
439
|
+
return client;
|
|
440
|
+
}
|
|
441
|
+
const OvClientContext = /*#__PURE__*/ createContext(null);
|
|
442
|
+
function OpenVikingProvider({ baseURL, apiKey, accountId, userId, resourceId, credentials, signal, fetch, children }) {
|
|
443
|
+
const parent = useContext(OvClientContext);
|
|
444
|
+
const value = useMemo(()=>{
|
|
445
|
+
const base = mergeProviderConfig(parent?.base, {
|
|
446
|
+
baseURL,
|
|
447
|
+
apiKey,
|
|
448
|
+
accountId,
|
|
449
|
+
userId,
|
|
450
|
+
resourceId,
|
|
451
|
+
credentials,
|
|
452
|
+
signal,
|
|
453
|
+
fetch
|
|
454
|
+
});
|
|
455
|
+
return {
|
|
456
|
+
base,
|
|
457
|
+
client: createOvClient({
|
|
458
|
+
...base.identity,
|
|
459
|
+
baseURL: base.baseURL,
|
|
460
|
+
credentials: base.credentials,
|
|
461
|
+
signal: base.signal,
|
|
462
|
+
fetch: base.fetch
|
|
463
|
+
})
|
|
464
|
+
};
|
|
465
|
+
}, [
|
|
466
|
+
parent,
|
|
467
|
+
baseURL,
|
|
468
|
+
apiKey,
|
|
469
|
+
accountId,
|
|
470
|
+
userId,
|
|
471
|
+
resourceId,
|
|
472
|
+
credentials,
|
|
473
|
+
signal,
|
|
474
|
+
fetch
|
|
475
|
+
]);
|
|
476
|
+
return /*#__PURE__*/ jsx(OvClientContext.Provider, {
|
|
477
|
+
value: value,
|
|
478
|
+
children: children
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
function useOvClient() {
|
|
482
|
+
return useContext(OvClientContext)?.client ?? null;
|
|
483
|
+
}
|
|
484
|
+
const OV_PATHS = {
|
|
485
|
+
fsLs: '/api/v1/fs/ls',
|
|
486
|
+
fsStat: '/api/v1/fs/stat',
|
|
487
|
+
fsTree: '/api/v1/fs/tree',
|
|
488
|
+
fsMkdir: '/api/v1/fs/mkdir',
|
|
489
|
+
fsMv: '/api/v1/fs/mv',
|
|
490
|
+
contentRead: '/api/v1/content/read',
|
|
491
|
+
contentAbstract: '/api/v1/content/abstract',
|
|
492
|
+
contentOverview: '/api/v1/content/overview',
|
|
493
|
+
contentDownload: '/api/v1/content/download',
|
|
494
|
+
contentWrite: '/api/v1/content/write',
|
|
495
|
+
searchGlob: '/api/v1/search/glob',
|
|
496
|
+
searchFind: '/api/v1/search/find',
|
|
497
|
+
searchGrep: '/api/v1/search/grep',
|
|
498
|
+
sessions: '/api/v1/sessions',
|
|
499
|
+
botChat: '/bot/v1/chat',
|
|
500
|
+
botChatStream: '/bot/v1/chat/stream'
|
|
501
|
+
};
|
|
502
|
+
const OV_PATH_BUILDERS = {
|
|
503
|
+
session: (sessionId)=>`${OV_PATHS.sessions}/${encodeURIComponent(sessionId)}`,
|
|
504
|
+
sessionMessages: (sessionId)=>`${OV_PATH_BUILDERS.session(sessionId)}/messages`
|
|
505
|
+
};
|
|
506
|
+
export { OV_PATHS, OV_PATH_BUILDERS, OpenVikingProvider, OvClientError, createOvClient, isOvClientError, useOvClient };
|
package/dist/2~0.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
function Divider({ orientation = 'vertical', length, thickness = 1, color, className, style, ...rest }) {
|
|
3
|
+
const vertical = 'vertical' === orientation;
|
|
4
|
+
const size = vertical ? {
|
|
5
|
+
flex: 'none',
|
|
6
|
+
width: thickness,
|
|
7
|
+
height: length
|
|
8
|
+
} : {
|
|
9
|
+
flex: 'none',
|
|
10
|
+
width: length ?? '100%',
|
|
11
|
+
height: thickness
|
|
12
|
+
};
|
|
13
|
+
return /*#__PURE__*/ jsx("div", {
|
|
14
|
+
...rest,
|
|
15
|
+
role: "separator",
|
|
16
|
+
"aria-orientation": orientation,
|
|
17
|
+
className: [
|
|
18
|
+
'ov-divider',
|
|
19
|
+
className
|
|
20
|
+
].filter(Boolean).join(' '),
|
|
21
|
+
style: {
|
|
22
|
+
background: color ?? 'var(--ov-ui-color-border-2, var(--ov-ui-border-2-default, #e1e4f2))',
|
|
23
|
+
...size,
|
|
24
|
+
...style
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function ConnectAgentIcon() {
|
|
29
|
+
return /*#__PURE__*/ jsx("svg", {
|
|
30
|
+
width: "14",
|
|
31
|
+
height: "14",
|
|
32
|
+
viewBox: "0 0 14 14",
|
|
33
|
+
fill: "none",
|
|
34
|
+
stroke: "currentColor",
|
|
35
|
+
strokeWidth: "1.4",
|
|
36
|
+
strokeLinecap: "round",
|
|
37
|
+
strokeLinejoin: "round",
|
|
38
|
+
"aria-hidden": "true",
|
|
39
|
+
focusable: "false",
|
|
40
|
+
children: /*#__PURE__*/ jsx("path", {
|
|
41
|
+
d: "M5.187 1.75V3.736M8.876 1.75V3.736M7.031 10.547V12.25M4.052 3.736H10.011A1.135 1.135 0 0 1 11.147 4.872V8.277A2.27 2.27 0 0 1 8.876 10.547H5.187A2.27 2.27 0 0 1 2.917 8.277V4.872A1.135 1.135 0 0 1 4.052 3.736Z"
|
|
42
|
+
})
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function ImportResourcesIcon() {
|
|
46
|
+
return /*#__PURE__*/ jsx("svg", {
|
|
47
|
+
width: "12",
|
|
48
|
+
height: "12",
|
|
49
|
+
viewBox: "0 0 12 12",
|
|
50
|
+
fill: "none",
|
|
51
|
+
stroke: "currentColor",
|
|
52
|
+
strokeWidth: "1.4",
|
|
53
|
+
strokeLinecap: "round",
|
|
54
|
+
strokeLinejoin: "round",
|
|
55
|
+
"aria-hidden": "true",
|
|
56
|
+
focusable: "false",
|
|
57
|
+
children: /*#__PURE__*/ jsx("path", {
|
|
58
|
+
d: "M10.5 7.5V8.1C10.5 8.94008 10.5 9.36012 10.3365 9.68099C10.1927 9.96323 9.96323 10.1927 9.68099 10.3365C9.36012 10.5 8.94008 10.5 8.1 10.5H3.9C3.05992 10.5 2.63988 10.5 2.31901 10.3365C2.03677 10.1927 1.8073 9.96323 1.66349 9.68099C1.5 9.36012 1.5 8.94008 1.5 8.1V7.5M3.5 4L6 1.5L8.5 4M6 1.5V7.5"
|
|
59
|
+
})
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const DEFAULT_LABELS = {
|
|
63
|
+
connectAgent: 'Connect agent',
|
|
64
|
+
importResources: 'Import resources'
|
|
65
|
+
};
|
|
66
|
+
function FileBrowserEntries({ onConnectAgent, onImportResources, labels, className, ...rest }) {
|
|
67
|
+
const text = {
|
|
68
|
+
...DEFAULT_LABELS,
|
|
69
|
+
...labels
|
|
70
|
+
};
|
|
71
|
+
if (!onConnectAgent && !onImportResources) return null;
|
|
72
|
+
return /*#__PURE__*/ jsxs("div", {
|
|
73
|
+
...rest,
|
|
74
|
+
className: [
|
|
75
|
+
'ov-file-browser-entries',
|
|
76
|
+
className
|
|
77
|
+
].filter(Boolean).join(' '),
|
|
78
|
+
children: [
|
|
79
|
+
onConnectAgent ? /*#__PURE__*/ jsxs("button", {
|
|
80
|
+
type: "button",
|
|
81
|
+
className: "ov-file-browser-entries__entry",
|
|
82
|
+
onClick: onConnectAgent,
|
|
83
|
+
children: [
|
|
84
|
+
/*#__PURE__*/ jsx("span", {
|
|
85
|
+
className: "ov-file-browser-entries__icon",
|
|
86
|
+
"aria-hidden": "true",
|
|
87
|
+
children: /*#__PURE__*/ jsx(ConnectAgentIcon, {})
|
|
88
|
+
}),
|
|
89
|
+
/*#__PURE__*/ jsx("span", {
|
|
90
|
+
className: "ov-file-browser-entries__label",
|
|
91
|
+
children: text.connectAgent
|
|
92
|
+
})
|
|
93
|
+
]
|
|
94
|
+
}) : null,
|
|
95
|
+
onConnectAgent && onImportResources ? /*#__PURE__*/ jsx(Divider, {
|
|
96
|
+
className: "ov-file-browser-entries__divider",
|
|
97
|
+
length: 12,
|
|
98
|
+
color: "var(--ov-ui-color-primary, var(--ov-ui-primary-default, #5252ff))",
|
|
99
|
+
style: {
|
|
100
|
+
opacity: 0.5
|
|
101
|
+
}
|
|
102
|
+
}) : null,
|
|
103
|
+
onImportResources ? /*#__PURE__*/ jsxs("button", {
|
|
104
|
+
type: "button",
|
|
105
|
+
className: "ov-file-browser-entries__entry",
|
|
106
|
+
onClick: onImportResources,
|
|
107
|
+
children: [
|
|
108
|
+
/*#__PURE__*/ jsx("span", {
|
|
109
|
+
className: "ov-file-browser-entries__icon",
|
|
110
|
+
"aria-hidden": "true",
|
|
111
|
+
children: /*#__PURE__*/ jsx(ImportResourcesIcon, {})
|
|
112
|
+
}),
|
|
113
|
+
/*#__PURE__*/ jsx("span", {
|
|
114
|
+
className: "ov-file-browser-entries__label",
|
|
115
|
+
children: text.importResources
|
|
116
|
+
})
|
|
117
|
+
]
|
|
118
|
+
}) : null
|
|
119
|
+
]
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
export { FileBrowserEntries };
|