synomem 0.1.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.
Files changed (130) hide show
  1. package/AGENTS.md +42 -0
  2. package/ARCHITECTURE.md +126 -0
  3. package/CHANGELOG.md +35 -0
  4. package/CODE_OF_CONDUCT.md +29 -0
  5. package/CONTRIBUTING.md +48 -0
  6. package/LICENSE +21 -0
  7. package/README.md +247 -0
  8. package/SECURITY.md +117 -0
  9. package/dist/backend.d.ts +9 -0
  10. package/dist/backend.d.ts.map +1 -0
  11. package/dist/backend.js +60 -0
  12. package/dist/backend.js.map +1 -0
  13. package/dist/cli.d.ts +34 -0
  14. package/dist/cli.d.ts.map +1 -0
  15. package/dist/cli.js +1040 -0
  16. package/dist/cli.js.map +1 -0
  17. package/dist/client.d.ts +168 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +1031 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/config.d.ts +33 -0
  22. package/dist/config.d.ts.map +1 -0
  23. package/dist/config.js +153 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/credentials.d.ts +36 -0
  26. package/dist/credentials.d.ts.map +1 -0
  27. package/dist/credentials.js +127 -0
  28. package/dist/credentials.js.map +1 -0
  29. package/dist/errors.d.ts +9 -0
  30. package/dist/errors.d.ts.map +1 -0
  31. package/dist/errors.js +60 -0
  32. package/dist/errors.js.map +1 -0
  33. package/dist/fs-utils.d.ts +7 -0
  34. package/dist/fs-utils.d.ts.map +1 -0
  35. package/dist/fs-utils.js +68 -0
  36. package/dist/fs-utils.js.map +1 -0
  37. package/dist/import.d.ts +655 -0
  38. package/dist/import.d.ts.map +1 -0
  39. package/dist/import.js +226 -0
  40. package/dist/import.js.map +1 -0
  41. package/dist/index.d.ts +20 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +11 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/mcp/index.d.ts +14 -0
  46. package/dist/mcp/index.d.ts.map +1 -0
  47. package/dist/mcp/index.js +698 -0
  48. package/dist/mcp/index.js.map +1 -0
  49. package/dist/mcp-server.d.ts +3 -0
  50. package/dist/mcp-server.d.ts.map +1 -0
  51. package/dist/mcp-server.js +45 -0
  52. package/dist/mcp-server.js.map +1 -0
  53. package/dist/oauth.d.ts +27 -0
  54. package/dist/oauth.d.ts.map +1 -0
  55. package/dist/oauth.js +201 -0
  56. package/dist/oauth.js.map +1 -0
  57. package/dist/ports/projections.d.ts +6 -0
  58. package/dist/ports/projections.d.ts.map +1 -0
  59. package/dist/ports/projections.js +2 -0
  60. package/dist/ports/projections.js.map +1 -0
  61. package/dist/ports/repository.d.ts +31 -0
  62. package/dist/ports/repository.d.ts.map +1 -0
  63. package/dist/ports/repository.js +2 -0
  64. package/dist/ports/repository.js.map +1 -0
  65. package/dist/projections.d.ts +24 -0
  66. package/dist/projections.d.ts.map +1 -0
  67. package/dist/projections.js +531 -0
  68. package/dist/projections.js.map +1 -0
  69. package/dist/remote.d.ts +120 -0
  70. package/dist/remote.d.ts.map +1 -0
  71. package/dist/remote.js +286 -0
  72. package/dist/remote.js.map +1 -0
  73. package/dist/schemas.d.ts +901 -0
  74. package/dist/schemas.d.ts.map +1 -0
  75. package/dist/schemas.js +424 -0
  76. package/dist/schemas.js.map +1 -0
  77. package/dist/service.d.ts +126 -0
  78. package/dist/service.d.ts.map +1 -0
  79. package/dist/service.js +2 -0
  80. package/dist/service.js.map +1 -0
  81. package/dist/skill-install.d.ts +34 -0
  82. package/dist/skill-install.d.ts.map +1 -0
  83. package/dist/skill-install.js +256 -0
  84. package/dist/skill-install.js.map +1 -0
  85. package/dist/storage.d.ts +94 -0
  86. package/dist/storage.d.ts.map +1 -0
  87. package/dist/storage.js +1229 -0
  88. package/dist/storage.js.map +1 -0
  89. package/dist/types.d.ts +442 -0
  90. package/dist/types.d.ts.map +1 -0
  91. package/dist/types.js +2 -0
  92. package/dist/types.js.map +1 -0
  93. package/dist/version.d.ts +3 -0
  94. package/dist/version.d.ts.map +1 -0
  95. package/dist/version.js +14 -0
  96. package/dist/version.js.map +1 -0
  97. package/docs/cli.md +180 -0
  98. package/docs/examples.md +70 -0
  99. package/docs/mcp.md +96 -0
  100. package/docs/recovery.md +45 -0
  101. package/docs/releasing.md +61 -0
  102. package/docs/skill.md +93 -0
  103. package/docs/storage-format.md +83 -0
  104. package/openapi/synomem-v1.yaml +674 -0
  105. package/package.json +100 -0
  106. package/skills/synomem/SKILL.md +71 -0
  107. package/skills/synomem/agents/openai.yaml +8 -0
  108. package/skills/synomem/references/examples.md +28 -0
  109. package/src/backend.ts +91 -0
  110. package/src/cli.ts +1623 -0
  111. package/src/client.ts +1261 -0
  112. package/src/config.ts +170 -0
  113. package/src/credentials.ts +194 -0
  114. package/src/errors.ts +64 -0
  115. package/src/fs-utils.ts +85 -0
  116. package/src/import.ts +284 -0
  117. package/src/index.ts +61 -0
  118. package/src/mcp/index.ts +973 -0
  119. package/src/mcp-server.ts +46 -0
  120. package/src/oauth.ts +252 -0
  121. package/src/ports/projections.ts +6 -0
  122. package/src/ports/repository.ts +67 -0
  123. package/src/projections.ts +624 -0
  124. package/src/remote.ts +516 -0
  125. package/src/schemas.ts +457 -0
  126. package/src/service.ts +140 -0
  127. package/src/skill-install.ts +332 -0
  128. package/src/storage.ts +1603 -0
  129. package/src/types.ts +458 -0
  130. package/src/version.ts +16 -0
