@executor-js/sdk 0.0.1-beta.6 → 0.0.2

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 (96) hide show
  1. package/README.md +125 -107
  2. package/dist/blob.d.ts +48 -0
  3. package/dist/blob.d.ts.map +1 -0
  4. package/dist/blob.test.d.ts +2 -0
  5. package/dist/blob.test.d.ts.map +1 -0
  6. package/dist/chunk-6LMMN2GP.js +4396 -0
  7. package/dist/chunk-6LMMN2GP.js.map +1 -0
  8. package/dist/config.d.ts +14 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/connections.d.ts +107 -0
  11. package/dist/connections.d.ts.map +1 -0
  12. package/dist/connections.test.d.ts +2 -0
  13. package/dist/connections.test.d.ts.map +1 -0
  14. package/dist/core-schema.d.ts +372 -0
  15. package/dist/core-schema.d.ts.map +1 -0
  16. package/dist/core.js +273 -57
  17. package/dist/core.js.map +1 -1
  18. package/dist/elicitation.d.ts +18 -34
  19. package/dist/elicitation.d.ts.map +1 -1
  20. package/dist/error-handling.test.d.ts +2 -0
  21. package/dist/error-handling.test.d.ts.map +1 -0
  22. package/dist/errors.d.ts +95 -24
  23. package/dist/errors.d.ts.map +1 -1
  24. package/dist/executor.d.ts +107 -48
  25. package/dist/executor.d.ts.map +1 -1
  26. package/dist/executor.test.d.ts +2 -0
  27. package/dist/executor.test.d.ts.map +1 -0
  28. package/dist/ids.d.ts +6 -4
  29. package/dist/ids.d.ts.map +1 -1
  30. package/dist/index.d.ts +22 -16
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +80 -308
  33. package/dist/index.js.map +1 -1
  34. package/dist/oauth-discovery.d.ts +138 -0
  35. package/dist/oauth-discovery.d.ts.map +1 -0
  36. package/dist/oauth-discovery.test.d.ts +2 -0
  37. package/dist/oauth-discovery.test.d.ts.map +1 -0
  38. package/dist/oauth-helpers.d.ts +89 -0
  39. package/dist/oauth-helpers.d.ts.map +1 -0
  40. package/dist/oauth-helpers.test.d.ts +2 -0
  41. package/dist/oauth-helpers.test.d.ts.map +1 -0
  42. package/dist/oauth-popup-types.d.ts +14 -0
  43. package/dist/oauth-popup-types.d.ts.map +1 -0
  44. package/dist/oauth-service.d.ts +33 -0
  45. package/dist/oauth-service.d.ts.map +1 -0
  46. package/dist/oauth.d.ts +275 -0
  47. package/dist/oauth.d.ts.map +1 -0
  48. package/dist/plugin.d.ts +261 -27
  49. package/dist/plugin.d.ts.map +1 -1
  50. package/dist/policies.d.ts +56 -64
  51. package/dist/policies.d.ts.map +1 -1
  52. package/dist/policies.test.d.ts +2 -0
  53. package/dist/policies.test.d.ts.map +1 -0
  54. package/dist/promise-executor.d.ts +26 -128
  55. package/dist/promise-executor.d.ts.map +1 -1
  56. package/dist/promise.d.ts +12 -6
  57. package/dist/promise.d.ts.map +1 -1
  58. package/dist/promise.test.d.ts +2 -0
  59. package/dist/promise.test.d.ts.map +1 -0
  60. package/dist/schema-types.d.ts +6 -5
  61. package/dist/schema-types.d.ts.map +1 -1
  62. package/dist/scope.d.ts +5 -15
  63. package/dist/scope.d.ts.map +1 -1
  64. package/dist/scoped-adapter.d.ts +13 -0
  65. package/dist/scoped-adapter.d.ts.map +1 -0
  66. package/dist/scoped-adapter.test.d.ts +2 -0
  67. package/dist/scoped-adapter.test.d.ts.map +1 -0
  68. package/dist/secret-backed-value.d.ts +27 -0
  69. package/dist/secret-backed-value.d.ts.map +1 -0
  70. package/dist/secrets.d.ts +52 -106
  71. package/dist/secrets.d.ts.map +1 -1
  72. package/dist/testing.d.ts +5 -3
  73. package/dist/testing.d.ts.map +1 -1
  74. package/dist/types.d.ts +84 -0
  75. package/dist/types.d.ts.map +1 -0
  76. package/package.json +7 -4
  77. package/dist/chunk-CJY7TT3J.js +0 -1384
  78. package/dist/chunk-CJY7TT3J.js.map +0 -1
  79. package/dist/in-memory/policy-engine.d.ts +0 -10
  80. package/dist/in-memory/policy-engine.d.ts.map +0 -1
  81. package/dist/in-memory/secret-store.d.ts +0 -16
  82. package/dist/in-memory/secret-store.d.ts.map +0 -1
  83. package/dist/in-memory/tool-registry.d.ts +0 -35
  84. package/dist/in-memory/tool-registry.d.ts.map +0 -1
  85. package/dist/index.test.d.ts +0 -2
  86. package/dist/index.test.d.ts.map +0 -1
  87. package/dist/plugin-kv.d.ts +0 -48
  88. package/dist/plugin-kv.d.ts.map +0 -1
  89. package/dist/plugins/in-memory-tools.d.ts +0 -42
  90. package/dist/plugins/in-memory-tools.d.ts.map +0 -1
  91. package/dist/runtime-tools.d.ts +0 -41
  92. package/dist/runtime-tools.d.ts.map +0 -1
  93. package/dist/sources.d.ts +0 -124
  94. package/dist/sources.d.ts.map +0 -1
  95. package/dist/tools.d.ts +0 -219
  96. package/dist/tools.d.ts.map +0 -1
package/dist/index.js CHANGED
@@ -1,356 +1,128 @@
1
1
  import {
2
- ElicitationDeclinedError,
2
+ ElicitationAction,
3
3
  ElicitationResponse,
4
4
  FormElicitation,
5
- Policy,
6
- PolicyCheckInput,
7
- PolicyDeniedError,
5
+ NoHandlerError,
6
+ PluginNotLoadedError,
8
7
  PolicyId,
9
8
  Scope,
10
9
  ScopeId,
10
+ SecretBackedMap,
11
+ SecretBackedValue,
11
12
  SecretId,
12
13
  SecretNotFoundError,
13
14
  SecretRef,
14
15
  SecretResolutionError,
15
- Source,
16
+ SetSecretInput,
16
17
  SourceDetectionResult,
17
- ToolAnnotations,
18
+ SourceNotFoundError,
19
+ SourceRemovalNotAllowedError,
18
20
  ToolId,
19
21
  ToolInvocationError,
20
- ToolInvocationResult,
21
- ToolListFilter,
22
- ToolMetadata,
23
22
  ToolNotFoundError,
24
- ToolRegistration,
25
23
  ToolSchema,
26
24
  UrlElicitation,
25
+ collectSchemas,
27
26
  createExecutor,
28
- makeInMemoryPolicyEngine,
29
- makeInMemorySecretStore,
30
- makeInMemorySourceRegistry,
31
- makeInMemoryToolRegistry
32
- } from "./chunk-CJY7TT3J.js";
27
+ defineExecutorConfig,
28
+ isSecretBackedRef,
29
+ makeInMemoryBlobStore,
30
+ resolveSecretBackedMap
31
+ } from "./chunk-6LMMN2GP.js";
33
32
 
34
33
  // src/promise-executor.ts
