@book.dev/sdk 1.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +23 -0
- package/dist/account.d.ts +57 -0
- package/dist/account.js +104 -0
- package/dist/account.js.map +1 -0
- package/dist/ai.d.ts +264 -0
- package/dist/ai.js +36 -0
- package/dist/ai.js.map +1 -0
- package/dist/backup.d.ts +52 -0
- package/dist/backup.js +35 -0
- package/dist/backup.js.map +1 -0
- package/dist/bookFolder.d.ts +44 -0
- package/dist/bookFolder.js +98 -0
- package/dist/bookFolder.js.map +1 -0
- package/dist/bookfile.d.ts +42 -0
- package/dist/bookfile.js +159 -0
- package/dist/bookfile.js.map +1 -0
- package/dist/client.d.ts +279 -0
- package/dist/client.js +502 -0
- package/dist/client.js.map +1 -0
- package/dist/connection.d.ts +20 -0
- package/dist/connection.js +77 -0
- package/dist/connection.js.map +1 -0
- package/dist/content.d.ts +38 -0
- package/dist/content.js +107 -0
- package/dist/content.js.map +1 -0
- package/dist/database.d.ts +687 -0
- package/dist/database.js +1082 -0
- package/dist/database.js.map +1 -0
- package/dist/formula.d.ts +41 -0
- package/dist/formula.js +469 -0
- package/dist/formula.js.map +1 -0
- package/dist/forwarding/challenge.d.ts +35 -0
- package/dist/forwarding/challenge.js +45 -0
- package/dist/forwarding/challenge.js.map +1 -0
- package/dist/forwarding/encoding.d.ts +14 -0
- package/dist/forwarding/encoding.js +54 -0
- package/dist/forwarding/encoding.js.map +1 -0
- package/dist/forwarding/forwardingClient.d.ts +76 -0
- package/dist/forwarding/forwardingClient.js +128 -0
- package/dist/forwarding/forwardingClient.js.map +1 -0
- package/dist/forwarding/index.d.ts +5 -0
- package/dist/forwarding/index.js +14 -0
- package/dist/forwarding/index.js.map +1 -0
- package/dist/forwarding/siteKey.d.ts +12 -0
- package/dist/forwarding/siteKey.js +36 -0
- package/dist/forwarding/siteKey.js.map +1 -0
- package/dist/forwarding/tunnelClient.d.ts +56 -0
- package/dist/forwarding/tunnelClient.js +206 -0
- package/dist/forwarding/tunnelClient.js.map +1 -0
- package/dist/forwarding/tunnelProtocol.d.ts +45 -0
- package/dist/forwarding/tunnelProtocol.js +29 -0
- package/dist/forwarding/tunnelProtocol.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/mtime.d.ts +51 -0
- package/dist/mtime.js +84 -0
- package/dist/mtime.js.map +1 -0
- package/dist/pageProperties.d.ts +80 -0
- package/dist/pageProperties.js +97 -0
- package/dist/pageProperties.js.map +1 -0
- package/dist/plugins.d.ts +110 -0
- package/dist/plugins.js +113 -0
- package/dist/plugins.js.map +1 -0
- package/dist/routes.d.ts +89 -0
- package/dist/routes.js +89 -0
- package/dist/routes.js.map +1 -0
- package/dist/sampleDocument.d.ts +25 -0
- package/dist/sampleDocument.js +67 -0
- package/dist/sampleDocument.js.map +1 -0
- package/dist/suggestions.d.ts +126 -0
- package/dist/suggestions.js +21 -0
- package/dist/suggestions.js.map +1 -0
- package/dist/templates.d.ts +35 -0
- package/dist/templates.js +555 -0
- package/dist/templates.js.map +1 -0
- package/dist/types.d.ts +146 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/package.json +33 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
import { API } from './routes';
|
|
2
|
+
/**
|
|
3
|
+
* The global `fetch`, wrapped so it's safe to store on an object and call as a
|
|
4
|
+
* property/method. WebKit (the desktop WKWebView) throws "Can only call
|
|
5
|
+
* Window.fetch on instances of Window" when `fetch` runs with a `this` that
|
|
6
|
+
* isn't the window — which is exactly what `obj.fetchImpl(...)` does once the
|
|
7
|
+
* bare global is assigned to a property. Calling the unqualified global here
|
|
8
|
+
* sidesteps that, so it's the right default wherever a {@link FetchLike} is
|
|
9
|
+
* stored and later invoked as a method.
|
|
10
|
+
*/
|
|
11
|
+
export const globalFetch = (input, init) => fetch(input, init);
|
|
12
|
+
class LiveStream {
|
|
13
|
+
constructor(liveUrl, fetchers, createSource) {
|
|
14
|
+
this.liveUrl = liveUrl;
|
|
15
|
+
this.fetchers = fetchers;
|
|
16
|
+
this.createSource = createSource;
|
|
17
|
+
this.source = null;
|
|
18
|
+
this.listListeners = new Set();
|
|
19
|
+
this.pageListeners = new Map();
|
|
20
|
+
this.rowsListeners = new Map();
|
|
21
|
+
// The source reconnects on its own after a drop (server/app restart). We track
|
|
22
|
+
// a prior disconnect so that, on the *next* successful open, we re-fetch every
|
|
23
|
+
// open subscription — the firehose only replays the page *list* on connect, so
|
|
24
|
+
// open pages/rows would otherwise show stale data until their next edit.
|
|
25
|
+
this.sawError = false;
|
|
26
|
+
}
|
|
27
|
+
dispatch(raw) {
|
|
28
|
+
let ev;
|
|
29
|
+
try {
|
|
30
|
+
ev = JSON.parse(raw);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (ev.type === 'list') {
|
|
36
|
+
this.listListeners.forEach((fn) => fn(ev.pages));
|
|
37
|
+
}
|
|
38
|
+
else if (ev.type === 'page') {
|
|
39
|
+
const page = ev.page;
|
|
40
|
+
this.pageListeners.get(page.id)?.forEach((s) => s.onPage?.(page));
|
|
41
|
+
}
|
|
42
|
+
else if (ev.type === 'deleted') {
|
|
43
|
+
const id = ev.id;
|
|
44
|
+
this.pageListeners.get(id)?.forEach((s) => s.onDeleted?.(id));
|
|
45
|
+
}
|
|
46
|
+
else if (ev.type === 'rows') {
|
|
47
|
+
this.rowsListeners.get(ev.databaseId)?.forEach((fn) => fn(ev.rows));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
ensureOpen() {
|
|
51
|
+
if (this.source)
|
|
52
|
+
return;
|
|
53
|
+
const source = this.createSource(this.liveUrl);
|
|
54
|
+
const handle = (e) => {
|
|
55
|
+
if (e.data != null)
|
|
56
|
+
this.dispatch(e.data);
|
|
57
|
+
};
|
|
58
|
+
for (const name of ['list', 'page', 'deleted', 'rows'])
|
|
59
|
+
source.addEventListener(name, handle);
|
|
60
|
+
// A drop sets `sawError`; the source auto-reconnects and fires `open` again,
|
|
61
|
+
// at which point we resync so every client transparently re-attaches after a
|
|
62
|
+
// server or app restart (OB-132).
|
|
63
|
+
source.addEventListener('error', () => {
|
|
64
|
+
this.sawError = true;
|
|
65
|
+
});
|
|
66
|
+
source.addEventListener('open', () => {
|
|
67
|
+
if (this.sawError) {
|
|
68
|
+
this.sawError = false;
|
|
69
|
+
void this.resync();
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
this.source = source;
|
|
73
|
+
}
|
|
74
|
+
/** Re-fetch and re-dispatch every open subscription after a reconnect. */
|
|
75
|
+
async resync() {
|
|
76
|
+
try {
|
|
77
|
+
const pages = await this.fetchers.listPages();
|
|
78
|
+
this.listListeners.forEach((fn) => fn(pages));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Server still coming back up — the next event or resync will catch up.
|
|
82
|
+
}
|
|
83
|
+
for (const id of [...this.pageListeners.keys()]) {
|
|
84
|
+
try {
|
|
85
|
+
const page = await this.fetchers.getPage(id);
|
|
86
|
+
if (page)
|
|
87
|
+
this.pageListeners.get(id)?.forEach((s) => s.onPage?.(page));
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
/* keep going */
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
for (const dbId of [...this.rowsListeners.keys()]) {
|
|
94
|
+
try {
|
|
95
|
+
const rows = await this.fetchers.listRows(dbId);
|
|
96
|
+
this.rowsListeners.get(dbId)?.forEach((fn) => fn(rows));
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
/* keep going */
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
maybeClose() {
|
|
104
|
+
if (this.listListeners.size === 0 && this.pageListeners.size === 0 && this.rowsListeners.size === 0) {
|
|
105
|
+
this.source?.close();
|
|
106
|
+
this.source = null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
removeFromMap(map, key, value) {
|
|
110
|
+
const set = map.get(key);
|
|
111
|
+
set?.delete(value);
|
|
112
|
+
if (set && set.size === 0)
|
|
113
|
+
map.delete(key);
|
|
114
|
+
}
|
|
115
|
+
onList(fn) {
|
|
116
|
+
this.ensureOpen();
|
|
117
|
+
this.listListeners.add(fn);
|
|
118
|
+
return () => {
|
|
119
|
+
this.listListeners.delete(fn);
|
|
120
|
+
this.maybeClose();
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
onPage(id, sub) {
|
|
124
|
+
this.ensureOpen();
|
|
125
|
+
let set = this.pageListeners.get(id);
|
|
126
|
+
if (!set) {
|
|
127
|
+
set = new Set();
|
|
128
|
+
this.pageListeners.set(id, set);
|
|
129
|
+
}
|
|
130
|
+
set.add(sub);
|
|
131
|
+
return () => {
|
|
132
|
+
this.removeFromMap(this.pageListeners, id, sub);
|
|
133
|
+
this.maybeClose();
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
onRows(databaseId, fn) {
|
|
137
|
+
this.ensureOpen();
|
|
138
|
+
let set = this.rowsListeners.get(databaseId);
|
|
139
|
+
if (!set) {
|
|
140
|
+
set = new Set();
|
|
141
|
+
this.rowsListeners.set(databaseId, set);
|
|
142
|
+
}
|
|
143
|
+
set.add(fn);
|
|
144
|
+
return () => {
|
|
145
|
+
this.removeFromMap(this.rowsListeners, databaseId, fn);
|
|
146
|
+
this.maybeClose();
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* {@link DataClient} backed by an OpenBook server's HTTP API. Isomorphic, and
|
|
152
|
+
* transport-pluggable: by default it uses the global `fetch` + `EventSource`
|
|
153
|
+
* (web, remote), but the desktop injects a `fetchImpl`/`createLiveSource` that
|
|
154
|
+
* tunnel over its host IPC bridge to a portless Unix-socket server.
|
|
155
|
+
*/
|
|
156
|
+
export class HttpDataClient {
|
|
157
|
+
/**
|
|
158
|
+
* @param baseUrl Server base URL. May be empty when a `fetchImpl` resolves
|
|
159
|
+
* paths itself (the desktop IPC transport).
|
|
160
|
+
* @param token Optional access token required by a published (LAN) server;
|
|
161
|
+
* sent as `Authorization: Bearer` on requests and `?token=` on
|
|
162
|
+
* the SSE stream (EventSource can't set headers). Omit for a
|
|
163
|
+
* loopback/local server, which needs none.
|
|
164
|
+
* @param opts Optional transport overrides (desktop IPC).
|
|
165
|
+
*/
|
|
166
|
+
constructor(baseUrl, token, opts = {}) {
|
|
167
|
+
this.live = null;
|
|
168
|
+
this.baseUrl = baseUrl.replace(/\/+$/, '');
|
|
169
|
+
this.token = token && token.length > 0 ? token : undefined;
|
|
170
|
+
this.fetchImpl = opts.fetchImpl ?? globalFetch;
|
|
171
|
+
this.createLiveSource = opts.createLiveSource ?? ((url) => new EventSource(url));
|
|
172
|
+
}
|
|
173
|
+
/** `fetch` (or the injected transport) with the access token attached (when set). */
|
|
174
|
+
authFetch(input, init = {}) {
|
|
175
|
+
if (!this.token)
|
|
176
|
+
return this.fetchImpl(input, init);
|
|
177
|
+
return this.fetchImpl(input, {
|
|
178
|
+
...init,
|
|
179
|
+
headers: { ...init.headers, Authorization: `Bearer ${this.token}` },
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/** Lazily create the shared live connection (browser-only). */
|
|
183
|
+
liveStream() {
|
|
184
|
+
if (!this.live) {
|
|
185
|
+
// EventSource can't send headers, so the token rides the URL.
|
|
186
|
+
const liveUrl = `${this.baseUrl}${API.live}${this.token ? `?token=${encodeURIComponent(this.token)}` : ''}`;
|
|
187
|
+
this.live = new LiveStream(liveUrl, {
|
|
188
|
+
listPages: () => this.listPages(),
|
|
189
|
+
getPage: (id) => this.getPage(id),
|
|
190
|
+
listRows: (databaseId) => this.listRows(databaseId),
|
|
191
|
+
}, this.createLiveSource);
|
|
192
|
+
}
|
|
193
|
+
return this.live;
|
|
194
|
+
}
|
|
195
|
+
async listPages() {
|
|
196
|
+
return this.request('GET', API.pages);
|
|
197
|
+
}
|
|
198
|
+
async getPage(id) {
|
|
199
|
+
const res = await this.authFetch(`${this.baseUrl}${API.page(id)}`, { cache: 'no-store' });
|
|
200
|
+
if (res.status === 404)
|
|
201
|
+
return null;
|
|
202
|
+
await throwIfNotOk(res);
|
|
203
|
+
return (await res.json());
|
|
204
|
+
}
|
|
205
|
+
async savePage(input) {
|
|
206
|
+
// Known id → PUT to that resource; otherwise POST to create.
|
|
207
|
+
if (input.id) {
|
|
208
|
+
return this.request('PUT', API.page(input.id), input);
|
|
209
|
+
}
|
|
210
|
+
return this.request('POST', API.pages, input);
|
|
211
|
+
}
|
|
212
|
+
async renamePage(id, name) {
|
|
213
|
+
return this.request('PATCH', API.page(id), { name });
|
|
214
|
+
}
|
|
215
|
+
async setPageProperties(id, properties) {
|
|
216
|
+
return this.request('PATCH', API.pageProperties(id), { properties });
|
|
217
|
+
}
|
|
218
|
+
async listBacklinks(id) {
|
|
219
|
+
return this.request('GET', API.pageBacklinks(id));
|
|
220
|
+
}
|
|
221
|
+
async movePage(id, move) {
|
|
222
|
+
return this.request('PUT', API.pageMove(id), move);
|
|
223
|
+
}
|
|
224
|
+
async deletePage(id) {
|
|
225
|
+
const res = await this.authFetch(`${this.baseUrl}${API.page(id)}`, { method: 'DELETE' });
|
|
226
|
+
if (res.status === 404)
|
|
227
|
+
return false;
|
|
228
|
+
await throwIfNotOk(res);
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
async exportSpace() {
|
|
232
|
+
return this.request('GET', API.exportSpace);
|
|
233
|
+
}
|
|
234
|
+
async importSpace(req) {
|
|
235
|
+
return this.request('POST', API.importSpace, req);
|
|
236
|
+
}
|
|
237
|
+
async listTrash() {
|
|
238
|
+
return this.request('GET', API.trash);
|
|
239
|
+
}
|
|
240
|
+
async restorePage(id) {
|
|
241
|
+
const res = await this.authFetch(`${this.baseUrl}${API.pageRestore(id)}`, { method: 'POST' });
|
|
242
|
+
if (res.status === 404)
|
|
243
|
+
return null;
|
|
244
|
+
await throwIfNotOk(res);
|
|
245
|
+
return (await res.json());
|
|
246
|
+
}
|
|
247
|
+
async purgePage(id) {
|
|
248
|
+
const res = await this.authFetch(`${this.baseUrl}${API.trashItem(id)}`, { method: 'DELETE' });
|
|
249
|
+
if (res.status === 404)
|
|
250
|
+
return false;
|
|
251
|
+
await throwIfNotOk(res);
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
async emptyTrash() {
|
|
255
|
+
const { purged } = await this.request('DELETE', API.trash);
|
|
256
|
+
return purged;
|
|
257
|
+
}
|
|
258
|
+
subscribePage(id, handlers) {
|
|
259
|
+
return this.liveStream().onPage(id, handlers);
|
|
260
|
+
}
|
|
261
|
+
subscribePages(onList) {
|
|
262
|
+
return this.liveStream().onList(onList);
|
|
263
|
+
}
|
|
264
|
+
// ── Databases ──────────────────────────────────────────────────────────────
|
|
265
|
+
async createDatabase(input) {
|
|
266
|
+
return this.request('POST', API.databases, input);
|
|
267
|
+
}
|
|
268
|
+
async getDatabase(id) {
|
|
269
|
+
const res = await this.authFetch(`${this.baseUrl}${API.database(id)}`, { cache: 'no-store' });
|
|
270
|
+
if (res.status === 404)
|
|
271
|
+
return null;
|
|
272
|
+
await throwIfNotOk(res);
|
|
273
|
+
return (await res.json());
|
|
274
|
+
}
|
|
275
|
+
async getPageDatabase(pageId) {
|
|
276
|
+
const res = await this.authFetch(`${this.baseUrl}${API.pageDatabase(pageId)}`, { cache: 'no-store' });
|
|
277
|
+
if (res.status === 404)
|
|
278
|
+
return null;
|
|
279
|
+
await throwIfNotOk(res);
|
|
280
|
+
return (await res.json());
|
|
281
|
+
}
|
|
282
|
+
async updateDatabase(id, patch) {
|
|
283
|
+
return this.request('PATCH', API.database(id), patch);
|
|
284
|
+
}
|
|
285
|
+
async deleteDatabase(id) {
|
|
286
|
+
const res = await this.authFetch(`${this.baseUrl}${API.database(id)}`, { method: 'DELETE' });
|
|
287
|
+
if (res.status === 404)
|
|
288
|
+
return false;
|
|
289
|
+
await throwIfNotOk(res);
|
|
290
|
+
return true;
|
|
291
|
+
}
|
|
292
|
+
async listRows(databaseId) {
|
|
293
|
+
return this.request('GET', API.databaseRows(databaseId));
|
|
294
|
+
}
|
|
295
|
+
async createRow(databaseId, input = {}) {
|
|
296
|
+
return this.request('POST', API.databaseRows(databaseId), input);
|
|
297
|
+
}
|
|
298
|
+
async updateRow(databaseId, rowId, patch) {
|
|
299
|
+
return this.request('PATCH', API.databaseRow(databaseId, rowId), patch);
|
|
300
|
+
}
|
|
301
|
+
async reorderRows(databaseId, orderedIds) {
|
|
302
|
+
await this.request('PUT', API.databaseRowsOrder(databaseId), { orderedIds });
|
|
303
|
+
}
|
|
304
|
+
subscribeRows(databaseId, onRows) {
|
|
305
|
+
return this.liveStream().onRows(databaseId, onRows);
|
|
306
|
+
}
|
|
307
|
+
// ── Suggestions + comments (the review layer) ────────────────────────────────
|
|
308
|
+
async listSuggestions(pageId, status) {
|
|
309
|
+
const path = status ? `${API.suggestions(pageId)}?status=${encodeURIComponent(status)}` : API.suggestions(pageId);
|
|
310
|
+
return this.request('GET', path);
|
|
311
|
+
}
|
|
312
|
+
async createSuggestion(input) {
|
|
313
|
+
return this.request('POST', API.suggestions(input.pageId), input);
|
|
314
|
+
}
|
|
315
|
+
async updateSuggestion(id, patch) {
|
|
316
|
+
return this.request('PATCH', API.suggestion(id), patch);
|
|
317
|
+
}
|
|
318
|
+
async deleteSuggestion(id) {
|
|
319
|
+
const res = await this.authFetch(`${this.baseUrl}${API.suggestion(id)}`, { method: 'DELETE' });
|
|
320
|
+
if (res.status === 404)
|
|
321
|
+
return false;
|
|
322
|
+
await throwIfNotOk(res);
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
async listComments(pageId) {
|
|
326
|
+
return this.request('GET', API.comments(pageId));
|
|
327
|
+
}
|
|
328
|
+
async createComment(input) {
|
|
329
|
+
return this.request('POST', API.comments(input.pageId), input);
|
|
330
|
+
}
|
|
331
|
+
async deleteComment(id) {
|
|
332
|
+
const res = await this.authFetch(`${this.baseUrl}${API.comment(id)}`, { method: 'DELETE' });
|
|
333
|
+
if (res.status === 404)
|
|
334
|
+
return false;
|
|
335
|
+
await throwIfNotOk(res);
|
|
336
|
+
return true;
|
|
337
|
+
}
|
|
338
|
+
// ── Optional local AI ───────────────────────────────────────────────────────
|
|
339
|
+
async aiStatus() {
|
|
340
|
+
return this.request('GET', API.aiStatus);
|
|
341
|
+
}
|
|
342
|
+
async aiSetConfig(config) {
|
|
343
|
+
return this.request('PUT', API.aiConfig, config);
|
|
344
|
+
}
|
|
345
|
+
async aiIndex() {
|
|
346
|
+
return this.request('POST', API.aiIndex);
|
|
347
|
+
}
|
|
348
|
+
async aiSearch(query, limit) {
|
|
349
|
+
return this.request('POST', API.aiSearch, { query, limit });
|
|
350
|
+
}
|
|
351
|
+
async aiTasks(goal, context) {
|
|
352
|
+
return this.request('POST', API.aiTasks, { goal, context });
|
|
353
|
+
}
|
|
354
|
+
async aiDownloadModel(url) {
|
|
355
|
+
return this.request('POST', API.aiModelDownload, { url });
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Stream a document completion. `onToken` fires per token; resolves with
|
|
359
|
+
* the full text. Abort via the optional signal.
|
|
360
|
+
*/
|
|
361
|
+
async aiComplete(text, onToken, opts = {}) {
|
|
362
|
+
return this.aiStream(API.aiComplete, { text, instruction: opts.instruction }, onToken, opts.signal);
|
|
363
|
+
}
|
|
364
|
+
/** Stream a raw generation (prompt + optional system). */
|
|
365
|
+
async aiGenerate(prompt, onToken, opts = {}) {
|
|
366
|
+
return this.aiStream(API.aiGenerate, { prompt, system: opts.system, maxTokens: opts.maxTokens }, onToken, opts.signal);
|
|
367
|
+
}
|
|
368
|
+
async listPlugins() {
|
|
369
|
+
return this.request('GET', API.plugins);
|
|
370
|
+
}
|
|
371
|
+
async installPlugin(pkg) {
|
|
372
|
+
return this.request('POST', API.plugins, pkg);
|
|
373
|
+
}
|
|
374
|
+
async setPluginEnabled(id, enabled) {
|
|
375
|
+
return this.request('PATCH', API.plugin(id), { enabled });
|
|
376
|
+
}
|
|
377
|
+
async removePlugin(id) {
|
|
378
|
+
const res = await this.authFetch(`${this.baseUrl}${API.plugin(id)}`, { method: 'DELETE' });
|
|
379
|
+
if (res.status === 404)
|
|
380
|
+
return false;
|
|
381
|
+
await throwIfNotOk(res);
|
|
382
|
+
return true;
|
|
383
|
+
}
|
|
384
|
+
async aiSkills() {
|
|
385
|
+
return this.request('GET', API.aiSkills);
|
|
386
|
+
}
|
|
387
|
+
async aiSaveSkill(skill) {
|
|
388
|
+
return this.request('PUT', API.aiSkills, { skill });
|
|
389
|
+
}
|
|
390
|
+
async aiDeleteSkill(name) {
|
|
391
|
+
const { removed } = await this.request('DELETE', API.aiSkill(name));
|
|
392
|
+
return removed;
|
|
393
|
+
}
|
|
394
|
+
/** Run the workspace agent, surfacing each streamed step via `onEvent`. */
|
|
395
|
+
async agentChat(messages, onEvent, opts = {}) {
|
|
396
|
+
const res = await this.authFetch(`${this.baseUrl}${API.agentChat}`, {
|
|
397
|
+
method: 'POST',
|
|
398
|
+
headers: { 'Content-Type': 'application/json' },
|
|
399
|
+
body: JSON.stringify({ messages, provider: opts.provider, model: opts.model, effort: opts.effort, thinking: opts.thinking, skills: opts.skills, pageId: opts.pageId, selection: opts.selection, allowDirectEdits: opts.allowDirectEdits }),
|
|
400
|
+
cache: 'no-store',
|
|
401
|
+
signal: opts.signal,
|
|
402
|
+
});
|
|
403
|
+
await throwIfNotOk(res);
|
|
404
|
+
if (!res.body)
|
|
405
|
+
return;
|
|
406
|
+
const reader = res.body.getReader();
|
|
407
|
+
const decoder = new TextDecoder();
|
|
408
|
+
let buffer = '';
|
|
409
|
+
for (;;) {
|
|
410
|
+
const { done, value } = await reader.read();
|
|
411
|
+
if (done)
|
|
412
|
+
break;
|
|
413
|
+
buffer += decoder.decode(value, { stream: true });
|
|
414
|
+
const lines = buffer.split('\n');
|
|
415
|
+
buffer = lines.pop() ?? '';
|
|
416
|
+
for (const line of lines) {
|
|
417
|
+
if (!line.startsWith('data:'))
|
|
418
|
+
continue;
|
|
419
|
+
let event;
|
|
420
|
+
try {
|
|
421
|
+
event = JSON.parse(line.slice(5));
|
|
422
|
+
}
|
|
423
|
+
catch {
|
|
424
|
+
continue; // partial frame
|
|
425
|
+
}
|
|
426
|
+
if (event.done)
|
|
427
|
+
return;
|
|
428
|
+
onEvent(event);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
/** POST a body and consume the SSE token stream the AI endpoints emit. */
|
|
433
|
+
async aiStream(path, body, onToken, signal) {
|
|
434
|
+
const res = await this.authFetch(`${this.baseUrl}${path}`, {
|
|
435
|
+
method: 'POST',
|
|
436
|
+
headers: { 'Content-Type': 'application/json' },
|
|
437
|
+
body: JSON.stringify(body),
|
|
438
|
+
cache: 'no-store',
|
|
439
|
+
signal,
|
|
440
|
+
});
|
|
441
|
+
await throwIfNotOk(res);
|
|
442
|
+
if (!res.body)
|
|
443
|
+
return '';
|
|
444
|
+
const reader = res.body.getReader();
|
|
445
|
+
const decoder = new TextDecoder();
|
|
446
|
+
let buffer = '';
|
|
447
|
+
let full = '';
|
|
448
|
+
for (;;) {
|
|
449
|
+
const { done, value } = await reader.read();
|
|
450
|
+
if (done)
|
|
451
|
+
break;
|
|
452
|
+
buffer += decoder.decode(value, { stream: true });
|
|
453
|
+
const lines = buffer.split('\n');
|
|
454
|
+
buffer = lines.pop() ?? '';
|
|
455
|
+
for (const line of lines) {
|
|
456
|
+
if (!line.startsWith('data:'))
|
|
457
|
+
continue;
|
|
458
|
+
try {
|
|
459
|
+
const event = JSON.parse(line.slice(5));
|
|
460
|
+
if (event.error)
|
|
461
|
+
throw new Error(event.error);
|
|
462
|
+
if (event.token) {
|
|
463
|
+
full += event.token;
|
|
464
|
+
onToken(event.token);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
catch (err) {
|
|
468
|
+
if (err instanceof SyntaxError)
|
|
469
|
+
continue; // partial frame
|
|
470
|
+
throw err;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
return full;
|
|
475
|
+
}
|
|
476
|
+
async request(method, path, body) {
|
|
477
|
+
const res = await this.authFetch(`${this.baseUrl}${path}`, {
|
|
478
|
+
method,
|
|
479
|
+
headers: body === undefined ? undefined : { 'Content-Type': 'application/json' },
|
|
480
|
+
body: body === undefined ? undefined : JSON.stringify(body),
|
|
481
|
+
// Always hit the server: the desktop WKWebView otherwise serves cached
|
|
482
|
+
// GETs (e.g. a stale empty `GET /api/trash`). See the server's no-store header.
|
|
483
|
+
cache: 'no-store',
|
|
484
|
+
});
|
|
485
|
+
await throwIfNotOk(res);
|
|
486
|
+
return (await res.json());
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
async function throwIfNotOk(res) {
|
|
490
|
+
if (res.ok)
|
|
491
|
+
return;
|
|
492
|
+
let detail = '';
|
|
493
|
+
try {
|
|
494
|
+
const data = (await res.json());
|
|
495
|
+
detail = data?.error ? `: ${data.error}` : '';
|
|
496
|
+
}
|
|
497
|
+
catch {
|
|
498
|
+
// Non-JSON error body; ignore.
|
|
499
|
+
}
|
|
500
|
+
throw new Error(`OpenBook request failed (${res.status} ${res.statusText})${detail}`);
|
|
501
|
+
}
|
|
502
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** The configured external server URL, or `null` if none is set. */
|
|
2
|
+
export declare function getServerUrlOverride(): string | null;
|
|
3
|
+
/** Set (or clear, with `null`) the external server URL. Takes effect on reload. */
|
|
4
|
+
export declare function setServerUrlOverride(url: string | null): void;
|
|
5
|
+
/**
|
|
6
|
+
* Whether fetching `url` from a page on `pageProtocol` would be blocked by the
|
|
7
|
+
* browser as **mixed content** — an `https:` page cannot load a plain `http:`
|
|
8
|
+
* subresource, so a hosted app (e.g. https://app.book.pub) can never reach a
|
|
9
|
+
* `http://192.168.x.x:port` LAN server, no matter what CORS headers it sends.
|
|
10
|
+
* `http://localhost` (and `127.0.0.1` / `[::1]`) are "potentially trustworthy"
|
|
11
|
+
* and exempt. `pageProtocol` defaults to the current page's protocol.
|
|
12
|
+
*
|
|
13
|
+
* The fix for a blocked URL is an HTTPS origin — the device's `✦.book.pub`
|
|
14
|
+
* forwarding address, or running the app on the same machine.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isMixedContentBlocked(url: string, pageProtocol?: string): boolean;
|
|
17
|
+
/** The configured access token for the external server, or `null`. */
|
|
18
|
+
export declare function getServerTokenOverride(): string | null;
|
|
19
|
+
/** Set (or clear, with `null`) the access token. Takes effect on reload. */
|
|
20
|
+
export declare function setServerTokenOverride(token: string | null): void;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection override stored in the browser. When set, clients connect to this
|
|
3
|
+
* external server instead of the local/default one. Used by the desktop's
|
|
4
|
+
* "connect to a remote server" flow and readable by the web shell.
|
|
5
|
+
*/
|
|
6
|
+
const SERVER_URL_KEY = 'openbook.serverUrl';
|
|
7
|
+
/** The configured external server URL, or `null` if none is set. */
|
|
8
|
+
export function getServerUrlOverride() {
|
|
9
|
+
if (typeof localStorage === 'undefined')
|
|
10
|
+
return null;
|
|
11
|
+
const value = localStorage.getItem(SERVER_URL_KEY);
|
|
12
|
+
return value && value.trim().length > 0 ? value.trim() : null;
|
|
13
|
+
}
|
|
14
|
+
/** Set (or clear, with `null`) the external server URL. Takes effect on reload. */
|
|
15
|
+
export function setServerUrlOverride(url) {
|
|
16
|
+
if (typeof localStorage === 'undefined')
|
|
17
|
+
return;
|
|
18
|
+
if (url && url.trim().length > 0) {
|
|
19
|
+
localStorage.setItem(SERVER_URL_KEY, url.trim());
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
localStorage.removeItem(SERVER_URL_KEY);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Whether fetching `url` from a page on `pageProtocol` would be blocked by the
|
|
27
|
+
* browser as **mixed content** — an `https:` page cannot load a plain `http:`
|
|
28
|
+
* subresource, so a hosted app (e.g. https://app.book.pub) can never reach a
|
|
29
|
+
* `http://192.168.x.x:port` LAN server, no matter what CORS headers it sends.
|
|
30
|
+
* `http://localhost` (and `127.0.0.1` / `[::1]`) are "potentially trustworthy"
|
|
31
|
+
* and exempt. `pageProtocol` defaults to the current page's protocol.
|
|
32
|
+
*
|
|
33
|
+
* The fix for a blocked URL is an HTTPS origin — the device's `✦.book.pub`
|
|
34
|
+
* forwarding address, or running the app on the same machine.
|
|
35
|
+
*/
|
|
36
|
+
export function isMixedContentBlocked(url, pageProtocol) {
|
|
37
|
+
const proto = pageProtocol ?? (typeof location !== 'undefined' ? location.protocol : 'http:');
|
|
38
|
+
if (proto !== 'https:')
|
|
39
|
+
return false;
|
|
40
|
+
let u;
|
|
41
|
+
try {
|
|
42
|
+
u = new URL(url);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false; // not an absolute URL — nothing to block (or a relative path)
|
|
46
|
+
}
|
|
47
|
+
if (u.protocol !== 'http:')
|
|
48
|
+
return false;
|
|
49
|
+
const h = u.hostname;
|
|
50
|
+
const trustworthy = h === 'localhost' || h.endsWith('.localhost') || h === '127.0.0.1' || h === '::1';
|
|
51
|
+
return !trustworthy;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Access token for a published (LAN) server connection. Paired with
|
|
55
|
+
* {@link getServerUrlOverride} when connecting to another machine's published
|
|
56
|
+
* workspace — that server requires the token on every request.
|
|
57
|
+
*/
|
|
58
|
+
const SERVER_TOKEN_KEY = 'openbook.serverToken';
|
|
59
|
+
/** The configured access token for the external server, or `null`. */
|
|
60
|
+
export function getServerTokenOverride() {
|
|
61
|
+
if (typeof localStorage === 'undefined')
|
|
62
|
+
return null;
|
|
63
|
+
const value = localStorage.getItem(SERVER_TOKEN_KEY);
|
|
64
|
+
return value && value.trim().length > 0 ? value.trim() : null;
|
|
65
|
+
}
|
|
66
|
+
/** Set (or clear, with `null`) the access token. Takes effect on reload. */
|
|
67
|
+
export function setServerTokenOverride(token) {
|
|
68
|
+
if (typeof localStorage === 'undefined')
|
|
69
|
+
return;
|
|
70
|
+
if (token && token.trim().length > 0) {
|
|
71
|
+
localStorage.setItem(SERVER_TOKEN_KEY, token.trim());
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
localStorage.removeItem(SERVER_TOKEN_KEY);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAE5C,oEAAoE;AACpE,MAAM,UAAU,oBAAoB;IAClC,IAAI,OAAO,YAAY,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACnD,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,oBAAoB,CAAC,GAAkB;IACrD,IAAI,OAAO,YAAY,KAAK,WAAW;QAAE,OAAO;IAChD,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW,EAAE,YAAqB;IACtE,MAAM,KAAK,GAAG,YAAY,IAAI,CAAC,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC9F,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,CAAM,CAAC;IACX,IAAI,CAAC;QACH,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,CAAC,8DAA8D;IAC9E,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IACrB,MAAM,WAAW,GAAG,CAAC,KAAK,WAAW,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,KAAK,CAAC;IACtG,OAAO,CAAC,WAAW,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAEhD,sEAAsE;AACtE,MAAM,UAAU,sBAAsB;IACpC,IAAI,OAAO,YAAY,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACrD,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,sBAAsB,CAAC,KAAoB;IACzD,IAAI,OAAO,YAAY,KAAK,WAAW;QAAE,OAAO;IAChD,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,YAAY,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,YAAY,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
|