@slates/provider-handler 1.0.0-rc.4 → 1.0.0-rc.7

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 (65) hide show
  1. package/dist/index.cjs +954 -2
  2. package/dist/index.d.cts +8 -0
  3. package/dist/index.d.ts +6 -3
  4. package/dist/index.module.js +926 -2
  5. package/package.json +10 -9
  6. package/src/index.ts +523 -109
  7. package/src/spec.ts +9 -8
  8. package/src/validation.ts +1 -1
  9. package/dist/action/action.d.ts +0 -90
  10. package/dist/action/action.d.ts.map +0 -1
  11. package/dist/action/builder.d.ts +0 -27
  12. package/dist/action/builder.d.ts.map +0 -1
  13. package/dist/action/index.d.ts +0 -5
  14. package/dist/action/index.d.ts.map +0 -1
  15. package/dist/action/tool.d.ts +0 -11
  16. package/dist/action/tool.d.ts.map +0 -1
  17. package/dist/action/trigger.d.ts +0 -14
  18. package/dist/action/trigger.d.ts.map +0 -1
  19. package/dist/auth/auth.d.ts +0 -26
  20. package/dist/auth/auth.d.ts.map +0 -1
  21. package/dist/auth/index.d.ts +0 -3
  22. package/dist/auth/index.d.ts.map +0 -1
  23. package/dist/auth/types.d.ts +0 -148
  24. package/dist/auth/types.d.ts.map +0 -1
  25. package/dist/axios/index.d.ts +0 -4
  26. package/dist/axios/index.d.ts.map +0 -1
  27. package/dist/config/config.d.ts +0 -22
  28. package/dist/config/config.d.ts.map +0 -1
  29. package/dist/config/index.d.ts +0 -2
  30. package/dist/config/index.d.ts.map +0 -1
  31. package/dist/context/context.d.ts +0 -20
  32. package/dist/context/context.d.ts.map +0 -1
  33. package/dist/context/hook.d.ts +0 -4
  34. package/dist/context/hook.d.ts.map +0 -1
  35. package/dist/context/index.d.ts +0 -2
  36. package/dist/context/index.d.ts.map +0 -1
  37. package/dist/error/base.d.ts +0 -5
  38. package/dist/error/base.d.ts.map +0 -1
  39. package/dist/error/declaration.d.ts +0 -6
  40. package/dist/error/declaration.d.ts.map +0 -1
  41. package/dist/error/index.d.ts +0 -3
  42. package/dist/error/index.d.ts.map +0 -1
  43. package/dist/index.cjs.map +0 -1
  44. package/dist/index.d.ts.map +0 -1
  45. package/dist/index.modern.js +0 -2
  46. package/dist/index.modern.js.map +0 -1
  47. package/dist/index.module.js.map +0 -1
  48. package/dist/index.umd.js +0 -2
  49. package/dist/index.umd.js.map +0 -1
  50. package/dist/spec.d.ts +0 -14
  51. package/dist/spec.d.ts.map +0 -1
  52. package/dist/specification/index.d.ts +0 -3
  53. package/dist/specification/index.d.ts.map +0 -1
  54. package/dist/specification/slate.d.ts +0 -15
  55. package/dist/specification/slate.d.ts.map +0 -1
  56. package/dist/specification/specification.d.ts +0 -30
  57. package/dist/specification/specification.d.ts.map +0 -1
  58. package/dist/specification/zero.d.ts +0 -13
  59. package/dist/specification/zero.d.ts.map +0 -1
  60. package/dist/state.d.ts +0 -8
  61. package/dist/state.d.ts.map +0 -1
  62. package/dist/tokens.d.ts +0 -34
  63. package/dist/tokens.d.ts.map +0 -1
  64. package/dist/validation.d.ts +0 -5
  65. package/dist/validation.d.ts.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,2 +1,954 @@