35
- import { Data, Effect } from "effect";
36
- var run = (effect) => Effect.runPromise(effect);
37
- var PromiseAdapterError = class extends Data.TaggedError("PromiseAdapterError") {
38
- };
39
- var fromPromise = (fn) => Effect.tryPromise({
40
- try: fn,
41
- catch: (cause) => new PromiseAdapterError({ cause })
42
- });
43
- var fromPromiseDying = (fn) => Effect.orDie(fromPromise(fn));
44
- var fromPromiseTagged = (fn, tags) => fromPromise(fn).pipe(
45
- Effect.catchAll((err) => {
46
- const cause = err.cause;
47
- if (cause !== null && typeof cause === "object" && "_tag" in cause && typeof cause._tag === "string" && tags.includes(cause._tag)) {
48
- return Effect.fail(cause);
49
- }
50
- return Effect.die(cause);
51
- })
52
- );
53
- var toEffectElicitationHandler = (handler) => (ctx) => fromPromise(() => handler(ctx)).pipe(
54
- Effect.map(
55
- (r) => new ElicitationResponse({
56
- action: r.action,
57
- content: r.content
58
- })
59
- ),
60
- Effect.catchAll((e) => Effect.die(e.cause))
61
- );
62
- var toEffectInvokeOptions = (options) => ({
63
- onElicitation: options.onElicitation === "accept-all" ? "accept-all" : toEffectElicitationHandler(options.onElicitation)
64
- });
65
- var effectToPromiseInvokeOptions = (options) => {
66
- if (!options || options.onElicitation === "accept-all") return { onElicitation: "accept-all" };
67
- const handler = options.onElicitation;
68
- return {
69
- onElicitation: async (ctx) => {
70
- const r = await run(handler(ctx));
71
- return { action: r.action, content: r.content ?? void 0 };
72
- }
73
- };
74
- };
75
- var toEffectInvoker = (invoker) => ({
76
- invoke: (toolId, args, options) => fromPromiseTagged(
77
- () => invoker.invoke(toolId, args, effectToPromiseInvokeOptions(options)),
78
- ["ToolInvocationError", "ElicitationDeclinedError"]
79
- ),
80
- resolveAnnotations: invoker.resolveAnnotations ? (toolId) => fromPromiseDying(() => invoker.resolveAnnotations(toolId)) : void 0
81
- });
82
- var toEffectRuntimeHandler = (handler) => ({
83
- invoke: (args, options) => fromPromiseTagged(
84
- () => handler.invoke(args, effectToPromiseInvokeOptions(options)),
85
- ["ToolInvocationError", "ElicitationDeclinedError"]
86
- ),
87
- resolveAnnotations: handler.resolveAnnotations ? () => fromPromiseDying(() => handler.resolveAnnotations()) : void 0
88
- });
89
- var toEffectSourceManager = (manager) => ({
90
- kind: manager.kind,
91
- list: () => fromPromiseDying(() => manager.list()),
92
- remove: (sourceId) => fromPromiseDying(() => manager.remove(sourceId)),
93
- refresh: manager.refresh ? (sourceId) => fromPromiseDying(() => manager.refresh(sourceId)) : void 0,
94
- detect: manager.detect ? (url) => fromPromiseDying(() => manager.detect(url)) : void 0
95
- });
96
- var toEffectSecretProvider = (provider) => ({
97
- key: provider.key,
98
- writable: provider.writable,
99
- get: (key) => fromPromiseDying(() => provider.get(key)),
100
- set: provider.set ? (key, value) => fromPromiseDying(() => provider.set(key, value)) : void 0,
101
- delete: provider.delete ? (key) => fromPromiseDying(() => provider.delete(key)) : void 0,
102
- list: provider.list ? () => fromPromiseDying(() => provider.list()) : void 0
103
- });
104
- var toPromiseInvoker = (invoker) => ({
105
- invoke: (toolId, args, options) => run(
106
- invoker.invoke(ToolId.make(toolId), args, toEffectInvokeOptions(options))
107
- ),
108
- resolveAnnotations: invoker.resolveAnnotations ? (toolId) => run(invoker.resolveAnnotations(ToolId.make(toolId))) : void 0
109
- });
110
- var toPromiseRuntimeHandler = (handler) => ({
111
- invoke: (args, options) => run(handler.invoke(args, toEffectInvokeOptions(options))),
112
- resolveAnnotations: handler.resolveAnnotations ? () => run(handler.resolveAnnotations()) : void 0
113
- });
114
- var toPromiseSourceManager = (manager) => ({
115
- kind: manager.kind,
116
- list: () => run(manager.list()),
117
- remove: (sourceId) => run(manager.remove(sourceId)),
118
- refresh: manager.refresh ? (sourceId) => run(manager.refresh(sourceId)) : void 0,
119
- detect: manager.detect ? (url) => run(manager.detect(url)) : void 0
120
- });
121
- var toPromiseSecretProvider = (provider) => ({
122
- key: provider.key,
123
- writable: provider.writable,
124
- get: (key) => run(provider.get(key)),
125
- set: provider.set ? (key, value) => run(provider.set(key, value)) : void 0,
126
- delete: provider.delete ? (key) => run(provider.delete(key)) : void 0,
127
- list: provider.list ? () => run(provider.list()) : void 0
128
- });
129
- var toEffectToolRegistry = (r) => ({
130
- list: (filter) => fromPromiseDying(() => r.list(filter)),
131
- schema: (toolId) => fromPromiseTagged(() => r.schema(toolId), ["ToolNotFoundError"]),
132
- definitions: () => fromPromiseDying(() => r.definitions()),
133
- registerDefinitions: (defs) => fromPromiseDying(() => r.registerDefinitions(defs)),
134
- registerRuntimeDefinitions: (defs) => fromPromiseDying(() => r.registerRuntimeDefinitions(defs)),
135
- unregisterRuntimeDefinitions: (names) => fromPromiseDying(() => r.unregisterRuntimeDefinitions(names)),
136
- registerInvoker: (pluginKey, effectInvoker) => fromPromiseDying(() => r.registerInvoker(pluginKey, toPromiseInvoker(effectInvoker))),
137
- resolveAnnotations: (toolId) => fromPromiseDying(() => r.resolveAnnotations(toolId)),
138
- invoke: (toolId, args, options) => fromPromiseTagged(
139
- () => r.invoke(toolId, args, effectToPromiseInvokeOptions(options)),
140
- ["ToolNotFoundError", "ToolInvocationError", "ElicitationDeclinedError"]
141
- ),
142
- register: (tools) => fromPromiseDying(() => r.register(tools)),
143
- registerRuntime: (tools) => fromPromiseDying(() => r.registerRuntime(tools)),
144
- registerRuntimeHandler: (toolId, effectHandler) => fromPromiseDying(
145
- () => r.registerRuntimeHandler(toolId, toPromiseRuntimeHandler(effectHandler))
146
- ),
147
- unregisterRuntime: (toolIds) => fromPromiseDying(() => r.unregisterRuntime(toolIds)),
148
- unregister: (toolIds) => fromPromiseDying(() => r.unregister(toolIds)),
149
- unregisterBySource: (sourceId) => fromPromiseDying(() => r.unregisterBySource(sourceId))
150
- });
151
- var toEffectSourceRegistry = (r) => ({
152
- addManager: (manager) => fromPromiseDying(() => r.addManager(toPromiseSourceManager(manager))),
153
- registerRuntime: (source) => fromPromiseDying(() => r.registerRuntime(source)),
154
- unregisterRuntime: (sourceId) => fromPromiseDying(() => r.unregisterRuntime(sourceId)),
155
- list: () => fromPromiseDying(() => r.list()),
156
- remove: (sourceId) => fromPromiseDying(() => r.remove(sourceId)),
157
- refresh: (sourceId) => fromPromiseDying(() => r.refresh(sourceId)),
158
- detect: (url) => fromPromiseDying(() => r.detect(url))
159
- });
160
- var toEffectSecretStore = (s) => ({
161
- list: (scopeId) => fromPromiseDying(() => s.list(scopeId)),
162
- get: (secretId) => fromPromiseTagged(
163
- () => s.get(secretId),
164
- ["SecretNotFoundError"]
165
- ),
166
- resolve: (secretId, scopeId) => fromPromiseTagged(
167
- () => s.resolve(secretId, scopeId),
168
- ["SecretNotFoundError", "SecretResolutionError"]
169
- ),
170
- status: (secretId, scopeId) => fromPromiseDying(() => s.status(secretId, scopeId)),
171
- set: (input) => fromPromiseTagged(
172
- () => s.set(input),
173
- ["SecretResolutionError"]
174
- ),
175
- remove: (secretId) => fromPromiseTagged(
176
- () => s.remove(secretId),
177
- ["SecretNotFoundError"]
178
- ),
179
- addProvider: (provider) => fromPromiseDying(() => s.addProvider(toPromiseSecretProvider(provider))),
180
- providers: () => fromPromiseDying(() => s.providers())
181
- });
182
- var toEffectPolicyEngine = (p) => ({
183
- list: (scopeId) => fromPromiseDying(() => p.list(scopeId)),
184
- check: (input) => fromPromiseTagged(
185
- () => p.check({ scopeId: input.scopeId, toolId: input.toolId }),
186
- ["PolicyDeniedError"]
187
- ),
188
- add: (policy) => fromPromiseDying(() => p.add(policy)),
189
- remove: (policyId) => fromPromiseDying(() => p.remove(policyId))
190
- });
191
- var wrapPluginContext = (ctx) => ({
192
- scope: ctx.scope,
193
- tools: {
194
- list: (filter) => run(ctx.tools.list(filter ? new ToolListFilter(filter) : void 0)),
195
- schema: (toolId) => run(ctx.tools.schema(ToolId.make(toolId))),
196
- invoke: (toolId, args, options) => run(ctx.tools.invoke(ToolId.make(toolId), args, toEffectInvokeOptions(options))),
197
- definitions: () => run(ctx.tools.definitions()),
198
- registerDefinitions: (defs) => run(ctx.tools.registerDefinitions(defs)),
199
- registerRuntimeDefinitions: (defs) => run(ctx.tools.registerRuntimeDefinitions(defs)),
200
- unregisterRuntimeDefinitions: (names) => run(ctx.tools.unregisterRuntimeDefinitions(names)),
201
- registerInvoker: (pluginKey, invoker) => run(ctx.tools.registerInvoker(pluginKey, toEffectInvoker(invoker))),
202
- resolveAnnotations: (toolId) => run(ctx.tools.resolveAnnotations(ToolId.make(toolId))),
203
- register: (tools) => run(ctx.tools.register(tools)),
204
- registerRuntime: (tools) => run(ctx.tools.registerRuntime(tools)),
205
- registerRuntimeHandler: (toolId, handler) => run(ctx.tools.registerRuntimeHandler(ToolId.make(toolId), toEffectRuntimeHandler(handler))),
206
- unregisterRuntime: (toolIds) => run(ctx.tools.unregisterRuntime(toolIds.map((id) => ToolId.make(id)))),
207
- unregister: (toolIds) => run(ctx.tools.unregister(toolIds.map((id) => ToolId.make(id)))),
208
- unregisterBySource: (sourceId) => run(ctx.tools.unregisterBySource(sourceId))
209
- },
210
- sources: {
211
- addManager: (manager) => run(ctx.sources.addManager(toEffectSourceManager(manager))),
212
- registerRuntime: (source) => run(ctx.sources.registerRuntime(source)),
213
- unregisterRuntime: (sourceId) => run(ctx.sources.unregisterRuntime(sourceId)),
214
- list: () => run(ctx.sources.list()),
215
- remove: (sourceId) => run(ctx.sources.remove(sourceId)),
216
- refresh: (sourceId) => run(ctx.sources.refresh(sourceId)),
217
- detect: (url) => run(ctx.sources.detect(url))
218
- },
219
- secrets: {
220
- list: (scopeId) => run(ctx.secrets.list(ScopeId.make(scopeId))),
221
- get: (secretId) => run(ctx.secrets.get(SecretId.make(secretId))),
222
- resolve: (secretId, scopeId) => run(ctx.secrets.resolve(SecretId.make(secretId), ScopeId.make(scopeId))),
223
- status: (secretId, scopeId) => run(ctx.secrets.status(SecretId.make(secretId), ScopeId.make(scopeId))),
224
- set: (input) => run(ctx.secrets.set(input)),
225
- remove: (secretId) => run(ctx.secrets.remove(SecretId.make(secretId))),
226
- addProvider: (provider) => run(ctx.secrets.addProvider(toEffectSecretProvider(provider))),
227
- providers: () => run(ctx.secrets.providers())
228
- },
229
- policies: {
230
- list: (scopeId) => run(ctx.policies.list(ScopeId.make(scopeId))),
231
- check: (input) => run(
232
- ctx.policies.check(
233
- new PolicyCheckInput({
234
- scopeId: ScopeId.make(input.scopeId),
235
- toolId: ToolId.make(input.toolId)
236
- })
237
- )
238
- ),
239
- add: (policy) => run(ctx.policies.add(policy)),
240
- remove: (policyId) => run(ctx.policies.remove(PolicyId.make(policyId)))
34
+ import { Effect } from "effect";
35
+ import { makeMemoryAdapter } from "@executor-js/storage-core/testing/memory";
36
+ var isPlainObject = (v) => v !== null && typeof v === "object" && !Array.isArray(v) && !(v instanceof Date) && !(v instanceof Promise);
37
+ var promisifyDeep = (value) => {
38
+ if (typeof value === "function") {
39
+ return ((...args) => {
40
+ const result = value.apply(
41
+ void 0,
42
+ args
43
+ );
44
+ if (Effect.isEffect(result)) {
45
+ return Effect.runPromise(result);
46
+ }
47
+ return result;
48
+ });
241
49
  }
242
- });
243
- var definePlugin = (plugin) => ({ ...plugin, _promise: true });
244
- var isPromisePlugin = (plugin) => plugin._promise === true;
245
- var toEffectPlugin = (plugin) => ({
246
- key: plugin.key,
247
- init: (ctx) => fromPromise(async () => {
248
- const handle = await plugin.init(wrapPluginContext(ctx));
249
- return {
250
- extension: handle.extension,
251
- close: handle.close ? () => fromPromise(() => handle.close()) : void 0
252
- };
253
- })
254
- });
255
- function promisifyObject(obj) {
256
- return new Proxy(obj, {
50
+ if (!isPlainObject(value)) return value;
51
+ return new Proxy(value, {
257
52
  get(target, prop, receiver) {
258
- const value = Reflect.get(target, prop, receiver);
259
- if (typeof value === "function") {
53
+ const v = Reflect.get(target, prop, receiver);
54
+ if (typeof v === "function") {
260
55
  return (...args) => {
261
- const result = value.apply(target, args);
262
- if (Effect.isEffect(result)) return run(result);
56
+ const result = v.apply(
57
+ target,
58
+ args
59
+ );
60
+ if (Effect.isEffect(result)) {
61
+ return Effect.runPromise(result);
62
+ }
263
63
  return result;
264
64
  };
265
65
  }
266
- if (value !== null && typeof value === "object" && !Array.isArray(value))
267
- return promisifyObject(value);
268
- return value;
66
+ if (isPlainObject(v)) return promisifyDeep(v);
67
+ return v;
269
68
  }
270
69
  });
271
- }
272
- var KNOWN_KEYS = /* @__PURE__ */ new Set(["scope", "tools", "sources", "policies", "secrets", "close"]);
273
- var createExecutor2 = async (config = {}) => {
274
- const effectPlugins = (config.plugins ?? []).map(
275
- (p) => isPromisePlugin(p) ? toEffectPlugin(p) : p
276
- );
277
- const effectConfig = {
278
- scope: {
279
- id: ScopeId.make(config.scope?.id ?? "default"),
280
- name: config.scope?.name ?? "default",
70
+ };
71
+ var createExecutor2 = async (config) => {
72
+ const plugins = config?.plugins ?? [];
73
+ const schema = collectSchemas(plugins);
74
+ const scopes = config.scopes && config.scopes.length > 0 ? config.scopes.map(
75
+ (s, i) => new Scope({
76
+ id: ScopeId.make(s.id ?? (i === 0 ? "default-scope" : `scope-${i}`)),
77
+ name: s.name ?? (i === 0 ? "default" : `scope-${i}`),
281
78
  createdAt: /* @__PURE__ */ new Date()
282
- },
283
- tools: config.tools ? toEffectToolRegistry(config.tools) : makeInMemoryToolRegistry(),
284
- sources: config.sources ? toEffectSourceRegistry(config.sources) : makeInMemorySourceRegistry(),
285
- secrets: config.secrets ? toEffectSecretStore(config.secrets) : makeInMemorySecretStore(),
286
- policies: config.policies ? toEffectPolicyEngine(config.policies) : makeInMemoryPolicyEngine(),
287
- plugins: effectPlugins
288
- };
289
- const executor = await run(createExecutor(effectConfig));
290
- const base = {
291
- scope: executor.scope,
292
- tools: {
293
- list: (filter) => run(executor.tools.list(filter ? new ToolListFilter(filter) : void 0)),
294
- schema: (toolId) => run(executor.tools.schema(toolId)),
295
- definitions: () => run(executor.tools.definitions()),
296
- invoke: (toolId, args, options) => run(executor.tools.invoke(toolId, args, toEffectInvokeOptions(options)))
297
- },
298
- sources: {
299
- list: () => run(executor.sources.list()),
300
- remove: (sourceId) => run(executor.sources.remove(sourceId)),
301
- refresh: (sourceId) => run(executor.sources.refresh(sourceId)),
302
- detect: (url) => run(executor.sources.detect(url))
303
- },
304
- policies: {
305
- list: () => run(executor.policies.list()),
306
- add: (policy) => run(executor.policies.add(policy)),
307
- remove: (policyId) => run(executor.policies.remove(policyId))
308
- },
309
- secrets: {
310
- list: () => run(executor.secrets.list()),
311
- resolve: (secretId) => run(executor.secrets.resolve(SecretId.make(secretId))),
312
- status: (secretId) => run(executor.secrets.status(SecretId.make(secretId))),
313
- set: (input) => run(executor.secrets.set({ ...input, id: SecretId.make(input.id) })),
314
- remove: (secretId) => run(executor.secrets.remove(SecretId.make(secretId))),
315
- addProvider: (provider) => run(executor.secrets.addProvider(toEffectSecretProvider(provider))),
316
- providers: () => run(executor.secrets.providers())
317
- },
318
- close: () => run(executor.close())
79
+ })
80
+ ) : [
81
+ new Scope({
82
+ id: ScopeId.make("default-scope"),
83
+ name: "default",
84
+ createdAt: /* @__PURE__ */ new Date()
85
+ })
86
+ ];
87
+ const effectConfig = {
88
+ scopes,
89
+ adapter: makeMemoryAdapter({ schema }),
90
+ blobs: makeInMemoryBlobStore(),
91
+ plugins,
92
+ onElicitation: config.onElicitation
319
93
  };
320
- for (const key of Object.keys(executor)) {
321
- if (!KNOWN_KEYS.has(key)) {
322
- const ext = executor[key];
323
- if (ext !== null && typeof ext === "object") base[key] = promisifyObject(ext);
324
- else base[key] = ext;
325
- }
326
- }
327
- return base;
94
+ const effectExecutor = await Effect.runPromise(
95
+ createExecutor(effectConfig)
96
+ );
97
+ return promisifyDeep(effectExecutor);
328
98
  };
329
99
  export {
330
- ElicitationDeclinedError,
100
+ ElicitationAction,
101
+ ElicitationResponse,
331
102
  FormElicitation,
332
- Policy,
333
- PolicyDeniedError,
103
+ NoHandlerError,
104
+ PluginNotLoadedError,
334
105
  PolicyId,
335
106
  Scope,
336
107
  ScopeId,
108
+ SecretBackedMap,
109
+ SecretBackedValue,
337
110
  SecretId,
338
111
  SecretNotFoundError,
339
112
  SecretRef,
340
113
  SecretResolutionError,
341
- Source,
114
+ SetSecretInput,
342
115
  SourceDetectionResult,
343
- ToolAnnotations,
116
+ SourceNotFoundError,
117
+ SourceRemovalNotAllowedError,
344
118
  ToolId,
345
119
  ToolInvocationError,
346
- ToolInvocationResult,
347
- ToolListFilter,
348
- ToolMetadata,
349
120
  ToolNotFoundError,
350
- ToolRegistration,
351
121
  ToolSchema,
352
122
  UrlElicitation,
353
123
  createExecutor2 as createExecutor,
354
- definePlugin
124
+ defineExecutorConfig,
125
+ isSecretBackedRef,
126
+ resolveSecretBackedMap
355
127
  };
356
128
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/promise-executor.ts"],"sourcesContent":["import { Context, Data, Effect } from \"effect\";\n\nimport {\n createExecutor as createEffectExecutor,\n ElicitationResponse as ElicitationResponseClass,\n makeInMemoryToolRegistry,\n makeInMemorySecretStore,\n makeInMemoryPolicyEngine,\n makeInMemorySourceRegistry,\n ScopeId,\n ToolId,\n SecretId,\n PolicyId,\n type ToolRegistry as CoreToolRegistry,\n type SourceRegistry as CoreSourceRegistry,\n type SecretStore as CoreSecretStore,\n type PolicyEngine as CorePolicyEngine,\n type ExecutorConfig as EffectExecutorConfig,\n type ExecutorPlugin,\n type PluginContext as EffectPluginContext,\n type PluginHandle as EffectPluginHandle,\n type ElicitationContext,\n type InvokeOptions as EffectInvokeOptions,\n type ToolInvocationResult,\n type ToolMetadata,\n type ToolAnnotations,\n type ToolSchema,\n type ToolInvoker as EffectToolInvoker,\n type RuntimeToolHandler as EffectRuntimeToolHandler,\n type SourceManager as EffectSourceManager,\n type Policy,\n type SecretRef,\n type SecretProvider as EffectSecretProvider,\n type SetSecretInput,\n type Scope,\n type ToolId as ToolIdType,\n type SecretId as SecretIdType,\n type ScopeId as ScopeIdType,\n type PolicyId as PolicyIdType,\n type ToolNotFoundError,\n type ToolInvocationError,\n type SecretNotFoundError,\n type SecretResolutionError,\n type PolicyDeniedError,\n type ElicitationDeclinedError,\n ToolListFilter,\n PolicyCheckInput,\n} from \"./index\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst run = <A, E>(effect: Effect.Effect<A, E>): Promise<A> =>\n Effect.runPromise(effect as Effect.Effect<A, never>);\n\n/**\n * Tagged error produced by the Promise→Effect adapter layer. User-supplied\n * Promise-based store implementations can reject with anything; we wrap the\n * raw rejection in `cause` so downstream code can inspect or re-throw it.\n */\nclass PromiseAdapterError extends Data.TaggedError(\"PromiseAdapterError\")<{\n readonly cause: unknown;\n}> {}\n\nconst fromPromise = <A>(fn: () => Promise<A>): Effect.Effect<A, PromiseAdapterError> =>\n Effect.tryPromise({\n try: fn,\n catch: (cause) => new PromiseAdapterError({ cause }),\n });\n\n/**\n * Wrap a promise-returning function as an Effect whose error channel is\n * `never`. Unexpected rejections become unhandled defects. Used by the store\n * adapters where the Effect-layer service interface forbids a typed error\n * channel.\n */\nconst fromPromiseDying = <A>(fn: () => Promise<A>): Effect.Effect<A, never> =>\n Effect.orDie(fromPromise(fn));\n\n/**\n * Wrap a promise-returning function as an Effect whose error channel contains\n * only the expected tagged errors listed in `tags`. If the promise rejects\n * with anything whose `_tag` isn't in the list, the rejection becomes an\n * unhandled defect — users of the promise-shaped store interfaces are expected\n * to throw the documented tagged error types from core.\n */\nconst fromPromiseTagged = <E extends { readonly _tag: string }, A>(\n fn: () => Promise<A>,\n tags: readonly E[\"_tag\"][],\n): Effect.Effect<A, E> =>\n fromPromise(fn).pipe(\n Effect.catchAll((err) => {\n const cause = err.cause;\n if (\n cause !== null &&\n typeof cause === \"object\" &&\n \"_tag\" in cause &&\n typeof (cause as { _tag: unknown })._tag === \"string\" &&\n (tags as readonly string[]).includes((cause as { _tag: string })._tag)\n ) {\n return Effect.fail(cause as E);\n }\n return Effect.die(cause);\n }),\n );\n\n// ---------------------------------------------------------------------------\n// Type derivation — derive Promise-based SDK types from core Effect types\n// ---------------------------------------------------------------------------\n\n/** Replace branded IDs with plain strings in parameter types */\ntype UnbrandParam<T> = T extends ToolIdType\n ? string\n : T extends SecretIdType\n ? string\n : T extends ScopeIdType\n ? string\n : T extends PolicyIdType\n ? string\n : T extends readonly (infer U)[]\n ? readonly UnbrandParam<U>[]\n : T;\n\n/** Convert an Effect service interface to Promise-based, unbranding ID params */\ntype PromisifyService<T> = {\n readonly [K in keyof T]: NonNullable<T[K]> extends (\n ...args: infer A\n ) => Effect.Effect<infer R, infer _E>\n ? (...args: { [I in keyof A]: UnbrandParam<A[I]> }) => Promise<R>\n : T[K];\n};\n\ntype CoreToolRegistryService = Context.Tag.Service<typeof CoreToolRegistry>;\ntype CoreSourceRegistryService = Context.Tag.Service<typeof CoreSourceRegistry>;\ntype CoreSecretStoreService = Context.Tag.Service<typeof CoreSecretStore>;\ntype CorePolicyEngineService = Context.Tag.Service<typeof CorePolicyEngine>;\n\n// ---------------------------------------------------------------------------\n// Elicitation\n// ---------------------------------------------------------------------------\n\nexport interface ElicitationResponse {\n readonly action: \"accept\" | \"decline\" | \"cancel\";\n readonly content?: Record<string, unknown>;\n}\n\nexport type ElicitationHandler = (ctx: ElicitationContext) => Promise<ElicitationResponse>;\n\nexport interface InvokeOptions {\n readonly onElicitation: ElicitationHandler | \"accept-all\";\n}\n\nconst toEffectElicitationHandler = (handler: ElicitationHandler) => (ctx: ElicitationContext) =>\n fromPromise(() => handler(ctx)).pipe(\n Effect.map(\n (r) =>\n new ElicitationResponseClass({\n action: r.action,\n content: r.content,\n }),\n ),\n Effect.catchAll((e) => Effect.die(e.cause)),\n );\n\nconst toEffectInvokeOptions = (options: InvokeOptions): EffectInvokeOptions => ({\n onElicitation:\n options.onElicitation === \"accept-all\"\n ? (\"accept-all\" as const)\n : toEffectElicitationHandler(options.onElicitation),\n});\n\n// ---------------------------------------------------------------------------\n// Plugin callback types\n// ---------------------------------------------------------------------------\n\nexport interface ToolInvoker {\n readonly invoke: (\n toolId: string,\n args: unknown,\n options: InvokeOptions,\n ) => Promise<ToolInvocationResult>;\n readonly resolveAnnotations?: (toolId: string) => Promise<ToolAnnotations | undefined>;\n}\n\nexport interface RuntimeToolHandler {\n readonly invoke: (args: unknown, options: InvokeOptions) => Promise<ToolInvocationResult>;\n readonly resolveAnnotations?: () => Promise<ToolAnnotations | undefined>;\n}\n\nexport type SourceManager = PromisifyService<EffectSourceManager>;\n\nexport type SecretProvider = PromisifyService<EffectSecretProvider>;\n\n// --- Adapters ---\n\nconst effectToPromiseInvokeOptions = (options?: EffectInvokeOptions): InvokeOptions => {\n if (!options || options.onElicitation === \"accept-all\") return { onElicitation: \"accept-all\" };\n const handler = options.onElicitation;\n return {\n onElicitation: async (ctx) => {\n const r = await run(handler(ctx));\n return { action: r.action, content: r.content ?? undefined };\n },\n };\n};\n\nconst toEffectInvoker = (invoker: ToolInvoker): EffectToolInvoker => ({\n invoke: (toolId, args, options) =>\n fromPromiseTagged<ToolInvocationError | ElicitationDeclinedError, ToolInvocationResult>(\n () => invoker.invoke(toolId, args, effectToPromiseInvokeOptions(options)),\n [\"ToolInvocationError\", \"ElicitationDeclinedError\"],\n ),\n resolveAnnotations: invoker.resolveAnnotations\n ? (toolId) => fromPromiseDying(() => invoker.resolveAnnotations!(toolId))\n : undefined,\n});\n\nconst toEffectRuntimeHandler = (handler: RuntimeToolHandler): EffectRuntimeToolHandler => ({\n invoke: (args, options) =>\n fromPromiseTagged<ToolInvocationError | ElicitationDeclinedError, ToolInvocationResult>(\n () => handler.invoke(args, effectToPromiseInvokeOptions(options)),\n [\"ToolInvocationError\", \"ElicitationDeclinedError\"],\n ),\n resolveAnnotations: handler.resolveAnnotations\n ? () => fromPromiseDying(() => handler.resolveAnnotations!())\n : undefined,\n});\n\nconst toEffectSourceManager = (manager: SourceManager): EffectSourceManager => ({\n kind: manager.kind,\n list: () => fromPromiseDying(() => manager.list()),\n remove: (sourceId) => fromPromiseDying(() => manager.remove(sourceId)),\n refresh: manager.refresh\n ? (sourceId) => fromPromiseDying(() => manager.refresh!(sourceId))\n : undefined,\n detect: manager.detect ? (url) => fromPromiseDying(() => manager.detect!(url)) : undefined,\n});\n\nconst toEffectSecretProvider = (provider: SecretProvider): EffectSecretProvider => ({\n key: provider.key,\n writable: provider.writable,\n get: (key) => fromPromiseDying(() => provider.get(key)),\n set: provider.set ? (key, value) => fromPromiseDying(() => provider.set!(key, value)) : undefined,\n delete: provider.delete ? (key) => fromPromiseDying(() => provider.delete!(key)) : undefined,\n list: provider.list ? () => fromPromiseDying(() => provider.list!()) : undefined,\n});\n\n// --- Reverse adapters (Effect -> Promise) for callbacks handed to user stores ---\n//\n// When the Effect core hands us an Effect-shaped ToolInvoker / ToolHandler /\n// SourceManager / SecretProvider (e.g. from a plugin), we need to convert it\n// into the promise-shaped equivalent before passing it to a user-supplied\n// promise-based store implementation.\n\nconst toPromiseInvoker = (invoker: EffectToolInvoker): ToolInvoker => ({\n invoke: (toolId, args, options) =>\n run(\n invoker.invoke(ToolId.make(toolId), args, toEffectInvokeOptions(options)),\n ) as Promise<ToolInvocationResult>,\n resolveAnnotations: invoker.resolveAnnotations\n ? (toolId) => run(invoker.resolveAnnotations!(ToolId.make(toolId)))\n : undefined,\n});\n\nconst toPromiseRuntimeHandler = (handler: EffectRuntimeToolHandler): RuntimeToolHandler => ({\n invoke: (args, options) =>\n run(handler.invoke(args, toEffectInvokeOptions(options))) as Promise<ToolInvocationResult>,\n resolveAnnotations: handler.resolveAnnotations\n ? () => run(handler.resolveAnnotations!())\n : undefined,\n});\n\nconst toPromiseSourceManager = (manager: EffectSourceManager): SourceManager => ({\n kind: manager.kind,\n list: () => run(manager.list()),\n remove: (sourceId) => run(manager.remove(sourceId)),\n refresh: manager.refresh ? (sourceId) => run(manager.refresh!(sourceId)) : undefined,\n detect: manager.detect ? (url) => run(manager.detect!(url)) : undefined,\n});\n\nconst toPromiseSecretProvider = (provider: EffectSecretProvider): SecretProvider => ({\n key: provider.key,\n writable: provider.writable,\n get: (key) => run(provider.get(key)),\n set: provider.set ? (key, value) => run(provider.set!(key, value)) : undefined,\n delete: provider.delete ? (key) => run(provider.delete!(key)) : undefined,\n list: provider.list ? () => run(provider.list!()) : undefined,\n});\n\n// --- Main store adapters (Promise -> Effect) ---\n//\n// Users implementing a pluggable store (e.g. a Postgres-backed tool registry)\n// write against the promise-shaped ToolRegistry / SourceRegistry / SecretStore\n// / PolicyEngine interfaces declared below. These adapters wrap the user impl\n// so the Effect core layer sees a native Effect service.\n\nconst toEffectToolRegistry = (r: ToolRegistry): CoreToolRegistryService => ({\n list: (filter) => fromPromiseDying(() => r.list(filter)),\n schema: (toolId) =>\n fromPromiseTagged<ToolNotFoundError, ToolSchema>(() => r.schema(toolId), [\"ToolNotFoundError\"]),\n definitions: () => fromPromiseDying(() => r.definitions()),\n registerDefinitions: (defs) => fromPromiseDying(() => r.registerDefinitions(defs)),\n registerRuntimeDefinitions: (defs) => fromPromiseDying(() => r.registerRuntimeDefinitions(defs)),\n unregisterRuntimeDefinitions: (names) =>\n fromPromiseDying(() => r.unregisterRuntimeDefinitions(names)),\n registerInvoker: (pluginKey, effectInvoker) =>\n fromPromiseDying(() => r.registerInvoker(pluginKey, toPromiseInvoker(effectInvoker))),\n resolveAnnotations: (toolId) => fromPromiseDying(() => r.resolveAnnotations(toolId)),\n invoke: (toolId, args, options) =>\n fromPromiseTagged<\n ToolNotFoundError | ToolInvocationError | ElicitationDeclinedError,\n ToolInvocationResult\n >(\n () => r.invoke(toolId, args, effectToPromiseInvokeOptions(options)),\n [\"ToolNotFoundError\", \"ToolInvocationError\", \"ElicitationDeclinedError\"],\n ),\n register: (tools) => fromPromiseDying(() => r.register(tools)),\n registerRuntime: (tools) => fromPromiseDying(() => r.registerRuntime(tools)),\n registerRuntimeHandler: (toolId, effectHandler) =>\n fromPromiseDying(() =>\n r.registerRuntimeHandler(toolId, toPromiseRuntimeHandler(effectHandler)),\n ),\n unregisterRuntime: (toolIds) => fromPromiseDying(() => r.unregisterRuntime(toolIds)),\n unregister: (toolIds) => fromPromiseDying(() => r.unregister(toolIds)),\n unregisterBySource: (sourceId) => fromPromiseDying(() => r.unregisterBySource(sourceId)),\n});\n\nconst toEffectSourceRegistry = (r: SourceRegistry): CoreSourceRegistryService => ({\n addManager: (manager) => fromPromiseDying(() => r.addManager(toPromiseSourceManager(manager))),\n registerRuntime: (source) => fromPromiseDying(() => r.registerRuntime(source)),\n unregisterRuntime: (sourceId) => fromPromiseDying(() => r.unregisterRuntime(sourceId)),\n list: () => fromPromiseDying(() => r.list()),\n remove: (sourceId) => fromPromiseDying(() => r.remove(sourceId)),\n refresh: (sourceId) => fromPromiseDying(() => r.refresh(sourceId)),\n detect: (url) => fromPromiseDying(() => r.detect(url)),\n});\n\nconst toEffectSecretStore = (s: SecretStore): CoreSecretStoreService => ({\n list: (scopeId) => fromPromiseDying(() => s.list(scopeId)),\n get: (secretId) =>\n fromPromiseTagged<SecretNotFoundError, SecretRef>(\n () => s.get(secretId),\n [\"SecretNotFoundError\"],\n ),\n resolve: (secretId, scopeId) =>\n fromPromiseTagged<SecretNotFoundError | SecretResolutionError, string>(\n () => s.resolve(secretId, scopeId),\n [\"SecretNotFoundError\", \"SecretResolutionError\"],\n ),\n status: (secretId, scopeId) => fromPromiseDying(() => s.status(secretId, scopeId)),\n set: (input) =>\n fromPromiseTagged<SecretResolutionError, SecretRef>(\n () => s.set(input),\n [\"SecretResolutionError\"],\n ),\n remove: (secretId) =>\n fromPromiseTagged<SecretNotFoundError, boolean>(\n () => s.remove(secretId),\n [\"SecretNotFoundError\"],\n ),\n addProvider: (provider) =>\n fromPromiseDying(() => s.addProvider(toPromiseSecretProvider(provider))),\n providers: () => fromPromiseDying(() => s.providers()),\n});\n\nconst toEffectPolicyEngine = (p: PolicyEngine): CorePolicyEngineService => ({\n list: (scopeId) => fromPromiseDying(() => p.list(scopeId)),\n check: (input) =>\n fromPromiseTagged<PolicyDeniedError, void>(\n () => p.check({ scopeId: input.scopeId, toolId: input.toolId }),\n [\"PolicyDeniedError\"],\n ),\n add: (policy) => fromPromiseDying(() => p.add(policy)),\n remove: (policyId) => fromPromiseDying(() => p.remove(policyId)),\n});\n\n// ---------------------------------------------------------------------------\n// Plugin context\n// ---------------------------------------------------------------------------\n\nexport interface PluginContext {\n readonly scope: Scope;\n readonly tools: ToolRegistry;\n readonly sources: SourceRegistry;\n readonly secrets: SecretStore;\n readonly policies: PolicyEngine;\n}\n\nexport interface ToolRegistry extends Omit<\n PromisifyService<CoreToolRegistryService>,\n \"list\" | \"invoke\" | \"registerInvoker\" | \"registerRuntimeHandler\"\n> {\n readonly list: (filter?: {\n sourceId?: string;\n query?: string;\n }) => Promise<readonly ToolMetadata[]>;\n readonly invoke: (\n toolId: string,\n args: unknown,\n options: InvokeOptions,\n ) => Promise<ToolInvocationResult>;\n readonly registerInvoker: (pluginKey: string, invoker: ToolInvoker) => Promise<void>;\n readonly registerRuntimeHandler: (toolId: string, handler: RuntimeToolHandler) => Promise<void>;\n}\n\nexport interface SourceRegistry extends Omit<\n PromisifyService<CoreSourceRegistryService>,\n \"addManager\"\n> {\n readonly addManager: (manager: SourceManager) => Promise<void>;\n}\n\nexport interface SecretStore extends Omit<\n PromisifyService<CoreSecretStoreService>,\n \"set\" | \"addProvider\"\n> {\n readonly set: (input: {\n readonly id: string;\n readonly scopeId: string;\n readonly name: string;\n readonly value: string;\n readonly provider?: string;\n readonly purpose?: string;\n }) => Promise<SecretRef>;\n readonly addProvider: (provider: SecretProvider) => Promise<void>;\n}\n\nexport interface PolicyEngine extends Omit<PromisifyService<CorePolicyEngineService>, \"check\"> {\n readonly check: (input: { scopeId: string; toolId: string }) => Promise<void>;\n}\n\nconst wrapPluginContext = (ctx: EffectPluginContext): PluginContext => ({\n scope: ctx.scope,\n tools: {\n list: (filter?) => run(ctx.tools.list(filter ? new ToolListFilter(filter) : undefined)),\n schema: (toolId) => run(ctx.tools.schema(ToolId.make(toolId))),\n invoke: (toolId, args, options) =>\n run(ctx.tools.invoke(ToolId.make(toolId), args, toEffectInvokeOptions(options))),\n definitions: () => run(ctx.tools.definitions()),\n registerDefinitions: (defs) => run(ctx.tools.registerDefinitions(defs)),\n registerRuntimeDefinitions: (defs) => run(ctx.tools.registerRuntimeDefinitions(defs)),\n unregisterRuntimeDefinitions: (names) => run(ctx.tools.unregisterRuntimeDefinitions(names)),\n registerInvoker: (pluginKey, invoker) =>\n run(ctx.tools.registerInvoker(pluginKey, toEffectInvoker(invoker))),\n resolveAnnotations: (toolId) => run(ctx.tools.resolveAnnotations(ToolId.make(toolId))),\n register: (tools) => run(ctx.tools.register(tools)),\n registerRuntime: (tools) => run(ctx.tools.registerRuntime(tools)),\n registerRuntimeHandler: (toolId, handler) =>\n run(ctx.tools.registerRuntimeHandler(ToolId.make(toolId), toEffectRuntimeHandler(handler))),\n unregisterRuntime: (toolIds) =>\n run(ctx.tools.unregisterRuntime(toolIds.map((id) => ToolId.make(id)))),\n unregister: (toolIds) => run(ctx.tools.unregister(toolIds.map((id) => ToolId.make(id)))),\n unregisterBySource: (sourceId) => run(ctx.tools.unregisterBySource(sourceId)),\n },\n sources: {\n addManager: (manager) => run(ctx.sources.addManager(toEffectSourceManager(manager))),\n registerRuntime: (source) => run(ctx.sources.registerRuntime(source)),\n unregisterRuntime: (sourceId) => run(ctx.sources.unregisterRuntime(sourceId)),\n list: () => run(ctx.sources.list()),\n remove: (sourceId) => run(ctx.sources.remove(sourceId)),\n refresh: (sourceId) => run(ctx.sources.refresh(sourceId)),\n detect: (url) => run(ctx.sources.detect(url)),\n },\n secrets: {\n list: (scopeId) => run(ctx.secrets.list(ScopeId.make(scopeId))),\n get: (secretId) => run(ctx.secrets.get(SecretId.make(secretId))),\n resolve: (secretId, scopeId) =>\n run(ctx.secrets.resolve(SecretId.make(secretId), ScopeId.make(scopeId))),\n status: (secretId, scopeId) =>\n run(ctx.secrets.status(SecretId.make(secretId), ScopeId.make(scopeId))),\n set: (input) => run(ctx.secrets.set(input as SetSecretInput)),\n remove: (secretId) => run(ctx.secrets.remove(SecretId.make(secretId))),\n addProvider: (provider) => run(ctx.secrets.addProvider(toEffectSecretProvider(provider))),\n providers: () => run(ctx.secrets.providers()),\n },\n policies: {\n list: (scopeId) => run(ctx.policies.list(ScopeId.make(scopeId))),\n check: (input) =>\n run(\n ctx.policies.check(\n new PolicyCheckInput({\n scopeId: ScopeId.make(input.scopeId),\n toolId: ToolId.make(input.toolId),\n }),\n ),\n ),\n add: (policy) => run(ctx.policies.add(policy)),\n remove: (policyId) => run(ctx.policies.remove(PolicyId.make(policyId))),\n },\n});\n\n// ---------------------------------------------------------------------------\n// Plugin definition\n// ---------------------------------------------------------------------------\n\nexport interface Plugin<TKey extends string = string, TExtension extends object = object> {\n readonly key: TKey;\n /** @internal */\n readonly _promise?: true;\n readonly init: (ctx: PluginContext) => Promise<PluginHandle<TExtension>>;\n}\n\nexport interface PluginHandle<TExtension extends object = object> {\n readonly extension: TExtension;\n readonly close?: () => Promise<void>;\n}\n\nexport const definePlugin = <const TKey extends string, TExtension extends object>(\n plugin: Plugin<TKey, TExtension>,\n): Plugin<TKey, TExtension> => ({ ...plugin, _promise: true as const });\n\nconst isPromisePlugin = (plugin: { _promise?: boolean }): boolean => plugin._promise === true;\n\nconst toEffectPlugin = <TKey extends string, TExtension extends object>(\n plugin: Plugin<TKey, TExtension>,\n): ExecutorPlugin<TKey, TExtension> => ({\n key: plugin.key,\n init: (ctx) =>\n fromPromise(async () => {\n const handle = await plugin.init(wrapPluginContext(ctx));\n return {\n extension: handle.extension,\n close: handle.close\n ? () => fromPromise(() => handle.close!()) as Effect.Effect<void>\n : undefined,\n };\n }) as Effect.Effect<EffectPluginHandle<TExtension>, PromiseAdapterError>,\n});\n\n// ---------------------------------------------------------------------------\n// Executor type\n// ---------------------------------------------------------------------------\n\ntype Promisified<T> = T extends (...args: infer A) => Effect.Effect<infer R, infer _E>\n ? (...args: A) => Promise<R>\n : T extends object\n ? { readonly [K in keyof T]: Promisified<T[K]> }\n : T;\n\nexport type AnyPlugin = Plugin<string, object> | ExecutorPlugin<string, object>;\n\nexport type Executor<TPlugins extends readonly AnyPlugin[] = []> = {\n readonly scope: Scope;\n readonly tools: Pick<ToolRegistry, \"list\" | \"schema\" | \"definitions\" | \"invoke\">;\n readonly sources: Pick<SourceRegistry, \"list\" | \"remove\" | \"refresh\" | \"detect\">;\n readonly policies: {\n readonly list: () => Promise<readonly Policy[]>;\n readonly add: (policy: Omit<Policy, \"id\" | \"createdAt\">) => Promise<Policy>;\n readonly remove: (policyId: string) => Promise<boolean>;\n };\n readonly secrets: {\n readonly list: () => Promise<readonly SecretRef[]>;\n readonly resolve: (secretId: string) => Promise<string>;\n readonly status: (secretId: string) => Promise<\"resolved\" | \"missing\">;\n readonly set: (input: {\n readonly id: string;\n readonly name: string;\n readonly value: string;\n readonly provider?: string;\n readonly purpose?: string;\n }) => Promise<SecretRef>;\n readonly remove: (secretId: string) => Promise<boolean>;\n readonly addProvider: (provider: SecretProvider) => Promise<void>;\n readonly providers: () => Promise<readonly string[]>;\n };\n readonly close: () => Promise<void>;\n} & PluginExtensions<TPlugins>;\n\ntype PluginExtensions<TPlugins extends readonly AnyPlugin[]> = {\n readonly [P in TPlugins[number] as P[\"key\"]]: P extends Plugin<string, infer TExt>\n ? TExt\n : P extends ExecutorPlugin<string, infer TExt>\n ? Promisified<TExt>\n : never;\n};\n\nfunction promisifyObject<T extends object>(obj: T): Promisified<T> {\n return new Proxy(obj, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === \"function\") {\n return (...args: unknown[]) => {\n const result = value.apply(target, args);\n if (Effect.isEffect(result)) return run(result as Effect.Effect<unknown, unknown>);\n return result;\n };\n }\n if (value !== null && typeof value === \"object\" && !Array.isArray(value))\n return promisifyObject(value as object);\n return value;\n },\n }) as Promisified<T>;\n}\n\n// ---------------------------------------------------------------------------\n// Config & createExecutor\n// ---------------------------------------------------------------------------\n\nexport interface ExecutorConfig<TPlugins extends readonly AnyPlugin[] = []> {\n readonly scope?: { readonly id?: string; readonly name?: string };\n readonly plugins?: TPlugins;\n /**\n * Custom tool registry implementation. Defaults to an in-memory store.\n * Implement the promise-shaped `ToolRegistry` interface to persist tool\n * metadata to a database, remote service, etc.\n */\n readonly tools?: ToolRegistry;\n /** Custom source registry implementation. Defaults to an in-memory store. */\n readonly sources?: SourceRegistry;\n /**\n * Custom secret store implementation. Defaults to an in-memory store.\n * For most use cases, prefer passing a custom `SecretProvider` via\n * `executor.secrets.addProvider(...)` — only replace the whole store if you\n * need to persist the `SecretRef` metadata itself.\n */\n readonly secrets?: SecretStore;\n /** Custom policy engine implementation. Defaults to an in-memory store. */\n readonly policies?: PolicyEngine;\n}\n\nconst KNOWN_KEYS = new Set([\"scope\", \"tools\", \"sources\", \"policies\", \"secrets\", \"close\"]);\n\nexport const createExecutor = async <const TPlugins extends readonly AnyPlugin[] = []>(\n config: ExecutorConfig<TPlugins> = {},\n): Promise<Executor<TPlugins>> => {\n const effectPlugins = (config.plugins ?? []).map((p) =>\n isPromisePlugin(p as { _promise?: boolean })\n ? toEffectPlugin(p as Plugin<string, object>)\n : (p as unknown as ExecutorPlugin<string, object>),\n );\n\n const effectConfig: EffectExecutorConfig<ExecutorPlugin<string, object>[]> = {\n scope: {\n id: ScopeId.make(config.scope?.id ?? \"default\"),\n name: config.scope?.name ?? \"default\",\n createdAt: new Date(),\n },\n tools: config.tools ? toEffectToolRegistry(config.tools) : makeInMemoryToolRegistry(),\n sources: config.sources ? toEffectSourceRegistry(config.sources) : makeInMemorySourceRegistry(),\n secrets: config.secrets ? toEffectSecretStore(config.secrets) : makeInMemorySecretStore(),\n policies: config.policies ? toEffectPolicyEngine(config.policies) : makeInMemoryPolicyEngine(),\n plugins: effectPlugins,\n };\n\n const executor = await run(createEffectExecutor(effectConfig));\n\n const base: Record<string, unknown> = {\n scope: executor.scope,\n tools: {\n list: (filter?: { sourceId?: string; query?: string }) =>\n run(executor.tools.list(filter ? new ToolListFilter(filter) : undefined)),\n schema: (toolId: string) => run(executor.tools.schema(toolId)),\n definitions: () => run(executor.tools.definitions()),\n invoke: (toolId: string, args: unknown, options: InvokeOptions) =>\n run(executor.tools.invoke(toolId, args, toEffectInvokeOptions(options))),\n },\n sources: {\n list: () => run(executor.sources.list()),\n remove: (sourceId: string) => run(executor.sources.remove(sourceId)),\n refresh: (sourceId: string) => run(executor.sources.refresh(sourceId)),\n detect: (url: string) => run(executor.sources.detect(url)),\n },\n policies: {\n list: () => run(executor.policies.list()),\n add: (policy: Omit<Policy, \"id\" | \"createdAt\">) => run(executor.policies.add(policy)),\n remove: (policyId: string) => run(executor.policies.remove(policyId)),\n },\n secrets: {\n list: () => run(executor.secrets.list()),\n resolve: (secretId: string) => run(executor.secrets.resolve(SecretId.make(secretId))),\n status: (secretId: string) => run(executor.secrets.status(SecretId.make(secretId))),\n set: (input: {\n readonly id: string;\n readonly name: string;\n readonly value: string;\n readonly provider?: string;\n readonly purpose?: string;\n }) => run(executor.secrets.set({ ...input, id: SecretId.make(input.id) })),\n remove: (secretId: string) => run(executor.secrets.remove(SecretId.make(secretId))),\n addProvider: (provider: SecretProvider) =>\n run(executor.secrets.addProvider(toEffectSecretProvider(provider))),\n providers: () => run(executor.secrets.providers()),\n },\n close: () => run(executor.close()),\n };\n\n for (const key of Object.keys(executor)) {\n if (!KNOWN_KEYS.has(key)) {\n const ext = (executor as Record<string, unknown>)[key];\n if (ext !== null && typeof ext === \"object\") base[key] = promisifyObject(ext as object);\n else base[key] = ext;\n }\n }\n\n return base as Executor<TPlugins>;\n};\n"],"mappings":"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","names":["createExecutor"]}
1
+ {"version":3,"sources":["../src/promise-executor.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// @executor-js/sdk/promise — thin Promise façade over the Effect SDK.\n//\n// Consumer goal: use executors + plugins without touching Effect. The\n// façade wraps `createExecutor` so it returns a Promise, and proxies\n// every method on the returned executor to unwrap its Effect into a\n// Promise. Plugin factories are Effect-native but consumers never see\n// that — the proxy flattens plugin extension methods too.\n//\n// Not a goal: authoring plugins in Promise style. The plugin model\n// (storage, schema, staticSources, Effect ctx) is Effect-only. Bring\n// your own `@executor-js/plugin-*` from the Effect side.\n// ---------------------------------------------------------------------------\n\nimport { Brand, Effect } from \"effect\";\n\nimport { makeMemoryAdapter } from \"@executor-js/storage-core/testing/memory\";\n\nimport { makeInMemoryBlobStore } from \"./blob\";\nimport {\n createExecutor as createEffectExecutor,\n collectSchemas,\n type Executor as EffectExecutor,\n type OnElicitation,\n} from \"./executor\";\nimport { ScopeId } from \"./ids\";\nimport type { AnyPlugin } from \"./plugin\";\nimport { Scope } from \"./scope\";\n\n// ---------------------------------------------------------------------------\n// Types\n//\n// Promise consumers shouldn't need to construct Effect `Brand`s to call into\n// the executor — branded ids (`SecretId`, `ScopeId`, `ToolId`, `PolicyId`,\n// `ConnectionId`) are typed as `string & Brand<...>` on the Effect side, but\n// at runtime they're plain strings. `Unbrand` strips brand tags from\n// parameter types (recursively, so it walks into object fields like\n// `secrets.set({ id, scope })`) so consumers can pass plain strings. Return\n// types are passed through unchanged — caller code that reads `.id` etc.\n// off a returned ref still gets the branded type for use as an opaque token.\n// ---------------------------------------------------------------------------\n\ntype Unbrand<T> = T extends Brand.Brand<string>\n ? string\n : T extends readonly (infer U)[]\n ? readonly Unbrand<U>[]\n : T extends ReadonlyMap<infer K, infer V>\n ? ReadonlyMap<Unbrand<K>, Unbrand<V>>\n : T extends ReadonlySet<infer U>\n ? ReadonlySet<Unbrand<U>>\n : T extends Date\n ? T\n : T extends (...args: infer A) => infer R\n ? (...args: { [I in keyof A]: Unbrand<A[I]> }) => Unbrand<R>\n : T extends object\n ? { readonly [K in keyof T]: Unbrand<T[K]> }\n : T;\n\nexport type Promisified<T> = T extends (\n ...args: infer A\n) => Effect.Effect<infer R, infer _E>\n ? (...args: { [I in keyof A]: Unbrand<A[I]> }) => Promise<R>\n : T extends readonly unknown[]\n ? T\n : T extends object\n ? { readonly [K in keyof T]: Promisified<T[K]> }\n : T;\n\nexport type Executor<TPlugins extends readonly AnyPlugin[] = []> = Promisified<\n EffectExecutor<TPlugins>\n>;\n\nexport interface ExecutorConfig<TPlugins extends readonly AnyPlugin[] = []> {\n /**\n * Precedence-ordered scope stack (innermost first). Optional — defaults\n * to a single-element stack with id \"default-scope\". Pass an array of\n * `{ id, name }` partials to build a multi-scope executor.\n */\n readonly scopes?: readonly { readonly id?: string; readonly name?: string }[];\n readonly plugins?: TPlugins;\n /**\n * How to respond when a tool requests user input mid-invocation. Pass\n * `\"accept-all\"` for tests / non-interactive hosts, or a handler\n * `(ctx) => Promise<ElicitationResponse>` for interactive ones.\n * Required at construction so per-invoke calls don't have to thread\n * an options arg.\n */\n readonly onElicitation: OnElicitation;\n}\n\n// ---------------------------------------------------------------------------\n// Promisify proxy — walks nested objects, converts Effect-returning methods\n// into Promise-returning methods. Non-Effect return values pass through.\n// ---------------------------------------------------------------------------\n\nconst isPlainObject = (v: unknown): v is Record<string | symbol, unknown> =>\n v !== null &&\n typeof v === \"object\" &&\n !Array.isArray(v) &&\n !(v instanceof Date) &&\n !(v instanceof Promise);\n\nconst promisifyDeep = <T>(value: T): Promisified<T> => {\n if (typeof value === \"function\") {\n return ((...args: unknown[]) => {\n const result = (value as (...a: unknown[]) => unknown).apply(\n undefined,\n args,\n );\n if (Effect.isEffect(result)) {\n return Effect.runPromise(result as Effect.Effect<unknown, unknown>);\n }\n return result;\n }) as Promisified<T>;\n }\n\n if (!isPlainObject(value)) return value as Promisified<T>;\n\n return new Proxy(value, {\n get(target, prop, receiver) {\n const v = Reflect.get(target, prop, receiver);\n if (typeof v === \"function\") {\n return (...args: unknown[]) => {\n const result = (v as (...a: unknown[]) => unknown).apply(\n target,\n args,\n );\n if (Effect.isEffect(result)) {\n return Effect.runPromise(result as Effect.Effect<unknown, unknown>);\n }\n return result;\n };\n }\n if (isPlainObject(v)) return promisifyDeep(v);\n return v;\n },\n }) as Promisified<T>;\n};\n\n// ---------------------------------------------------------------------------\n// createExecutor — Promise wrapper over the Effect createExecutor.\n// Defaults to an in-memory adapter + blob store, so a consumer can\n// construct an executor with just `{ plugins: [...] }`.\n// ---------------------------------------------------------------------------\n\nexport const createExecutor = async <\n const TPlugins extends readonly AnyPlugin[] = [],\n>(\n config: ExecutorConfig<TPlugins>,\n): Promise<Executor<TPlugins>> => {\n const plugins = (config?.plugins ?? []) as TPlugins;\n const schema = collectSchemas(plugins);\n\n const scopes =\n config.scopes && config.scopes.length > 0\n ? config.scopes.map(\n (s, i) =>\n new Scope({\n id: ScopeId.make(s.id ?? (i === 0 ? \"default-scope\" : `scope-${i}`)),\n name: s.name ?? (i === 0 ? \"default\" : `scope-${i}`),\n createdAt: new Date(),\n }),\n )\n : [\n new Scope({\n id: ScopeId.make(\"default-scope\"),\n name: \"default\",\n createdAt: new Date(),\n }),\n ];\n\n const effectConfig = {\n scopes,\n adapter: makeMemoryAdapter({ schema }),\n blobs: makeInMemoryBlobStore(),\n plugins,\n onElicitation: config.onElicitation,\n };\n\n // The SDK has no observability requirement; storage failures surface\n // as raw `StorageError` / `UniqueViolationError` in the typed channel.\n // `Effect.runPromise` turns them into Promise rejections — consumers\n // get the tagged error as the rejected value. See\n // notes/promise-sdk-typed-errors.md for the planned `runPromiseExit`\n // rewrite that exposes the full error union to consumers.\n const effectExecutor = await Effect.runPromise(\n createEffectExecutor(effectConfig),\n );\n\n return promisifyDeep(effectExecutor) as Executor<TPlugins>;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,SAAgB,cAAc;AAE9B,SAAS,yBAAyB;AA+ElC,IAAM,gBAAgB,CAAC,MACrB,MAAM,QACN,OAAO,MAAM,YACb,CAAC,MAAM,QAAQ,CAAC,KAChB,EAAE,aAAa,SACf,EAAE,aAAa;AAEjB,IAAM,gBAAgB,CAAI,UAA6B;AACrD,MAAI,OAAO,UAAU,YAAY;AAC/B,YAAQ,IAAI,SAAoB;AAC9B,YAAM,SAAU,MAAuC;AAAA,QACrD;AAAA,QACA;AAAA,MACF;AACA,UAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,eAAO,OAAO,WAAW,MAAyC;AAAA,MACpE;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,CAAC,cAAc,KAAK,EAAG,QAAO;AAElC,SAAO,IAAI,MAAM,OAAO;AAAA,IACtB,IAAI,QAAQ,MAAM,UAAU;AAC1B,YAAM,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAC5C,UAAI,OAAO,MAAM,YAAY;AAC3B,eAAO,IAAI,SAAoB;AAC7B,gBAAM,SAAU,EAAmC;AAAA,YACjD;AAAA,YACA;AAAA,UACF;AACA,cAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,mBAAO,OAAO,WAAW,MAAyC;AAAA,UACpE;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AACA,UAAI,cAAc,CAAC,EAAG,QAAO,cAAc,CAAC;AAC5C,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAQO,IAAMA,kBAAiB,OAG5B,WACgC;AAChC,QAAM,UAAW,QAAQ,WAAW,CAAC;AACrC,QAAM,SAAS,eAAe,OAAO;AAErC,QAAM,SACJ,OAAO,UAAU,OAAO,OAAO,SAAS,IACpC,OAAO,OAAO;AAAA,IACZ,CAAC,GAAG,MACF,IAAI,MAAM;AAAA,MACR,IAAI,QAAQ,KAAK,EAAE,OAAO,MAAM,IAAI,kBAAkB,SAAS,CAAC,GAAG;AAAA,MACnE,MAAM,EAAE,SAAS,MAAM,IAAI,YAAY,SAAS,CAAC;AAAA,MACjD,WAAW,oBAAI,KAAK;AAAA,IACtB,CAAC;AAAA,EACL,IACA;AAAA,IACE,IAAI,MAAM;AAAA,MACR,IAAI,QAAQ,KAAK,eAAe;AAAA,MAChC,MAAM;AAAA,MACN,WAAW,oBAAI,KAAK;AAAA,IACtB,CAAC;AAAA,EACH;AAEN,QAAM,eAAe;AAAA,IACnB;AAAA,IACA,SAAS,kBAAkB,EAAE,OAAO,CAAC;AAAA,IACrC,OAAO,sBAAsB;AAAA,IAC7B;AAAA,IACA,eAAe,OAAO;AAAA,EACxB;AAQA,QAAM,iBAAiB,MAAM,OAAO;AAAA,IAClC,eAAqB,YAAY;AAAA,EACnC;AAEA,SAAO,cAAc,cAAc;AACrC;","names":["createExecutor"]}