onlymcp 0.9.1 → 0.11.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/README.md +14 -11
- package/dist/apiClient.d.ts +129 -7
- package/dist/apiClient.js +98 -4
- package/dist/apiClient.js.map +1 -1
- package/dist/auth/deviceLogin.js +5 -1
- package/dist/auth/deviceLogin.js.map +1 -1
- package/dist/bin/cli.js +349 -131
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/mcp.js +16 -2
- package/dist/bin/mcp.js.map +1 -1
- package/dist/export/unpack.d.ts +33 -0
- package/dist/export/unpack.js +54 -0
- package/dist/export/unpack.js.map +1 -0
- package/dist/identity.d.ts +25 -0
- package/dist/identity.js +106 -0
- package/dist/identity.js.map +1 -0
- package/dist/import/collect.d.ts +14 -1
- package/dist/import/collect.js +25 -3
- package/dist/import/collect.js.map +1 -1
- package/dist/import/frontmatter.d.ts +31 -5
- package/dist/import/frontmatter.js +64 -22
- package/dist/import/frontmatter.js.map +1 -1
- package/dist/import/plan.d.ts +22 -1
- package/dist/import/plan.js +66 -19
- package/dist/import/plan.js.map +1 -1
- package/dist/import/prune.d.ts +46 -0
- package/dist/import/prune.js +61 -0
- package/dist/import/prune.js.map +1 -0
- package/dist/import/secrets.js +1 -1
- package/dist/import/secrets.js.map +1 -1
- package/dist/import/upload.js +17 -2
- package/dist/import/upload.js.map +1 -1
- package/dist/install.d.ts +67 -6
- package/dist/install.js +137 -59
- package/dist/install.js.map +1 -1
- package/dist/instructions.d.ts +3 -1
- package/dist/instructions.js +19 -2
- package/dist/instructions.js.map +1 -1
- package/dist/memorySync.d.ts +28 -0
- package/dist/memorySync.js +56 -0
- package/dist/memorySync.js.map +1 -0
- package/dist/paths.d.ts +12 -0
- package/dist/paths.js +34 -8
- package/dist/paths.js.map +1 -1
- package/dist/registry/caveats.d.ts +17 -0
- package/dist/registry/caveats.js +50 -0
- package/dist/registry/caveats.js.map +1 -0
- package/dist/registry/clients.d.ts +11 -0
- package/dist/registry/clients.js +327 -0
- package/dist/registry/clients.js.map +1 -0
- package/dist/registry/index.d.ts +4 -0
- package/dist/registry/index.js +5 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/servers.d.ts +50 -0
- package/dist/registry/servers.js +225 -0
- package/dist/registry/servers.js.map +1 -0
- package/dist/registry/types.d.ts +54 -0
- package/dist/registry/types.js +6 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/stubs.d.ts +1 -0
- package/dist/stubs.js +85 -13
- package/dist/stubs.js.map +1 -1
- package/dist/tools/getAgentDefinition.js +5 -2
- package/dist/tools/getAgentDefinition.js.map +1 -1
- package/dist/tools/getSkill.js +1 -1
- package/dist/tools/getSkill.js.map +1 -1
- package/dist/tools/getSkillFile.js +3 -3
- package/dist/tools/getSkillFile.js.map +1 -1
- package/dist/tools/memoryGraph.d.ts +69 -0
- package/dist/tools/memoryGraph.js +128 -0
- package/dist/tools/memoryGraph.js.map +1 -0
- package/dist/tools/memoryRead.js +1 -1
- package/dist/tools/memoryRead.js.map +1 -1
- package/dist/tools/memoryWrite.js +1 -1
- package/dist/tools/memoryWrite.js.map +1 -1
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -7,10 +7,10 @@ in every MCP client you use. This package ships two binaries: the stdio MCP serv
|
|
|
7
7
|
**There is a second way in, and for most people it is the better one.** The hosted
|
|
8
8
|
server at `https://only-mcp.com/api/mcp` needs nothing installed, works from any
|
|
9
9
|
machine, and is the only way to reach the tools of the MCP servers you connect to
|
|
10
|
-
your account (GitHub,
|
|
10
|
+
your account (GitHub, Linear, Notion, your own — see "The gateway" below):
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
claude mcp add --transport http onlymcp https://only-mcp.com/api/mcp \
|
|
13
|
+
claude mcp add --transport http --scope user onlymcp https://only-mcp.com/api/mcp \
|
|
14
14
|
--header "Authorization: Bearer omk_…"
|
|
15
15
|
```
|
|
16
16
|
|
|
@@ -23,7 +23,7 @@ Requires a free account at [only-mcp.com](https://only-mcp.com) and Node.js 22 o
|
|
|
23
23
|
## Set up a client
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
npx onlymcp install --client claude # or: codex, gemini
|
|
26
|
+
npx onlymcp install --client claude-code # or: codex, gemini-cli
|
|
27
27
|
npx onlymcp login
|
|
28
28
|
```
|
|
29
29
|
|
|
@@ -36,8 +36,10 @@ merges into what is already there rather than replacing it:
|
|
|
36
36
|
| Codex | `~/.codex/config.toml` |
|
|
37
37
|
| Gemini CLI | `~/.gemini/settings.json` |
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
the
|
|
39
|
+
`npx onlymcp install --all` writes into every one of these whose config file already
|
|
40
|
+
exists on this machine, and skips the rest. Any other MCP client works too:
|
|
41
|
+
`npx onlymcp install --print --client claude-code` prints the JSON snippet to paste in
|
|
42
|
+
by hand.
|
|
41
43
|
|
|
42
44
|
`login` connects the device over an OAuth device code (a code plus a QR in the
|
|
43
45
|
terminal) and stores the token in the operating system keyring, never in a file.
|
|
@@ -46,12 +48,13 @@ terminal) and stores the token in the operating system keyring, never in a file.
|
|
|
46
48
|
|
|
47
49
|
| Command | What it does |
|
|
48
50
|
| --- | --- |
|
|
49
|
-
| `onlymcp install --client <id>` | Add OnlyMCP to a client's config |
|
|
50
|
-
| `onlymcp install --
|
|
51
|
-
| `onlymcp
|
|
52
|
-
| `onlymcp
|
|
53
|
-
| `onlymcp
|
|
54
|
-
| `onlymcp
|
|
51
|
+
| `npx onlymcp install --client <id>` | Add OnlyMCP to a client's config |
|
|
52
|
+
| `npx onlymcp install --all` | Add OnlyMCP to every client already set up on this machine |
|
|
53
|
+
| `npx onlymcp install --print --client <id>` | Print the snippet, write nothing |
|
|
54
|
+
| `npx onlymcp login` | Connect this device |
|
|
55
|
+
| `npx onlymcp status` | Show whether this device is connected |
|
|
56
|
+
| `npx onlymcp sync` | Rewrite the local stub files |
|
|
57
|
+
| `npx onlymcp logout` | End this device's session on the server, then remove the token and the local cache |
|
|
55
58
|
|
|
56
59
|
## What the agent gets
|
|
57
60
|
|
package/dist/apiClient.d.ts
CHANGED
|
@@ -4,11 +4,40 @@ export declare class ApiError extends Error {
|
|
|
4
4
|
readonly status: number;
|
|
5
5
|
constructor(code: string, params?: Record<string, unknown>, status?: number);
|
|
6
6
|
}
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Herkunft und Bearbeitbarkeit, wie jede Liste des Servers sie mitschickt
|
|
9
|
+
* (teams/scope.ts). Der Client braucht sie fuer `--prune`: geloescht wird nur,
|
|
10
|
+
* was diesem Konto allein gehoert.
|
|
11
|
+
*/
|
|
12
|
+
export type Scoped = {
|
|
13
|
+
scope: 'personal' | 'team';
|
|
14
|
+
teamName: string | null;
|
|
15
|
+
isOwn: boolean;
|
|
16
|
+
canEdit: boolean;
|
|
17
|
+
archivedAt: string | null;
|
|
18
|
+
};
|
|
19
|
+
/** Die Sammlung, aus der ein Skill stammt (Paket 03 Aufgabe 11). */
|
|
20
|
+
export type SkillCollection = {
|
|
21
|
+
key: string;
|
|
22
|
+
kind: string;
|
|
23
|
+
label: string;
|
|
24
|
+
};
|
|
25
|
+
export type SkillProvenance = {
|
|
26
|
+
description?: string;
|
|
27
|
+
sourcePath?: string;
|
|
28
|
+
collection?: {
|
|
29
|
+
key: string;
|
|
30
|
+
kind: string;
|
|
31
|
+
label?: string;
|
|
32
|
+
} | null;
|
|
33
|
+
};
|
|
34
|
+
export type SkillListItem = Scoped & {
|
|
8
35
|
name: string;
|
|
36
|
+
description: string;
|
|
37
|
+
collection: SkillCollection | null;
|
|
9
38
|
updatedAt: string;
|
|
10
39
|
};
|
|
11
|
-
export type AgentListItem = {
|
|
40
|
+
export type AgentListItem = Scoped & {
|
|
12
41
|
name: string;
|
|
13
42
|
description: string;
|
|
14
43
|
model: string | null;
|
|
@@ -29,17 +58,37 @@ export type MemoryFile = {
|
|
|
29
58
|
path: string;
|
|
30
59
|
content: string;
|
|
31
60
|
frontmatter: Record<string, unknown>;
|
|
32
|
-
links:
|
|
61
|
+
links: {
|
|
62
|
+
resolved: string[];
|
|
63
|
+
unresolved: string[];
|
|
64
|
+
};
|
|
33
65
|
updatedAt: string;
|
|
34
66
|
updatedByDevice: string | null;
|
|
67
|
+
updatedByName?: string | null;
|
|
35
68
|
};
|
|
36
|
-
export type
|
|
69
|
+
export type SearchHit = {
|
|
70
|
+
kind: 'memory' | 'skill' | 'agent';
|
|
71
|
+
id: string;
|
|
72
|
+
name: string;
|
|
73
|
+
path: string | null;
|
|
74
|
+
snippet: string;
|
|
75
|
+
scope: 'personal' | 'team';
|
|
76
|
+
teamId: string | null;
|
|
77
|
+
};
|
|
78
|
+
export type TreeEntry = {
|
|
79
|
+
kind: 'folder' | 'file';
|
|
37
80
|
path: string;
|
|
38
|
-
|
|
81
|
+
name: string;
|
|
82
|
+
type: string | null;
|
|
83
|
+
updatedAt: string | null;
|
|
39
84
|
scope: 'personal' | 'team';
|
|
40
85
|
teamName: string | null;
|
|
41
86
|
canEdit: boolean;
|
|
42
87
|
};
|
|
88
|
+
export type MemoryListItem = Scoped & {
|
|
89
|
+
path: string;
|
|
90
|
+
updatedAt: string;
|
|
91
|
+
};
|
|
43
92
|
export type Connection = {
|
|
44
93
|
id: string;
|
|
45
94
|
name: string;
|
|
@@ -97,6 +146,24 @@ export declare class ApiClient {
|
|
|
97
146
|
plan: {
|
|
98
147
|
name: string;
|
|
99
148
|
};
|
|
149
|
+
/** Optional, weil eine aeltere API sie nicht schickt. Fehlt sie, gilt an. */
|
|
150
|
+
brainvaultMode?: boolean;
|
|
151
|
+
}>;
|
|
152
|
+
/**
|
|
153
|
+
* Tells the server this device just finished an import or a sync (POST
|
|
154
|
+
* /api/devices/current/run), so the devices page can show when and how many files. The caller
|
|
155
|
+
* treats a failure as nothing: an older server answers 404, and a report is never worth a
|
|
156
|
+
* failed command. Five seconds at most, so a slow server cannot hold the command up.
|
|
157
|
+
*/
|
|
158
|
+
reportRun(kind: 'import' | 'sync', files: number): Promise<void>;
|
|
159
|
+
/**
|
|
160
|
+
* Ends this device's session on the server (POST /api/auth/sign-out, Better Auth's own sign-out:
|
|
161
|
+
* the API's bearer plugin turns the token into the session cookie that endpoint reads). For
|
|
162
|
+
* `onlymcp logout`, which forgets the login on this machine whatever this answers. Five seconds
|
|
163
|
+
* at most, so an unreachable server cannot hold the logout up.
|
|
164
|
+
*/
|
|
165
|
+
signOut(): Promise<{
|
|
166
|
+
success: boolean;
|
|
100
167
|
}>;
|
|
101
168
|
listSkills(): Promise<{
|
|
102
169
|
skills: SkillListItem[];
|
|
@@ -104,10 +171,19 @@ export declare class ApiClient {
|
|
|
104
171
|
getSkill(name: string): Promise<{
|
|
105
172
|
name: string;
|
|
106
173
|
body: string;
|
|
174
|
+
description: string;
|
|
175
|
+
collection: SkillCollection | null;
|
|
176
|
+
sourcePath: string | null;
|
|
107
177
|
updatedAt: string;
|
|
108
178
|
files: SkillFileMeta[];
|
|
109
179
|
}>;
|
|
110
|
-
|
|
180
|
+
/**
|
|
181
|
+
* Die Herkunft ist optional und wird WEGGELASSEN, nicht auf leer gesetzt,
|
|
182
|
+
* wenn es keine gibt: ein fehlendes Feld heisst serverseitig "nicht
|
|
183
|
+
* anfassen" (Spec 5, Regel 1). Ein `description: ''` mitzuschicken loeschte
|
|
184
|
+
* die Beschreibung, die ein frueherer Import geschrieben hat.
|
|
185
|
+
*/
|
|
186
|
+
putSkill(name: string, body: string, provenance?: SkillProvenance): Promise<{
|
|
111
187
|
name: string;
|
|
112
188
|
updatedAt: string;
|
|
113
189
|
}>;
|
|
@@ -130,7 +206,21 @@ export declare class ApiClient {
|
|
|
130
206
|
name: string;
|
|
131
207
|
updatedAt: string;
|
|
132
208
|
}>;
|
|
133
|
-
|
|
209
|
+
/**
|
|
210
|
+
* `use` says "I am loading this definition to run it", and the server counts
|
|
211
|
+
* a load for the agent's "Used" line. Only `get_agent_definition` asks. Any
|
|
212
|
+
* other read of the same route (the write tool looking at the previous state)
|
|
213
|
+
* is not a use and must not send it.
|
|
214
|
+
*/
|
|
215
|
+
getAgent(name: string, { use }?: {
|
|
216
|
+
use?: boolean;
|
|
217
|
+
}): Promise<Scoped & {
|
|
218
|
+
name: string;
|
|
219
|
+
description: string;
|
|
220
|
+
model: string | null;
|
|
221
|
+
tools: string[];
|
|
222
|
+
updatedAt: string;
|
|
223
|
+
} & {
|
|
134
224
|
body: string;
|
|
135
225
|
}>;
|
|
136
226
|
readMemory(path: string): Promise<MemoryFile>;
|
|
@@ -139,6 +229,38 @@ export declare class ApiClient {
|
|
|
139
229
|
listMemory(): Promise<{
|
|
140
230
|
files: MemoryListItem[];
|
|
141
231
|
}>;
|
|
232
|
+
searchContent(q: string, opts?: {
|
|
233
|
+
types?: string[];
|
|
234
|
+
limit?: number;
|
|
235
|
+
}): Promise<{
|
|
236
|
+
hits: SearchHit[];
|
|
237
|
+
}>;
|
|
238
|
+
memoryTree(scope?: string): Promise<{
|
|
239
|
+
nodes: TreeEntry[];
|
|
240
|
+
}>;
|
|
241
|
+
/**
|
|
242
|
+
* A move is a write of the moved file and of every file whose links it rewrites, and the
|
|
243
|
+
* server records the device each write came from. This machine's host name, as the
|
|
244
|
+
* memory_write tool and the import name it, so a write and a move from here are one device.
|
|
245
|
+
*/
|
|
246
|
+
moveMemory(from: string, to: string, updateLinks?: boolean, deviceLabel?: string): Promise<{
|
|
247
|
+
from: string;
|
|
248
|
+
to: string;
|
|
249
|
+
rewritten: number;
|
|
250
|
+
skipped: number;
|
|
251
|
+
}>;
|
|
252
|
+
/**
|
|
253
|
+
* Das Export-Archiv, als ROHE Antwort.
|
|
254
|
+
*
|
|
255
|
+
* Geht bewusst nicht durch `call`: das dort ist ein JSON-Client, und ein
|
|
256
|
+
* Archiv von zwei Gigabyte durch `res.json()` zu schicken waere genau der
|
|
257
|
+
* Fehler, den die Route auf ihrer Seite vermeidet. Der Aufrufer bekommt den
|
|
258
|
+
* Strom und entscheidet, ob er ihn in eine Datei giesst oder auspackt.
|
|
259
|
+
*/
|
|
260
|
+
exportArchive(opts?: {
|
|
261
|
+
scope?: string;
|
|
262
|
+
types?: string[];
|
|
263
|
+
}): Promise<Response>;
|
|
142
264
|
deleteMemory(path: string): Promise<void>;
|
|
143
265
|
deleteSkill(name: string): Promise<void>;
|
|
144
266
|
deleteSkillFile(name: string, path: string): Promise<void>;
|
package/dist/apiClient.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { hostname } from 'node:os';
|
|
2
|
+
import { identityHeaders } from './identity.js';
|
|
1
3
|
export class ApiError extends Error {
|
|
2
4
|
code;
|
|
3
5
|
params;
|
|
@@ -21,9 +23,12 @@ export class ApiClient {
|
|
|
21
23
|
const tok = this.token();
|
|
22
24
|
if (!tok)
|
|
23
25
|
throw new ApiError('errors.NOT_LOGGED_IN');
|
|
26
|
+
// Wer anruft, steht in den Koepfen - sonst schickt Node 'node' und das
|
|
27
|
+
// Geraet heisst in der Liste genau so. Siehe identity.ts.
|
|
24
28
|
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
25
29
|
...init,
|
|
26
30
|
headers: {
|
|
31
|
+
...(await identityHeaders()),
|
|
27
32
|
...(init.headers ?? {}),
|
|
28
33
|
authorization: `Bearer ${tok}`,
|
|
29
34
|
'content-type': 'application/json',
|
|
@@ -40,14 +45,46 @@ export class ApiClient {
|
|
|
40
45
|
getMe() {
|
|
41
46
|
return this.call('/api/me');
|
|
42
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Tells the server this device just finished an import or a sync (POST
|
|
50
|
+
* /api/devices/current/run), so the devices page can show when and how many files. The caller
|
|
51
|
+
* treats a failure as nothing: an older server answers 404, and a report is never worth a
|
|
52
|
+
* failed command. Five seconds at most, so a slow server cannot hold the command up.
|
|
53
|
+
*/
|
|
54
|
+
reportRun(kind, files) {
|
|
55
|
+
return this.call('/api/devices/current/run', {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
body: JSON.stringify({ kind, files }),
|
|
58
|
+
signal: AbortSignal.timeout(5000),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Ends this device's session on the server (POST /api/auth/sign-out, Better Auth's own sign-out:
|
|
63
|
+
* the API's bearer plugin turns the token into the session cookie that endpoint reads). For
|
|
64
|
+
* `onlymcp logout`, which forgets the login on this machine whatever this answers. Five seconds
|
|
65
|
+
* at most, so an unreachable server cannot hold the logout up.
|
|
66
|
+
*/
|
|
67
|
+
signOut() {
|
|
68
|
+
return this.call('/api/auth/sign-out', {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
body: '{}',
|
|
71
|
+
signal: AbortSignal.timeout(5000),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
43
74
|
listSkills() {
|
|
44
75
|
return this.call('/api/skills');
|
|
45
76
|
}
|
|
46
77
|
getSkill(name) {
|
|
47
78
|
return this.call(`/api/skills/${encodeURIComponent(name)}`);
|
|
48
79
|
}
|
|
49
|
-
|
|
50
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Die Herkunft ist optional und wird WEGGELASSEN, nicht auf leer gesetzt,
|
|
82
|
+
* wenn es keine gibt: ein fehlendes Feld heisst serverseitig "nicht
|
|
83
|
+
* anfassen" (Spec 5, Regel 1). Ein `description: ''` mitzuschicken loeschte
|
|
84
|
+
* die Beschreibung, die ein frueherer Import geschrieben hat.
|
|
85
|
+
*/
|
|
86
|
+
putSkill(name, body, provenance = {}) {
|
|
87
|
+
return this.call(`/api/skills/${encodeURIComponent(name)}`, { method: 'PUT', body: JSON.stringify({ body, ...provenance }) });
|
|
51
88
|
}
|
|
52
89
|
// Der Pfad wird Segment fuer Segment kodiert, genau wie bei readMemory:
|
|
53
90
|
// encodeURIComponent ueber die ganze Zeichenkette machte aus jedem
|
|
@@ -69,8 +106,14 @@ export class ApiClient {
|
|
|
69
106
|
putAgent(name, a) {
|
|
70
107
|
return this.call(`/api/agents/${encodeURIComponent(name)}`, { method: 'PUT', body: JSON.stringify(a) });
|
|
71
108
|
}
|
|
72
|
-
|
|
73
|
-
|
|
109
|
+
/**
|
|
110
|
+
* `use` says "I am loading this definition to run it", and the server counts
|
|
111
|
+
* a load for the agent's "Used" line. Only `get_agent_definition` asks. Any
|
|
112
|
+
* other read of the same route (the write tool looking at the previous state)
|
|
113
|
+
* is not a use and must not send it.
|
|
114
|
+
*/
|
|
115
|
+
getAgent(name, { use = false } = {}) {
|
|
116
|
+
return this.call(`/api/agents/${encodeURIComponent(name)}${use ? '?use=1' : ''}`);
|
|
74
117
|
}
|
|
75
118
|
readMemory(path) {
|
|
76
119
|
return this.call(this.memoryUrl(path));
|
|
@@ -89,6 +132,57 @@ export class ApiClient {
|
|
|
89
132
|
listMemory() {
|
|
90
133
|
return this.call('/api/memory');
|
|
91
134
|
}
|
|
135
|
+
// --- Suchen, Baum und Verschieben (Paket 03 Aufgabe 14) -----------------
|
|
136
|
+
searchContent(q, opts = {}) {
|
|
137
|
+
const query = new URLSearchParams({ q });
|
|
138
|
+
if (opts.types?.length)
|
|
139
|
+
query.set('types', opts.types.join(','));
|
|
140
|
+
if (opts.limit)
|
|
141
|
+
query.set('limit', String(opts.limit));
|
|
142
|
+
return this.call(`/api/search?${query.toString()}`);
|
|
143
|
+
}
|
|
144
|
+
memoryTree(scope = 'all') {
|
|
145
|
+
return this.call(`/api/memory/tree?scope=${encodeURIComponent(scope)}`);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* A move is a write of the moved file and of every file whose links it rewrites, and the
|
|
149
|
+
* server records the device each write came from. This machine's host name, as the
|
|
150
|
+
* memory_write tool and the import name it, so a write and a move from here are one device.
|
|
151
|
+
*/
|
|
152
|
+
moveMemory(from, to, updateLinks = true, deviceLabel = hostname()) {
|
|
153
|
+
return this.call('/api/memory/move', {
|
|
154
|
+
method: 'POST',
|
|
155
|
+
body: JSON.stringify({ from, to, updateLinks, deviceLabel }),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
// --- Der Weg nach draussen ---------------------------------------------
|
|
159
|
+
/**
|
|
160
|
+
* Das Export-Archiv, als ROHE Antwort.
|
|
161
|
+
*
|
|
162
|
+
* Geht bewusst nicht durch `call`: das dort ist ein JSON-Client, und ein
|
|
163
|
+
* Archiv von zwei Gigabyte durch `res.json()` zu schicken waere genau der
|
|
164
|
+
* Fehler, den die Route auf ihrer Seite vermeidet. Der Aufrufer bekommt den
|
|
165
|
+
* Strom und entscheidet, ob er ihn in eine Datei giesst oder auspackt.
|
|
166
|
+
*/
|
|
167
|
+
async exportArchive(opts = {}) {
|
|
168
|
+
const tok = this.token();
|
|
169
|
+
if (!tok)
|
|
170
|
+
throw new ApiError('errors.NOT_LOGGED_IN');
|
|
171
|
+
const query = new URLSearchParams();
|
|
172
|
+
if (opts.scope)
|
|
173
|
+
query.set('scope', opts.scope);
|
|
174
|
+
if (opts.types?.length)
|
|
175
|
+
query.set('types', opts.types.join(','));
|
|
176
|
+
const tail = query.size > 0 ? `?${query.toString()}` : '';
|
|
177
|
+
const res = await fetch(`${this.baseUrl}/api/export${tail}`, {
|
|
178
|
+
headers: { ...(await identityHeaders()), authorization: `Bearer ${tok}` },
|
|
179
|
+
});
|
|
180
|
+
if (!res.ok) {
|
|
181
|
+
const body = (await res.json().catch(() => ({})));
|
|
182
|
+
throw new ApiError(body.code ?? 'errors.UNKNOWN', body.params ?? {}, res.status);
|
|
183
|
+
}
|
|
184
|
+
return res;
|
|
185
|
+
}
|
|
92
186
|
deleteMemory(path) {
|
|
93
187
|
return this.call(this.memoryUrl(path), { method: 'DELETE' });
|
|
94
188
|
}
|
package/dist/apiClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../src/apiClient.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEtB;IACA;IACA;IAHX,YACW,IAAY,EACZ,SAAkC,EAAE,EACpC,SAAS,CAAC;QAEnB,KAAK,CAAC,IAAI,CAAC,CAAC;QAJH,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAA8B;QACpC,WAAM,GAAN,MAAM,CAAI;QAGnB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../src/apiClient.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/deviceLogin.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ApiError } from '../apiClient.js';
|
|
2
|
+
import { identityHeaders } from '../identity.js';
|
|
2
3
|
const defaultDeps = {
|
|
3
4
|
sleep: (ms) => new Promise((r) => setTimeout(r, ms)),
|
|
4
5
|
};
|
|
@@ -6,9 +7,12 @@ export async function pollForToken(baseUrl, deviceCode, intervalSeconds, deps =
|
|
|
6
7
|
let interval = intervalSeconds;
|
|
7
8
|
for (;;) {
|
|
8
9
|
await deps.sleep(interval * 1000);
|
|
10
|
+
// Diese Anfrage ist die, die die Sitzung erzeugt - hier entscheidet sich,
|
|
11
|
+
// wie das Geraet in der Liste heissen wird. Ohne die Koepfe schickt Node
|
|
12
|
+
// 'node', und genau das stand vorher dort.
|
|
9
13
|
const res = await fetch(`${baseUrl}/api/auth/device/token`, {
|
|
10
14
|
method: 'POST',
|
|
11
|
-
headers: { 'content-type': 'application/json' },
|
|
15
|
+
headers: { ...(await identityHeaders()), 'content-type': 'application/json' },
|
|
12
16
|
body: JSON.stringify({
|
|
13
17
|
grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
|
|
14
18
|
device_code: deviceCode,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deviceLogin.js","sourceRoot":"","sources":["../../src/auth/deviceLogin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"deviceLogin.js","sourceRoot":"","sources":["../../src/auth/deviceLogin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAIjD,MAAM,WAAW,GAAS;IACxB,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,UAAkB,EAClB,eAAuB,EACvB,OAAa,WAAW;IAExB,IAAI,QAAQ,GAAG,eAAe,CAAC;IAC/B,SAAS,CAAC;QACR,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;QAClC,0EAA0E;QAC1E,yEAAyE;QACzE,2CAA2C;QAC3C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,wBAAwB,EAAE;YAC1D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,GAAG,CAAC,MAAM,eAAe,EAAE,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC7E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,UAAU,EAAE,8CAA8C;gBAC1D,WAAW,EAAE,UAAU;gBACvB,SAAS,EAAE,aAAa;aACzB,CAAC;SACH,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC,YAAsB,CAAC;QAC1D,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,uBAAuB;gBAC1B,MAAM;YACR,KAAK,WAAW;gBACd,QAAQ,IAAI,CAAC,CAAC;gBACd,MAAM;YACR,KAAK,eAAe;gBAClB,MAAM,IAAI,QAAQ,CAAC,6BAA6B,CAAC,CAAC;YACpD,KAAK,eAAe;gBAClB,MAAM,IAAI,QAAQ,CAAC,4BAA4B,CAAC,CAAC;YACnD;gBACE,MAAM,IAAI,QAAQ,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;AACH,CAAC"}
|