synomem 0.8.0 → 0.9.1

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 (93) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +47 -68
  3. package/dist/backend.d.ts +18 -6
  4. package/dist/backend.d.ts.map +1 -1
  5. package/dist/backend.js +55 -41
  6. package/dist/backend.js.map +1 -1
  7. package/dist/cli.d.ts +20 -33
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +1391 -1321
  10. package/dist/cli.js.map +1 -1
  11. package/dist/configure.d.ts +12 -46
  12. package/dist/configure.d.ts.map +1 -1
  13. package/dist/configure.js +51 -192
  14. package/dist/configure.js.map +1 -1
  15. package/dist/credentials.d.ts +82 -33
  16. package/dist/credentials.d.ts.map +1 -1
  17. package/dist/credentials.js +270 -44
  18. package/dist/credentials.js.map +1 -1
  19. package/dist/discover.d.ts +8 -35
  20. package/dist/discover.d.ts.map +1 -1
  21. package/dist/discover.js +42 -38
  22. package/dist/discover.js.map +1 -1
  23. package/dist/errors.d.ts +1 -1
  24. package/dist/errors.d.ts.map +1 -1
  25. package/dist/errors.js +4 -0
  26. package/dist/errors.js.map +1 -1
  27. package/dist/import.d.ts +3 -0
  28. package/dist/import.d.ts.map +1 -1
  29. package/dist/import.js +3 -0
  30. package/dist/import.js.map +1 -1
  31. package/dist/index.d.ts +10 -8
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +6 -5
  34. package/dist/index.js.map +1 -1
  35. package/dist/mcp/index.d.ts +18 -18
  36. package/dist/mcp/index.d.ts.map +1 -1
  37. package/dist/mcp/index.js +402 -231
  38. package/dist/mcp/index.js.map +1 -1
  39. package/dist/mcp-server.d.ts +5 -1
  40. package/dist/mcp-server.d.ts.map +1 -1
  41. package/dist/mcp-server.js +27 -105
  42. package/dist/mcp-server.js.map +1 -1
  43. package/dist/oauth.d.ts +32 -33
  44. package/dist/oauth.d.ts.map +1 -1
  45. package/dist/oauth.js +196 -126
  46. package/dist/oauth.js.map +1 -1
  47. package/dist/profiles.d.ts +243 -0
  48. package/dist/profiles.d.ts.map +1 -0
  49. package/dist/profiles.js +479 -0
  50. package/dist/profiles.js.map +1 -0
  51. package/dist/project.d.ts +8 -39
  52. package/dist/project.d.ts.map +1 -1
  53. package/dist/project.js +36 -94
  54. package/dist/project.js.map +1 -1
  55. package/dist/remote.d.ts +24 -17
  56. package/dist/remote.d.ts.map +1 -1
  57. package/dist/remote.js +54 -52
  58. package/dist/remote.js.map +1 -1
  59. package/dist/resolvers.d.ts +54 -0
  60. package/dist/resolvers.d.ts.map +1 -0
  61. package/dist/resolvers.js +336 -0
  62. package/dist/resolvers.js.map +1 -0
  63. package/dist/service.d.ts +3 -2
  64. package/dist/service.d.ts.map +1 -1
  65. package/dist/skill-install.d.ts +4 -6
  66. package/dist/skill-install.d.ts.map +1 -1
  67. package/dist/skill-install.js +13 -12
  68. package/dist/skill-install.js.map +1 -1
  69. package/dist/types.d.ts +45 -15
  70. package/dist/types.d.ts.map +1 -1
  71. package/docs/cli.md +173 -196
  72. package/docs/mcp.md +69 -65
  73. package/package.json +1 -1
  74. package/skills/synomem/SKILL.md +29 -26
  75. package/skills/synomem/references/examples.md +13 -11
  76. package/src/backend.ts +66 -64
  77. package/src/cli.ts +2123 -2219
  78. package/src/configure.ts +62 -241
  79. package/src/credentials.ts +316 -85
  80. package/src/discover.ts +53 -59
  81. package/src/errors.ts +4 -0
  82. package/src/import.ts +5 -0
  83. package/src/index.ts +15 -19
  84. package/src/mcp/index.ts +473 -277
  85. package/src/mcp-server.ts +32 -114
  86. package/src/oauth.ts +249 -131
  87. package/src/profiles.ts +661 -0
  88. package/src/project.ts +42 -108
  89. package/src/remote.ts +69 -63
  90. package/src/resolvers.ts +385 -0
  91. package/src/service.ts +2 -7
  92. package/src/skill-install.ts +17 -18
  93. package/src/types.ts +40 -15
