@nextclaw/extension-sdk 0.1.6 → 0.1.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.
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  import { ChannelConfigGetRequest, ChannelConfigGetResponse, ChannelFileContent, ChannelImageContent, ChannelMessageContent, ChannelSubmittedAttachment, ChannelSubmittedMessage, ChannelTextContent, ExtensionCapabilities, ExtensionCapabilityHandler, ExtensionCapabilityPayload, ExtensionChannel, ExtensionChannelConfig, ExtensionChannels, ExtensionRequest, ExtensionRequestHandler, ExtensionRequestResponse, ExtensionTransportEnvelope, NextClawExtensionOptions, NextClawExtensionWebSocketLike } from "./types/extension-sdk.types.js";
2
2
  import { NextClawExtension } from "./services/extension-client.service.js";
3
- export { type ChannelConfigGetRequest, type ChannelConfigGetResponse, type ChannelFileContent, type ChannelImageContent, type ChannelMessageContent, type ChannelSubmittedAttachment, type ChannelSubmittedMessage, type ChannelTextContent, type ExtensionCapabilities, type ExtensionCapabilityHandler, type ExtensionCapabilityPayload, type ExtensionChannel, type ExtensionChannelConfig, type ExtensionChannels, type ExtensionRequest, type ExtensionRequestHandler, type ExtensionRequestResponse, type ExtensionTransportEnvelope, NextClawExtension, type NextClawExtensionOptions, type NextClawExtensionWebSocketLike };
3
+ import { BusChannelCreateContext, BusChannelExtensionDefinition, BusChannelInboundMessage, BusChannelMessageBus, BusChannelRuntime, ChannelExtensionContext, ChannelExtensionDefinition, ChannelSubmittedMessageInput, ExtensionChannelAdapter, ExtensionChannelController, startBusChannelExtension, startChannelExtension, warnNcpEventError } from "./services/extension-channel-controller.service.js";
4
+ export { type BusChannelCreateContext, type BusChannelExtensionDefinition, type BusChannelInboundMessage, type BusChannelMessageBus, type BusChannelRuntime, type ChannelConfigGetRequest, type ChannelConfigGetResponse, type ChannelExtensionContext, type ChannelExtensionDefinition, type ChannelFileContent, type ChannelImageContent, type ChannelMessageContent, type ChannelSubmittedAttachment, type ChannelSubmittedMessage, type ChannelSubmittedMessageInput, type ChannelTextContent, type ExtensionCapabilities, type ExtensionCapabilityHandler, type ExtensionCapabilityPayload, type ExtensionChannel, type ExtensionChannelAdapter, type ExtensionChannelConfig, ExtensionChannelController, type ExtensionChannels, type ExtensionRequest, type ExtensionRequestHandler, type ExtensionRequestResponse, type ExtensionTransportEnvelope, NextClawExtension, type NextClawExtensionOptions, type NextClawExtensionWebSocketLike, startBusChannelExtension, startChannelExtension, warnNcpEventError };
package/dist/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  import { NextClawExtension } from "./services/extension-client.service.js";
2
- export { NextClawExtension };
2
+ import { ExtensionChannelController, startBusChannelExtension, startChannelExtension, warnNcpEventError } from "./services/extension-channel-controller.service.js";
3
+ export { ExtensionChannelController, NextClawExtension, startBusChannelExtension, startChannelExtension, warnNcpEventError };
@@ -0,0 +1,97 @@
1
+ import { ChannelSubmittedAttachment, ChannelSubmittedMessage, ExtensionChannel, NextClawExtensionOptions } from "../types/extension-sdk.types.js";
2
+ import { NcpEndpointEvent } from "@nextclaw/ncp";
3
+
4
+ //#region src/services/extension-channel-controller.service.d.ts
5
+ type ExtensionChannelAdapter<TConfig, TInbound> = {
6
+ configure: (config: TConfig) => Promise<void>;
7
+ start: () => Promise<void>;
8
+ stop: () => Promise<void>;
9
+ onMessage: (handler: (message: TInbound) => void | Promise<void>) => () => void;
10
+ sendNcpEvent: (event: NcpEndpointEvent) => Promise<void>;
11
+ sendOutboundText: (params: {
12
+ to: string;
13
+ text: string;
14
+ accountId?: string | null;
15
+ replyTo?: string | null;
16
+ media?: string[];
17
+ metadata?: Record<string, unknown>;
18
+ }) => Promise<void>;
19
+ };
20
+ type ChannelSubmittedMessageInput = Omit<ChannelSubmittedMessage, "channelId">;
21
+ type BusChannelInboundMessage = {
22
+ channel: string;
23
+ senderId: string;
24
+ chatId: string;
25
+ content: string;
26
+ attachments?: ChannelSubmittedAttachment[];
27
+ metadata?: Record<string, unknown>;
28
+ };
29
+ type BusChannelMessageBus = {
30
+ publishInbound: (message: BusChannelInboundMessage) => Promise<void>;
31
+ };
32
+ type BusChannelRuntime = {
33
+ start: () => Promise<void>;
34
+ stop: () => Promise<void>;
35
+ send: (message: {
36
+ channel: string;
37
+ chatId: string;
38
+ content: string;
39
+ replyTo?: string | null;
40
+ media: string[];
41
+ metadata: Record<string, unknown>;
42
+ }) => Promise<void>;
43
+ };
44
+ type BusChannelCreateContext<TConfig, TBus = BusChannelMessageBus> = {
45
+ config: TConfig;
46
+ bus: TBus;
47
+ };
48
+ type BusChannelExtensionDefinition<TConfig, TBus = BusChannelMessageBus> = {
49
+ channelId: string;
50
+ createChannel: (context: BusChannelCreateContext<TConfig, TBus>) => BusChannelRuntime;
51
+ mapInbound?: ExtensionChannelInboundMapper<BusChannelInboundMessage>;
52
+ onChannelStartError?: (error: unknown) => void | Promise<void>;
53
+ };
54
+ type ExtensionChannelInboundMapper<TInbound> = (message: TInbound) => ChannelSubmittedMessageInput | Promise<ChannelSubmittedMessageInput>;
55
+ type ExtensionChannelControllerOptions<TConfig, TInbound> = {
56
+ channel: ExtensionChannel;
57
+ adapter: ExtensionChannelAdapter<TConfig, TInbound>;
58
+ mapInbound: ExtensionChannelInboundMapper<TInbound>;
59
+ onNcpEventError?: (error: unknown, event: NcpEndpointEvent) => void | Promise<void>;
60
+ };
61
+ type ChannelExtensionContext = {
62
+ channel: ExtensionChannel;
63
+ };
64
+ type ChannelExtensionDefinition<TConfig, TInbound> = {
65
+ channelId: string;
66
+ createAdapter: () => ExtensionChannelAdapter<TConfig, TInbound>;
67
+ mapInbound: ExtensionChannelInboundMapper<TInbound>;
68
+ createAuthCapability?: (context: ChannelExtensionContext) => object;
69
+ onNcpEventError?: (error: unknown, event: NcpEndpointEvent) => void | Promise<void>;
70
+ };
71
+ declare class ExtensionChannelController<TConfig, TInbound> {
72
+ private readonly options;
73
+ private readonly cleanups;
74
+ private started;
75
+ constructor(options: ExtensionChannelControllerOptions<TConfig, TInbound>);
76
+ start: () => Promise<void>;
77
+ stop: () => Promise<void>;
78
+ sendOutboundText: (params: {
79
+ to: string;
80
+ text: string;
81
+ accountId?: string | null;
82
+ replyTo?: string | null;
83
+ media?: string[];
84
+ metadata?: Record<string, unknown>;
85
+ }) => Promise<{
86
+ accepted: true;
87
+ }>;
88
+ private applyConfig;
89
+ private submitMessage;
90
+ private sendNcpEvent;
91
+ private drainCleanups;
92
+ }
93
+ declare function startChannelExtension<TConfig, TInbound>(definition: ChannelExtensionDefinition<TConfig, TInbound>, options?: NextClawExtensionOptions): Promise<void>;
94
+ declare function startBusChannelExtension<TConfig, TBus = BusChannelMessageBus>(definition: BusChannelExtensionDefinition<TConfig, TBus>, options?: NextClawExtensionOptions): Promise<void>;
95
+ declare function warnNcpEventError(channelId: string): (error: unknown) => void;
96
+ //#endregion
97
+ export { BusChannelCreateContext, BusChannelExtensionDefinition, BusChannelInboundMessage, BusChannelMessageBus, BusChannelRuntime, ChannelExtensionContext, ChannelExtensionDefinition, ChannelSubmittedMessageInput, ExtensionChannelAdapter, ExtensionChannelController, startBusChannelExtension, startChannelExtension, warnNcpEventError };
@@ -0,0 +1,212 @@
1
+ import { NextClawExtension } from "./extension-client.service.js";
2
+ import { NcpEventType } from "@nextclaw/ncp";
3
+ //#region src/services/extension-channel-controller.service.ts
4
+ function readRecord(value) {
5
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
6
+ }
7
+ const AGENT_ROUTE_KINDS = new Set([
8
+ "direct",
9
+ "group",
10
+ "channel",
11
+ "thread"
12
+ ]);
13
+ function parseSessionDeliveryRoute(sessionId) {
14
+ const parts = sessionId.trim().split(":");
15
+ if (parts[0] !== "agent" || parts.length < 5) return {};
16
+ const hasAccount = !AGENT_ROUTE_KINDS.has(parts[3]);
17
+ const kind = parts[hasAccount ? 4 : 3];
18
+ if (!AGENT_ROUTE_KINDS.has(kind ?? "")) return {};
19
+ return {
20
+ channel: parts[2],
21
+ ...hasAccount ? { accountId: parts[3] } : {},
22
+ chatId: parts.slice(hasAccount ? 5 : 4).join(":")
23
+ };
24
+ }
25
+ function readString(value) {
26
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
27
+ }
28
+ function renderMessageText(parts) {
29
+ return parts.map((part) => (part.type === "text" || part.type === "rich-text") && part.text ? part.text : "").filter(Boolean).join("\n\n");
30
+ }
31
+ function defaultChannelEnabled(config) {
32
+ return !(config && typeof config === "object" && !Array.isArray(config) && config.enabled === false);
33
+ }
34
+ var ExtensionChannelController = class {
35
+ cleanups = [];
36
+ started = false;
37
+ constructor(options) {
38
+ this.options = options;
39
+ }
40
+ start = async () => {
41
+ if (this.started) return;
42
+ this.started = true;
43
+ this.cleanups.push(this.options.adapter.onMessage(this.submitMessage));
44
+ this.cleanups.push(this.options.channel.onNcpEvent(this.sendNcpEvent));
45
+ this.cleanups.push(this.options.channel.config.onChange(async () => {
46
+ await this.applyConfig();
47
+ }));
48
+ await this.applyConfig();
49
+ };
50
+ stop = async () => {
51
+ if (!this.started) return;
52
+ this.started = false;
53
+ this.drainCleanups();
54
+ await this.options.adapter.stop();
55
+ };
56
+ sendOutboundText = async (params) => {
57
+ await this.options.adapter.sendOutboundText(params);
58
+ return { accepted: true };
59
+ };
60
+ applyConfig = async () => {
61
+ const config = await this.options.channel.config.get();
62
+ await this.options.adapter.configure(config);
63
+ if (defaultChannelEnabled(config) === false) {
64
+ await this.options.adapter.stop();
65
+ return;
66
+ }
67
+ await this.options.adapter.start();
68
+ };
69
+ submitMessage = async (message) => {
70
+ await this.options.channel.submitMessage(await this.options.mapInbound(message));
71
+ };
72
+ sendNcpEvent = async (event) => {
73
+ try {
74
+ await this.options.adapter.sendNcpEvent(event);
75
+ } catch (error) {
76
+ await this.options.onNcpEventError?.(error, event);
77
+ }
78
+ };
79
+ drainCleanups = () => {
80
+ for (const cleanup of this.cleanups.splice(0).reverse()) cleanup();
81
+ };
82
+ };
83
+ var BusChannelAdapter = class {
84
+ channel = null;
85
+ messageHandler = null;
86
+ constructor(definition) {
87
+ this.definition = definition;
88
+ }
89
+ configure = async (config) => {
90
+ await this.stop();
91
+ this.channel = this.definition.createChannel({
92
+ config,
93
+ bus: { publishInbound: async (message) => {
94
+ await this.messageHandler?.(message);
95
+ } }
96
+ });
97
+ };
98
+ start = async () => {
99
+ const channel = this.channel;
100
+ if (!channel) return;
101
+ channel.start().catch(async (error) => {
102
+ await this.definition.onChannelStartError?.(error);
103
+ });
104
+ };
105
+ stop = async () => {
106
+ const channel = this.channel;
107
+ this.channel = null;
108
+ await channel?.stop();
109
+ };
110
+ onMessage = (handler) => {
111
+ this.messageHandler = handler;
112
+ return () => {
113
+ if (this.messageHandler === handler) this.messageHandler = null;
114
+ };
115
+ };
116
+ sendNcpEvent = async (event) => {
117
+ if (event.type !== NcpEventType.MessageCompleted) return;
118
+ const metadata = readRecord(event.payload.message.metadata);
119
+ const sessionRoute = parseSessionDeliveryRoute(event.payload.message.sessionId);
120
+ if ((readString(metadata.channel) ?? readString(metadata.channelId) ?? sessionRoute.channel) !== this.definition.channelId) return;
121
+ const chatId = readString(metadata.chatId) ?? readString(metadata.chat_id) ?? sessionRoute.chatId;
122
+ const content = renderMessageText(event.payload.message.parts).trim();
123
+ if (!chatId || !content) return;
124
+ const replyTo = readString(metadata.message_id);
125
+ await this.channel?.send({
126
+ channel: this.definition.channelId,
127
+ chatId,
128
+ content,
129
+ ...replyTo ? { replyTo } : {},
130
+ media: [],
131
+ metadata: {
132
+ ...metadata,
133
+ ...sessionRoute.accountId && !metadata.accountId ? { accountId: sessionRoute.accountId } : {}
134
+ }
135
+ });
136
+ };
137
+ sendOutboundText = async (params) => {
138
+ const { accountId, media, metadata, replyTo, text, to } = params;
139
+ await this.channel?.send({
140
+ channel: this.definition.channelId,
141
+ chatId: to,
142
+ content: text,
143
+ ...replyTo !== void 0 ? { replyTo } : {},
144
+ media: media ?? [],
145
+ metadata: {
146
+ ...metadata ?? {},
147
+ ...accountId ? { accountId } : {}
148
+ }
149
+ });
150
+ };
151
+ };
152
+ async function startChannelExtension(definition, options = {}) {
153
+ const extension = new NextClawExtension(options);
154
+ const channel = extension.channels.use(definition.channelId);
155
+ const controller = new ExtensionChannelController({
156
+ channel,
157
+ adapter: definition.createAdapter(),
158
+ mapInbound: definition.mapInbound,
159
+ onNcpEventError: definition.onNcpEventError
160
+ });
161
+ if (definition.createAuthCapability) extension.capabilities.provide("channel.auth", definition.createAuthCapability({ channel }));
162
+ extension.capabilities.provideHandler("channel.outbound.sendText", async (payload) => await controller.sendOutboundText({
163
+ to: readRequiredPayloadString(payload.to, "to"),
164
+ text: readRequiredPayloadString(payload.text, "text"),
165
+ accountId: readOptionalPayloadString(payload.accountId),
166
+ replyTo: readOptionalPayloadString(payload.replyTo),
167
+ media: readStringArray(payload.media),
168
+ metadata: readOptionalRecord(payload.metadata)
169
+ }));
170
+ await controller.start();
171
+ }
172
+ async function startBusChannelExtension(definition, options = {}) {
173
+ await startChannelExtension({
174
+ channelId: definition.channelId,
175
+ createAdapter: () => new BusChannelAdapter(definition),
176
+ mapInbound: definition.mapInbound ?? toSubmittedTextMessage
177
+ }, options);
178
+ }
179
+ function warnNcpEventError(channelId) {
180
+ return (error) => {
181
+ const message = error instanceof Error ? error.message : String(error);
182
+ console.warn(`[${channelId}] failed to send NCP event: ${message}`);
183
+ };
184
+ }
185
+ function readRequiredPayloadString(value, name) {
186
+ if (typeof value !== "string" || !value.trim()) throw new Error(`${name} is required`);
187
+ return value.trim();
188
+ }
189
+ function readOptionalPayloadString(value) {
190
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
191
+ }
192
+ function readStringArray(value) {
193
+ if (!Array.isArray(value)) return;
194
+ return value.filter((item) => typeof item === "string");
195
+ }
196
+ function readOptionalRecord(value) {
197
+ return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
198
+ }
199
+ function toSubmittedTextMessage(message) {
200
+ return {
201
+ conversationId: message.chatId,
202
+ senderId: message.senderId,
203
+ content: {
204
+ type: "text",
205
+ text: message.content
206
+ },
207
+ ...message.attachments ? { attachments: message.attachments } : {},
208
+ ...message.metadata ? { metadata: message.metadata } : {}
209
+ };
210
+ }
211
+ //#endregion
212
+ export { ExtensionChannelController, startBusChannelExtension, startChannelExtension, warnNcpEventError };
@@ -1,13 +1,11 @@
1
- import { eventKeys, getKeyId } from "@nextclaw/shared";
1
+ import { eventKeys, getKeyId, ingressKeys } from "@nextclaw/shared";
2
2
  //#region src/services/extension-channel.service.ts
