@compozy/extension-sdk 0.3.0-beta.10

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 (160) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/base-types.js +3 -0
  3. package/dist/cjs/base-types.js.map +1 -0
  4. package/dist/cjs/capabilities.js +27 -0
  5. package/dist/cjs/capabilities.js.map +1 -0
  6. package/dist/cjs/connectivity-provider.js +70 -0
  7. package/dist/cjs/connectivity-provider.js.map +1 -0
  8. package/dist/cjs/errors.js +123 -0
  9. package/dist/cjs/errors.js.map +1 -0
  10. package/dist/cjs/extension-context.js +28 -0
  11. package/dist/cjs/extension-context.js.map +1 -0
  12. package/dist/cjs/extension-contract.js +8 -0
  13. package/dist/cjs/extension-contract.js.map +1 -0
  14. package/dist/cjs/extension-describe.js +88 -0
  15. package/dist/cjs/extension-describe.js.map +1 -0
  16. package/dist/cjs/extension-initialize.js +67 -0
  17. package/dist/cjs/extension-initialize.js.map +1 -0
  18. package/dist/cjs/extension-provide-surface.js +81 -0
  19. package/dist/cjs/extension-provide-surface.js.map +1 -0
  20. package/dist/cjs/extension-runtime.js +227 -0
  21. package/dist/cjs/extension-runtime.js.map +1 -0
  22. package/dist/cjs/extension-session.js +47 -0
  23. package/dist/cjs/extension-session.js.map +1 -0
  24. package/dist/cjs/extension-tool-context.js +29 -0
  25. package/dist/cjs/extension-tool-context.js.map +1 -0
  26. package/dist/cjs/extension-tool-registration.js +42 -0
  27. package/dist/cjs/extension-tool-registration.js.map +1 -0
  28. package/dist/cjs/extension.js +340 -0
  29. package/dist/cjs/extension.js.map +1 -0
  30. package/dist/cjs/generated/contracts.js +29 -0
  31. package/dist/cjs/generated/contracts.js.map +1 -0
  32. package/dist/cjs/host-api.js +189 -0
  33. package/dist/cjs/host-api.js.map +1 -0
  34. package/dist/cjs/index.js +37 -0
  35. package/dist/cjs/index.js.map +1 -0
  36. package/dist/cjs/json.js +13 -0
  37. package/dist/cjs/json.js.map +1 -0
  38. package/dist/cjs/package.json +3 -0
  39. package/dist/cjs/schema-digest.js +45 -0
  40. package/dist/cjs/schema-digest.js.map +1 -0
  41. package/dist/cjs/testing/conformance.js +23 -0
  42. package/dist/cjs/testing/conformance.js.map +1 -0
  43. package/dist/cjs/testing/harness.js +158 -0
  44. package/dist/cjs/testing/harness.js.map +1 -0
  45. package/dist/cjs/testing/index.js +12 -0
  46. package/dist/cjs/testing/index.js.map +1 -0
  47. package/dist/cjs/testing/mock-transport.js +77 -0
  48. package/dist/cjs/testing/mock-transport.js.map +1 -0
  49. package/dist/cjs/transport.js +244 -0
  50. package/dist/cjs/transport.js.map +1 -0
  51. package/dist/cjs/types.js +19 -0
  52. package/dist/cjs/types.js.map +1 -0
  53. package/dist/cjs/watch-source.js +140 -0
  54. package/dist/cjs/watch-source.js.map +1 -0
  55. package/dist/esm/base-types.js +2 -0
  56. package/dist/esm/base-types.js.map +1 -0
  57. package/dist/esm/capabilities.js +22 -0
  58. package/dist/esm/capabilities.js.map +1 -0
  59. package/dist/esm/connectivity-provider.js +66 -0
  60. package/dist/esm/connectivity-provider.js.map +1 -0
  61. package/dist/esm/errors.js +106 -0
  62. package/dist/esm/errors.js.map +1 -0
  63. package/dist/esm/extension-context.js +24 -0
  64. package/dist/esm/extension-context.js.map +1 -0
  65. package/dist/esm/extension-contract.js +6 -0
  66. package/dist/esm/extension-contract.js.map +1 -0
  67. package/dist/esm/extension-describe.js +82 -0
  68. package/dist/esm/extension-describe.js.map +1 -0
  69. package/dist/esm/extension-initialize.js +63 -0
  70. package/dist/esm/extension-initialize.js.map +1 -0
  71. package/dist/esm/extension-provide-surface.js +77 -0
  72. package/dist/esm/extension-provide-surface.js.map +1 -0
  73. package/dist/esm/extension-runtime.js +214 -0
  74. package/dist/esm/extension-runtime.js.map +1 -0
  75. package/dist/esm/extension-session.js +44 -0
  76. package/dist/esm/extension-session.js.map +1 -0
  77. package/dist/esm/extension-tool-context.js +26 -0
  78. package/dist/esm/extension-tool-context.js.map +1 -0
  79. package/dist/esm/extension-tool-registration.js +39 -0
  80. package/dist/esm/extension-tool-registration.js.map +1 -0
  81. package/dist/esm/extension.js +336 -0
  82. package/dist/esm/extension.js.map +1 -0
  83. package/dist/esm/generated/contracts.js +26 -0
  84. package/dist/esm/generated/contracts.js.map +1 -0
  85. package/dist/esm/host-api.js +185 -0
  86. package/dist/esm/host-api.js.map +1 -0
  87. package/dist/esm/index.js +7 -0
  88. package/dist/esm/index.js.map +1 -0
  89. package/dist/esm/json.js +10 -0
  90. package/dist/esm/json.js.map +1 -0
  91. package/dist/esm/package.json +3 -0
  92. package/dist/esm/schema-digest.js +41 -0
  93. package/dist/esm/schema-digest.js.map +1 -0
  94. package/dist/esm/testing/conformance.js +19 -0
  95. package/dist/esm/testing/conformance.js.map +1 -0
  96. package/dist/esm/testing/harness.js +151 -0
  97. package/dist/esm/testing/harness.js.map +1 -0
  98. package/dist/esm/testing/index.js +4 -0
  99. package/dist/esm/testing/index.js.map +1 -0
  100. package/dist/esm/testing/mock-transport.js +72 -0
  101. package/dist/esm/testing/mock-transport.js.map +1 -0
  102. package/dist/esm/transport.js +239 -0
  103. package/dist/esm/transport.js.map +1 -0
  104. package/dist/esm/types.js +3 -0
  105. package/dist/esm/types.js.map +1 -0
  106. package/dist/esm/watch-source.js +133 -0
  107. package/dist/esm/watch-source.js.map +1 -0
  108. package/dist/types/base-types.d.ts +25 -0
  109. package/dist/types/base-types.d.ts.map +1 -0
  110. package/dist/types/capabilities.d.ts +6 -0
  111. package/dist/types/capabilities.d.ts.map +1 -0
  112. package/dist/types/connectivity-provider.d.ts +14 -0
  113. package/dist/types/connectivity-provider.d.ts.map +1 -0
  114. package/dist/types/errors.d.ts +66 -0
  115. package/dist/types/errors.d.ts.map +1 -0
  116. package/dist/types/extension-context.d.ts +6 -0
  117. package/dist/types/extension-context.d.ts.map +1 -0
  118. package/dist/types/extension-contract.d.ts +65 -0
  119. package/dist/types/extension-contract.d.ts.map +1 -0
  120. package/dist/types/extension-describe.d.ts +16 -0
  121. package/dist/types/extension-describe.d.ts.map +1 -0
  122. package/dist/types/extension-initialize.d.ts +4 -0
  123. package/dist/types/extension-initialize.d.ts.map +1 -0
  124. package/dist/types/extension-provide-surface.d.ts +23 -0
  125. package/dist/types/extension-provide-surface.d.ts.map +1 -0
  126. package/dist/types/extension-runtime.d.ts +14 -0
  127. package/dist/types/extension-runtime.d.ts.map +1 -0
  128. package/dist/types/extension-session.d.ts +16 -0
  129. package/dist/types/extension-session.d.ts.map +1 -0
  130. package/dist/types/extension-tool-context.d.ts +4 -0
  131. package/dist/types/extension-tool-context.d.ts.map +1 -0
  132. package/dist/types/extension-tool-registration.d.ts +3 -0
  133. package/dist/types/extension-tool-registration.d.ts.map +1 -0
  134. package/dist/types/extension.d.ts +59 -0
  135. package/dist/types/extension.d.ts.map +1 -0
  136. package/dist/types/generated/contracts.d.ts +6332 -0
  137. package/dist/types/generated/contracts.d.ts.map +1 -0
  138. package/dist/types/host-api.d.ts +92 -0
  139. package/dist/types/host-api.d.ts.map +1 -0
  140. package/dist/types/index.d.ts +14 -0
  141. package/dist/types/index.d.ts.map +1 -0
  142. package/dist/types/json.d.ts +3 -0
  143. package/dist/types/json.d.ts.map +1 -0
  144. package/dist/types/schema-digest.d.ts +4 -0
  145. package/dist/types/schema-digest.d.ts.map +1 -0
  146. package/dist/types/testing/conformance.d.ts +7 -0
  147. package/dist/types/testing/conformance.d.ts.map +1 -0
  148. package/dist/types/testing/harness.d.ts +51 -0
  149. package/dist/types/testing/harness.d.ts.map +1 -0
  150. package/dist/types/testing/index.d.ts +4 -0
  151. package/dist/types/testing/index.d.ts.map +1 -0
  152. package/dist/types/testing/mock-transport.d.ts +29 -0
  153. package/dist/types/testing/mock-transport.d.ts.map +1 -0
  154. package/dist/types/transport.d.ts +58 -0
  155. package/dist/types/transport.d.ts.map +1 -0
  156. package/dist/types/types.d.ts +115 -0
  157. package/dist/types/types.d.ts.map +1 -0
  158. package/dist/types/watch-source.d.ts +59 -0
  159. package/dist/types/watch-source.d.ts.map +1 -0
  160. package/package.json +49 -0
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExtensionWatchSources = exports.WATCH_POLL_METHOD = exports.WATCH_SOURCE_CAPABILITY = void 0;
4
+ exports.isWatchSourceMethod = isWatchSourceMethod;
5
+ exports.parseWatchPollRequest = parseWatchPollRequest;
6
+ exports.normalizeWatchPollResponse = normalizeWatchPollResponse;
7
+ const errors_js_1 = require("./errors.js");
8
+ const json_js_1 = require("./json.js");
9
+ exports.WATCH_SOURCE_CAPABILITY = "loop.watch_source";
10
+ exports.WATCH_POLL_METHOD = "watch/poll";
11
+ class ExtensionWatchSources {
12
+ options;
13
+ handlers = new Map();
14
+ constructor(options) {
15
+ this.options = options;
16
+ }
17
+ register(definition, kind, _registerOptions, handler) {
18
+ const cleanKind = kind.trim();
19
+ if (!cleanKind) {
20
+ throw new Error("watch source kind is required");
21
+ }
22
+ if (this.handlers.has(cleanKind)) {
23
+ throw new Error(`watch source already registered: ${cleanKind}`);
24
+ }
25
+ if (this.options.hasUserHandler(exports.WATCH_POLL_METHOD)) {
26
+ throw new Error("watch/poll is reserved by extension.watchSource()");
27
+ }
28
+ this.handlers.set(cleanKind, {
29
+ kind: cleanKind,
30
+ handler: handler,
31
+ });
32
+ this.ensureCapability(definition);
33
+ this.options.bindMethod(exports.WATCH_POLL_METHOD);
34
+ }
35
+ hasHandlers() {
36
+ return this.handlers.size > 0;
37
+ }
38
+ implementedMethods() {
39
+ return this.hasHandlers() ? [exports.WATCH_POLL_METHOD] : [];
40
+ }
41
+ bindMethods() {
42
+ if (this.hasHandlers()) {
43
+ this.options.bindMethod(exports.WATCH_POLL_METHOD);
44
+ }
45
+ }
46
+ kinds() {
47
+ return Array.from(this.handlers.keys()).sort();
48
+ }
49
+ initializeResponseFields() {
50
+ return this.hasHandlers() ? { watch_source_kinds: this.kinds() } : {};
51
+ }
52
+ async handlePoll(request, params) {
53
+ const poll = parseWatchPollRequest(params);
54
+ const registered = this.handlers.get(poll.kind);
55
+ if (!registered) {
56
+ throw new errors_js_1.InvalidParamsError("watch source kind is not registered", { kind: poll.kind });
57
+ }
58
+ const context = this.options.makeContext(request);
59
+ const response = await registered.handler({
60
+ kind: registered.kind,
61
+ spec: poll.spec,
62
+ context,
63
+ host: context.host,
64
+ session: context.session,
65
+ ...(poll.expected_state_digest ? { expectedStateDigest: poll.expected_state_digest } : {}),
66
+ });
67
+ return normalizeWatchPollResponse(response);
68
+ }
69
+ ensureCapability(definition) {
70
+ const capabilities = definition.capabilities ?? {};
71
+ capabilities.provides = normalizeStringList([
72
+ ...(capabilities.provides ?? []),
73
+ exports.WATCH_SOURCE_CAPABILITY,
74
+ ]);
75
+ definition.capabilities = capabilities;
76
+ }
77
+ }
78
+ exports.ExtensionWatchSources = ExtensionWatchSources;
79
+ function isWatchSourceMethod(method) {
80
+ return method === exports.WATCH_POLL_METHOD;
81
+ }
82
+ function parseWatchPollRequest(params) {
83
+ if (typeof params !== "object" || params === null) {
84
+ throw new errors_js_1.InvalidParamsError("watch/poll params must be an object");
85
+ }
86
+ const request = params;
87
+ if (typeof request.spec !== "object" || request.spec === null || Array.isArray(request.spec)) {
88
+ throw new errors_js_1.InvalidParamsError("spec must be an object");
89
+ }
90
+ const kind = request.spec.kind;
91
+ if (typeof kind !== "string" || kind.trim() === "") {
92
+ throw new errors_js_1.InvalidParamsError("spec.kind is required");
93
+ }
94
+ if (request.expected_state_digest !== undefined &&
95
+ typeof request.expected_state_digest !== "string") {
96
+ throw new errors_js_1.InvalidParamsError("expected_state_digest must be a string");
97
+ }
98
+ return {
99
+ spec: (0, json_js_1.cloneJSON)(request.spec),
100
+ kind: kind.trim(),
101
+ ...(request.expected_state_digest
102
+ ? { expected_state_digest: request.expected_state_digest.trim() }
103
+ : {}),
104
+ };
105
+ }
106
+ function normalizeWatchPollResponse(response) {
107
+ if (typeof response !== "object" || response === null) {
108
+ throw new errors_js_1.InvalidParamsError("watch source response must be an object");
109
+ }
110
+ if (typeof response.ready !== "boolean") {
111
+ throw new errors_js_1.InvalidParamsError("watch source response.ready must be a boolean");
112
+ }
113
+ if (typeof response.event_key !== "string") {
114
+ throw new errors_js_1.InvalidParamsError("watch source response.event_key must be a string");
115
+ }
116
+ const eventKey = response.event_key.trim().normalize("NFC");
117
+ if (!eventKey) {
118
+ throw new errors_js_1.InvalidParamsError("watch source response.event_key is required");
119
+ }
120
+ if (new TextEncoder().encode(eventKey).byteLength > 256) {
121
+ throw new errors_js_1.InvalidParamsError("watch source response.event_key must be at most 256 bytes");
122
+ }
123
+ if (response.state_digest !== undefined && typeof response.state_digest !== "string") {
124
+ throw new errors_js_1.InvalidParamsError("watch source response.state_digest must be a string");
125
+ }
126
+ if (response.settled_at !== undefined && typeof response.settled_at !== "string") {
127
+ throw new errors_js_1.InvalidParamsError("watch source response.settled_at must be a string");
128
+ }
129
+ return {
130
+ ready: response.ready,
131
+ event_key: eventKey,
132
+ ...(response.state_digest ? { state_digest: response.state_digest } : {}),
133
+ ...(response.payload !== undefined ? { payload: (0, json_js_1.cloneJSON)(response.payload) } : {}),
134
+ ...(response.settled_at ? { settled_at: response.settled_at } : {}),
135
+ };
136
+ }
137
+ function normalizeStringList(values) {
138
+ return Array.from(new Set((values ?? []).map(value => value.trim()).filter(Boolean))).sort();
139
+ }
140
+ //# sourceMappingURL=watch-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-source.js","sourceRoot":"","sources":["../../src/watch-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-types.js","sourceRoot":"","sources":["../../src/base-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { InternalError } from "./errors.js";
2
+ import { REQUIRED_METHODS_BY_PROVIDE } from "./generated/contracts.js";
3
+ export const TOOL_PROVIDER_CAPABILITY = "tool.provider";
4
+ export const PROVIDE_TOOLS_METHOD = "provide_tools";
5
+ export const TOOLS_CALL_METHOD = "tools/call";
6
+ export function isToolProviderMethod(method) {
7
+ return method === PROVIDE_TOOLS_METHOD || method === TOOLS_CALL_METHOD;
8
+ }
9
+ export function validateProvidedMethodCoverage(provides, implementedMethods) {
10
+ const implemented = new Set(implementedMethods);
11
+ for (const capability of provides) {
12
+ const requiredMethods = REQUIRED_METHODS_BY_PROVIDE[capability];
13
+ if (!requiredMethods) {
14
+ continue;
15
+ }
16
+ const missing = requiredMethods.filter(method => !implemented.has(method));
17
+ if (missing.length > 0) {
18
+ throw new InternalError(`capability ${capability} requires methods ${missing.join(", ")}`);
19
+ }
20
+ }
21
+ }
22
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAEvE,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAC;AACxD,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC;AACpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAE9C,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,OAAO,MAAM,KAAK,oBAAoB,IAAI,MAAM,KAAK,iBAAiB,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,QAA2B,EAC3B,kBAAqC;IAErC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChD,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE,CAAC;QAClC,MAAM,eAAe,GACnB,2BACD,CAAC,UAAU,CAAC,CAAC;QACd,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,aAAa,CAAC,cAAc,UAAU,qBAAqB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { InvalidParamsError } from "./errors.js";
2
+ import { registerProvideSurface } from "./extension-provide-surface.js";
3
+ export const CONNECTIVITY_PROVIDER_CAPABILITY = "connectivity.provider";
4
+ export const CONNECTIVITY_ESTABLISH_METHOD = "connectivity/establish";
5
+ export const CONNECTIVITY_STATUS_METHOD = "connectivity/status";
6
+ export const CONNECTIVITY_TEARDOWN_METHOD = "connectivity/teardown";
7
+ function parseRequestRecord(method, request) {
8
+ if (typeof request !== "object" || request === null || Array.isArray(request)) {
9
+ throw new InvalidParamsError(`${method} params must be an object`);
10
+ }
11
+ return request;
12
+ }
13
+ function requiredString(method, request, field) {
14
+ const value = request[field];
15
+ if (typeof value !== "string" || value.length === 0) {
16
+ throw new InvalidParamsError(`${method} requires a non-empty ${field}`);
17
+ }
18
+ return value;
19
+ }
20
+ function parseEstablishRequest(request) {
21
+ const record = parseRequestRecord(CONNECTIVITY_ESTABLISH_METHOD, request);
22
+ return {
23
+ tier: requiredString(CONNECTIVITY_ESTABLISH_METHOD, record, "tier"),
24
+ forward_target: requiredString(CONNECTIVITY_ESTABLISH_METHOD, record, "forward_target"),
25
+ challenge_path: requiredString(CONNECTIVITY_ESTABLISH_METHOD, record, "challenge_path"),
26
+ deadline: requiredString(CONNECTIVITY_ESTABLISH_METHOD, record, "deadline"),
27
+ };
28
+ }
29
+ function parseStatusRequest(request) {
30
+ const record = parseRequestRecord(CONNECTIVITY_STATUS_METHOD, request);
31
+ return {
32
+ tier: requiredString(CONNECTIVITY_STATUS_METHOD, record, "tier"),
33
+ };
34
+ }
35
+ function parseTeardownRequest(request) {
36
+ const record = parseRequestRecord(CONNECTIVITY_TEARDOWN_METHOD, request);
37
+ return {
38
+ tier: requiredString(CONNECTIVITY_TEARDOWN_METHOD, record, "tier"),
39
+ deadline: requiredString(CONNECTIVITY_TEARDOWN_METHOD, record, "deadline"),
40
+ };
41
+ }
42
+ export function registerConnectivityProvider(extension, handlers) {
43
+ if (!extension) {
44
+ throw new Error("extension is required");
45
+ }
46
+ if (typeof handlers?.establish !== "function" ||
47
+ typeof handlers.status !== "function" ||
48
+ typeof handlers.teardown !== "function") {
49
+ throw new Error("connectivity provider handlers are required");
50
+ }
51
+ return extension[registerProvideSurface](CONNECTIVITY_PROVIDER_CAPABILITY, [
52
+ {
53
+ method: CONNECTIVITY_ESTABLISH_METHOD,
54
+ handler: async (context, request) => await handlers.establish(context, parseEstablishRequest(request)),
55
+ },
56
+ {
57
+ method: CONNECTIVITY_STATUS_METHOD,
58
+ handler: async (context, request) => await handlers.status(context, parseStatusRequest(request)),
59
+ },
60
+ {
61
+ method: CONNECTIVITY_TEARDOWN_METHOD,
62
+ handler: async (context, request) => await handlers.teardown(context, parseTeardownRequest(request)),
63
+ },
64
+ ]);
65
+ }
66
+ //# sourceMappingURL=connectivity-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectivity-provider.js","sourceRoot":"","sources":["../../src/connectivity-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ export class RPCError extends Error {
2
+ code;
3
+ data;
4
+ constructor(code, message, data) {
5
+ super(message);
6
+ this.name = new.target.name;
7
+ this.code = code;
8
+ this.data = data;
9
+ }
10
+ toJSONRPC() {
11
+ const base = {
12
+ code: this.code,
13
+ message: this.message,
14
+ };
15
+ if (this.data === undefined) {
16
+ return base;
17
+ }
18
+ return {
19
+ ...base,
20
+ data: this.data,
21
+ };
22
+ }
23
+ }
24
+ export class ParseError extends RPCError {
25
+ constructor(error) {
26
+ super(-32700, "Parse error", { error });
27
+ }
28
+ }
29
+ export class InvalidRequestError extends RPCError {
30
+ constructor(reason) {
31
+ super(-32600, "Invalid request", { reason });
32
+ }
33
+ }
34
+ export class MethodNotFoundError extends RPCError {
35
+ constructor(method) {
36
+ super(-32601, "Method not found", { method });
37
+ }
38
+ }
39
+ export class InvalidParamsError extends RPCError {
40
+ constructor(error, data) {
41
+ super(-32602, "Invalid params", { error, ...data });
42
+ }
43
+ }
44
+ export class InternalError extends RPCError {
45
+ constructor(error) {
46
+ super(-32603, "Internal error", { error });
47
+ }
48
+ }
49
+ export class CapabilityDeniedError extends RPCError {
50
+ constructor(data) {
51
+ super(-32001, "Capability denied", data);
52
+ }
53
+ }
54
+ export class RateLimitedError extends RPCError {
55
+ constructor(data) {
56
+ super(-32002, "Rate limited", data);
57
+ }
58
+ }
59
+ export class NotInitializedError extends RPCError {
60
+ constructor(data = { allowed_methods: ["initialize"] }) {
61
+ super(-32003, "Not initialized", data);
62
+ }
63
+ }
64
+ export class ShutdownInProgressError extends RPCError {
65
+ constructor(data = {}) {
66
+ super(-32004, "Shutdown in progress", data);
67
+ }
68
+ }
69
+ export class ToolExecutionError extends RPCError {
70
+ constructor(data = {}) {
71
+ super(-32010, "Tool execution failed", data);
72
+ }
73
+ }
74
+ export function isRPCError(error) {
75
+ return error instanceof RPCError;
76
+ }
77
+ export function errorFromObject(error) {
78
+ switch (error.code) {
79
+ case -32601:
80
+ return new MethodNotFoundError(String(error.data?.method ?? ""));
81
+ case -32602:
82
+ return new InvalidParamsError(String(error.data?.error ?? error.message), error.data ?? {});
83
+ case -32001:
84
+ return new CapabilityDeniedError(error.data ?? {});
85
+ case -32002:
86
+ return new RateLimitedError(error.data ?? {});
87
+ case -32003:
88
+ return new NotInitializedError(error.data ?? {});
89
+ case -32004:
90
+ return new ShutdownInProgressError(error.data ?? {});
91
+ case -32010:
92
+ return new ToolExecutionError(error.data ?? {});
93
+ default:
94
+ return new RPCError(error.code, error.message, error.data);
95
+ }
96
+ }
97
+ export function ensureRPCError(error) {
98
+ if (error instanceof RPCError) {
99
+ return error;
100
+ }
101
+ if (error instanceof Error) {
102
+ return new InternalError(error.message);
103
+ }
104
+ return new InternalError(String(error));
105
+ }
106
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAgCA,MAAM,OAAO,QAAyB,SAAQ,KAAK;IACxC,IAAI,CAAS;IACb,IAAI,CAAmB;IAEhC,YAAmB,IAAY,EAAE,OAAe,EAAE,IAAW;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEM,SAAS;QACd,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;QACF,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,GAAG,IAAI;YACP,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,QAAmC;IACjE,YAAmB,KAAa;QAC9B,KAAK,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,QAAmC;IAC1E,YAAmB,MAAc;QAC/B,KAAK,CAAC,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,QAAgC;IACvE,YAAmB,MAAc;QAC/B,KAAK,CAAC,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,QAAmC;IACzE,YAAmB,KAAa,EAAE,IAAgC;QAChE,KAAK,CAAC,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,QAAmC;IACpE,YAAmB,KAAa;QAC9B,KAAK,CAAC,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,QAA8B;IACvE,YAAmB,IAA0B;QAC3C,KAAK,CAAC,CAAC,KAAK,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,QAAyB;IAC7D,YAAmB,IAAqB;QACtC,KAAK,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,QAA4B;IACnE,YAAmB,IAAI,GAAuB,EAAE,eAAe,EAAE,CAAC,YAAY,CAAC,EAAE;QAC/E,KAAK,CAAC,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,QAA8B;IACzE,YAAmB,IAAI,GAAyB,EAAE;QAChD,KAAK,CAAC,CAAC,KAAK,EAAE,sBAAsB,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,QAA2B;IACjE,YAAmB,IAAI,GAAsB,EAAE;QAC7C,KAAK,CAAC,CAAC,KAAK,EAAE,uBAAuB,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;CACF;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,KAAK,YAAY,QAAQ,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAyB;IACvD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,CAAC,KAAK;YACT,OAAO,IAAI,mBAAmB,CAC5B,MAAM,CAAE,KAAK,CAAC,IAAyC,EAAE,MAAM,IAAI,EAAE,CAAC,CACvE,CAAC;QACJ,KAAK,CAAC,KAAK;YACT,OAAO,IAAI,kBAAkB,CAC3B,MAAM,CAAE,KAAK,CAAC,IAAwC,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,EAC9E,KAAK,CAAC,IAA8C,IAAI,EAAE,CAC5D,CAAC;QACJ,KAAK,CAAC,KAAK;YACT,OAAO,IAAI,qBAAqB,CAAE,KAAK,CAAC,IAAyC,IAAI,EAAE,CAAC,CAAC;QAC3F,KAAK,CAAC,KAAK;YACT,OAAO,IAAI,gBAAgB,CAAE,KAAK,CAAC,IAAoC,IAAI,EAAE,CAAC,CAAC;QACjF,KAAK,CAAC,KAAK;YACT,OAAO,IAAI,mBAAmB,CAAE,KAAK,CAAC,IAAuC,IAAI,EAAE,CAAC,CAAC;QACvF,KAAK,CAAC,KAAK;YACT,OAAO,IAAI,uBAAuB,CAAE,KAAK,CAAC,IAAyC,IAAI,EAAE,CAAC,CAAC;QAC7F,KAAK,CAAC,KAAK;YACT,OAAO,IAAI,kBAAkB,CAAE,KAAK,CAAC,IAAsC,IAAI,EAAE,CAAC,CAAC;QACrF;YACE,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { format } from "node:util";
2
+ import { InternalError } from "./errors.js";
3
+ export function makeExtensionContext(request, host, session, stderr) {
4
+ if (!session) {
5
+ throw new InternalError("session is not initialized");
6
+ }
7
+ if (request.id === undefined) {
8
+ throw new InternalError("request id is required");
9
+ }
10
+ return {
11
+ request,
12
+ requestId: request.id,
13
+ host,
14
+ session,
15
+ log: (...values) => {
16
+ stderr.write(`${format(...values)}\n`);
17
+ },
18
+ };
19
+ }
20
+ export function writeExtensionError(stderr, message, error) {
21
+ const detail = error instanceof Error ? (error.stack ?? error.message) : String(error);
22
+ stderr.write(`${message}: ${detail}\n`);
23
+ }
24
+ //# sourceMappingURL=extension-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-context.js","sourceRoot":"","sources":["../../src/extension-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAK5C,MAAM,UAAU,oBAAoB,CAClC,OAA+B,EAC/B,IAAa,EACb,OAAqC,EACrC,MAA6B;IAE7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,aAAa,CAAC,4BAA4B,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,aAAa,CAAC,wBAAwB,CAAC,CAAC;IACpD,CAAC;IACD,OAAO;QACL,OAAO;QACP,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,IAAI;QACJ,OAAO;QACP,GAAG,EAAE,CAAC,GAAG,MAAiB,EAAE,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAA6B,EAC7B,OAAe,EACf,KAAc;IAEd,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvF,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { HostAPI } from "./host-api.js";
2
+ export const SDK_NAME = "@compozy/extension-sdk";
3
+ export const SDK_VERSION = "0.1.0";
4
+ export const SDK_MIN_COMPOZY_VERSION = "0.3.0-beta.1";
5
+ export const SUPPORTED_PROTOCOL_VERSIONS = ["1"];
6
+ //# sourceMappingURL=extension-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-contract.js","sourceRoot":"","sources":["../../src/extension-contract.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,CAAC,MAAM,QAAQ,GAAG,wBAAwB,CAAC;AAEjD,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC,MAAM,CAAC,MAAM,uBAAuB,GAAG,cAAc,CAAC;AAEtD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,GAAG,CAAC,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { SDK_MIN_COMPOZY_VERSION, SDK_NAME, } from "./extension-contract.js";
2
+ import { normalizeHostMethodList, normalizeStringList } from "./extension-runtime.js";
3
+ export function defaultExtensionDescribeProcess() {
4
+ return {
5
+ argv: process.argv,
6
+ stdout: process.stdout,
7
+ setExitCode: code => {
8
+ process.exitCode = code;
9
+ },
10
+ };
11
+ }
12
+ export function runExtensionDescribeMode(describeProcess, describe) {
13
+ if (describeProcess.argv.at(-1)?.trim() !== "__describe") {
14
+ return false;
15
+ }
16
+ describeProcess.stdout.write(`${JSON.stringify(describe())}\n`);
17
+ describeProcess.setExitCode(0);
18
+ return true;
19
+ }
20
+ export function cloneExtensionToolDescriptors(tools) {
21
+ return [...tools].map(tool => ({
22
+ ...tool.descriptor,
23
+ ...(tool.descriptor.input_schema === undefined
24
+ ? {}
25
+ : { input_schema: structuredClone(tool.descriptor.input_schema) }),
26
+ ...(tool.descriptor.output_schema === undefined
27
+ ? {}
28
+ : { output_schema: structuredClone(tool.descriptor.output_schema) }),
29
+ capabilities: [...(tool.descriptor.capabilities ?? [])],
30
+ ...(tool.descriptor.command === undefined
31
+ ? {}
32
+ : { command: structuredClone(tool.descriptor.command) }),
33
+ }));
34
+ }
35
+ export function buildExtensionDescribePayload(input) {
36
+ const command = input.definition.subprocess?.command.trim() ?? "";
37
+ if (!command) {
38
+ throw new Error("subprocess command is required");
39
+ }
40
+ return {
41
+ name: input.definition.name.trim(),
42
+ version: input.definition.version.trim(),
43
+ ...(input.definition.description?.trim()
44
+ ? { description: input.definition.description.trim() }
45
+ : {}),
46
+ provides: normalizeStringList(input.definition.capabilities?.provides),
47
+ permissions: normalizeHostMethodList(input.definition.permissions?.requires),
48
+ requires_env: normalizeStringList(input.definition.requires_env),
49
+ resources: {
50
+ skills: normalizeStringList(input.definition.resources?.skills),
51
+ loops: normalizeStringList(input.definition.resources?.loops),
52
+ agents: normalizeStringList(input.definition.resources?.agents),
53
+ automation: normalizeStringList(input.definition.resources?.automation),
54
+ layouts: normalizeStringList(input.definition.resources?.layouts),
55
+ },
56
+ subprocess: {
57
+ command,
58
+ args: [...(input.definition.subprocess?.args ?? [])],
59
+ env: { ...input.definition.subprocess?.env },
60
+ },
61
+ ...(input.definition.network_participation === undefined
62
+ ? {}
63
+ : {
64
+ network_participation: {
65
+ required: input.definition.network_participation.required,
66
+ mode: input.definition.network_participation.mode.trim().toLowerCase(),
67
+ channel_scopes: normalizeStringList(input.definition.network_participation.channel_scopes),
68
+ },
69
+ }),
70
+ tools: [...input.tools].sort((left, right) => left.handler.localeCompare(right.handler)),
71
+ command_groups: input.commandGroups.map(group => ({ ...group })),
72
+ hook_events: normalizeStringList(input.definition.supported_hook_events),
73
+ watch_source_kinds: input.watchSourceKinds,
74
+ sdk: {
75
+ name: SDK_NAME,
76
+ version: input.sdkVersion,
77
+ protocol_version: "1",
78
+ min_compozy_version: SDK_MIN_COMPOZY_VERSION,
79
+ },
80
+ };
81
+ }
82
+ //# sourceMappingURL=extension-describe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-describe.js","sourceRoot":"","sources":["../../src/extension-describe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { InvalidParamsError } from "./errors.js";
2
+ import { SUPPORTED_PROTOCOL_VERSIONS } from "./extension-contract.js";
3
+ export function parseInitializeRequest(params) {
4
+ if (typeof params !== "object" || params === null) {
5
+ throw new InvalidParamsError("initialize params must be an object");
6
+ }
7
+ const request = params;
8
+ if (!request.protocol_version) {
9
+ throw new InvalidParamsError("protocol_version is required");
10
+ }
11
+ if (typeof request.session_nonce !== "string" || request.session_nonce.trim() === "") {
12
+ throw new InvalidParamsError("session_nonce is required");
13
+ }
14
+ if (!Array.isArray(request.supported_protocol_versions) ||
15
+ request.supported_protocol_versions.length === 0) {
16
+ throw new InvalidParamsError("supported_protocol_versions is required");
17
+ }
18
+ if (!request.extension?.name || !request.extension?.version) {
19
+ throw new InvalidParamsError("extension identity is required");
20
+ }
21
+ if (!request.capabilities || typeof request.capabilities !== "object") {
22
+ throw new InvalidParamsError("capabilities are required");
23
+ }
24
+ if (!Array.isArray(request.capabilities.provides)) {
25
+ throw new InvalidParamsError("capabilities.provides must be an array");
26
+ }
27
+ if (!Array.isArray(request.capabilities.granted_permissions)) {
28
+ throw new InvalidParamsError("capabilities.granted_permissions must be an array");
29
+ }
30
+ if (!Array.isArray(request.capabilities.granted_resource_kinds)) {
31
+ throw new InvalidParamsError("capabilities.granted_resource_kinds must be an array");
32
+ }
33
+ if (!Array.isArray(request.capabilities.granted_resource_scopes)) {
34
+ throw new InvalidParamsError("capabilities.granted_resource_scopes must be an array");
35
+ }
36
+ if (!request.runtime) {
37
+ throw new InvalidParamsError("runtime is required");
38
+ }
39
+ for (const field of [
40
+ "health_check_interval_ms",
41
+ "health_check_timeout_ms",
42
+ "shutdown_timeout_ms",
43
+ "default_hook_timeout_ms",
44
+ ]) {
45
+ if (!Number.isFinite(request.runtime[field]) || request.runtime[field] <= 0) {
46
+ throw new InvalidParamsError(`${field} must be greater than zero`);
47
+ }
48
+ }
49
+ return request;
50
+ }
51
+ export function validateProtocolVersion(request) {
52
+ if (!SUPPORTED_PROTOCOL_VERSIONS.includes(request.protocol_version)) {
53
+ throw new InvalidParamsError("unsupported protocol version", {
54
+ reason: "unsupported_protocol_version",
55
+ protocol_version: request.protocol_version,
56
+ supported_protocol_versions: SUPPORTED_PROTOCOL_VERSIONS,
57
+ });
58
+ }
59
+ if (!request.supported_protocol_versions.includes("1")) {
60
+ throw new InvalidParamsError("supported protocol versions must include 1");
61
+ }
62
+ }
63
+ //# sourceMappingURL=extension-initialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-initialize.js","sourceRoot":"","sources":["../../src/extension-initialize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { normalizeStringList } from "./extension-runtime.js";
2
+ export const registerProvideSurface = Symbol("registerProvideSurface");
3
+ export class ExtensionProvideSurfaces {
4
+ options;
5
+ owners = new Map();
6
+ constructor(options) {
7
+ this.options = options;
8
+ }
9
+ owner(method) {
10
+ return this.owners.get(method);
11
+ }
12
+ register(definition, capability, registrations) {
13
+ const cleanCapability = capability.trim();
14
+ if (!cleanCapability) {
15
+ throw new Error("provide capability is required");
16
+ }
17
+ if (registrations.length === 0) {
18
+ throw new Error(`${cleanCapability} requires at least one service method`);
19
+ }
20
+ const prepared = registrations.map(registration => ({
21
+ method: registration.method.trim(),
22
+ handler: registration.handler,
23
+ }));
24
+ this.validateRegistrations(cleanCapability, prepared);
25
+ const previousCapabilities = definition.capabilities;
26
+ definition.capabilities = {
27
+ ...previousCapabilities,
28
+ provides: normalizeStringList([...(previousCapabilities?.provides ?? []), cleanCapability]),
29
+ };
30
+ for (const registration of prepared) {
31
+ this.options.handlers.set(registration.method, registration.handler);
32
+ this.owners.set(registration.method, cleanCapability);
33
+ }
34
+ try {
35
+ for (const registration of prepared) {
36
+ this.options.bindMethod(registration.method);
37
+ }
38
+ }
39
+ catch (error) {
40
+ for (const registration of prepared) {
41
+ this.options.handlers.delete(registration.method);
42
+ this.owners.delete(registration.method);
43
+ this.options.unbindMethod(registration.method);
44
+ }
45
+ if (previousCapabilities === undefined) {
46
+ delete definition.capabilities;
47
+ }
48
+ else {
49
+ definition.capabilities = previousCapabilities;
50
+ }
51
+ throw error;
52
+ }
53
+ }
54
+ validateRegistrations(capability, registrations) {
55
+ const seen = new Set();
56
+ for (const registration of registrations) {
57
+ if (!registration.method) {
58
+ throw new Error(`${capability} service method is required`);
59
+ }
60
+ if (registration.method === "initialize") {
61
+ throw new Error("initialize is reserved by the SDK");
62
+ }
63
+ if (typeof registration.handler !== "function") {
64
+ throw new Error(`${registration.method} handler is required`);
65
+ }
66
+ if (seen.has(registration.method)) {
67
+ throw new Error(`${registration.method} is declared more than once`);
68
+ }
69
+ seen.add(registration.method);
70
+ if (this.options.handlers.has(registration.method) || this.owners.has(registration.method)) {
71
+ throw new Error(`${registration.method} is already registered`);
72
+ }
73
+ this.options.validateMethod(registration.method);
74
+ }
75
+ }
76
+ }
77
+ //# sourceMappingURL=extension-provide-surface.js.map