@@ -1,16 +1,74 @@
1
- import { createHash } from 'node:crypto';
1
+ /**
2
+ * Credential storage, indexed by connection — never by actor or workspace.
3
+ *
4
+ * One stored secret serves every profile that routes through its connection:
5
+ * adding a profile for another agent or workspace never copies a refresh
6
+ * token, and rotating a credential updates exactly one entry. Which actor and
7
+ * workspace an operation uses is the profile's business (see `profiles.ts`),
8
+ * and the server authorizes it on every request regardless of what is stored
9
+ * here.
10
+ *
11
+ * Two credential kinds, deliberately distinct so nothing tries to refresh a
12
+ * key or treat an OAuth family as a static secret:
13
+ *
14
+ * - `oauth`: an authorization-code family for one connection, refreshed
15
+ * under a cross-process lock with a generation counter;
16
+ * - `access-key`: a member-owned `syn_…` key, used exactly as stored.
17
+ *
18
+ * Backends: the macOS Keychain, Linux Secret Service (`secret-tool`), an
19
+ * explicit restricted file, or the process environment. There is no silent
20
+ * fallback from one to another: a keychain that refuses a write is an error
21
+ * that names the explicit alternative.
22
+ */
2
23
  import { spawn } from 'node:child_process';
24
+ import { randomBytes, randomUUID } from 'node:crypto';
25
+ import { chmodSync, closeSync, existsSync, linkSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, statSync, writeSync, } from 'node:fs';
26
+ import { hostname } from 'node:os';
27
+ import { join } from 'node:path';
28
+ import { z } from 'zod';
3
29
  import { SynomemError } from './errors.js';
30
+ import { atomicWriteFile } from './fs-utils.js';
4
31
  const serviceName = 'ai.synomem.credentials';
5
32
  const maximumOutputBytes = 128 * 1024;