@@ -0,0 +1,120 @@
1
+ import type { SynomemService, SynomemServiceCapabilities, SynomemServiceInfo } from './service.js';
2
+ import type { ActorIdentity, ChangesInput, CreateAgentInput, CreateNoteInput, CreateTodoInput, GiveKudosInput, ItemListInput, KudosListInput, ReviseNoteInput, SendMemoInput, UpdateAgentInput, UpdateTodoInput } from './types.js';
3
+ export interface SynomemCredentialProvider {
4
+ getAccessToken(signal?: AbortSignal): Promise<string | undefined>;
5
+ }
6
+ export interface RemoteSynomemOptions {
7
+ baseUrl: string;
8
+ workspaceId: string;
9
+ expectedActor: ActorIdentity;
10
+ credentialProvider: SynomemCredentialProvider;
11
+ fetch?: typeof fetch;
12
+ signal?: AbortSignal;
13
+ timeoutMs?: number;
14
+ maximumResponseBytes?: number;
15
+ }
16
+ export declare function environmentCredentialProvider(env?: NodeJS.ProcessEnv): SynomemCredentialProvider;
17
+ export declare class RemoteSynomemService implements SynomemService {
18
+ readonly actor: ActorIdentity;
19
+ private readonly baseUrl;
20
+ private readonly workspaceId;
21
+ private readonly credentialProvider;
22
+ private readonly fetchImplementation;
23
+ private readonly signal?;
24
+ private readonly timeoutMs;
25
+ private readonly maximumResponseBytes;
26
+ private initialized;
27
+ private cachedCapabilities?;
28
+ readonly agents: {
29
+ create: (input: CreateAgentInput) => Promise<import("./types.js").AgentProfile>;
30
+ update: (id: string, changes: UpdateAgentInput) => Promise<import("./types.js").AgentProfile>;
31
+ get: (idOrAlias: string) => Promise<import("./types.js").AgentProfile>;
32
+ list: () => Promise<import("./types.js").AgentProfile[]>;
33
+ };
34
+ readonly kudos: {
35
+ give: (input: GiveKudosInput) => Promise<import("./types.js").GiveKudosResult>;
36
+ list: (input?: KudosListInput) => Promise<import("./types.js").Page<import("./types.js").KudosSummary>>;
37
+ changes: (input?: ChangesInput) => Promise<import("./types.js").ChangePage>;
38
+ get: (id: string) => Promise<import("./types.js").KudosRecord>;
39
+ acknowledge: (input: {
40
+ kudosId: string;
41
+ note?: string;
42
+ }) => Promise<import("./types.js").KudosRecord>;
43
+ revoke: (input: {
44
+ kudosId: string;
45
+ reason: string;
46
+ administrative?: boolean;
47
+ }) => Promise<import("./types.js").KudosRecord>;
48
+ };
49
+ readonly memos: {
50
+ send: (input: SendMemoInput) => Promise<import("./types.js").SendMemoResult>;
51
+ list: (input?: Omit<ItemListInput, "kinds">) => Promise<import("./types.js").Page<import("./types.js").ItemSummary>>;
52
+ get: (id: string) => Promise<import("./types.js").MemoRecord>;
53
+ read: (input: {
54
+ memoId: string;
55
+ idempotencyKey?: string;
56
+ }) => Promise<import("./types.js").MemoRecord>;
57
+ archive: (input: {
58
+ memoId: string;
59
+ idempotencyKey?: string;
60
+ }) => Promise<import("./types.js").MemoRecord>;
61
+ };
62
+ readonly notes: {
63
+ create: (input: CreateNoteInput) => Promise<import("./types.js").CreateNoteResult>;
64
+ list: (input?: Omit<ItemListInput, "kinds">) => Promise<import("./types.js").Page<import("./types.js").ItemSummary>>;
65
+ get: (id: string) => Promise<import("./types.js").NoteRecord>;
66
+ revise: (input: ReviseNoteInput) => Promise<import("./types.js").NoteRecord>;
67
+ archive: (input: {
68
+ noteId: string;
69
+ idempotencyKey?: string;
70
+ }) => Promise<import("./types.js").NoteRecord>;
71
+ };
72
+ readonly todos: {
73
+ create: (input: CreateTodoInput) => Promise<import("./types.js").CreateTodoResult>;
74
+ list: (input?: Omit<ItemListInput, "kinds">) => Promise<import("./types.js").Page<import("./types.js").ItemSummary>>;
75
+ get: (id: string) => Promise<import("./types.js").TodoRecord>;
76
+ update: (input: UpdateTodoInput) => Promise<import("./types.js").TodoRecord>;
77
+ accept: (input: {
78
+ todoId: string;
79
+ idempotencyKey?: string;
80
+ }) => Promise<import("./types.js").TodoRecord>;
81
+ reject: (input: {
82
+ todoId: string;
83
+ reason?: string;
84
+ idempotencyKey?: string;
85
+ }) => Promise<import("./types.js").TodoRecord>;
86
+ complete: (input: {
87
+ todoId: string;
88
+ note?: string;
89
+ idempotencyKey?: string;
90
+ }) => Promise<import("./types.js").TodoRecord>;
91
+ reopen: (input: {
92
+ todoId: string;
93
+ idempotencyKey?: string;
94
+ }) => Promise<import("./types.js").TodoRecord>;
95
+ cancel: (input: {
96
+ todoId: string;
97
+ reason?: string;
98
+ idempotencyKey?: string;
99
+ }) => Promise<import("./types.js").TodoRecord>;
100
+ };
101
+ readonly items: {
102
+ list: (input?: ItemListInput) => Promise<import("./types.js").Page<import("./types.js").ItemSummary>>;
103
+ get: (id: string) => Promise<import("./types.js").ItemRecord>;
104
+ changes: (input?: ChangesInput) => Promise<import("./types.js").ChangePage>;
105
+ };
106
+ constructor(options: RemoteSynomemOptions);
107
+ init(): Promise<void>;
108
+ close(): Promise<void>;
109
+ stats(input?: KudosListInput): Promise<import("./types.js").KudosStats>;
110
+ doctor(): Promise<import("./types.js").DoctorResult>;
111
+ export(format: 'json' | 'jsonl' | 'markdown'): Promise<string>;
112
+ rebuild(): Promise<import("./service.js").ProjectionRebuildResult>;
113
+ capabilities(): Promise<SynomemServiceCapabilities>;
114
+ info(): Promise<SynomemServiceInfo>;
115
+ getCanonicalEvent(id: string): Promise<import("./types.js").SynomemEvent | undefined>;
116
+ private todoTransition;
117
+ private mutation;
118
+ private request;
119
+ }
120
+ //# sourceMappingURL=remote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
package/dist/remote.js ADDED
@@ -0,0 +1,286 @@
1
+ import { actorSchema } from './schemas.js';
2
+ import { asSynomemError, errorCodes, SynomemError } from './errors.js';
3
+ const defaultMaximumResponseBytes = 1024 * 1024;
4
+ const defaultTimeoutMs = 15_000;
5
+ function remoteBaseUrl(value) {
6
+ let parsed;
7
+ try {
8
+ parsed = new URL(value);
9
+ }
10
+ catch {
11
+ throw new SynomemError('CONFIG_INVALID', 'Remote Synomem baseUrl must be an absolute URL.');
12
+ }
13
+ const loopback = parsed.hostname === 'localhost' ||
14
+ parsed.hostname === '127.0.0.1' ||
15
+ parsed.hostname === '[::1]';
16
+ if (parsed.protocol !== 'https:' && !(parsed.protocol === 'http:' && loopback)) {
17
+ throw new SynomemError('CONFIG_INVALID', 'Remote Synomem requires HTTPS except for explicit loopback development URLs.');
18
+ }
19
+ if (parsed.username ||
20
+ parsed.password ||
21
+ parsed.search ||
22
+ parsed.hash ||
23
+ parsed.pathname !== '/') {
24
+ throw new SynomemError('CONFIG_INVALID', 'Remote Synomem baseUrl cannot contain credentials, paths, query parameters, or fragments.');
25
+ }
26
+ return new URL(parsed.href.endsWith('/') ? parsed.href : `${parsed.href}/`);
27
+ }
28
+ function queryString(input) {
29
+ const parameters = new URLSearchParams();
30
+ for (const [key, value] of Object.entries(input)) {
31
+ if (value === undefined)
32
+ continue;
33
+ if (Array.isArray(value)) {
34
+ for (const item of value)
35
+ parameters.append(key, String(item));
36
+ }
37
+ else {
38
+ parameters.set(key, String(value));
39
+ }
40
+ }
41
+ const encoded = parameters.toString();
42
+ return encoded ? `?${encoded}` : '';
43
+ }
44
+ function knownErrorCode(value) {
45
+ return errorCodes.some((code) => code === value)
46
+ ? value
47
+ : 'REMOTE_PROTOCOL';
48
+ }
49
+ async function boundedResponseBytes(response, maximumBytes) {
50
+ if (!response.body)
51
+ return new Uint8Array();
52
+ const reader = response.body.getReader();
53
+ const chunks = [];
54
+ let length = 0;
55
+ while (true) {
56
+ const { done, value } = await reader.read();
57
+ if (done)
58
+ break;
59
+ if (!value) {
60
+ throw new SynomemError('REMOTE_PROTOCOL', 'Remote response stream was malformed.');
61
+ }
62
+ length += value.byteLength;
63
+ if (length > maximumBytes) {
64
+ await reader.cancel();
65
+ throw new SynomemError('REMOTE_PROTOCOL', 'Remote response exceeded the configured limit.');
66
+ }
67
+ chunks.push(value);
68
+ }
69
+ const bytes = new Uint8Array(length);
70
+ let offset = 0;
71
+ for (const chunk of chunks) {
72
+ bytes.set(chunk, offset);
73
+ offset += chunk.byteLength;
74
+ }
75
+ return bytes;
76
+ }
77
+ export function environmentCredentialProvider(env = process.env) {
78
+ return {
79
+ async getAccessToken() {
80
+ return env.SYNOMEM_ACCESS_TOKEN;
81
+ },
82
+ };
83
+ }
84
+ export class RemoteSynomemService {
85
+ actor;
86
+ baseUrl;
87
+ workspaceId;
88
+ credentialProvider;
89
+ fetchImplementation;
90
+ signal;
91
+ timeoutMs;
92
+ maximumResponseBytes;
93
+ initialized = false;
94
+ cachedCapabilities;
95
+ agents = {
96
+ create: (input) => this.request('POST', 'agents', input),
97
+ update: (id, changes) => this.request('PATCH', `agents/${encodeURIComponent(id)}`, changes),
98
+ get: (idOrAlias) => this.request('GET', `agents/${encodeURIComponent(idOrAlias)}`),
99
+ list: () => this.request('GET', 'agents'),
100
+ };
101
+ kudos = {
102
+ give: (input) => this.mutation('POST', 'kudos', input),
103
+ list: (input = {}) => this.request('GET', `kudos${queryString(input)}`),
104
+ changes: (input = {}) => this.request('GET', `kudos/changes${queryString(input)}`),
105
+ get: (id) => this.request('GET', `kudos/${encodeURIComponent(id)}`),
106
+ acknowledge: (input) => this.request('POST', `kudos/${encodeURIComponent(input.kudosId)}/acknowledgment`, input.note === undefined ? {} : { note: input.note }),
107
+ revoke: (input) => this.request('POST', `kudos/${encodeURIComponent(input.kudosId)}/revocation`, { reason: input.reason }),
108
+ };
109
+ memos = {
110
+ send: (input) => this.mutation('POST', 'memos', input),
111
+ list: (input = {}) => this.request('GET', `memos${queryString(input)}`),
112
+ get: (id) => this.request('GET', `memos/${encodeURIComponent(id)}`),
113
+ read: (input) => this.mutation('POST', `memos/${encodeURIComponent(input.memoId)}/read`, input, ['memoId']),
114
+ archive: (input) => this.mutation('POST', `memos/${encodeURIComponent(input.memoId)}/archive`, input, ['memoId']),
115
+ };
116
+ notes = {
117
+ create: (input) => this.mutation('POST', 'notes', input),
118
+ list: (input = {}) => this.request('GET', `notes${queryString(input)}`),
119
+ get: (id) => this.request('GET', `notes/${encodeURIComponent(id)}`),
120
+ revise: (input) => this.mutation('POST', `notes/${encodeURIComponent(input.noteId)}/revisions`, input, ['noteId']),
121
+ archive: (input) => this.mutation('POST', `notes/${encodeURIComponent(input.noteId)}/archive`, input, ['noteId']),
122
+ };
123
+ todos = {
124
+ create: (input) => this.mutation('POST', 'todos', input),
125
+ list: (input = {}) => this.request('GET', `todos${queryString(input)}`),
126
+ get: (id) => this.request('GET', `todos/${encodeURIComponent(id)}`),
127
+ update: (input) => this.mutation('POST', `todos/${encodeURIComponent(input.todoId)}/revisions`, input, ['todoId']),
128
+ accept: (input) => this.todoTransition('accept', input),
129
+ reject: (input) => this.todoTransition('reject', input),
130
+ complete: (input) => this.todoTransition('complete', input),
131
+ reopen: (input) => this.todoTransition('reopen', input),
132
+ cancel: (input) => this.todoTransition('cancel', input),
133
+ };
134
+ items = {
135
+ list: (input = {}) => this.request('GET', `items${queryString(input)}`),
136
+ get: (id) => this.request('GET', `items/${encodeURIComponent(id)}`),
137
+ changes: (input = {}) => this.request('GET', `changes${queryString(input)}`),
138
+ };
139
+ constructor(options) {
140
+ this.baseUrl = remoteBaseUrl(options.baseUrl);
141
+ if (!options.workspaceId.trim() || options.workspaceId.length > 100) {
142
+ throw new SynomemError('CONFIG_INVALID', 'Remote Synomem workspaceId is required.');
143
+ }
144
+ this.workspaceId = options.workspaceId;
145
+ try {
146
+ this.actor = actorSchema.parse(options.expectedActor);
147
+ }
148
+ catch (error) {
149
+ throw asSynomemError(error);
150
+ }
151
+ this.credentialProvider = options.credentialProvider;
152
+ this.fetchImplementation = options.fetch ?? fetch;
153
+ this.signal = options.signal;
154
+ this.timeoutMs = options.timeoutMs ?? defaultTimeoutMs;
155
+ this.maximumResponseBytes = options.maximumResponseBytes ?? defaultMaximumResponseBytes;
156
+ if (!Number.isSafeInteger(this.timeoutMs) || this.timeoutMs < 1) {
157
+ throw new SynomemError('CONFIG_INVALID', 'Remote timeoutMs must be a positive integer.');
158
+ }
159
+ if (!Number.isSafeInteger(this.maximumResponseBytes) || this.maximumResponseBytes < 1024) {
160
+ throw new SynomemError('CONFIG_INVALID', 'Remote maximumResponseBytes must be an integer of at least 1024.');
161
+ }
162
+ }
163
+ async init() {
164
+ if (this.initialized)
165
+ return;
166
+ this.cachedCapabilities = await this.request('GET', '../../capabilities');
167
+ if (this.cachedCapabilities.backend !== 'remote') {
168
+ throw new SynomemError('REMOTE_PROTOCOL', 'The configured server is not a remote backend.');
169
+ }
170
+ const binding = this.cachedCapabilities.binding;
171
+ if (binding.workspaceId !== this.workspaceId ||
172
+ binding.actor.kind !== this.actor.kind ||
173
+ binding.actor.id !== this.actor.id) {
174
+ throw new SynomemError('AUTH_FORBIDDEN', 'The authenticated Synomem actor does not match the configured actor.');
175
+ }
176
+ this.initialized = true;
177
+ }
178
+ async close() {
179
+ this.initialized = false;
180
+ }
181
+ stats(input = {}) {
182
+ return this.request('GET', `kudos/stats${queryString(input)}`);
183
+ }
184
+ doctor() {
185
+ return this.request('GET', 'diagnostics');
186
+ }
187
+ async export(format) {
188
+ const result = await this.request('GET', `export${queryString({ format })}`);
189
+ return result.content;
190
+ }
191
+ rebuild() {
192
+ return this.request('POST', 'administration/rebuild', {});
193
+ }
194
+ async capabilities() {
195
+ return (this.cachedCapabilities ??
196
+ (await this.request('GET', '../../capabilities')));
197
+ }
198
+ async info() {
199
+ return { backend: 'remote', baseUrl: this.baseUrl.href, workspaceId: this.workspaceId };
200
+ }
201
+ getCanonicalEvent(id) {
202
+ return this.request('GET', `events/${encodeURIComponent(id)}`);
203
+ }
204
+ todoTransition(transition, input) {
205
+ return this.mutation('POST', `todos/${encodeURIComponent(input.todoId)}/${transition}`, input, ['todoId']);
206
+ }
207
+ mutation(method, path, input, omittedKeys = []) {
208
+ const body = { ...input };
209
+ const idempotencyKey = typeof body.idempotencyKey === 'string' ? body.idempotencyKey : undefined;
210
+ delete body.idempotencyKey;
211
+ for (const key of omittedKeys)
212
+ delete body[key];
213
+ return this.request(method, path, body, idempotencyKey);
214
+ }
215
+ async request(method, path, body, idempotencyKey) {
216
+ const accessToken = await this.credentialProvider.getAccessToken(this.signal);
217
+ if (!accessToken) {
218
+ throw new SynomemError('AUTH_REQUIRED', 'Remote Synomem authentication is required.');
219
+ }
220
+ const workspaceBase = new URL(`v1/workspaces/${encodeURIComponent(this.workspaceId)}/`, this.baseUrl);
221
+ const url = new URL(path, workspaceBase);
222
+ if (url.origin !== this.baseUrl.origin) {
223
+ throw new SynomemError('CONFIG_INVALID', 'Remote request escaped the configured origin.');
224
+ }
225
+ const timeoutSignal = AbortSignal.timeout(this.timeoutMs);
226
+ const signal = this.signal ? AbortSignal.any([this.signal, timeoutSignal]) : timeoutSignal;
227
+ let response;
228
+ try {
229
+ response = await this.fetchImplementation(url, {
230
+ method,
231
+ redirect: 'manual',
232
+ signal,
233
+ headers: {
234
+ accept: 'application/json',
235
+ authorization: `Bearer ${accessToken}`,
236
+ ...(body ? { 'content-type': 'application/json' } : {}),
237
+ ...(idempotencyKey ? { 'idempotency-key': idempotencyKey } : {}),
238
+ },
239
+ ...(body ? { body: JSON.stringify(body) } : {}),
240
+ });
241
+ }
242
+ catch (error) {
243
+ if (this.signal?.aborted)
244
+ throw error;
245
+ throw new SynomemError('REMOTE_UNAVAILABLE', 'The remote Synomem service is unavailable.', {
246
+ cause: error instanceof Error ? error.name : 'network_error',
247
+ });
248
+ }
249
+ if (response.status >= 300 && response.status < 400) {
250
+ throw new SynomemError('REMOTE_PROTOCOL', 'Remote redirects are not followed.');
251
+ }
252
+ const declaredLength = Number(response.headers.get('content-length') ?? 0);
253
+ if (declaredLength > this.maximumResponseBytes) {
254
+ throw new SynomemError('REMOTE_PROTOCOL', 'Remote response exceeded the configured limit.');
255
+ }
256
+ const bytes = await boundedResponseBytes(response, this.maximumResponseBytes);
257
+ let envelope;
258
+ try {
259
+ envelope = JSON.parse(new TextDecoder().decode(bytes));
260
+ }
261
+ catch {
262
+ throw new SynomemError('REMOTE_PROTOCOL', 'Remote Synomem returned invalid JSON.');
263
+ }
264
+ if (!response.ok || envelope.ok !== true) {
265
+ if (envelope.ok !== false || !envelope.error || typeof envelope.error.message !== 'string') {
266
+ throw new SynomemError('REMOTE_PROTOCOL', 'Remote Synomem returned an invalid error.');
267
+ }
268
+ const code = response.status === 401
269
+ ? 'AUTH_REQUIRED'
270
+ : response.status === 403
271
+ ? 'AUTH_FORBIDDEN'
272
+ : response.status === 429
273
+ ? 'RATE_LIMITED'
274
+ : knownErrorCode(envelope.error.code);
275
+ throw new SynomemError(code, envelope.error.message, {
276
+ ...(envelope.error.details ?? {}),
277
+ ...(envelope.error.requestId ? { requestId: envelope.error.requestId } : {}),
278
+ });
279
+ }
280
+ if (!('data' in envelope)) {
281
+ throw new SynomemError('REMOTE_PROTOCOL', 'Remote Synomem response omitted data.');
282
+ }
283
+ return envelope.data;
284
+ }
285
+ }
286
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}