@compozy/extension-sdk 0.3.0-beta.3

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 (142) 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/errors.js +123 -0
  7. package/dist/cjs/errors.js.map +1 -0
  8. package/dist/cjs/extension-context.js +28 -0
  9. package/dist/cjs/extension-context.js.map +1 -0
  10. package/dist/cjs/extension-contract.js +8 -0
  11. package/dist/cjs/extension-contract.js.map +1 -0
  12. package/dist/cjs/extension-describe.js +72 -0
  13. package/dist/cjs/extension-describe.js.map +1 -0
  14. package/dist/cjs/extension-initialize.js +67 -0
  15. package/dist/cjs/extension-initialize.js.map +1 -0
  16. package/dist/cjs/extension-runtime.js +227 -0
  17. package/dist/cjs/extension-runtime.js.map +1 -0
  18. package/dist/cjs/extension-tool-context.js +29 -0
  19. package/dist/cjs/extension-tool-context.js.map +1 -0
  20. package/dist/cjs/extension-tool-registration.js +42 -0
  21. package/dist/cjs/extension-tool-registration.js.map +1 -0
  22. package/dist/cjs/extension.js +329 -0
  23. package/dist/cjs/extension.js.map +1 -0
  24. package/dist/cjs/generated/contracts.js +20 -0
  25. package/dist/cjs/generated/contracts.js.map +1 -0
  26. package/dist/cjs/host-api.js +187 -0
  27. package/dist/cjs/host-api.js.map +1 -0
  28. package/dist/cjs/index.js +31 -0
  29. package/dist/cjs/index.js.map +1 -0
  30. package/dist/cjs/json.js +13 -0
  31. package/dist/cjs/json.js.map +1 -0
  32. package/dist/cjs/package.json +3 -0
  33. package/dist/cjs/schema-digest.js +45 -0
  34. package/dist/cjs/schema-digest.js.map +1 -0
  35. package/dist/cjs/testing/conformance.js +23 -0
  36. package/dist/cjs/testing/conformance.js.map +1 -0
  37. package/dist/cjs/testing/harness.js +158 -0
  38. package/dist/cjs/testing/harness.js.map +1 -0
  39. package/dist/cjs/testing/index.js +12 -0
  40. package/dist/cjs/testing/index.js.map +1 -0
  41. package/dist/cjs/testing/mock-transport.js +74 -0
  42. package/dist/cjs/testing/mock-transport.js.map +1 -0
  43. package/dist/cjs/transport.js +240 -0
  44. package/dist/cjs/transport.js.map +1 -0
  45. package/dist/cjs/types.js +19 -0
  46. package/dist/cjs/types.js.map +1 -0
  47. package/dist/cjs/watch-source.js +129 -0
  48. package/dist/cjs/watch-source.js.map +1 -0
  49. package/dist/esm/base-types.js +2 -0
  50. package/dist/esm/base-types.js.map +1 -0
  51. package/dist/esm/capabilities.js +22 -0
  52. package/dist/esm/capabilities.js.map +1 -0
  53. package/dist/esm/errors.js +106 -0
  54. package/dist/esm/errors.js.map +1 -0
  55. package/dist/esm/extension-context.js +24 -0
  56. package/dist/esm/extension-context.js.map +1 -0
  57. package/dist/esm/extension-contract.js +6 -0
  58. package/dist/esm/extension-contract.js.map +1 -0
  59. package/dist/esm/extension-describe.js +66 -0
  60. package/dist/esm/extension-describe.js.map +1 -0
  61. package/dist/esm/extension-initialize.js +63 -0
  62. package/dist/esm/extension-initialize.js.map +1 -0
  63. package/dist/esm/extension-runtime.js +214 -0
  64. package/dist/esm/extension-runtime.js.map +1 -0
  65. package/dist/esm/extension-tool-context.js +26 -0
  66. package/dist/esm/extension-tool-context.js.map +1 -0
  67. package/dist/esm/extension-tool-registration.js +39 -0
  68. package/dist/esm/extension-tool-registration.js.map +1 -0
  69. package/dist/esm/extension.js +325 -0
  70. package/dist/esm/extension.js.map +1 -0
  71. package/dist/esm/generated/contracts.js +17 -0
  72. package/dist/esm/generated/contracts.js.map +1 -0
  73. package/dist/esm/host-api.js +183 -0
  74. package/dist/esm/host-api.js.map +1 -0
  75. package/dist/esm/index.js +6 -0
  76. package/dist/esm/index.js.map +1 -0
  77. package/dist/esm/json.js +10 -0
  78. package/dist/esm/json.js.map +1 -0
  79. package/dist/esm/package.json +3 -0
  80. package/dist/esm/schema-digest.js +41 -0
  81. package/dist/esm/schema-digest.js.map +1 -0
  82. package/dist/esm/testing/conformance.js +19 -0
  83. package/dist/esm/testing/conformance.js.map +1 -0
  84. package/dist/esm/testing/harness.js +151 -0
  85. package/dist/esm/testing/harness.js.map +1 -0
  86. package/dist/esm/testing/index.js +4 -0
  87. package/dist/esm/testing/index.js.map +1 -0
  88. package/dist/esm/testing/mock-transport.js +69 -0
  89. package/dist/esm/testing/mock-transport.js.map +1 -0
  90. package/dist/esm/transport.js +235 -0
  91. package/dist/esm/transport.js.map +1 -0
  92. package/dist/esm/types.js +3 -0
  93. package/dist/esm/types.js.map +1 -0
  94. package/dist/esm/watch-source.js +122 -0
  95. package/dist/esm/watch-source.js.map +1 -0
  96. package/dist/types/base-types.d.ts +25 -0
  97. package/dist/types/base-types.d.ts.map +1 -0
  98. package/dist/types/capabilities.d.ts +6 -0
  99. package/dist/types/capabilities.d.ts.map +1 -0
  100. package/dist/types/errors.d.ts +66 -0
  101. package/dist/types/errors.d.ts.map +1 -0
  102. package/dist/types/extension-context.d.ts +6 -0
  103. package/dist/types/extension-context.d.ts.map +1 -0
  104. package/dist/types/extension-contract.d.ts +65 -0
  105. package/dist/types/extension-contract.d.ts.map +1 -0
  106. package/dist/types/extension-describe.d.ts +16 -0
  107. package/dist/types/extension-describe.d.ts.map +1 -0
  108. package/dist/types/extension-initialize.d.ts +4 -0
  109. package/dist/types/extension-initialize.d.ts.map +1 -0
  110. package/dist/types/extension-runtime.d.ts +14 -0
  111. package/dist/types/extension-runtime.d.ts.map +1 -0
  112. package/dist/types/extension-tool-context.d.ts +4 -0
  113. package/dist/types/extension-tool-context.d.ts.map +1 -0
  114. package/dist/types/extension-tool-registration.d.ts +3 -0
  115. package/dist/types/extension-tool-registration.d.ts.map +1 -0
  116. package/dist/types/extension.d.ts +55 -0
  117. package/dist/types/extension.d.ts.map +1 -0
  118. package/dist/types/generated/contracts.d.ts +6173 -0
  119. package/dist/types/generated/contracts.d.ts.map +1 -0
  120. package/dist/types/host-api.d.ts +90 -0
  121. package/dist/types/host-api.d.ts.map +1 -0
  122. package/dist/types/index.d.ts +12 -0
  123. package/dist/types/index.d.ts.map +1 -0
  124. package/dist/types/json.d.ts +3 -0
  125. package/dist/types/json.d.ts.map +1 -0
  126. package/dist/types/schema-digest.d.ts +4 -0
  127. package/dist/types/schema-digest.d.ts.map +1 -0
  128. package/dist/types/testing/conformance.d.ts +7 -0
  129. package/dist/types/testing/conformance.d.ts.map +1 -0
  130. package/dist/types/testing/harness.d.ts +51 -0
  131. package/dist/types/testing/harness.d.ts.map +1 -0
  132. package/dist/types/testing/index.d.ts +4 -0
  133. package/dist/types/testing/index.d.ts.map +1 -0
  134. package/dist/types/testing/mock-transport.d.ts +28 -0
  135. package/dist/types/testing/mock-transport.d.ts.map +1 -0
  136. package/dist/types/transport.d.ts +55 -0
  137. package/dist/types/transport.d.ts.map +1 -0
  138. package/dist/types/types.d.ts +114 -0
  139. package/dist/types/types.d.ts.map +1 -0
  140. package/dist/types/watch-source.d.ts +57 -0
  141. package/dist/types/watch-source.d.ts.map +1 -0
  142. package/package.json +49 -0
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotReadyTransport = exports.StdioTransport = exports.JSON_RPC_VERSION = exports.DEFAULT_MAX_MESSAGE_BYTES = void 0;
4
+ const node_buffer_1 = require("node:buffer");
5
+ const errors_js_1 = require("./errors.js");
6
+ exports.DEFAULT_MAX_MESSAGE_BYTES = 10 * 1024 * 1024;
7
+ exports.JSON_RPC_VERSION = "2.0";
8
+ function keyOfID(id) {
9
+ return `${typeof id}:${String(id)}`;
10
+ }
11
+ function isRecord(value) {
12
+ return typeof value === "object" && value !== null && !Array.isArray(value);
13
+ }
14
+ function isRequestFrame(value) {
15
+ if (!isRecord(value)) {
16
+ return false;
17
+ }
18
+ return value.jsonrpc === exports.JSON_RPC_VERSION && typeof value.method === "string";
19
+ }
20
+ function isResponseFrame(value) {
21
+ if (!isRecord(value)) {
22
+ return false;
23
+ }
24
+ return value.jsonrpc === exports.JSON_RPC_VERSION && "id" in value && !("method" in value);
25
+ }
26
+ class StdioTransport {
27
+ input;
28
+ output;
29
+ maxMessageBytes;
30
+ handlers = new Map();
31
+ pending = new Map();
32
+ errorListeners = new Set();
33
+ readBuffer = node_buffer_1.Buffer.alloc(0);
34
+ nextID = 0;
35
+ started = false;
36
+ closed = false;
37
+ onDataBound;
38
+ onErrorBound;
39
+ onEndBound;
40
+ constructor(options = {}) {
41
+ this.input = options.input ?? process.stdin;
42
+ this.output = options.output ?? process.stdout;
43
+ this.maxMessageBytes = options.maxMessageBytes ?? exports.DEFAULT_MAX_MESSAGE_BYTES;
44
+ this.onDataBound = chunk => {
45
+ this.handleChunk(typeof chunk === "string" ? node_buffer_1.Buffer.from(chunk) : chunk);
46
+ };
47
+ this.onErrorBound = error => {
48
+ this.fail(error);
49
+ };
50
+ this.onEndBound = () => {
51
+ this.fail(new Error("transport closed"));
52
+ };
53
+ }
54
+ start() {
55
+ if (this.started) {
56
+ return;
57
+ }
58
+ this.started = true;
59
+ this.input.on("data", this.onDataBound);
60
+ this.input.on("error", this.onErrorBound);
61
+ this.input.on("end", this.onEndBound);
62
+ this.input.on("close", this.onEndBound);
63
+ }
64
+ handle(method, handler) {
65
+ this.handlers.set(method.trim(), handler);
66
+ }
67
+ onTransportError(listener) {
68
+ this.errorListeners.add(listener);
69
+ return () => {
70
+ this.errorListeners.delete(listener);
71
+ };
72
+ }
73
+ async close() {
74
+ if (this.closed) {
75
+ return;
76
+ }
77
+ this.fail(new Error("transport closed"));
78
+ }
79
+ async call(method, params) {
80
+ if (this.closed) {
81
+ throw new Error("transport closed");
82
+ }
83
+ this.start();
84
+ const id = ++this.nextID;
85
+ const frame = {
86
+ jsonrpc: exports.JSON_RPC_VERSION,
87
+ id,
88
+ method,
89
+ params,
90
+ };
91
+ return await new Promise((resolve, reject) => {
92
+ this.pending.set(keyOfID(id), { resolve, reject });
93
+ try {
94
+ this.writeFrame(frame);
95
+ }
96
+ catch (error) {
97
+ this.pending.delete(keyOfID(id));
98
+ reject(error);
99
+ }
100
+ });
101
+ }
102
+ handleChunk(chunk) {
103
+ if (this.closed) {
104
+ return;
105
+ }
106
+ this.readBuffer = node_buffer_1.Buffer.concat([this.readBuffer, chunk]);
107
+ if (this.readBuffer.length > this.maxMessageBytes + 1) {
108
+ this.fail(new Error(`message exceeds ${this.maxMessageBytes} bytes`));
109
+ return;
110
+ }
111
+ while (true) {
112
+ const newlineIndex = this.readBuffer.indexOf(0x0a);
113
+ if (newlineIndex === -1) {
114
+ if (this.readBuffer.length > this.maxMessageBytes) {
115
+ this.fail(new Error(`message exceeds ${this.maxMessageBytes} bytes`));
116
+ }
117
+ return;
118
+ }
119
+ const line = this.readBuffer.subarray(0, newlineIndex);
120
+ this.readBuffer = this.readBuffer.subarray(newlineIndex + 1);
121
+ const trimmed = line.toString("utf8").trim();
122
+ if (trimmed.length === 0) {
123
+ continue;
124
+ }
125
+ if (node_buffer_1.Buffer.byteLength(trimmed) > this.maxMessageBytes) {
126
+ this.fail(new Error(`message exceeds ${this.maxMessageBytes} bytes`));
127
+ return;
128
+ }
129
+ this.processLine(trimmed);
130
+ if (this.closed) {
131
+ return;
132
+ }
133
+ }
134
+ }
135
+ processLine(line) {
136
+ let parsed;
137
+ try {
138
+ parsed = JSON.parse(line);
139
+ }
140
+ catch (error) {
141
+ this.fail(error instanceof Error ? new errors_js_1.ParseError(error.message) : new errors_js_1.ParseError(String(error)));
142
+ return;
143
+ }
144
+ if (Array.isArray(parsed)) {
145
+ this.fail(new errors_js_1.InvalidRequestError("batch requests are not supported"));
146
+ return;
147
+ }
148
+ if (isRequestFrame(parsed)) {
149
+ if (!("id" in parsed) || parsed.id === undefined || parsed.id === null) {
150
+ return;
151
+ }
152
+ void this.dispatchRequest(parsed);
153
+ return;
154
+ }
155
+ if (isResponseFrame(parsed)) {
156
+ this.dispatchResponse(parsed);
157
+ return;
158
+ }
159
+ this.fail(new errors_js_1.InvalidRequestError("invalid json-rpc envelope"));
160
+ }
161
+ async dispatchRequest(request) {
162
+ const handler = this.handlers.get(request.method.trim());
163
+ if (!handler) {
164
+ await this.sendError(request.id, new errors_js_1.MethodNotFoundError(request.method));
165
+ return;
166
+ }
167
+ try {
168
+ const result = await handler(request.params, request);
169
+ await this.sendResult(request.id, result ?? null);
170
+ }
171
+ catch (error) {
172
+ await this.sendError(request.id, (0, errors_js_1.ensureRPCError)(error));
173
+ }
174
+ }
175
+ dispatchResponse(response) {
176
+ const pending = this.pending.get(keyOfID(response.id));
177
+ if (!pending) {
178
+ return;
179
+ }
180
+ this.pending.delete(keyOfID(response.id));
181
+ if (response.error) {
182
+ pending.reject((0, errors_js_1.errorFromObject)(response.error));
183
+ return;
184
+ }
185
+ pending.resolve(response.result);
186
+ }
187
+ async sendResult(id, result) {
188
+ this.writeFrame({
189
+ jsonrpc: exports.JSON_RPC_VERSION,
190
+ id,
191
+ result,
192
+ });
193
+ }
194
+ async sendError(id, error) {
195
+ const rpcError = (0, errors_js_1.ensureRPCError)(error);
196
+ this.writeFrame({
197
+ jsonrpc: exports.JSON_RPC_VERSION,
198
+ id,
199
+ error: rpcError.toJSONRPC(),
200
+ });
201
+ }
202
+ writeFrame(frame) {
203
+ const encoded = JSON.stringify(frame);
204
+ if (node_buffer_1.Buffer.byteLength(encoded) > this.maxMessageBytes) {
205
+ throw new Error(`message exceeds ${this.maxMessageBytes} bytes`);
206
+ }
207
+ this.output.write(`${encoded}\n`);
208
+ }
209
+ fail(error) {
210
+ if (this.closed) {
211
+ return;
212
+ }
213
+ this.closed = true;
214
+ this.input.off("data", this.onDataBound);
215
+ this.input.off("error", this.onErrorBound);
216
+ this.input.off("end", this.onEndBound);
217
+ this.input.off("close", this.onEndBound);
218
+ for (const pending of this.pending.values()) {
219
+ pending.reject(error);
220
+ }
221
+ this.pending.clear();
222
+ for (const listener of this.errorListeners) {
223
+ listener(error);
224
+ }
225
+ }
226
+ }
227
+ exports.StdioTransport = StdioTransport;
228
+ class NotReadyTransport {
229
+ handle() { }
230
+ onTransportError() {
231
+ return () => { };
232
+ }
233
+ start() { }
234
+ async close() { }
235
+ async call(_method, _params) {
236
+ throw new errors_js_1.NotInitializedError();
237
+ }
238
+ }
239
+ exports.NotReadyTransport = NotReadyTransport;
240
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./base-types.js"), exports);
18
+ __exportStar(require("./generated/contracts.js"), exports);
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAmBA,kDAAgC;AAChC,2DAAyC"}
@@ -0,0 +1,129 @@
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 (response.state_digest !== undefined && typeof response.state_digest !== "string") {
114
+ throw new errors_js_1.InvalidParamsError("watch source response.state_digest must be a string");
115
+ }
116
+ if (response.settled_at !== undefined && typeof response.settled_at !== "string") {
117
+ throw new errors_js_1.InvalidParamsError("watch source response.settled_at must be a string");
118
+ }
119
+ return {
120
+ ready: response.ready,
121
+ ...(response.state_digest ? { state_digest: response.state_digest } : {}),
122
+ ...(response.payload !== undefined ? { payload: (0, json_js_1.cloneJSON)(response.payload) } : {}),
123
+ ...(response.settled_at ? { settled_at: response.settled_at } : {}),
124
+ };
125
+ }
126
+ function normalizeStringList(values) {
127
+ return Array.from(new Set((values ?? []).map(value => value.trim()).filter(Boolean))).sort();
128
+ }
129
+ //# 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,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":"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"}
@@ -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"}