1
- var e=require("@lowerdeck/error"),t=require("@slates/proto"),r=require("@slates/provider");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=/*#__PURE__*/n(require("zod"));function i(e,t){if(!{}.hasOwnProperty.call(e,t))throw new TypeError("attempted to use private field on non-instance");return e}var a=0;function u(e){return"__private_"+a+++"_"+e}function s(){return s=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},s.apply(null,arguments)}function c(e){var t=function(e){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:t+""}var l=function(t,r,n,o){var i=t.safeParse(r);if(!i.success)throw new e.ServiceError(function(t,r,n){return e.validationError({message:r,entity:t,errors:n.issues.map(function(e){return s({},e,{path:e.path.map(function(e){return String(e)})})})})}(n,o,i.error));return i.data},p=function(e){return e.toJSONSchema({unrepresentable:"any",override:function(e){var t=e.zodSchema._zod.def;"date"===t.type&&(e.jsonSchema.type="string",e.jsonSchema.format="date-time"),"bigint"===t.type&&(e.jsonSchema.type="number")}})},h=function(t,r){var n=t.spec.auth.authStack.find(function(e){return e.key==r});if(!n)throw new e.ServiceError(e.badRequestError({message:"Invalid authentication method ID: "+r}));return n},d=function(e,t){var r;return{id:t.key,name:t.name,type:t.type,scopes:"scopes"in t?t.scopes.map(function(e){return{id:e.scope,title:e.title,description:e.description}}):void 0,inputSchema:p(null!=(r=t.inputSchema)?r:o.default.object({})),outputSchema:p(e.spec.auth.outputSchema),capabilities:{getDefaultInput:{enabled:!(!("getDefaultInput"in t)||!t.getDefaultInput)},handleTokenRefresh:{enabled:!(!("handleTokenRefresh"in t)||!t.handleTokenRefresh)},handleChangedInput:{enabled:!!t.onInputChanged},getProfile:{enabled:!!t.getProfile}}}},f=function(t,r){var n=t.actions.find(function(e){return e.key==r});if(!n)throw new e.ServiceError(e.notFoundError("action",r));return n},v=function(t,r,n){var o=f(t,n);if(o.type!=r)throw new e.ServiceError(e.badRequestError({message:"Action with ID "+n+" is not of type "+r}));return o},m=function(e,t){var n;return s({},{id:t.key,name:t.name,description:t.description,instructions:t.instructions,constraints:t.constraints,tags:t.tags,metadata:t.metadata,inputSchema:p(t.inputSchema),outputSchema:p(t.outputSchema)},"tool"==t.type?{type:"action.tool",capabilities:{}}:{type:"action.trigger",capabilities:{},invocation:"polling"==t.source?{type:"polling",intervalSeconds:null!=(n=t.polling.intervalInSeconds)?n:r.SlateDefaultPollingIntervalSeconds}:{type:"webhook",autoRegistration:!!t.autoRegisterWebhook,autoUnregistration:!!t.autoUnregisterWebhook}})},g=/*#__PURE__*/u("value"),P=/*#__PURE__*/function(){function e(e){Object.defineProperty(this,g,{writable:!0,value:void 0}),i(this,g)[g]=e}var t,r,n=e.prototype;return n.get=function(){return i(this,g)[g]},n.set=function(e){i(this,g)[g]=e},t=e,(r=[{key:"value",get:function(){return i(this,g)[g]}}])&&function(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,c(n.key),n)}}(t.prototype,r),Object.defineProperty(t,"prototype",{writable:!1}),t}();exports.createProviderHandler=function(n,o){return t.createSlatesProviderProtoHandler(function(t){try{var i=new P(null),a=new P(null),u=new P(null),c=new P(null),g=new P(null),y=new r.SlateLogger(o),w=function(){var t=i.get(),r=a.get();if(!t||!r)throw new e.ServiceError(e.preconditionFailedError({message:"Connection context has not been initialized"}));return{protocol:t,participants:r}},I=function(){var t=w(),r=c.get(),o=g.get(),i=u.get();if(!r||!o||!i&&n.spec.auth.authStack.length>0)throw new e.ServiceError(e.preconditionFailedError({message:"Session context has not been initialized"}));return s({},t,{config:r.value,session:o,auth:i})};return t.onNotification("slates/hello",function(e){var t=e.params;try{return i.set(t.protocol),Promise.resolve()}catch(e){return Promise.reject(e)}}),t.onNotification("slates/participant.set",function(t){var r=t.params;try{if(!i.get())throw new e.ServiceError(e.preconditionFailedError({message:"Connection protocol has not been initialized"}));return a.set(r.participants),Promise.resolve()}catch(e){return Promise.reject(e)}}),t.onNotification("slates/auth.set",function(e){var t=e.params;try{w(),h(n,t.authenticationMethodId);var r=l(n.spec.authSchema,t.output,"auth","Invalid authentication output for method ID: "+t.authenticationMethodId);return u.set({authenticationMethodId:t.authenticationMethodId,output:r}),Promise.resolve()}catch(e){return Promise.reject(e)}}),t.onNotification("slates/config.set",function(e){var t=e.params;try{w();var r=l(n.spec.configSchema,t.config,"config","Invalid configuration");return c.set({value:r}),Promise.resolve()}catch(e){return Promise.reject(e)}}),t.onNotification("slates/session.start",function(e){var t=e.params;try{return w(),g.set({id:t.sessionId,state:t.state}),Promise.resolve()}catch(e){return Promise.reject(e)}}),t.onRequest("slates/config.changed",function(e){var t=e.params;try{w();var r=l(n.spec.config.configSchema,t.newConfig,"config","Invalid configuration"),o=n.spec.config.handlers.configChanged;return o?Promise.resolve(o({previousConfig:t.previousConfig,newConfig:r})).then(function(e){var t;return{success:!0,config:null!=(t=null==e?void 0:e.config)?t:r}}):Promise.resolve({success:!0,config:r})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/config.get_default",function(e){try{w();var t=n.spec.config.handlers.getDefaultConfig;return t?Promise.resolve(t()).then(function(e){return{config:e}}):Promise.resolve({config:null})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/config.schema.get",function(e){try{return w(),Promise.resolve({schema:p(n.spec.configSchema)})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/provider.identify",function(e){try{return w(),Promise.resolve({protocol:"slates@2026-01-01",provider:{type:"provider",id:n.spec.key,name:n.spec.name,description:n.spec.description,metadata:n.spec.parameters.metadata}})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/auth.methods.list",function(e){try{return w(),Promise.resolve({authenticationMethods:n.spec.auth.authStack.map(function(e){return d(n,e)})})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/auth.method.get",function(e){var t=e.params;try{w();var r=h(n,t.authenticationMethodId);return Promise.resolve({authenticationMethod:d(n,r)})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/auth.input.get_default",function(e){var t=e.params;try{w();var r=h(n,t.authenticationMethodId);return r.getDefaultInput?Promise.resolve(r.getDefaultInput()).then(function(e){return{input:e}}):Promise.resolve({input:null})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/auth.input.changed",function(e){var t=e.params;try{w();var r=h(n,t.authenticationMethodId);return r.onInputChanged?Promise.resolve(r.onInputChanged({previousInput:t.previousInput,newInput:t.newInput})).then(function(e){var r;return{success:!0,input:null!=(r=null==e?void 0:e.input)?r:t.newInput}}):Promise.resolve({success:!0,input:t.newInput})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/auth.output.get",function(e){var t=e.params;try{var r,o=function(e){return r?e:{output:a}};w();var i=h(n,t.authenticationMethodId),a=t.input;i.inputSchema&&(a=l(i.inputSchema,a,"auth","Invalid authentication input for method ID: "+t.authenticationMethodId));var u=function(){if("getOutput"in i)return Promise.resolve(i.getOutput({input:a})).then(function(e){return r=1,{output:e.output}})}();return Promise.resolve(u&&u.then?u.then(o):o(u))}catch(e){return Promise.reject(e)}}),t.onRequest("slates/auth.authorization_callback.handle",function(t){var r=t.params;try{var o,i=function(t){if(o)return t;throw new e.ServiceError(e.preconditionFailedError({message:"Authentication method does not support authorization callback handling: "+r.authenticationMethodId}))};w();var a=h(n,r.authenticationMethodId),u=function(){if("handleCallback"in a)return Promise.resolve(a.handleCallback({code:r.code,state:r.state,redirectUri:r.redirectUri,input:r.input,clientId:r.clientId,clientSecret:r.clientSecret,scopes:r.scopes})).then(function(e){return o=1,{output:e.output,input:e.input}})}();return Promise.resolve(u&&u.then?u.then(i):i(u))}catch(e){return Promise.reject(e)}}),t.onRequest("slates/auth.authorization_url.get",function(t){var r=t.params;try{var o,i=function(t){if(o)return t;throw new e.ServiceError(e.preconditionFailedError({message:"Authentication method does not support authorization URL retrieval: "+r.authenticationMethodId}))};w();var a=h(n,r.authenticationMethodId),u=function(){if("getAuthorizationUrl"in a)return Promise.resolve(a.getAuthorizationUrl({redirectUri:r.redirectUri,state:r.state,input:r.input,clientId:r.clientId,clientSecret:r.clientSecret,scopes:r.scopes})).then(function(e){return o=1,{authorizationUrl:e.url,input:e.input}})}();return Promise.resolve(u&&u.then?u.then(i):i(u))}catch(e){return Promise.reject(e)}}),t.onRequest("slates/auth.profile.get",function(t){var r=t.params;try{var o,i=function(t){if(o)return t;throw new e.ServiceError(e.preconditionFailedError({message:"Authentication method does not support profile retrieval: "+r.authenticationMethodId}))};w();var a=h(n,r.authenticationMethodId),u=function(){if(a.getProfile)return Promise.resolve(a.getProfile({output:r.output,input:r.input,scopes:r.scopes})).then(function(e){return o=1,{profile:e.profile}})}();return Promise.resolve(u&&u.then?u.then(i):i(u))}catch(e){return Promise.reject(e)}}),t.onRequest("slates/auth.token_refresh.handle",function(t){var r=t.params;try{var o,i=function(t){if(o)return t;throw new e.ServiceError(e.preconditionFailedError({message:"Authentication method does not support token refresh handling: "+r.authenticationMethodId}))};w();var a=h(n,r.authenticationMethodId),u=function(){if("handleTokenRefresh"in a&&a.handleTokenRefresh)return Promise.resolve(a.handleTokenRefresh({output:r.output,input:r.input,clientId:r.clientId,clientSecret:r.clientSecret,scopes:r.scopes})).then(function(e){return o=1,{output:e.output,input:e.input}})}();return Promise.resolve(u&&u.then?u.then(i):i(u))}catch(e){return Promise.reject(e)}}),t.onRequest("slates/actions.list",function(e){try{return w(),Promise.resolve({actions:n.actions.map(function(e){return m(0,e)})})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/action.get",function(e){var t=e.params;try{w();var r=f(n,t.actionId);return Promise.resolve({action:m(0,r)})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/action.tool.invoke",function(e){var t=e.params;try{var o,i=I(),a=v(n,"tool",t.actionId),u=l(a.inputSchema,t.input,"input","Invalid input for tool ID: "+t.actionId);return Promise.resolve(a.handleInvocation(new r.SlateContext(i.config,u,null==(o=i.auth)?void 0:o.output,n.spec,y))).then(function(e){return{output:e.output,message:e.message}})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/action.trigger.map_event",function(e){var t=e.params;try{var o,i=I(),a=v(n,"trigger",t.actionId),u=l(a.inputSchema,t.input,"input","Invalid event for trigger ID: "+t.actionId);return Promise.resolve(a.handleEvent(new r.SlateContext(i.config,u,null==(o=i.auth)?void 0:o.output,n.spec,y))).then(function(e){return{id:e.id,type:e.type,output:e.output}})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/action.trigger.poll_events",function(t){var o=t.params;try{var i,a=I(),u=v(n,"trigger",o.actionId);if(!u.pollEvents)throw new e.ServiceError(e.badRequestError({message:"Trigger action does not support polling: "+o.actionId}));return Promise.resolve(u.pollEvents(new r.SlateContext(a.config,{state:o.state},null==(i=a.auth)?void 0:i.output,n.spec,y))).then(function(e){return{inputs:e.inputs,updatedState:e.updatedState}})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/action.trigger.webhook_handle",function(t){var o=t.params;try{var i,a=I(),u=v(n,"trigger",o.actionId);if(!u.handleRequest)throw new e.ServiceError(e.badRequestError({message:"Trigger action does not support webhook requests: "+o.actionId}));var s=new Request(o.url,{method:o.method,headers:o.headers,body:o.body?Uint8Array.from(atob(o.body.content),function(e){return e.charCodeAt(0)}):null});return Promise.resolve(u.handleRequest(new r.SlateContext(a.config,{request:s,state:o.state},null==(i=a.auth)?void 0:i.output,n.spec,y))).then(function(e){return{inputs:e.inputs,updatedState:e.updatedState}})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/action.trigger.webhook_register",function(t){var o=t.params;try{var i,a=I(),u=v(n,"trigger",o.actionId);if(!u.autoRegisterWebhook)throw new e.ServiceError(e.badRequestError({message:"Trigger action does not support webhook auto-registration: "+o.actionId}));return Promise.resolve(u.autoRegisterWebhook(new r.SlateContext(a.config,{webhookBaseUrl:o.webhookBaseUrl},null==(i=a.auth)?void 0:i.output,n.spec,y))).then(function(e){return{registrationDetails:e.registrationDetails,state:e.state}})}catch(e){return Promise.reject(e)}}),t.onRequest("slates/action.trigger.webhook_unregister",function(t){var o=t.params;try{var i,a=I(),u=v(n,"trigger",o.actionId);if(!u.autoUnregisterWebhook)throw new e.ServiceError(e.badRequestError({message:"Trigger action does not support webhook auto-unregistration: "+o.actionId}));return Promise.resolve(u.autoUnregisterWebhook(new r.SlateContext(a.config,{webhookBaseUrl:o.webhookBaseUrl,registrationDetails:o.registrationDetails,state:o.state},null==(i=a.auth)?void 0:i.output,n.spec,y))).then(function(){return{}})}catch(e){return Promise.reject(e)}}),Promise.resolve()}catch(e){return Promise.reject(e)}})};
2
- //# sourceMappingURL=index.cjs.map
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ createProviderHandler: () => createProviderHandler
34
+ });
35
+ module.exports = __toCommonJS(index_exports);
36
+ var import_error3 = require("@lowerdeck/error");
37
+ var import_proto = require("@slates/proto");
38
+ var import_provider2 = require("@slates/provider");
39
+
40
+ // src/spec.ts
41
+ var import_error2 = require("@lowerdeck/error");
42
+ var import_provider = require("@slates/provider");
43
+ var import_zod = __toESM(require("zod"), 1);
44
+
45
+ // src/validation.ts
46
+ var import_error = require("@lowerdeck/error");
47
+ var zodToValidationError = (entity, message, e) => {
48
+ return (0, import_error.validationError)({
49
+ message,
50
+ entity,
51
+ errors: e.issues.map((i) => ({
52
+ ...i,
53
+ path: i.path.map((p) => String(p))
54
+ }))
55
+ });
56
+ };
57
+ var validate = (schema, data, entity, message) => {
58
+ let result = schema.safeParse(data);
59
+ if (!result.success) {
60
+ throw new import_error.ServiceError(zodToValidationError(entity, message, result.error));
61
+ }
62
+ return result.data;
63
+ };
64
+ var toJsonSchema = (schema) => schema.toJSONSchema({
65
+ unrepresentable: "any",
66
+ override: (ctx) => {
67
+ let def = ctx.zodSchema._zod.def;
68
+ if (def.type === "date") {
69
+ ctx.jsonSchema.type = "string";
70
+ ctx.jsonSchema.format = "date-time";
71
+ }
72
+ if (def.type === "bigint") {
73
+ ctx.jsonSchema.type = "number";
74
+ }
75
+ }
76
+ });
77
+
78
+ // src/spec.ts
79
+ var getAuthMethod = (slate, authenticationMethodId) => {
80
+ let authMethod = slate.spec.auth.authStack.find((m) => m.key === authenticationMethodId);
81
+ if (!authMethod) {
82
+ throw new import_error2.ServiceError(
83
+ (0, import_error2.badRequestError)({
84
+ message: `Invalid authentication method ID: ${authenticationMethodId}`
85
+ })
86
+ );
87
+ }
88
+ return authMethod;
89
+ };
90
+ var mapAuthMethod = (slate, m) => ({
91
+ id: m.key,
92
+ name: m.name,
93
+ type: m.type,
94
+ scopes: "scopes" in m ? m.scopes.map((s) => ({
95
+ id: s.scope,
96
+ title: s.title,
97
+ description: s.description
98
+ })) : void 0,
99
+ inputSchema: toJsonSchema(m.inputSchema ?? import_zod.default.object({})),
100
+ outputSchema: toJsonSchema(slate.spec.auth.outputSchema),
101
+ capabilities: {
102
+ getDefaultInput: { enabled: !!("getDefaultInput" in m && m.getDefaultInput) },
103
+ handleTokenRefresh: {
104
+ enabled: !!("handleTokenRefresh" in m && m.handleTokenRefresh)
105
+ },
106
+ handleChangedInput: {
107
+ enabled: !!m.onInputChanged
108
+ },
109
+ getProfile: { enabled: !!m.getProfile }
110
+ }
111
+ });
112
+ var getAction = (slate, actionId) => {
113
+ let action = slate.actions.find((m) => m.key === actionId);
114
+ if (!action) {
115
+ throw new import_error2.ServiceError((0, import_error2.notFoundError)(`action`, actionId));
116
+ }
117
+ return action;
118
+ };
119
+ var getActionWithType = (slate, type, actionId) => {
120
+ let action = getAction(slate, actionId);
121
+ if (action.type !== type) {
122
+ throw new import_error2.ServiceError(
123
+ (0, import_error2.badRequestError)({
124
+ message: `Action with ID ${actionId} is not of type ${type}`
125
+ })
126
+ );
127
+ }
128
+ return action;
129
+ };
130
+ var mapAction = (_slate, a) => {
131
+ let base = {
132
+ id: a.key,
133
+ name: a.name,
134
+ description: a.description,
135
+ instructions: a.instructions,
136
+ constraints: a.constraints,
137
+ tags: a.tags,
138
+ metadata: a.metadata,
139
+ scopes: a.scopes,
140
+ inputSchema: toJsonSchema(a.inputSchema),
141
+ outputSchema: toJsonSchema(a.outputSchema)
142
+ };
143
+ if (a.type === "tool") {
144
+ return {
145
+ ...base,
146
+ type: "action.tool",
147
+ capabilities: {}
148
+ };
149
+ }
150
+ return {
151
+ ...base,
152
+ type: "action.trigger",
153
+ capabilities: {},
154
+ invocation: a.source === "polling" ? {
155
+ type: "polling",
156
+ intervalSeconds: a.polling.intervalInSeconds ?? import_provider.SlateDefaultPollingIntervalSeconds
157
+ } : {
158
+ type: "webhook",
159
+ autoRegistration: !!a.autoRegisterWebhook,
160
+ autoUnregistration: !!a.autoUnregisterWebhook
161
+ }
162
+ };
163
+ };
164
+
165
+ // src/state.ts
166
+ var State = class {
167
+ #value;
168
+ get value() {
169
+ return this.#value;
170
+ }
171
+ get() {
172
+ return this.#value;
173
+ }
174
+ set(value) {
175
+ this.#value = value;
176
+ }
177
+ constructor(initialValue) {
178
+ this.#value = initialValue;
179
+ }
180
+ };
181
+
182
+ // src/index.ts
183
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
184
+ var getObjectKeyCount = (value) => isRecord(value) ? Object.keys(value).length : void 0;
185
+ var toErrorMetadata = (error) => {
186
+ if (error instanceof Error) {
187
+ return {
188
+ errorName: error.name,
189
+ errorMessage: error.message,
190
+ errorStack: error.stack
191
+ };
192
+ }
193
+ return {
194
+ errorValue: String(error)
195
+ };
196
+ };
197
+ var formatEntityLabel = (name, key) => `"${name}" (${key})`;
198
+ var resolveTraceMessage = (message, result) => typeof message === "function" ? message(result) : message;
199
+ var createProviderHandler = (slate, listeners) => (0, import_proto.createSlatesProviderProtoHandler)(async (manager) => {
200
+ let protocol = new State(null);
201
+ let participants = new State(null);
202
+ let auth = new State(null);
203
+ let config = new State(null);
204
+ let session = new State(null);
205
+ let logger = new import_provider2.SlateLogger(listeners);
206
+ let providerTrace = {
207
+ providerId: slate.spec.key,
208
+ providerName: slate.spec.name
209
+ };
210
+ let traceProviderCall = async (trace, handler) => {
211
+ let startedAt = Date.now();
212
+ logger.info({
213
+ ...providerTrace,
214
+ ...trace.metadata,
215
+ component: trace.component,
216
+ functionName: trace.functionName,
217
+ phase: "start",
218
+ message: trace.message
219
+ });
220
+ try {
221
+ let result = await handler();
222
+ let successMessage = resolveTraceMessage(trace.successMessage, result);
223
+ logger.info({
224
+ ...providerTrace,
225
+ ...trace.metadata,
226
+ ...trace.onSuccess?.(result) ?? {},
227
+ component: trace.component,
228
+ functionName: trace.functionName,
229
+ phase: "success",
230
+ durationMs: Date.now() - startedAt,
231
+ message: successMessage
232
+ });
233
+ return result;
234
+ } catch (error) {
235
+ logger.error({
236
+ ...providerTrace,
237
+ ...trace.metadata,
238
+ ...toErrorMetadata(error),
239
+ component: trace.component,
240
+ functionName: trace.functionName,
241
+ phase: "error",
242
+ durationMs: Date.now() - startedAt,
243
+ message: trace.errorMessage ?? `${typeof trace.successMessage === "string" ? trace.successMessage : trace.message} failed`
244
+ });
245
+ throw error;
246
+ }
247
+ };
248
+ let getContextBasic = () => {
249
+ let currentProtocol = protocol.get();
250
+ let currentParticipants = participants.get();
251
+ if (!currentProtocol || !currentParticipants) {
252
+ throw new import_error3.ServiceError(
253
+ (0, import_error3.preconditionFailedError)({
254
+ message: "Connection context has not been initialized"
255
+ })
256
+ );
257
+ }
258
+ return {
259
+ protocol: currentProtocol,
260
+ participants: currentParticipants
261
+ };
262
+ };
263
+ let getContextFull = () => {
264
+ let basic = getContextBasic();
265
+ let currentConfig = config.get();
266
+ let currentSession = session.get();
267
+ let currentAuth = auth.get();
268
+ if (!currentConfig || !currentSession || !currentAuth && slate.spec.auth.authStack.length > 0) {
269
+ throw new import_error3.ServiceError(
270
+ (0, import_error3.preconditionFailedError)({
271
+ message: "Session context has not been initialized"
272
+ })
273
+ );
274
+ }
275
+ return {
276
+ ...basic,
277
+ config: currentConfig.value,
278
+ session: currentSession,
279
+ auth: currentAuth
280
+ };
281
+ };
282
+ let getEmptyContext = () => new import_provider2.SlateContext({}, {}, {}, slate.spec, logger);
283
+ let withRequestTraces = (context, result) => {
284
+ let requestTraces = context.getHttpTraces();
285
+ return requestTraces.length > 0 ? { ...result, requestTraces } : result;
286
+ };
287
+ manager.onNotification("slates/hello", async ({ params }) => {
288
+ protocol.set(params.protocol);
289
+ });
290
+ manager.onNotification("slates/participant.set", async ({ params }) => {
291
+ if (!protocol.get()) {
292
+ throw new import_error3.ServiceError(
293
+ (0, import_error3.preconditionFailedError)({ message: "Connection protocol has not been initialized" })
294
+ );
295
+ }
296
+ participants.set(params.participants);
297
+ });
298
+ manager.onNotification("slates/auth.set", async ({ params }) => {
299
+ getContextBasic();
300
+ getAuthMethod(slate, params.authenticationMethodId);
301
+ let valRes = validate(
302
+ slate.spec.authSchema,
303
+ params.output,
304
+ "auth",
305
+ `Invalid authentication output for method ID: ${params.authenticationMethodId}`
306
+ );
307
+ auth.set({
308
+ authenticationMethodId: params.authenticationMethodId,
309
+ output: valRes
310
+ });
311
+ });
312
+ manager.onNotification("slates/config.set", async ({ params }) => {
313
+ getContextBasic();
314
+ let value = validate(
315
+ slate.spec.configSchema,
316
+ params.config,
317
+ "config",
318
+ "Invalid configuration"
319
+ );
320
+ config.set({ value });
321
+ });
322
+ manager.onNotification("slates/session.start", async ({ params }) => {
323
+ getContextBasic();
324
+ session.set({
325
+ id: params.sessionId,
326
+ state: params.state
327
+ });
328
+ });
329
+ manager.onRequest("slates/config.changed", async ({ params }) => {
330
+ getContextBasic();
331
+ let newConfig = validate(
332
+ slate.spec.config.configSchema,
333
+ params.newConfig,
334
+ "config",
335
+ "Invalid configuration"
336
+ );
337
+ let configChanged = slate.spec.config.handlers.configChanged;
338
+ if (!configChanged) {
339
+ return { success: true, config: newConfig };
340
+ }
341
+ let context = getEmptyContext();
342
+ let updatedConfig = await traceProviderCall(
343
+ {
344
+ component: "config",
345
+ functionName: "configChanged",
346
+ message: "Running config change handler",
347
+ successMessage: "Config change handler completed",
348
+ metadata: {
349
+ hasPreviousConfig: params.previousConfig !== null,
350
+ newConfigKeyCount: getObjectKeyCount(newConfig)
351
+ },
352
+ onSuccess: (result) => ({
353
+ returnedConfig: !!result?.config
354
+ })
355
+ },
356
+ () => (0, import_provider2.runWithContext)(
357
+ context,
358
+ async () => configChanged({
359
+ previousConfig: params.previousConfig,
360
+ newConfig
361
+ })
362
+ )
363
+ );
364
+ return withRequestTraces(context, {
365
+ success: true,
366
+ config: updatedConfig?.config ?? newConfig
367
+ });
368
+ });
369
+ manager.onRequest("slates/config.get_default", async () => {
370
+ getContextBasic();
371
+ let getDefaultConfig = slate.spec.config.handlers.getDefaultConfig;
372
+ if (!getDefaultConfig) {
373
+ return { config: null };
374
+ }
375
+ let context = getEmptyContext();
376
+ let defaultConfig = await traceProviderCall(
377
+ {
378
+ component: "config",
379
+ functionName: "getDefaultConfig",
380
+ message: "Getting default config",
381
+ successMessage: "Default config retrieved",
382
+ onSuccess: (result) => ({
383
+ configKeyCount: getObjectKeyCount(result)
384
+ })
385
+ },
386
+ () => (0, import_provider2.runWithContext)(context, async () => getDefaultConfig())
387
+ );
388
+ return withRequestTraces(context, {
389
+ config: defaultConfig ?? null
390
+ });
391
+ });
392
+ manager.onRequest("slates/config.schema.get", async () => {
393
+ getContextBasic();
394
+ return { schema: toJsonSchema(slate.spec.configSchema) };
395
+ });
396
+ manager.onRequest("slates/provider.identify", async () => {
397
+ getContextBasic();
398
+ return {
399
+ protocol: import_proto.SLATES_PROTOCOL_VERSION,
400
+ provider: {
401
+ type: "provider",
402
+ id: slate.spec.key,
403
+ name: slate.spec.name,
404
+ description: slate.spec.description,
405
+ metadata: slate.spec.parameters.metadata
406
+ }
407
+ };
408
+ });
409
+ manager.onRequest("slates/auth.methods.list", async () => {
410
+ getContextBasic();
411
+ return {
412
+ authenticationMethods: slate.spec.auth.authStack.map((m) => mapAuthMethod(slate, m))
413
+ };
414
+ });
415
+ manager.onRequest("slates/auth.method.get", async ({ params }) => {
416
+ getContextBasic();
417
+ let authMethod = getAuthMethod(slate, params.authenticationMethodId);
418
+ return {
419
+ authenticationMethod: mapAuthMethod(slate, authMethod)
420
+ };
421
+ });
422
+ manager.onRequest("slates/auth.input.get_default", async ({ params }) => {
423
+ getContextBasic();
424
+ let authMethod = getAuthMethod(slate, params.authenticationMethodId);
425
+ if (!authMethod.getDefaultInput) {
426
+ return { input: null };
427
+ }
428
+ let context = getEmptyContext();
429
+ let input = await traceProviderCall(
430
+ {
431
+ component: "auth",
432
+ functionName: "getDefaultInput",
433
+ message: "Getting default authentication input",
434
+ successMessage: "Default authentication input retrieved",
435
+ metadata: {
436
+ authenticationMethodId: params.authenticationMethodId,
437
+ authenticationMethodName: authMethod.name
438
+ },
439
+ onSuccess: (result) => ({
440
+ inputKeyCount: getObjectKeyCount(result)
441
+ })
442
+ },
443
+ () => (0, import_provider2.runWithContext)(context, () => authMethod.getDefaultInput())
444
+ );
445
+ return withRequestTraces(context, { input });
446
+ });
447
+ manager.onRequest("slates/auth.input.changed", async ({ params }) => {
448
+ getContextBasic();
449
+ let authMethod = getAuthMethod(slate, params.authenticationMethodId);
450
+ if (!authMethod.onInputChanged) {
451
+ return { success: true, input: params.newInput };
452
+ }
453
+ let context = getEmptyContext();
454
+ let updatedInput = await traceProviderCall(
455
+ {
456
+ component: "auth",
457
+ functionName: "onInputChanged",
458
+ message: "Running authentication input change handler",
459
+ successMessage: "Authentication input change handler completed",
460
+ metadata: {
461
+ authenticationMethodId: params.authenticationMethodId,
462
+ authenticationMethodName: authMethod.name,
463
+ hasPreviousInput: params.previousInput !== null,
464
+ newInputKeyCount: getObjectKeyCount(params.newInput)
465
+ },
466
+ onSuccess: (result) => ({
467
+ returnedInput: !!result?.input
468
+ })
469
+ },
470
+ () => (0, import_provider2.runWithContext)(
471
+ context,
472
+ () => authMethod.onInputChanged({
473
+ previousInput: params.previousInput,
474
+ newInput: params.newInput
475
+ })
476
+ )
477
+ );
478
+ return withRequestTraces(context, {
479
+ success: true,
480
+ input: updatedInput?.input ?? params.newInput
481
+ });
482
+ });
483
+ manager.onRequest("slates/auth.output.get", async ({ params }) => {
484
+ getContextBasic();
485
+ let authMethod = getAuthMethod(slate, params.authenticationMethodId);
486
+ let input = params.input;
487
+ if (authMethod.inputSchema) {
488
+ input = validate(
489
+ authMethod.inputSchema,
490
+ input,
491
+ "auth",
492
+ `Invalid authentication input for method ID: ${params.authenticationMethodId}`
493
+ );
494
+ }
495
+ if ("getOutput" in authMethod) {
496
+ let context = getEmptyContext();
497
+ let outputRes = await traceProviderCall(
498
+ {
499
+ component: "auth",
500
+ functionName: "getOutput",
501
+ message: "Getting authentication output",
502
+ successMessage: "Authentication output retrieved",
503
+ metadata: {
504
+ authenticationMethodId: params.authenticationMethodId,
505
+ authenticationMethodName: authMethod.name,
506
+ inputKeyCount: getObjectKeyCount(input)
507
+ },
508
+ onSuccess: (result) => ({
509
+ outputKeyCount: getObjectKeyCount(result.output)
510
+ })
511
+ },
512
+ () => (0, import_provider2.runWithContext)(context, () => authMethod.getOutput({ input }))
513
+ );
514
+ return withRequestTraces(context, { output: outputRes.output });
515
+ }
516
+ return { output: input };
517
+ });
518
+ manager.onRequest("slates/auth.authorization_callback.handle", async ({ params }) => {
519
+ getContextBasic();
520
+ let authMethod = getAuthMethod(slate, params.authenticationMethodId);
521
+ if ("handleCallback" in authMethod) {
522
+ let context = getEmptyContext();
523
+ let callbackRes = await traceProviderCall(
524
+ {
525
+ component: "auth",
526
+ functionName: "handleCallback",
527
+ message: "Handling authentication callback",
528
+ successMessage: "Authentication callback handled",
529
+ metadata: {
530
+ authenticationMethodId: params.authenticationMethodId,
531
+ authenticationMethodName: authMethod.name,
532
+ scopeCount: params.scopes.length,
533
+ hasCallbackState: !!params.callbackState
534
+ },
535
+ onSuccess: (result) => ({
536
+ outputKeyCount: getObjectKeyCount(result.output),
537
+ returnedInput: !!result.input,
538
+ returnedScopeCount: result.scopes?.length
539
+ })
540
+ },
541
+ () => (0, import_provider2.runWithContext)(
542
+ context,
543
+ () => authMethod.handleCallback({
544
+ code: params.code,
545
+ state: params.state,
546
+ redirectUri: params.redirectUri,
547
+ input: params.input,
548
+ clientId: params.clientId,
549
+ clientSecret: params.clientSecret,
550
+ scopes: params.scopes,
551
+ callbackState: params.callbackState || {}
552
+ })
553
+ )
554
+ );
555
+ return withRequestTraces(context, {
556
+ output: callbackRes.output,
557
+ input: callbackRes.input,
558
+ scopes: callbackRes.scopes
559
+ });
560
+ }
561
+ throw new import_error3.ServiceError(
562
+ (0, import_error3.preconditionFailedError)({
563
+ message: `Authentication method does not support authorization callback handling: ${params.authenticationMethodId}`
564
+ })
565
+ );
566
+ });
567
+ manager.onRequest("slates/auth.authorization_url.get", async ({ params }) => {
568
+ getContextBasic();
569
+ let authMethod = getAuthMethod(slate, params.authenticationMethodId);
570
+ if ("getAuthorizationUrl" in authMethod) {
571
+ let context = getEmptyContext();
572
+ let urlRes = await traceProviderCall(
573
+ {
574
+ component: "auth",
575
+ functionName: "getAuthorizationUrl",
576
+ message: "Getting authentication authorization URL",
577
+ successMessage: "Authentication authorization URL retrieved",
578
+ metadata: {
579
+ authenticationMethodId: params.authenticationMethodId,
580
+ authenticationMethodName: authMethod.name,
581
+ scopeCount: params.scopes.length,
582
+ inputKeyCount: getObjectKeyCount(params.input)
583
+ },
584
+ onSuccess: (result) => ({
585
+ returnedInput: !!result.input,
586
+ hasCallbackState: !!result.callbackState
587
+ })
588
+ },
589
+ () => (0, import_provider2.runWithContext)(
590
+ context,
591
+ () => authMethod.getAuthorizationUrl({
592
+ redirectUri: params.redirectUri,
593
+ state: params.state,
594
+ input: params.input,
595
+ clientId: params.clientId,
596
+ clientSecret: params.clientSecret,
597
+ scopes: params.scopes
598
+ })
599
+ )
600
+ );
601
+ return withRequestTraces(context, {
602
+ authorizationUrl: urlRes.url,
603
+ input: urlRes.input,
604
+ callbackState: urlRes.callbackState
605
+ });
606
+ }
607
+ throw new import_error3.ServiceError(
608
+ (0, import_error3.preconditionFailedError)({
609
+ message: `Authentication method does not support authorization URL retrieval: ${params.authenticationMethodId}`
610
+ })
611
+ );
612
+ });
613
+ manager.onRequest("slates/auth.profile.get", async ({ params }) => {
614
+ getContextBasic();
615
+ let authMethod = getAuthMethod(slate, params.authenticationMethodId);
616
+ if (authMethod.getProfile) {
617
+ let context = getEmptyContext();
618
+ let profileRes = await traceProviderCall(
619
+ {
620
+ component: "auth",
621
+ functionName: "getProfile",
622
+ message: "Getting authentication profile",
623
+ successMessage: "Authentication profile retrieved",
624
+ metadata: {
625
+ authenticationMethodId: params.authenticationMethodId,
626
+ authenticationMethodName: authMethod.name,
627
+ scopeCount: params.scopes.length,
628
+ inputKeyCount: getObjectKeyCount(params.input),
629
+ outputKeyCount: getObjectKeyCount(params.output)
630
+ },
631
+ onSuccess: (result) => ({
632
+ profileKeyCount: getObjectKeyCount(result.profile)
633
+ })
634
+ },
635
+ () => (0, import_provider2.runWithContext)(
636
+ context,
637
+ () => authMethod.getProfile({
638
+ output: params.output,
639
+ input: params.input,
640
+ scopes: params.scopes
641
+ })
642
+ )
643
+ );
644
+ return withRequestTraces(context, {
645
+ profile: profileRes.profile
646
+ });
647
+ }
648
+ throw new import_error3.ServiceError(
649
+ (0, import_error3.preconditionFailedError)({
650
+ message: `Authentication method does not support profile retrieval: ${params.authenticationMethodId}`
651
+ })
652
+ );
653
+ });
654
+ manager.onRequest("slates/auth.token_refresh.handle", async ({ params }) => {
655
+ getContextBasic();
656
+ let authMethod = getAuthMethod(slate, params.authenticationMethodId);
657
+ if ("handleTokenRefresh" in authMethod && authMethod.handleTokenRefresh) {
658
+ let context = getEmptyContext();
659
+ let refreshRes = await traceProviderCall(
660
+ {
661
+ component: "auth",
662
+ functionName: "handleTokenRefresh",
663
+ message: "Refreshing authentication token",
664
+ successMessage: "Authentication token refreshed",
665
+ metadata: {
666
+ authenticationMethodId: params.authenticationMethodId,
667
+ authenticationMethodName: authMethod.name,
668
+ scopeCount: params.scopes.length,
669
+ inputKeyCount: getObjectKeyCount(params.input),
670
+ outputKeyCount: getObjectKeyCount(params.output)
671
+ },
672
+ onSuccess: (result) => ({
673
+ refreshedOutputKeyCount: getObjectKeyCount(result.output),
674
+ returnedInput: !!result.input
675
+ })
676
+ },
677
+ () => (0, import_provider2.runWithContext)(
678
+ context,
679
+ () => authMethod.handleTokenRefresh({
680
+ output: params.output,
681
+ input: params.input,
682
+ clientId: params.clientId,
683
+ clientSecret: params.clientSecret,
684
+ scopes: params.scopes
685
+ })
686
+ )
687
+ );
688
+ return withRequestTraces(context, {
689
+ output: refreshRes.output,
690
+ input: refreshRes.input
691
+ });
692
+ }
693
+ throw new import_error3.ServiceError(
694
+ (0, import_error3.preconditionFailedError)({
695
+ message: `Authentication method does not support token refresh handling: ${params.authenticationMethodId}`
696
+ })
697
+ );
698
+ });
699
+ manager.onRequest("slates/actions.list", async () => {
700
+ getContextBasic();
701
+ return {
702
+ actions: slate.actions.map((a) => mapAction(slate, a))
703
+ };
704
+ });
705
+ manager.onRequest("slates/action.get", async ({ params }) => {
706
+ getContextBasic();
707
+ let action = getAction(slate, params.actionId);
708
+ return {
709
+ action: mapAction(slate, action)
710
+ };
711
+ });
712
+ manager.onRequest("slates/action.tool.invoke", async ({ params }) => {
713
+ let ctx = getContextFull();
714
+ let action = getActionWithType(slate, "tool", params.actionId);
715
+ let input = validate(
716
+ action.inputSchema,
717
+ params.input,
718
+ "input",
719
+ `Invalid input for tool ID: ${params.actionId}`
720
+ );
721
+ let context = new import_provider2.SlateContext(ctx.config, input, ctx.auth?.output, slate.spec, logger);
722
+ let res = await traceProviderCall(
723
+ {
724
+ component: "action",
725
+ functionName: "handleInvocation",
726
+ message: `Starting tool ${formatEntityLabel(action.name, action.key)}`,
727
+ successMessage: `Completed tool ${formatEntityLabel(action.name, action.key)}`,
728
+ errorMessage: `Tool ${formatEntityLabel(action.name, action.key)} failed`,
729
+ metadata: {
730
+ actionId: action.key,
731
+ actionName: action.name,
732
+ actionType: action.type,
733
+ inputKeyCount: getObjectKeyCount(input)
734
+ },
735
+ onSuccess: (result) => ({
736
+ hasMessage: !!result.message,
737
+ actionResultMessage: result.message,
738
+ outputKeyCount: getObjectKeyCount(result.output)
739
+ })
740
+ },
741
+ () => (0, import_provider2.runWithContext)(context, () => action.handleInvocation(context))
742
+ );
743
+ return withRequestTraces(context, { output: res.output, message: res.message });
744
+ });
745
+ manager.onRequest("slates/action.trigger.map_event", async ({ params }) => {
746
+ let ctx = getContextFull();
747
+ let action = getActionWithType(slate, "trigger", params.actionId);
748
+ let input = validate(
749
+ action.inputSchema,
750
+ params.input,
751
+ "input",
752
+ `Invalid event for trigger ID: ${params.actionId}`
753
+ );
754
+ let context = new import_provider2.SlateContext(ctx.config, input, ctx.auth?.output, slate.spec, logger);
755
+ let res = await traceProviderCall(
756
+ {
757
+ component: "action",
758
+ functionName: "handleEvent",
759
+ message: `Mapping event for trigger ${formatEntityLabel(action.name, action.key)}`,
760
+ successMessage: (result) => `Mapped trigger event "${result.type}" for ${formatEntityLabel(action.name, action.key)}`,
761
+ errorMessage: `Trigger ${formatEntityLabel(action.name, action.key)} failed while mapping an event`,
762
+ metadata: {
763
+ actionId: action.key,
764
+ actionName: action.name,
765
+ actionType: action.type,
766
+ inputKeyCount: getObjectKeyCount(input)
767
+ },
768
+ onSuccess: (result) => ({
769
+ eventType: result.type,
770
+ hasEventId: !!result.id,
771
+ outputKeyCount: getObjectKeyCount(result.output)
772
+ })
773
+ },
774
+ () => (0, import_provider2.runWithContext)(context, () => action.handleEvent(context))
775
+ );
776
+ return withRequestTraces(context, { id: res.id, type: res.type, output: res.output });
777
+ });
778
+ manager.onRequest("slates/action.trigger.poll_events", async ({ params }) => {
779
+ let ctx = getContextFull();
780
+ let action = getActionWithType(slate, "trigger", params.actionId);
781
+ if (!action.pollEvents) {
782
+ throw new import_error3.ServiceError(
783
+ (0, import_error3.badRequestError)({
784
+ message: `Trigger action does not support polling: ${params.actionId}`
785
+ })
786
+ );
787
+ }
788
+ let context = new import_provider2.SlateContext(
789
+ ctx.config,
790
+ { state: params.state },
791
+ ctx.auth?.output,
792
+ slate.spec,
793
+ logger
794
+ );
795
+ let res = await traceProviderCall(
796
+ {
797
+ component: "action",
798
+ functionName: "pollEvents",
799
+ message: `Polling events for trigger ${formatEntityLabel(action.name, action.key)}`,
800
+ successMessage: (result) => `Polled ${result.inputs.length} event(s) for trigger ${formatEntityLabel(action.name, action.key)}`,
801
+ errorMessage: `Trigger ${formatEntityLabel(action.name, action.key)} failed while polling events`,
802
+ metadata: {
803
+ actionId: action.key,
804
+ actionName: action.name,
805
+ actionType: action.type,
806
+ hasPreviousState: params.state !== null
807
+ },
808
+ onSuccess: (result) => ({
809
+ inputCount: result.inputs.length,
810
+ hasUpdatedState: result.updatedState !== void 0
811
+ })
812
+ },
813
+ () => (0, import_provider2.runWithContext)(context, () => action.pollEvents(context))
814
+ );
815
+ return withRequestTraces(context, {
816
+ inputs: res.inputs,
817
+ updatedState: res.updatedState
818
+ });
819
+ });
820
+ manager.onRequest("slates/action.trigger.webhook_handle", async ({ params }) => {
821
+ let ctx = getContextFull();
822
+ let action = getActionWithType(slate, "trigger", params.actionId);
823
+ if (!action.handleRequest) {
824
+ throw new import_error3.ServiceError(
825
+ (0, import_error3.badRequestError)({
826
+ message: `Trigger action does not support webhook requests: ${params.actionId}`
827
+ })
828
+ );
829
+ }
830
+ let req = new Request(params.url, {
831
+ method: params.method,
832
+ headers: params.headers,
833
+ body: params.body ? Uint8Array.from(atob(params.body.content), (c) => c.charCodeAt(0)) : null
834
+ });
835
+ let context = new import_provider2.SlateContext(
836
+ ctx.config,
837
+ { request: req, state: params.state },
838
+ ctx.auth?.output,
839
+ slate.spec,
840
+ logger
841
+ );
842
+ let res = await traceProviderCall(
843
+ {
844
+ component: "action",
845
+ functionName: "handleRequest",
846
+ message: `Handling webhook request for trigger ${formatEntityLabel(action.name, action.key)}`,
847
+ successMessage: (result) => `Received ${result.inputs.length} webhook event(s) for trigger ${formatEntityLabel(action.name, action.key)}`,
848
+ errorMessage: `Trigger ${formatEntityLabel(action.name, action.key)} failed while handling a webhook request`,
849
+ metadata: {
850
+ actionId: action.key,
851
+ actionName: action.name,
852
+ actionType: action.type,
853
+ requestMethod: params.method,
854
+ hasRequestBody: !!params.body,
855
+ hasPreviousState: params.state !== null
856
+ },
857
+ onSuccess: (result) => ({
858
+ inputCount: result.inputs.length,
859
+ hasUpdatedState: result.updatedState !== void 0
860
+ })
861
+ },
862
+ () => (0, import_provider2.runWithContext)(context, () => action.handleRequest(context))
863
+ );
864
+ return withRequestTraces(context, {
865
+ inputs: res.inputs,
866
+ updatedState: res.updatedState
867
+ });
868
+ });
869
+ manager.onRequest("slates/action.trigger.webhook_register", async ({ params }) => {
870
+ let ctx = getContextFull();
871
+ let action = getActionWithType(slate, "trigger", params.actionId);
872
+ if (!action.autoRegisterWebhook) {
873
+ throw new import_error3.ServiceError(
874
+ (0, import_error3.badRequestError)({
875
+ message: `Trigger action does not support webhook auto-registration: ${params.actionId}`
876
+ })
877
+ );
878
+ }
879
+ let context = new import_provider2.SlateContext(
880
+ ctx.config,
881
+ { webhookBaseUrl: params.webhookBaseUrl },
882
+ ctx.auth?.output,
883
+ slate.spec,
884
+ logger
885
+ );
886
+ let res = await traceProviderCall(
887
+ {
888
+ component: "action",
889
+ functionName: "autoRegisterWebhook",
890
+ message: `Registering webhook for trigger ${formatEntityLabel(action.name, action.key)}`,
891
+ successMessage: `Registered webhook for trigger ${formatEntityLabel(action.name, action.key)}`,
892
+ errorMessage: `Trigger ${formatEntityLabel(action.name, action.key)} failed while registering a webhook`,
893
+ metadata: {
894
+ actionId: action.key,
895
+ actionName: action.name,
896
+ actionType: action.type
897
+ },
898
+ onSuccess: (result) => ({
899
+ hasRegistrationDetails: result.registrationDetails !== void 0,
900
+ hasState: result.state !== void 0
901
+ })
902
+ },
903
+ () => (0, import_provider2.runWithContext)(context, () => action.autoRegisterWebhook(context))
904
+ );
905
+ return withRequestTraces(context, {
906
+ registrationDetails: res.registrationDetails,
907
+ state: res.state
908
+ });
909
+ });
910
+ manager.onRequest("slates/action.trigger.webhook_unregister", async ({ params }) => {
911
+ let ctx = getContextFull();
912
+ let action = getActionWithType(slate, "trigger", params.actionId);
913
+ if (!action.autoUnregisterWebhook) {
914
+ throw new import_error3.ServiceError(
915
+ (0, import_error3.badRequestError)({
916
+ message: `Trigger action does not support webhook auto-unregistration: ${params.actionId}`
917
+ })
918
+ );
919
+ }
920
+ let context = new import_provider2.SlateContext(
921
+ ctx.config,
922
+ {
923
+ webhookBaseUrl: params.webhookBaseUrl,
924
+ registrationDetails: params.registrationDetails,
925
+ state: params.state
926
+ },
927
+ ctx.auth?.output,
928
+ slate.spec,
929
+ logger
930
+ );
931
+ await traceProviderCall(
932
+ {
933
+ component: "action",
934
+ functionName: "autoUnregisterWebhook",
935
+ message: `Unregistering webhook for trigger ${formatEntityLabel(action.name, action.key)}`,
936
+ successMessage: `Unregistered webhook for trigger ${formatEntityLabel(action.name, action.key)}`,
937
+ errorMessage: `Trigger ${formatEntityLabel(action.name, action.key)} failed while unregistering a webhook`,
938
+ metadata: {
939
+ actionId: action.key,
940
+ actionName: action.name,
941
+ actionType: action.type,
942
+ hasRegistrationDetails: params.registrationDetails !== null,
943
+ hasPreviousState: params.state !== null
944
+ }
945
+ },
946
+ () => (0, import_provider2.runWithContext)(context, () => action.autoUnregisterWebhook(context))
947
+ );
948
+ return withRequestTraces(context, {});
949
+ });
950
+ });
951
+ // Annotate the CommonJS export names for ESM import in node:
952
+ 0 && (module.exports = {
953
+ createProviderHandler
954
+ });