3
- const CONFIG_GET_EVENT_TYPE = "extension.channel.config.get";
4
- const MESSAGE_SUBMIT_EVENT_TYPE = "extension.channel.message.submit";
5
3
  var ChannelConfig = class {
6
4
  constructor(params) {
7
5
  this.params = params;
8
6
  }
9
7
  get = async () => {
10
- return (await this.params.transport.postIngress(CONFIG_GET_EVENT_TYPE, { channelId: this.params.channelId })).config;
8
+ return (await this.params.transport.postIngress(getKeyId(ingressKeys.extension.channelConfigGet), { channelId: this.params.channelId })).config;
11
9
  };
12
10
  onChange = (handler) => this.params.eventBus.subscribeAll((event) => {
13
11
  if (event.type !== getKeyId(eventKeys.configUpdated)) return;
@@ -25,7 +23,7 @@ var ExtensionChannelService = class {
25
23
  this.config = new ChannelConfig(params);
26
24
  }
27
25
  submitMessage = async (input) => {
28
- await this.params.transport.postIngress(MESSAGE_SUBMIT_EVENT_TYPE, {
26
+ await this.params.transport.postIngress(getKeyId(ingressKeys.extension.channelMessageSubmit), {
29
27
  ...input,
30
28
  channelId: this.id
31
29
  });
@@ -1,4 +1,5 @@
1
1
  import { normalizeEndpoint, resolveWebSocketUrl } from "../utils/extension-url.utils.js";
2
+ import { getKeyId, ingressKeys } from "@nextclaw/shared";
2
3
  //#region src/services/extension-transport.service.ts
3
4
  function readRuntimeEnv() {
4
5
  return typeof process === "undefined" ? {} : process.env;
@@ -44,7 +45,7 @@ var ExtensionTransportService = class {
44
45
  return this.readResponseData(body);
45
46
  };
46
47
  respondToRequest = async (response) => {
47
- await this.postIngress("extension.response", response);
48
+ await this.postIngress(getKeyId(ingressKeys.extension.response), response);
48
49
  };
49
50
  subscribe = (handler) => {
50
51
  const socket = this.createSocket(resolveWebSocketUrl(this.endpoint, "/ws"));
@@ -1,4 +1,4 @@
1
- import { Unsubscribe } from "@nextclaw/shared";
1
+ import { ExtensionChannelConfigGetIngressPayload as ChannelConfigGetRequest, ExtensionChannelFileContent as ChannelFileContent, ExtensionChannelImageContent as ChannelImageContent, ExtensionChannelMessageContent as ChannelMessageContent, ExtensionChannelMessageSubmitIngressPayload, ExtensionChannelMessageSubmitIngressPayload as ChannelSubmittedMessage, ExtensionChannelSubmittedAttachment as ChannelSubmittedAttachment, ExtensionChannelTextContent as ChannelTextContent, ExtensionResponseIngressPayload as ExtensionRequestResponse, Unsubscribe } from "@nextclaw/shared";
2
2
  import { NcpEndpointEvent } from "@nextclaw/ncp";
3
3
 
4
4
  //#region src/types/extension-sdk.types.d.ts
@@ -31,59 +31,6 @@ type ExtensionRequest = {
31
31
  kind: string;
32
32
  payload?: Record<string, unknown>;
33
33
  };
34
- type ExtensionRequestResponse = {
35
- requestId: string;
36
- ok: true;
37
- data?: unknown;
38
- } | {
39
- requestId: string;
40
- ok: false;
41
- error: {
42
- message: string;
43
- };
44
- };
45
- type ChannelTextContent = {
46
- type: "text";
47
- text: string;
48
- };
49
- type ChannelImageContent = {
50
- type: "image";
51
- url?: string;
52
- assetUri?: string;
53
- mimeType?: string;
54
- name?: string;
55
- };
56
- type ChannelFileContent = {
57
- type: "file";
58
- url?: string;
59
- assetUri?: string;
60
- mimeType?: string;
61
- name?: string;
62
- };
63
- type ChannelMessageContent = ChannelTextContent | ChannelImageContent | ChannelFileContent;
64
- type ChannelSubmittedAttachment = {
65
- id?: string;
66
- name?: string;
67
- path?: string;
68
- url?: string;
69
- assetUri?: string;
70
- mimeType?: string;
71
- size?: number;
72
- source?: string;
73
- status?: "ready" | "remote-only";
74
- errorCode?: "too_large" | "download_failed" | "http_error" | "invalid_payload";
75
- };
76
- type ChannelSubmittedMessage = {
77
- channelId: string;
78
- conversationId: string;
79
- senderId: string;
80
- content: ChannelMessageContent;
81
- attachments?: ChannelSubmittedAttachment[];
82
- metadata?: Record<string, unknown>;
83
- };
84
- type ChannelConfigGetRequest = {
85
- channelId: string;
86
- };
87
34
  type ChannelConfigGetResponse<TConfig = unknown> = {
88
35
  config: TConfig;
89
36
  };
@@ -93,7 +40,7 @@ type ExtensionChannelConfig = {
93
40
  };
94
41
  type ExtensionChannel = {
95
42
  id: string;
96
- submitMessage: (input: Omit<ChannelSubmittedMessage, "channelId">) => Promise<void>;
43
+ submitMessage: (input: Omit<ExtensionChannelMessageSubmitIngressPayload, "channelId">) => Promise<void>;
97
44
  onNcpEvent: (handler: (event: NcpEndpointEvent) => void | Promise<void>) => Unsubscribe;
98
45
  config: ExtensionChannelConfig;
99
46
  };
@@ -108,4 +55,4 @@ type ExtensionCapabilities = {
108
55
  provideHandler: (kind: string, handler: ExtensionCapabilityHandler) => Unsubscribe;
109
56
  };
110
57
  //#endregion
111
- export { ChannelConfigGetRequest, ChannelConfigGetResponse, ChannelFileContent, ChannelImageContent, ChannelMessageContent, ChannelSubmittedAttachment, ChannelSubmittedMessage, ChannelTextContent, ExtensionCapabilities, ExtensionCapabilityHandler, ExtensionCapabilityPayload, ExtensionChannel, ExtensionChannelConfig, ExtensionChannels, ExtensionRequest, ExtensionRequestHandler, ExtensionRequestResponse, ExtensionTransportEnvelope, NextClawExtensionOptions, NextClawExtensionWebSocketLike };
58
+ export { type ChannelConfigGetRequest, ChannelConfigGetResponse, type ChannelFileContent, type ChannelImageContent, type ChannelMessageContent, type ChannelSubmittedAttachment, type ChannelSubmittedMessage, type ChannelTextContent, ExtensionCapabilities, ExtensionCapabilityHandler, ExtensionCapabilityPayload, ExtensionChannel, ExtensionChannelConfig, ExtensionChannels, ExtensionRequest, ExtensionRequestHandler, type ExtensionRequestResponse, ExtensionTransportEnvelope, NextClawExtensionOptions, NextClawExtensionWebSocketLike };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextclaw/extension-sdk",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "private": false,
5
5
  "description": "Backend SDK for NextClaw extension server processes.",
6
6
  "type": "module",
@@ -35,8 +35,8 @@
35
35
  "README.md"
36
36
  ],
37
37
  "dependencies": {
38
- "@nextclaw/shared": "0.1.6",
39
- "@nextclaw/ncp": "0.5.12"
38
+ "@nextclaw/ncp": "0.5.13",
39
+ "@nextclaw/shared": "0.1.7"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/node": "^20.17.6",