6
- export function credentialReference(baseUrl, workspaceId, actor) {
7
- return createHash('sha256')
8
- .update(JSON.stringify({
9
- baseUrl: new URL(baseUrl).origin,
10
- workspaceId,
11
- actor: { kind: actor.kind, id: actor.id },
12
- }))
13
- .digest('base64url');
33
+ export const storedOAuthCredentialSchema = z.object({
34
+ kind: z.literal('oauth'),
35
+ issuer: z.string().min(1),
36
+ resource: z.string().min(1),
37
+ clientId: z.string().min(1),
38
+ tokenEndpoint: z.string().min(1),
39
+ scope: z.string(),
40
+ accessToken: z.string().min(1),
41
+ refreshToken: z.string().min(1).optional(),
42
+ /** Epoch milliseconds, already reduced by a safety margin. */
43
+ expiresAt: z.number().int().nonnegative(),
44
+ /** Incremented on every successful refresh; the compare-and-swap token. */
45
+ generation: z.number().int().nonnegative(),
46
+ });
47
+ export const storedAccessKeySchema = z.object({
48
+ kind: z.literal('access-key'),
49
+ secret: z.string().min(1),
50
+ });
51
+ export const storedCredentialSchema = z.discriminatedUnion('kind', [
52
+ storedOAuthCredentialSchema,
53
+ storedAccessKeySchema,
54
+ ]);
55
+ /** An opaque, non-secret handle for a stored secret. Never derived from names. */
56
+ export function newSecretReference() {
57
+ return `synomem-${randomUUID()}`;
58
+ }
59
+ export function parseStoredCredential(value) {
60
+ let raw;
61
+ try {
62
+ raw = JSON.parse(value);
63
+ }
64
+ catch {
65
+ throw new SynomemError('AUTH_REQUIRED', 'Stored Synomem credential is malformed.');
66
+ }
67
+ const parsed = storedCredentialSchema.safeParse(raw);
68
+ if (!parsed.success) {
69
+ throw new SynomemError('AUTH_REQUIRED', 'Stored Synomem credential is in an unsupported format. Run `synomem connection login` (or `connection add-key`) again.');
70
+ }
71
+ return parsed.data;
14
72
  }
15
73
  async function command(executable, arguments_, input) {
16
74
  return await new Promise((resolve, reject) => {
@@ -38,28 +96,26 @@ async function command(executable, arguments_, input) {
38
96
  child.stdin.end(input);
39
97
  });
40
98
  }
41
- function parseCredential(value) {
42
- try {
43
- const parsed = JSON.parse(value);
44
- if (typeof parsed.accessToken !== 'string' ||
45
- typeof parsed.tokenEndpoint !== 'string' ||
46
- typeof parsed.clientId !== 'string' ||
47
- typeof parsed.resource !== 'string' ||
48
- typeof parsed.scope !== 'string') {
49
- throw new Error();
50
- }
51
- return parsed;
52
- }
53
- catch {
54
- throw new SynomemError('AUTH_REQUIRED', 'Stored Synomem credentials are malformed.');
55
- }
56
- }
99
+ /** macOS Keychain or Linux Secret Service. */
57
100
  export class OsCredentialStore {
58
101
  platform;
59
102
  run;
60
103
  constructor(options = {}) {
61
104
  this.platform = options.platform ?? process.platform;
62
- this.run = options.run ?? command;
105
+ const run = options.run ?? command;
106
+ // A missing helper (a headless Linux box with no Secret Service) is a
107
+ // configuration answer, not a crash: name the explicit alternatives. There
108
+ // is still no fallback — the caller chooses --store file deliberately.
109
+ this.run = async (executable, arguments_, input) => {
110
+ try {
111
+ return await run(executable, arguments_, input);
112
+ }
113
+ catch (error) {
114
+ if (error.code === 'ENOENT')
115
+ this.unsupported();
116
+ throw error;
117
+ }
118
+ };
63
119
  }
64
120
  async get(reference) {
65
121
  const result = this.platform === 'darwin'
@@ -76,10 +132,10 @@ export class OsCredentialStore {
76
132
  : this.unsupported();
77
133
  if (result.code !== 0)
78
134
  return undefined;
79
- return parseCredential(result.stdout.trim());
135
+ return parseStoredCredential(result.stdout.trim());
80
136
  }
81
137
  async set(reference, credential) {
82
- const serialized = JSON.stringify(credential);
138
+ const serialized = JSON.stringify(storedCredentialSchema.parse(credential));
83
139
  const result = this.platform === 'darwin'
84
140
  ? await this.run('/usr/bin/security', [
85
141
  'add-generic-password',
@@ -88,22 +144,15 @@ export class OsCredentialStore {
88
144
  '-s',
89
145
  serviceName,
90
146
  '-l',
91
- 'Synomem OAuth credential',
147
+ 'Synomem credential',
92
148
  '-U',
93
149
  '-w',
94
150
  ], `${serialized}\n`)
95
151
  : this.platform === 'linux'
96
- ? await this.run('secret-tool', [
97
- 'store',
98
- '--label=Synomem OAuth credential',
99
- 'service',
100
- serviceName,
101
- 'account',
102
- reference,
103
- ], serialized)
152
+ ? await this.run('secret-tool', ['store', '--label=Synomem credential', 'service', serviceName, 'account', reference], serialized)
104
153
  : this.unsupported();
105
154
  if (result.code !== 0) {
106
- throw new SynomemError('AUTH_REQUIRED', 'The operating-system credential store rejected the credential.');
155
+ throw new SynomemError('CONFIG_INVALID', 'The operating-system credential store rejected the credential. Re-run with --store file to use a restricted file instead.');
107
156
  }
108
157
  }
109
158
  async delete(reference) {
@@ -121,15 +170,192 @@ export class OsCredentialStore {
121
170
  return result.code === 0;
122
171
  }
123
172
  /*
124
- * Windows Credential Manager is not implemented yet. `cmdkey` can write a
125
- * generic credential but deliberately will not read the secret back, so a
126
- * store built on it would accept a credential and then never return it --
127
- * worse than saying so plainly.
173
+ * Windows Credential Manager is not implemented: `cmdkey` can write a generic
174
+ * credential but will not read the secret back, so a store built on it would
175
+ * accept a credential and never return it.
128
176
  */
129
177
  unsupported() {
130
178
  throw new SynomemError('CONFIG_INVALID', this.platform === 'win32'
131
- ? 'Windows Credential Manager storage is not supported yet. Run `synomem config init` and choose the restricted-file store, or set SYNOMEM_ACCESS_TOKEN.'
132
- : 'Operating-system credential storage needs the macOS Keychain, or secret-tool on Linux. Run `synomem config init` and choose the restricted-file store, or set SYNOMEM_ACCESS_TOKEN.');
179
+ ? 'Windows Credential Manager storage is not supported yet. Use --store file, or --store environment with SYNOMEM_ACCESS_TOKEN.'
180
+ : 'No operating-system credential store is available here (it needs the macOS Keychain, or secret-tool with a Secret Service on Linux). Choose one explicitly: --store file keeps it in a 0600 file under your Synomem home; --store environment reads SYNOMEM_ACCESS_TOKEN.');
181
+ }
182
+ }
183
+ /**
184
+ * One restricted file per secret under `<home>/credentials/`, mode 0600 in a
185
+ * 0700 directory. Chosen explicitly (`--store file`), never as a fallback.
186
+ */
187
+ export class FileCredentialStore {
188
+ directory;
189
+ constructor(home) {
190
+ this.directory = join(home, 'credentials');
191
+ }
192
+ path(reference) {
193
+ if (!/^[A-Za-z0-9_-]{1,100}$/.test(reference)) {
194
+ throw new SynomemError('CONFIG_INVALID', 'Credential reference is malformed.');
195
+ }
196
+ return join(this.directory, `${reference}.json`);
197
+ }
198
+ async get(reference) {
199
+ const path = this.path(reference);
200
+ if (!existsSync(path))
201
+ return undefined;
202
+ assertPrivate(this.directory, 0o700);
203
+ assertPrivate(path, 0o600);
204
+ return parseStoredCredential(readFileSync(path, 'utf8'));
205
+ }
206
+ async set(reference, credential) {
207
+ if (!existsSync(this.directory))
208
+ mkdirSync(this.directory, { recursive: true, mode: 0o700 });
209
+ chmodSync(this.directory, 0o700);
210
+ atomicWriteFile(this.path(reference), `${JSON.stringify(storedCredentialSchema.parse(credential))}\n`, 0o600);
211
+ }
212
+ async delete(reference) {
213
+ const path = this.path(reference);
214
+ if (!existsSync(path))
215
+ return false;
216
+ rmSync(path, { force: true });
217
+ return true;
218
+ }
219
+ }
220
+ /*
221
+ * Like ssh with a private key: a credential file (or its directory) that other
222
+ * users can read, or that another user owns, is refused rather than used. The
223
+ * fix is the owner's to make; silently tightening it would hide that the
224
+ * secret may already have been exposed.
225
+ */
226
+ function assertPrivate(path, expected) {
227
+ if (process.platform === 'win32')
228
+ return;
229
+ const stat = statSync(path);
230
+ if (typeof process.getuid === 'function' && stat.uid !== process.getuid()) {
231
+ throw new SynomemError('CONFIG_INVALID', `${path} is owned by another user; refusing to use it.`);
232
+ }
233
+ if ((stat.mode & 0o077) !== 0) {
234
+ throw new SynomemError('CONFIG_INVALID', `${path} is accessible to other users (mode ${(stat.mode & 0o777).toString(8)}). ` +
235
+ `Run \`chmod ${expected.toString(8)} ${path}\` if you are sure it was not exposed, ` +
236
+ 'otherwise remove it and sign in again.');
237
+ }
238
+ }
239
+ export function defaultCredentialStores(home) {
240
+ return { keychain: new OsCredentialStore(), file: new FileCredentialStore(home) };
241
+ }
242
+ /**
243
+ * A cross-process lock around one credential's refresh.
244
+ *
245
+ * `O_EXCL` creation is the mutual exclusion. The lock file records its owner
246
+ * (pid, host) and a random token. A lock is broken only when its owner is
247
+ * provably gone — a dead pid on this host — or, for an owner on another host
248
+ * or an unreadable file, once it is older than `staleMs`. A live owner is never
249
+ * preempted however long its refresh takes (the refresh request itself times
250
+ * out well inside `staleMs`).
251
+ *
252
+ * Breaking renames the file aside first and checks the token: if another
253
+ * process already broke and re-acquired it in between, the fresh lock is put
254
+ * back rather than deleted. Correctness against a concurrent writer is still
255
+ * the generation compare-and-swap in the refresh path; the lock exists so that
256
+ * only one process ever spends a given refresh token. Locks assume one host's
257
+ * filesystem; a home shared over a network filesystem is not supported.
258
+ */
259
+ export async function withCredentialLock(home, name, operation, options = {}) {
260
+ if (!/^[A-Za-z0-9_.-]{1,100}$/.test(name)) {
261
+ throw new SynomemError('CONFIG_INVALID', 'Credential name is malformed.');
262
+ }
263
+ const directory = join(home, 'locks');
264
+ if (!existsSync(directory))
265
+ mkdirSync(directory, { recursive: true, mode: 0o700 });
266
+ const path = join(directory, `${name}.lock`);
267
+ const staleMs = options.staleMs ?? 60_000;
268
+ const deadline = Date.now() + (options.timeoutMs ?? 30_000);
269
+ const pollMs = options.pollMs ?? 50;
270
+ const token = randomBytes(16).toString('hex');
271
+ const host = hostname();
272
+ let descriptor;
273
+ while (descriptor === undefined) {
274
+ try {
275
+ descriptor = openSync(path, 'wx', 0o600);
276
+ writeSync(descriptor, `${process.pid}\n${host}\n${token}\n`);
277
+ }
278
+ catch (error) {
279
+ if (error.code !== 'EEXIST')
280
+ throw error;
281
+ if (breakIfAbandoned(path, host, staleMs))
282
+ continue;
283
+ if (Date.now() > deadline) {
284
+ throw new SynomemError('DATABASE_BUSY', `Another Synomem process is refreshing the ${name} credential. Try again.`);
285
+ }
286
+ await new Promise((resolve) => setTimeout(resolve, pollMs));
287
+ }
288
+ }
289
+ try {
290
+ return await operation();
291
+ }
292
+ finally {
293
+ closeSync(descriptor);
294
+ // Release only our own lock.
295
+ if (readLock(path)?.token === token)
296
+ rmSync(path, { force: true });
297
+ }
298
+ }
299
+ function readLock(path) {
300
+ try {
301
+ const [pid, host, token] = readFileSync(path, 'utf8').split('\n');
302
+ const parsed = Number(pid);
303
+ if (!Number.isSafeInteger(parsed) || !host || !token)
304
+ return undefined;
305
+ return { pid: parsed, host, token };
306
+ }
307
+ catch {
308
+ return undefined;
309
+ }
310
+ }
311
+ function processAlive(pid) {
312
+ try {
313
+ process.kill(pid, 0);
314
+ return true;
315
+ }
316
+ catch (error) {
317
+ // EPERM: it exists but belongs to someone else — alive.
318
+ return error.code === 'EPERM';
319
+ }
320
+ }
321
+ /** Returns true when the caller should immediately retry acquiring. */
322
+ function breakIfAbandoned(path, host, staleMs) {
323
+ let age;
324
+ try {
325
+ age = Date.now() - statSync(path).mtimeMs;
326
+ }
327
+ catch {
328
+ return true; // Released between the failed open and now.
329
+ }
330
+ const owner = readLock(path);
331
+ // A lock whose contents are still being written is fresh, not abandoned.
332
+ if (!owner && age < 1_000)
333
+ return false;
334
+ const abandoned = owner
335
+ ? owner.host === host
336
+ ? !processAlive(owner.pid)
337
+ : age > staleMs
338
+ : age > staleMs;
339
+ if (!abandoned)
340
+ return false;
341
+ const aside = `${path}.broken-${randomBytes(6).toString('hex')}`;
342
+ try {
343
+ renameSync(path, aside);
344
+ }
345
+ catch {
346
+ return true; // Someone else broke or released it first.
347
+ }
348
+ const taken = readLock(aside);
349
+ if (owner && taken?.token !== owner.token) {
350
+ // We grabbed a lock re-acquired after our inspection: restore it.
351
+ try {
352
+ linkSync(aside, path);
353
+ }
354
+ catch {
355
+ /* a third process holds the path now; ours is the one to discard */
356
+ }
133
357
  }
358
+ rmSync(aside, { force: true });
359
+ return true;
134
360
  }
135
361
  //# sourceMappingURL=credentials.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { ContextListing, IdentityDescription } from './types.js';
1
2
  export interface DiscoveredWorkspace {
2
3
  id: string;
3
4
  displayName: string;
@@ -9,18 +10,6 @@ export interface DiscoveredOrganization {
9
10
  role: string;
10
11
  workspaces: DiscoveredWorkspace[];
11
12
  }
12
- export interface WorkspaceMembership {
13
- id: string;
14
- displayName: string;
15
- roles: string[];
16
- /**
17
- * Reachable right now, with this same credential, by naming it as
18
- * Synomem-Workspace-Id — no new token or re-authentication. A human
19
- * credential's own organization is the boundary; an agent credential has
20
- * only ever one such entry, its own.
21
- */
22
- addressableWithThisToken: boolean;
23
- }
24
13
  export interface DiscoveryOptions {
25
14
  baseUrl: string;
26
15
  accessToken: string;
@@ -28,19 +17,6 @@ export interface DiscoveryOptions {
28
17
  fetch?: typeof globalThis.fetch;
29
18
  signal?: AbortSignal;
30
19
  }
31
- /**
32
- * Every workspace a member-owned access key can reach, asked before any one
33
- * of them has been chosen.
34
- *
35
- * Answered by the data plane rather than the control plane: an access key is
36
- * not an account principal the control plane recognizes, but the data plane
37
- * already knows which organization owns it and can list that organization's
38
- * workspaces without requiring one to be named first.
39
- */
40
- export declare function discoverAccessKeyWorkspaces(options: DiscoveryOptions): Promise<{
41
- organizationId: string;
42
- workspaces: DiscoveredWorkspace[];
43
- }>;
44
20
  /**
45
21
  * Every organization this account belongs to, each with its workspaces.
46
22
  *
@@ -50,17 +26,14 @@ export declare function discoverAccessKeyWorkspaces(options: DiscoveryOptions):
50
26
  */
51
27
  export declare function discoverOrganizations(options: DiscoveryOptions): Promise<DiscoveredOrganization[]>;
52
28
  /**
53
- * Every workspace this credential's account belongs to, and which are
54
- * reachable right now without a new token — the data-plane counterpart to
55
- * `discoverOrganizations`, and the one that actually works with an ordinary
56
- * bearer token (OAuth or access key alike). `/v1/me` requires a first-party
57
- * control-plane credential a CLI never holds; `/v1/identity` requires only
58
- * the normal `synomem:read` scope every credential already has.
29
+ * Every context this credential's grant may use right now, with canonical ids
30
+ * (`GET /v1/contexts`). Follows `nextCursor` until the listing is complete, bounded.
59
31
  */
60
- export declare function discoverIdentity(options: DiscoveryOptions): Promise<{
61
- workspaceId: string;
62
- workspaces: WorkspaceMembership[];
63
- }>;
32
+ export declare function discoverContexts(options: DiscoveryOptions): Promise<ContextListing>;
33
+ /** Who this credential is: account, connection, grant, and effective context if selected. */
34
+ export declare function describeIdentity(options: DiscoveryOptions & {
35
+ contextId?: string;
36
+ }): Promise<IdentityDescription>;
64
37
  /** Flattens discovery into the choices a person picks from. */
65
38
  export declare function workspaceChoices(organizations: DiscoveredOrganization[]): Array<{
66
39
  value: string;
@@ -1 +1 @@
1
- {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;;;;;OAKG;IACH,wBAAwB,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AA2CD;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,mBAAmB,EAAE,CAAA;CAAE,CAAC,CAKxE;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAsBnC;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,mBAAmB,EAAE,CAAA;CAAE,CAAC,CAKrE;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,sBAAsB,EAAE,GACtC,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAe1D"}
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AA6DD;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAsBnC;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAazF;AAED,6FAA6F;AAC7F,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,gBAAgB,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD,OAAO,CAAC,mBAAmB,CAAC,CAM9B;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,sBAAsB,EAAE,GACtC,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAe1D"}
package/dist/discover.js CHANGED
@@ -1,31 +1,28 @@
1
1
  /*
2
- * Finding out which workspaces a credential can reach, so nobody has to type
3
- * one from memory.
2
+ * Finding out what a credential can reach, so nobody has to type an id from memory.
4
3
  *
5
- * A hosted workspace ID looks like `ws-04psqx2rkt8ttft7a1t2z69r97`. Asking a
6
- * person to enter that during setup is asking them to leave and go find it, and
7
- * the credential they just authorized already knows the answer -- or knows
8
- * enough to offer a short list.
4
+ * Two questions, two routes, because they carry different authority:
9
5
  *
10
- * Two credentials, two routes, because they carry different authority:
6
+ * `discoverContexts` / `describeIdentity` ask the DATA plane, with any credential
7
+ * (OAuth access token or `syn_` access key), which workspace/actor targets that
8
+ * credential's grant may use right now (identity contract §4). No context has to be
9
+ * chosen first — that is the point.
11
10
  *
12
- * A member-owned access key authenticates the ACCOUNT that created it, and
13
- * reaches every workspace in that account's organization -- never just one
14
- * -- so `discoverAccessKeyWorkspaces` lists them off the data plane, with no
15
- * workspace chosen yet, which is exactly what setup cannot supply up front.
16
- *
17
- * A browser sign-in also authorizes an ACCOUNT, which may reach several
18
- * organizations, each with several workspaces. `discoverOrganizations` lists
19
- * them for selection.
11
+ * `discoverOrganizations` asks the control plane which organizations an account
12
+ * belongs to, for first-party setup flows that hold an account session.
20
13
  */
21
14
  import { SynomemError } from './errors.js';
22
- async function readJson(options, path) {
15
+ async function readJson(options, path, extraHeaders) {
23
16
  const request = options.fetch ?? globalThis.fetch;
24
17
  const url = new URL(path, options.baseUrl.endsWith('/') ? options.baseUrl : `${options.baseUrl}/`);
25
18
  let response;
26
19
  try {
27
20
  response = await request(url, {
28
- headers: { authorization: `Bearer ${options.accessToken}`, accept: 'application/json' },
21
+ headers: {
22
+ authorization: `Bearer ${options.accessToken}`,
23
+ accept: 'application/json',
24
+ ...extraHeaders,
25
+ },
29
26
  ...(options.signal ? { signal: options.signal } : {}),
30
27
  });
31
28
  }
@@ -42,24 +39,22 @@ async function readJson(options, path) {
42
39
  if (!response.ok || body.ok !== true || body.data === undefined) {
43
40
  // 401 and 403 are the ones a person can act on, so they keep their own
44
41
  // codes rather than being flattened into a generic protocol error.
45
- const code = response.status === 401 ? 'AUTH_REQUIRED' : response.status === 403 ? 'AUTH_FORBIDDEN' : null;
42
+ const reported = body.error?.code;
43
+ const code = reported === 'CONTEXT_REQUIRED' ||
44
+ reported === 'CONTEXT_FORBIDDEN' ||
45
+ reported === 'CONTEXT_AMBIGUOUS' ||
46
+ reported === 'REAUTHORIZATION_REQUIRED'
47
+ ? reported
48
+ : response.status === 401
49
+ ? 'AUTH_REQUIRED'
50
+ : response.status === 403
51
+ ? 'AUTH_FORBIDDEN'
52
+ : null;
46
53
  const message = body.error?.message ?? `${url.pathname} returned ${response.status}.`;
47
54
  throw new SynomemError(code ?? 'REMOTE_PROTOCOL', message);
48
55
  }
49
56
  return body.data;
50
57
  }
51
- /**
52
- * Every workspace a member-owned access key can reach, asked before any one
53
- * of them has been chosen.
54
- *
55
- * Answered by the data plane rather than the control plane: an access key is
56
- * not an account principal the control plane recognizes, but the data plane
57
- * already knows which organization owns it and can list that organization's
58
- * workspaces without requiring one to be named first.
59
- */
60
- export async function discoverAccessKeyWorkspaces(options) {
61
- return await readJson(options, 'v1/access-keys/workspaces');
62
- }
63
58
  /**
64
59
  * Every organization this account belongs to, each with its workspaces.
65
60
  *
@@ -86,15 +81,24 @@ export async function discoverOrganizations(options) {
86
81
  return organizations;
87
82
  }
88
83
  /**
89
- * Every workspace this credential's account belongs to, and which are
90
- * reachable right now without a new token — the data-plane counterpart to
91
- * `discoverOrganizations`, and the one that actually works with an ordinary
92
- * bearer token (OAuth or access key alike). `/v1/me` requires a first-party
93
- * control-plane credential a CLI never holds; `/v1/identity` requires only
94
- * the normal `synomem:read` scope every credential already has.
84
+ * Every context this credential's grant may use right now, with canonical ids
85
+ * (`GET /v1/contexts`). Follows `nextCursor` until the listing is complete, bounded.
95
86
  */
96
- export async function discoverIdentity(options) {
97
- return await readJson(options, 'v1/identity');
87
+ export async function discoverContexts(options) {
88
+ let listing;
89
+ let cursor;
90
+ for (let page = 0; page < 20; page += 1) {
91
+ const next = await readJson(options, `v1/contexts?limit=100${cursor ? `&cursor=${encodeURIComponent(cursor)}` : ''}`);
92
+ listing = listing ? { ...next, contexts: [...listing.contexts, ...next.contexts] } : next;
93
+ cursor = next.nextCursor;
94
+ if (!cursor)
95
+ break;
96
+ }
97
+ return { ...listing, nextCursor: null };
98
+ }
99
+ /** Who this credential is: account, connection, grant, and effective context if selected. */
100
+ export async function describeIdentity(options) {
101
+ return await readJson(options, 'v1/identity', options.contextId ? { 'synomem-context-id': options.contextId } : undefined);
98
102
  }
99
103
  /** Flattens discovery into the choices a person picks from. */
100
104
  export function workspaceChoices(organizations) {
@@ -1 +1 @@
1
- {"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"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"}
package/dist/errors.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const errorCodes: readonly ["INVALID_INPUT", "INVALID_AGENT_ID", "INVALID_EVENT", "UNSUPPORTED_EVENT", "AGENT_NOT_FOUND", "AGENT_EXISTS", "ALIAS_CONFLICT", "TOPIC_NOT_FOUND", "TOPIC_EXISTS", "KUDOS_NOT_FOUND", "ITEM_NOT_FOUND", "MEMO_NOT_FOUND", "NOTE_NOT_FOUND", "TODO_NOT_FOUND", "REVISION_CONFLICT", "IDEMPOTENCY_CONFLICT", "MUTATION_FORBIDDEN", "SELF_AWARD_FORBIDDEN", "ACKNOWLEDGMENT_FORBIDDEN", "REVOCATION_FORBIDDEN", "READ_ONLY", "DATABASE_BUSY", "DATABASE_CORRUPT", "UNSUPPORTED_SCHEMA", "UNSAFE_PATH", "POLICY_FORBIDDEN", "CONFIG_INVALID", "AUTH_REQUIRED", "AUTH_FORBIDDEN", "UNSUPPORTED_BACKEND", "REMOTE_UNAVAILABLE", "REMOTE_PROTOCOL", "RATE_LIMITED", "INTERNAL_ERROR"];
1
+ export declare const errorCodes: readonly ["INVALID_INPUT", "INVALID_AGENT_ID", "INVALID_EVENT", "UNSUPPORTED_EVENT", "AGENT_NOT_FOUND", "AGENT_EXISTS", "ALIAS_CONFLICT", "TOPIC_NOT_FOUND", "TOPIC_EXISTS", "KUDOS_NOT_FOUND", "ITEM_NOT_FOUND", "MEMO_NOT_FOUND", "NOTE_NOT_FOUND", "TODO_NOT_FOUND", "REVISION_CONFLICT", "IDEMPOTENCY_CONFLICT", "MUTATION_FORBIDDEN", "SELF_AWARD_FORBIDDEN", "ACKNOWLEDGMENT_FORBIDDEN", "REVOCATION_FORBIDDEN", "READ_ONLY", "DATABASE_BUSY", "DATABASE_CORRUPT", "UNSUPPORTED_SCHEMA", "UNSAFE_PATH", "POLICY_FORBIDDEN", "CONFIG_INVALID", "AUTH_REQUIRED", "AUTH_FORBIDDEN", "CONTEXT_REQUIRED", "CONTEXT_FORBIDDEN", "CONTEXT_AMBIGUOUS", "REAUTHORIZATION_REQUIRED", "UNSUPPORTED_BACKEND", "REMOTE_UNAVAILABLE", "REMOTE_PROTOCOL", "RATE_LIMITED", "INTERNAL_ERROR"];
2
2
  export type SynomemErrorCode = (typeof errorCodes)[number];
3
3
  export declare class SynomemError extends Error {
4
4
  readonly code: SynomemErrorCode;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,0pBAmCb,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAE/B,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAMvF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAa3D"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,ovBAuCb,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAE/B,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAMvF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAa3D"}
package/dist/errors.js CHANGED
@@ -29,6 +29,10 @@ export const errorCodes = [
29
29
  'CONFIG_INVALID',
30
30
  'AUTH_REQUIRED',
31
31
  'AUTH_FORBIDDEN',
32
+ 'CONTEXT_REQUIRED',
33
+ 'CONTEXT_FORBIDDEN',
34
+ 'CONTEXT_AMBIGUOUS',
35
+ 'REAUTHORIZATION_REQUIRED',
32
36
  'UNSUPPORTED_BACKEND',
33
37
  'REMOTE_UNAVAILABLE',
34
38
  'REMOTE_PROTOCOL',
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE/B,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,eAAe;IACf,kBAAkB;IAClB,eAAe;IACf,mBAAmB;IACnB,iBAAiB;IACjB,cAAc;IACd,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,mBAAmB;IACnB,sBAAsB;IACtB,oBAAoB;IACpB,sBAAsB;IACtB,0BAA0B;IAC1B,sBAAsB;IACtB,WAAW;IACX,eAAe;IACf,kBAAkB;IAClB,oBAAoB;IACpB,aAAa;IACb,kBAAkB;IAClB,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,qBAAqB;IACrB,oBAAoB;IACpB,iBAAiB;IACjB,cAAc;IACd,gBAAgB;CACR,CAAC;AAIX,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IACvB,OAAO,CAA2B;IAE3C,YAAY,IAAsB,EAAE,OAAe,EAAE,OAAiC;QACpF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,YAAY;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,YAAY,CAAC,eAAe,EAAE,0BAA0B,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;IACpF,IAAI,iCAAiC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,OAAO,IAAI,YAAY,CAAC,eAAe,EAAE,8CAA8C,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,+CAA+C,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClE,OAAO,IAAI,YAAY,CAAC,kBAAkB,EAAE,iDAAiD,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,IAAI,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE/B,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,eAAe;IACf,kBAAkB;IAClB,eAAe;IACf,mBAAmB;IACnB,iBAAiB;IACjB,cAAc;IACd,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,mBAAmB;IACnB,sBAAsB;IACtB,oBAAoB;IACpB,sBAAsB;IACtB,0BAA0B;IAC1B,sBAAsB;IACtB,WAAW;IACX,eAAe;IACf,kBAAkB;IAClB,oBAAoB;IACpB,aAAa;IACb,kBAAkB;IAClB,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,mBAAmB;IACnB,mBAAmB;IACnB,0BAA0B;IAC1B,qBAAqB;IACrB,oBAAoB;IACpB,iBAAiB;IACjB,cAAc;IACd,gBAAgB;CACR,CAAC;AAIX,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IACvB,OAAO,CAA2B;IAE3C,YAAY,IAAsB,EAAE,OAAe,EAAE,OAAiC;QACpF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,YAAY;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,YAAY,CAAC,eAAe,EAAE,0BAA0B,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;IACpF,IAAI,iCAAiC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,OAAO,IAAI,YAAY,CAAC,eAAe,EAAE,8CAA8C,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,+CAA+C,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClE,OAAO,IAAI,YAAY,CAAC,kBAAkB,EAAE,iDAAiD,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,IAAI,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC"}