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
@@ -0,0 +1,243 @@
1
+ import { z } from 'zod';
2
+ import { type CredentialStore, type CredentialStores } from './credentials.js';
3
+ import { SynomemError } from './errors.js';
4
+ import { createLocalResolver, createRemoteResolver, type ContextResolver, type RemoteCredentialSource } from './resolvers.js';
5
+ import type { ActorIdentity, ContextSummary } from './types.js';
6
+ export declare const PROFILES_FILE = "profiles.json";
7
+ declare const credentialEntrySchema: z.ZodObject<{
8
+ kind: z.ZodEnum<{
9
+ oauth: "oauth";
10
+ "access-key": "access-key";
11
+ }>;
12
+ apiUrl: z.ZodString;
13
+ store: z.ZodEnum<{
14
+ file: "file";
15
+ keychain: "keychain";
16
+ environment: "environment";
17
+ }>;
18
+ secretRef: z.ZodOptional<z.ZodString>;
19
+ issuer: z.ZodOptional<z.ZodString>;
20
+ resource: z.ZodOptional<z.ZodString>;
21
+ clientId: z.ZodOptional<z.ZodString>;
22
+ connectionId: z.ZodOptional<z.ZodString>;
23
+ label: z.ZodOptional<z.ZodString>;
24
+ createdAt: z.ZodString;
25
+ }, z.core.$strict>;
26
+ declare const localProfileSchema: z.ZodObject<{
27
+ backend: z.ZodLiteral<"local">;
28
+ home: z.ZodOptional<z.ZodString>;
29
+ actorId: z.ZodString;
30
+ actorName: z.ZodOptional<z.ZodString>;
31
+ contextId: z.ZodString;
32
+ }, z.core.$strict>;
33
+ declare const remoteProfileSchema: z.ZodObject<{
34
+ backend: z.ZodOptional<z.ZodLiteral<"remote">>;
35
+ credentialRef: z.ZodString;
36
+ contextId: z.ZodString;
37
+ workspaceId: z.ZodOptional<z.ZodString>;
38
+ workspaceName: z.ZodOptional<z.ZodString>;
39
+ actor: z.ZodOptional<z.ZodObject<{
40
+ kind: z.ZodEnum<{
41
+ human: "human";
42
+ agent: "agent";
43
+ system: "system";
44
+ }>;
45
+ id: z.ZodString;
46
+ displayName: z.ZodOptional<z.ZodString>;
47
+ }, z.core.$strict>>;
48
+ }, z.core.$strict>;
49
+ export declare const profileSchema: z.ZodUnion<readonly [z.ZodObject<{
50
+ backend: z.ZodLiteral<"local">;
51
+ home: z.ZodOptional<z.ZodString>;
52
+ actorId: z.ZodString;
53
+ actorName: z.ZodOptional<z.ZodString>;
54
+ contextId: z.ZodString;
55
+ }, z.core.$strict>, z.ZodObject<{
56
+ backend: z.ZodOptional<z.ZodLiteral<"remote">>;
57
+ credentialRef: z.ZodString;
58
+ contextId: z.ZodString;
59
+ workspaceId: z.ZodOptional<z.ZodString>;
60
+ workspaceName: z.ZodOptional<z.ZodString>;
61
+ actor: z.ZodOptional<z.ZodObject<{
62
+ kind: z.ZodEnum<{
63
+ human: "human";
64
+ agent: "agent";
65
+ system: "system";
66
+ }>;
67
+ id: z.ZodString;
68
+ displayName: z.ZodOptional<z.ZodString>;
69
+ }, z.core.$strict>>;
70
+ }, z.core.$strict>]>;
71
+ export declare const profilesConfigSchema: z.ZodObject<{
72
+ version: z.ZodLiteral<1>;
73
+ credentials: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
74
+ kind: z.ZodEnum<{
75
+ oauth: "oauth";
76
+ "access-key": "access-key";
77
+ }>;
78
+ apiUrl: z.ZodString;
79
+ store: z.ZodEnum<{
80
+ file: "file";
81
+ keychain: "keychain";
82
+ environment: "environment";
83
+ }>;
84
+ secretRef: z.ZodOptional<z.ZodString>;
85
+ issuer: z.ZodOptional<z.ZodString>;
86
+ resource: z.ZodOptional<z.ZodString>;
87
+ clientId: z.ZodOptional<z.ZodString>;
88
+ connectionId: z.ZodOptional<z.ZodString>;
89
+ label: z.ZodOptional<z.ZodString>;
90
+ createdAt: z.ZodString;
91
+ }, z.core.$strict>>>;
92
+ profiles: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
93
+ backend: z.ZodLiteral<"local">;
94
+ home: z.ZodOptional<z.ZodString>;
95
+ actorId: z.ZodString;
96
+ actorName: z.ZodOptional<z.ZodString>;
97
+ contextId: z.ZodString;
98
+ }, z.core.$strict>, z.ZodObject<{
99
+ backend: z.ZodOptional<z.ZodLiteral<"remote">>;
100
+ credentialRef: z.ZodString;
101
+ contextId: z.ZodString;
102
+ workspaceId: z.ZodOptional<z.ZodString>;
103
+ workspaceName: z.ZodOptional<z.ZodString>;
104
+ actor: z.ZodOptional<z.ZodObject<{
105
+ kind: z.ZodEnum<{
106
+ human: "human";
107
+ agent: "agent";
108
+ system: "system";
109
+ }>;
110
+ id: z.ZodString;
111
+ displayName: z.ZodOptional<z.ZodString>;
112
+ }, z.core.$strict>>;
113
+ }, z.core.$strict>]>>>;
114
+ harnessPresets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
115
+ defaultProfile: z.ZodOptional<z.ZodString>;
116
+ }, z.core.$strict>;
117
+ export type CredentialEntry = z.infer<typeof credentialEntrySchema>;
118
+ export type LocalProfile = z.infer<typeof localProfileSchema>;
119
+ export type RemoteProfile = z.infer<typeof remoteProfileSchema>;
120
+ export type Profile = z.infer<typeof profileSchema>;
121
+ export type ProfilesConfig = z.infer<typeof profilesConfigSchema>;
122
+ export declare function isLocalProfile(profile: Profile): profile is LocalProfile;
123
+ export declare function emptyProfilesConfig(): ProfilesConfig;
124
+ export declare function assertName(name: string, what: string): string;
125
+ /** Reads and writes `<home>/profiles.json`. Injected in tests. */
126
+ export declare class ProfileStore {
127
+ readonly home: string;
128
+ constructor(explicitHome?: string);
129
+ get path(): string;
130
+ read(): ProfilesConfig;
131
+ write(config: ProfilesConfig): void;
132
+ }
133
+ export type Selection = {
134
+ kind: 'profile';
135
+ name: string;
136
+ source: string;
137
+ } | {
138
+ kind: 'preset';
139
+ name: string;
140
+ source: string;
141
+ };
142
+ export interface SelectionInput {
143
+ profile?: string;
144
+ preset?: string;
145
+ env?: NodeJS.ProcessEnv;
146
+ cwd?: string;
147
+ /** The Synomem home, so it is never mistaken for a project directory. */
148
+ home?: string;
149
+ }
150
+ /**
151
+ * Which profile or preset a process acts through. One implementation, used by
152
+ * the CLI and both stdio entrypoints:
153
+ *
154
+ * 1. `--profile` / `--preset` on this invocation
155
+ * 2. `SYNOMEM_PROFILE` / `SYNOMEM_PRESET` for this process
156
+ * 3. the nearest project `.synomem/project.json` (names a profile/preset only)
157
+ * 4. `defaultProfile` in profiles.json
158
+ *
159
+ * Returns undefined when nothing selects anything. Naming something that does
160
+ * not exist is an error, never a fall-through to the next source.
161
+ */
162
+ export declare function resolveSelection(config: ProfilesConfig, input: SelectionInput): Selection | undefined;
163
+ export declare function noSelectionError(): SynomemError;
164
+ export interface CredentialSourceOptions {
165
+ home: string;
166
+ name: string;
167
+ entry: CredentialEntry;
168
+ stores: CredentialStores;
169
+ env?: NodeJS.ProcessEnv;
170
+ fetch?: typeof fetch;
171
+ }
172
+ export declare function storeFor(stores: CredentialStores, entry: CredentialEntry): CredentialStore;
173
+ /**
174
+ * A connection's current bearer: an access key as stored, or an OAuth access
175
+ * token, refreshed under the cross-process lock when it has expired.
176
+ *
177
+ * After taking the lock the stored credential is re-read: if another process
178
+ * already refreshed it (a newer generation), that token is used and the
179
+ * refresh token is not spent again. A refused refresh is never retried — the
180
+ * connection must be logged in again.
181
+ */
182
+ export declare class ConnectionCredentialSource implements RemoteCredentialSource {
183
+ private readonly options;
184
+ private cached?;
185
+ private cachedExpiry;
186
+ private pending?;
187
+ constructor(options: CredentialSourceOptions);
188
+ bearer(): Promise<string>;
189
+ private reauthorize;
190
+ private load;
191
+ private remember;
192
+ }
193
+ export interface ResolverDependencies {
194
+ stores: CredentialStores;
195
+ env?: NodeJS.ProcessEnv;
196
+ fetch?: typeof fetch;
197
+ createRemoteResolver?: typeof createRemoteResolver;
198
+ createLocalResolver?: typeof createLocalResolver;
199
+ }
200
+ export declare function credentialSourceFor(home: string, config: ProfilesConfig, name: string, deps: ResolverDependencies): ConnectionCredentialSource;
201
+ /** The canonical local actor for a local profile, after checking its store. */
202
+ export declare function localProfileTarget(rootHome: string, profile: LocalProfile): {
203
+ home: string;
204
+ actor: ActorIdentity;
205
+ };
206
+ /** A fixed-mode resolver for one profile. */
207
+ export declare function profileResolver(rootHome: string, config: ProfilesConfig, name: string, deps: ResolverDependencies): ContextResolver;
208
+ interface Route {
209
+ profile: string;
210
+ contextId: string;
211
+ resolver: ContextResolver;
212
+ }
213
+ /**
214
+ * An explicit-context resolver over a preset's profiles.
215
+ *
216
+ * Remote profiles sharing a connection share one remote resolver, restricted
217
+ * to exactly the contexts the preset names (the server still authorizes each).
218
+ * Every operation must name its context; there is no default and no switch.
219
+ */
220
+ export declare class PresetResolver implements ContextResolver {
221
+ private readonly name;
222
+ private readonly routes;
223
+ constructor(name: string, routes: Route[]);
224
+ mode(): 'explicit';
225
+ resolve(contextId?: string): Promise<import("./resolvers.js").ResolvedContext>;
226
+ list(): Promise<{
227
+ mode: "explicit";
228
+ fixedContextId: null;
229
+ contexts: ContextSummary[];
230
+ }>;
231
+ close(): Promise<void>;
232
+ }
233
+ export declare function presetResolver(rootHome: string, config: ProfilesConfig, name: string, deps: ResolverDependencies): PresetResolver;
234
+ /**
235
+ * The single entry point for the CLI and both stdio servers: selection flags
236
+ * and environment in, one resolver out.
237
+ */
238
+ export declare function resolverForSelection(rootHome: string, config: ProfilesConfig, selection: Selection, deps: ResolverDependencies): ContextResolver;
239
+ export declare function describeContext(context: ContextSummary): string;
240
+ /** One line describing a profile, for list/show. Never a secret. */
241
+ export declare function describeProfile(name: string, profile: Profile): string;
242
+ export {};
243
+ //# sourceMappingURL=profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../src/profiles.ts"],"names":[],"mappings":"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"}