@nextclaw/ncp-http-agent-client 0.3.48-beta.0 → 0.4.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/utils.ts","../src/client.ts"],"mappings":";;;KAKY,SAAA,IAAa,KAAA,EAAO,GAAA,YAAe,OAAA,EAAS,IAAA,GAAO,WAAA,KAAgB,OAAA,CAAQ,QAAA;;;KCiC3E,yBAAA;EACV,OAAA;EACA,QAAA;EACA,UAAA;EACA,OAAA,GAAU,MAAA;EACV,SAAA,GAAY,SAAA;AAAA;AAAA,cASD,0BAAA,YAAsC,sBAAA;EAAA,SACxC,QAAA,EAAU,mBAAA;EAAA,iBAEF,OAAA;EAAA,iBACA,QAAA;EAAA,iBACA,SAAA;EAAA,iBACA,cAAA;EAAA,iBACA,WAAA;EAAA,iBACA,iBAAA;EAAA,QACT,OAAA;cAEI,OAAA,EAAS,yBAAA;EAmBf,KAAA,CAAA,GAAS,OAAA;EAQT,IAAA,CAAA,GAAQ,OAAA;EAWR,IAAA,CAAK,KAAA,EAAO,gBAAA,GAAmB,OAAA;EAiBrC,SAAA,CAAU,QAAA,EAAU,qBAAA;EAOd,IAAA,CAAK,QAAA,EAAU,oBAAA,GAAuB,OAAA,CAAQ,YAAA;EAwC9C,MAAA,CAAO,OAAA,EAAS,uBAAA,GAA0B,OAAA;EAW1C,KAAA,CAAM,OAAA,EAAS,sBAAA,GAAyB,OAAA;EAAA,QAgChC,aAAA;EAAA,QAMN,OAAA;EAAA,QAMA,UAAA;EAAA,QAIM,aAAA;EAAA,QAkDN,cAAA;AAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/utils.ts","../src/client.ts"],"mappings":";;;KAKY,SAAA,IAAa,KAAA,EAAO,GAAA,YAAe,OAAA,EAAS,IAAA,GAAO,WAAA,KAAgB,OAAA,CAAQ,QAAA;;;KCkC3E,yBAAA;EACV,OAAA;EACA,QAAA;EACA,UAAA;EACA,OAAA,GAAU,MAAA;EACV,SAAA,GAAY,SAAA;AAAA;AAAA,cASD,0BAAA,YAAsC,sBAAA;EAAA,SACxC,QAAA,EAAU,mBAAA;EAAA,iBAEF,OAAA;EAAA,iBACA,QAAA;EAAA,iBACA,SAAA;EAAA,iBACA,cAAA;EAAA,iBACA,WAAA;EAAA,iBACA,iBAAA;EAAA,QACT,OAAA;cAEI,OAAA,EAAS,yBAAA;EAmBf,KAAA,CAAA,GAAS,OAAA;EAQT,IAAA,CAAA,GAAQ,OAAA;EAWR,IAAA,CAAK,KAAA,EAAO,gBAAA,GAAmB,OAAA;EAiBrC,SAAA,CAAU,QAAA,EAAU,qBAAA;EAOd,IAAA,CAAK,QAAA,EAAU,oBAAA,GAAuB,OAAA,CAAQ,YAAA;EAwC9C,MAAA,CAAO,OAAA,EAAS,uBAAA,GAA0B,OAAA;EAW1C,KAAA,CAAM,OAAA,EAAS,sBAAA,GAAyB,OAAA;EAAA,QAgChC,aAAA;EAAA,QAMN,OAAA;EAAA,QAMA,UAAA;EAAA,QAIM,aAAA;EAAA,QAkDN,cAAA;AAAA"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { NcpEventType } from "@nextclaw/ncp";
1
+ import { NcpEventType, createNcpEndpointEvent } from "@nextclaw/ncp";
2
2
  //#region src/sse.ts
3
3
  function parseSseFrame(frameText) {
4
4
  const lines = frameText.split(/\r?\n/);
@@ -215,7 +215,7 @@ var NcpHttpAgentClientEndpoint = class {
215
215
  async start() {
216
216
  if (this.started) return;
217
217
  this.started = true;
218
- this.publish({ type: NcpEventType.EndpointReady });
218
+ this.publish(createNcpEndpointEvent({ type: NcpEventType.EndpointReady }));
219
219
  }
220
220
  async stop() {
221
221
  if (!this.started) return;
@@ -268,10 +268,10 @@ var NcpHttpAgentClientEndpoint = class {
268
268
  if (controller.signal.aborted) throw new Error("NCP send command was cancelled.");
269
269
  if (isNcpHttpAgentClientError(error)) throw error;
270
270
  const ncpError = toNcpError(error);
271
- this.publish({
271
+ this.publish(createNcpEndpointEvent({
272
272
  type: NcpEventType.EndpointError,
273
273
  payload: ncpError
274
- });
274
+ }));
275
275
  throw ncpErrorToError(ncpError);
276
276
  } finally {
277
277
  this.activeControllers.delete(controller);
@@ -304,10 +304,10 @@ var NcpHttpAgentClientEndpoint = class {
304
304
  } catch (error) {
305
305
  if (controller.signal.aborted) return;
306
306
  const ncpError = toNcpError(error);
307
- this.publish({
307
+ this.publish(createNcpEndpointEvent({
308
308
  type: NcpEventType.EndpointError,
309
309
  payload: ncpError
310
- });
310
+ }));
311
311
  throw ncpErrorToError(ncpError);
312
312
  } finally {
313
313
  this.activeControllers.delete(controller);
@@ -346,10 +346,10 @@ var NcpHttpAgentClientEndpoint = class {
346
346
  if (controller.signal.aborted) return;
347
347
  if (isNcpHttpAgentClientError(error)) throw error;
348
348
  const ncpError = toNcpError(error);
349
- this.publish({
349
+ this.publish(createNcpEndpointEvent({
350
350
  type: NcpEventType.EndpointError,
351
351
  payload: ncpError
352
- });
352
+ }));
353
353
  throw ncpErrorToError(ncpError);
354
354
  } finally {
355
355
  this.activeControllers.delete(controller);
@@ -359,13 +359,13 @@ var NcpHttpAgentClientEndpoint = class {
359
359
  if (frame.event === "ncp-event") {
360
360
  const event = parseNcpEvent(frame.data);
361
361
  if (!event) {
362
- this.publish({
362
+ this.publish(createNcpEndpointEvent({
363
363
  type: NcpEventType.EndpointError,
364
364
  payload: {
365
365
  code: "runtime-error",
366
366
  message: "Received malformed ncp-event frame."
367
367
  }
368
- });
368
+ }));
369
369
  return;
370
370
  }
371
371
  this.publish(event);
@@ -373,10 +373,10 @@ var NcpHttpAgentClientEndpoint = class {
373
373
  }
374
374
  if (frame.event === "error") {
375
375
  const ncpError = parseNcpError(frame.data);
376
- this.publish({
376
+ this.publish(createNcpEndpointEvent({
377
377
  type: NcpEventType.EndpointError,
378
378
  payload: ncpError
379
- });
379
+ }));
380
380
  throw ncpErrorToError(ncpError, { alreadyPublished: true });
381
381
  }
382
382
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/sse.ts","../src/utils.ts","../src/parsers.ts","../src/client.ts"],"sourcesContent":["export type SseFrame = {\n event: string;\n data: string;\n};\n\nexport function parseSseFrame(frameText: string): SseFrame | null {\n const lines = frameText.split(/\\r?\\n/);\n let eventName = \"message\";\n const dataLines: string[] = [];\n\n for (const rawLine of lines) {\n const line = rawLine.trimEnd();\n if (!line || line.startsWith(\":\")) {\n continue;\n }\n if (line.startsWith(\"event:\")) {\n eventName = line.slice(6).trim() || \"message\";\n continue;\n }\n if (line.startsWith(\"data:\")) {\n dataLines.push(line.slice(5).trimStart());\n }\n }\n\n if (dataLines.length === 0) {\n return null;\n }\n\n return {\n event: eventName,\n data: dataLines.join(\"\\n\"),\n };\n}\n\nexport async function* consumeSseStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<SseFrame> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n const { frames, rest } = drainFrames(buffer);\n buffer = rest;\n for (const frame of frames) {\n yield frame;\n }\n }\n buffer += decoder.decode();\n const { frames } = drainFrames(buffer, true);\n for (const frame of frames) {\n yield frame;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction drainFrames(rawBuffer: string, flush = false): { frames: SseFrame[]; rest: string } {\n const parts = rawBuffer.split(/\\r?\\n\\r?\\n/);\n const rest = parts.pop() ?? \"\";\n const frames: SseFrame[] = [];\n for (const part of parts) {\n const frame = parseSseFrame(part);\n if (frame) {\n frames.push(frame);\n }\n }\n if (flush && rest.trim()) {\n const frame = parseSseFrame(rest);\n if (frame) {\n frames.push(frame);\n }\n return { frames, rest: \"\" };\n }\n return { frames, rest };\n}\n","import type { NcpError, NcpErrorCode } from \"@nextclaw/ncp\";\n\nexport const DEFAULT_BASE_PATH = \"/ncp/agent\";\nexport const DEFAULT_ENDPOINT_ID = \"ncp-http-agent-client\";\n\nexport type FetchLike = (input: URL | string | Request, init?: RequestInit) => Promise<Response>;\n\nexport class NcpHttpAgentClientError extends Error {\n readonly ncpError: NcpError;\n readonly alreadyPublished: boolean;\n\n constructor(ncpError: NcpError, alreadyPublished = false) {\n super(ncpError.message);\n this.name = `NcpHttpAgentClientError(${ncpError.code})`;\n this.ncpError = ncpError;\n this.alreadyPublished = alreadyPublished;\n }\n}\n\nexport function toBaseUrl(baseUrl: string): URL {\n const trimmed = baseUrl.trim();\n if (!trimmed) {\n throw new Error(\"NcpHttpAgentClient requires a non-empty baseUrl.\");\n }\n return new URL(trimmed);\n}\n\nexport function resolveFetchImpl(fetchImpl: FetchLike | undefined): FetchLike {\n if (fetchImpl) {\n return fetchImpl;\n }\n if (typeof globalThis.fetch === \"function\") {\n return globalThis.fetch.bind(globalThis) as FetchLike;\n }\n throw new Error(\"No fetch implementation found. Pass options.fetchImpl explicitly.\");\n}\n\nexport function normalizeBasePath(basePath: string | undefined): string {\n const raw = (basePath ?? DEFAULT_BASE_PATH).trim();\n if (!raw) {\n return DEFAULT_BASE_PATH;\n }\n const withSlash = raw.startsWith(\"/\") ? raw : `/${raw}`;\n return withSlash.endsWith(\"/\") ? withSlash.slice(0, -1) : withSlash;\n}\n\nexport async function safeReadText(response: Response): Promise<string> {\n try {\n const text = await response.text();\n return text.trim();\n } catch {\n return \"\";\n }\n}\n\nexport function toNcpError(error: unknown): NcpError {\n if (isNcpHttpAgentClientError(error)) {\n return error.ncpError;\n }\n if (isNcpError(error)) {\n return error;\n }\n const message = error instanceof Error ? error.message : String(error ?? \"Unknown error\");\n return {\n code: normalizeErrorCode(undefined),\n message,\n ...(error instanceof Error && error.stack ? { details: { stack: error.stack } } : {}),\n };\n}\n\nexport function ncpErrorToError(\n error: NcpError,\n options: { alreadyPublished?: boolean } = {},\n): NcpHttpAgentClientError {\n return new NcpHttpAgentClientError(error, options.alreadyPublished ?? false);\n}\n\nfunction isNcpError(value: unknown): value is NcpError {\n return (\n isRecord(value) &&\n typeof value.code === \"string\" &&\n typeof value.message === \"string\"\n );\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isNcpHttpAgentClientError(error: unknown): error is NcpHttpAgentClientError {\n return error instanceof NcpHttpAgentClientError;\n}\n\nconst ERROR_CODE_MAP: Record<string, NcpErrorCode> = {\n \"config-error\": \"config-error\",\n \"auth-error\": \"auth-error\",\n \"runtime-error\": \"runtime-error\",\n \"timeout-error\": \"timeout-error\",\n \"abort-error\": \"abort-error\",\n};\n\nexport function normalizeErrorCode(code: string | undefined): NcpErrorCode {\n if (!code) {\n return \"runtime-error\";\n }\n const mapped = ERROR_CODE_MAP[code];\n if (mapped) {\n return mapped;\n }\n const lowered = code.toLowerCase();\n if (lowered.includes(\"timeout\")) return \"timeout-error\";\n if (lowered.includes(\"abort\") || lowered.includes(\"cancel\")) return \"abort-error\";\n if (lowered.includes(\"auth\")) return \"auth-error\";\n if (lowered.includes(\"config\")) return \"config-error\";\n return \"runtime-error\";\n}\n","import type { NcpEndpointEvent, NcpError } from \"@nextclaw/ncp\";\nimport { isRecord, normalizeErrorCode } from \"./utils.js\";\n\nexport function parseNcpEvent(rawData: string): NcpEndpointEvent | null {\n const parsed = parseJsonRecord(rawData);\n if (!parsed) {\n return null;\n }\n if (typeof parsed.type !== \"string\" || !parsed.type.trim()) {\n return null;\n }\n return parsed as NcpEndpointEvent;\n}\n\nexport function parseNcpError(rawData: string): NcpError {\n const parsed = parseJsonRecord(rawData);\n if (!parsed) {\n return {\n code: \"runtime-error\",\n message: rawData || \"Unknown stream error.\",\n };\n }\n\n const inputCode = typeof parsed.code === \"string\" ? parsed.code : undefined;\n const normalizedCode = normalizeErrorCode(inputCode);\n const details = isRecord(parsed.details) ? parsed.details : {};\n\n if (inputCode && inputCode !== normalizedCode) {\n details.originalCode = inputCode;\n }\n\n return {\n code: normalizedCode,\n message: typeof parsed.message === \"string\" && parsed.message ? parsed.message : \"Unknown stream error.\",\n ...(Object.keys(details).length > 0 ? { details } : {}),\n };\n}\n\nexport function parseJsonRecord(value: string): Record<string, unknown> | null {\n try {\n const parsed = JSON.parse(value) as unknown;\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n","import {\n type NcpAgentClientEndpoint,\n type NcpAgentSendEnvelope,\n type NcpEndpointEvent,\n type NcpEndpointManifest,\n type NcpEndpointSubscriber,\n type NcpMessageAbortPayload,\n type NcpRunHandle,\n type NcpStreamRequestPayload,\n NcpEventType,\n} from \"@nextclaw/ncp\";\nimport { consumeSseStream } from \"./sse.js\";\nimport { parseNcpEvent, parseNcpError } from \"./parsers.js\";\nimport {\n type FetchLike,\n DEFAULT_ENDPOINT_ID,\n toBaseUrl,\n resolveFetchImpl,\n normalizeBasePath,\n safeReadText,\n toNcpError,\n ncpErrorToError,\n isNcpHttpAgentClientError,\n} from \"./utils.js\";\n\nconst SUPPORTED_PART_TYPES: NcpEndpointManifest[\"supportedPartTypes\"] = [\n \"text\",\n \"file\",\n \"source\",\n \"step-start\",\n \"reasoning\",\n \"tool-invocation\",\n \"card\",\n \"rich-text\",\n \"action\",\n \"extension\",\n];\n\nexport type NcpHttpAgentClientOptions = {\n baseUrl: string;\n basePath?: string;\n endpointId?: string;\n headers?: Record<string, string>;\n fetchImpl?: FetchLike;\n};\n\ntype StreamRequestOptions = {\n path: string;\n method: \"GET\" | \"POST\";\n body?: unknown;\n};\n\nexport class NcpHttpAgentClientEndpoint implements NcpAgentClientEndpoint {\n readonly manifest: NcpEndpointManifest;\n\n private readonly baseUrl: URL;\n private readonly basePath: string;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly subscribers = new Set<NcpEndpointSubscriber>();\n private readonly activeControllers = new Set<AbortController>();\n private started = false;\n\n constructor(options: NcpHttpAgentClientOptions) {\n this.baseUrl = toBaseUrl(options.baseUrl);\n this.basePath = normalizeBasePath(options.basePath);\n this.fetchImpl = resolveFetchImpl(options.fetchImpl);\n this.defaultHeaders = options.headers ?? {};\n this.manifest = {\n endpointKind: \"custom\",\n endpointId: options.endpointId?.trim() || DEFAULT_ENDPOINT_ID,\n version: \"0.1.0\",\n supportsStreaming: true,\n supportsAbort: true,\n supportsProactiveMessages: false,\n supportsLiveSessionStream: true,\n supportedPartTypes: SUPPORTED_PART_TYPES,\n expectedLatency: \"seconds\",\n metadata: { transport: \"http+sse\", scope: \"agent\" },\n };\n }\n\n async start(): Promise<void> {\n if (this.started) {\n return;\n }\n this.started = true;\n this.publish({ type: NcpEventType.EndpointReady });\n }\n\n async stop(): Promise<void> {\n if (!this.started) {\n return;\n }\n this.started = false;\n for (const controller of this.activeControllers) {\n controller.abort();\n }\n this.activeControllers.clear();\n }\n\n async emit(event: NcpEndpointEvent): Promise<void> {\n switch (event.type) {\n case \"message.request\":\n await this.send(event.payload);\n return;\n case \"message.stream-request\":\n await this.stream(event.payload);\n return;\n case \"message.abort\":\n await this.abort(event.payload);\n return;\n default:\n this.publish(event);\n return;\n }\n }\n\n subscribe(listener: NcpEndpointSubscriber): () => void {\n this.subscribers.add(listener);\n return () => {\n this.subscribers.delete(listener);\n };\n }\n\n async send(envelope: NcpAgentSendEnvelope): Promise<NcpRunHandle> {\n await this.ensureStarted();\n const controller = new AbortController();\n this.activeControllers.add(controller);\n try {\n const response = await this.fetchImpl(this.resolveUrl(\"/send\"), {\n method: \"POST\",\n headers: {\n ...this.defaultHeaders,\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(envelope),\n signal: controller.signal,\n });\n if (!response.ok) {\n throw new Error(\n `NCP send command failed with HTTP ${response.status}: ${await safeReadText(response)}`,\n );\n }\n const payload = await response.json() as { ok?: boolean; data?: NcpRunHandle; error?: { message?: string } };\n if (!payload.ok || !payload.data) {\n throw new Error(payload.error?.message ?? \"NCP send command returned an invalid handle.\");\n }\n return payload.data;\n } catch (error) {\n if (controller.signal.aborted) {\n throw new Error(\"NCP send command was cancelled.\");\n }\n if (isNcpHttpAgentClientError(error)) {\n throw error;\n }\n const ncpError = toNcpError(error);\n this.publish({ type: NcpEventType.EndpointError, payload: ncpError });\n throw ncpErrorToError(ncpError);\n } finally {\n this.activeControllers.delete(controller);\n }\n }\n\n async stream(payload: NcpStreamRequestPayload): Promise<void> {\n await this.ensureStarted();\n const query = new URLSearchParams({\n sessionId: payload.sessionId,\n });\n await this.streamRequest({\n path: `/stream?${query.toString()}`,\n method: \"GET\",\n });\n }\n\n async abort(payload: NcpMessageAbortPayload): Promise<void> {\n await this.ensureStarted();\n const controller = new AbortController();\n this.activeControllers.add(controller);\n try {\n const response = await this.fetchImpl(this.resolveUrl(\"/abort\"), {\n method: \"POST\",\n headers: {\n ...this.defaultHeaders,\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n if (!response.ok) {\n throw new Error(\n `Abort request failed with HTTP ${response.status}: ${await safeReadText(response)}`,\n );\n }\n } catch (error) {\n if (controller.signal.aborted) {\n return;\n }\n const ncpError = toNcpError(error);\n this.publish({ type: NcpEventType.EndpointError, payload: ncpError });\n throw ncpErrorToError(ncpError);\n } finally {\n this.activeControllers.delete(controller);\n }\n }\n\n private async ensureStarted(): Promise<void> {\n if (!this.started) {\n await this.start();\n }\n }\n\n private publish(event: NcpEndpointEvent): void {\n for (const subscriber of this.subscribers) {\n subscriber(event);\n }\n }\n\n private resolveUrl(path: string): URL {\n return new URL(`${this.basePath}${path}`, this.baseUrl);\n }\n\n private async streamRequest(options: StreamRequestOptions): Promise<void> {\n const controller = new AbortController();\n this.activeControllers.add(controller);\n\n try {\n const response = await this.fetchImpl(this.resolveUrl(options.path), {\n method: options.method,\n headers: {\n ...this.defaultHeaders,\n accept: \"text/event-stream\",\n ...(options.body !== undefined\n ? { \"content-type\": \"application/json\" }\n : {}),\n },\n body:\n options.body === undefined ? undefined : JSON.stringify(options.body),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(\n `NCP stream request failed with HTTP ${response.status}: ${await safeReadText(response)}`,\n );\n }\n\n if (!response.body) {\n throw new Error(\"NCP stream response has no body.\");\n }\n\n for await (const frame of consumeSseStream(response.body)) {\n if (controller.signal.aborted) {\n return;\n }\n this.handleSseFrame(frame);\n }\n } catch (error) {\n if (controller.signal.aborted) {\n return;\n }\n if (isNcpHttpAgentClientError(error)) {\n throw error;\n }\n const ncpError = toNcpError(error);\n this.publish({ type: NcpEventType.EndpointError, payload: ncpError });\n throw ncpErrorToError(ncpError);\n } finally {\n this.activeControllers.delete(controller);\n }\n }\n\n private handleSseFrame(frame: { event: string; data: string }): void {\n if (frame.event === \"ncp-event\") {\n const event = parseNcpEvent(frame.data);\n if (!event) {\n this.publish({\n type: NcpEventType.EndpointError,\n payload: {\n code: \"runtime-error\",\n message: \"Received malformed ncp-event frame.\",\n },\n });\n return;\n }\n this.publish(event);\n return;\n }\n\n if (frame.event === \"error\") {\n const ncpError = parseNcpError(frame.data);\n this.publish({ type: NcpEventType.EndpointError, payload: ncpError });\n throw ncpErrorToError(ncpError, { alreadyPublished: true });\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["createClientEvent"],"sources":["../src/sse.ts","../src/utils.ts","../src/parsers.ts","../src/client.ts"],"sourcesContent":["export type SseFrame = {\n event: string;\n data: string;\n};\n\nexport function parseSseFrame(frameText: string): SseFrame | null {\n const lines = frameText.split(/\\r?\\n/);\n let eventName = \"message\";\n const dataLines: string[] = [];\n\n for (const rawLine of lines) {\n const line = rawLine.trimEnd();\n if (!line || line.startsWith(\":\")) {\n continue;\n }\n if (line.startsWith(\"event:\")) {\n eventName = line.slice(6).trim() || \"message\";\n continue;\n }\n if (line.startsWith(\"data:\")) {\n dataLines.push(line.slice(5).trimStart());\n }\n }\n\n if (dataLines.length === 0) {\n return null;\n }\n\n return {\n event: eventName,\n data: dataLines.join(\"\\n\"),\n };\n}\n\nexport async function* consumeSseStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<SseFrame> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n const { frames, rest } = drainFrames(buffer);\n buffer = rest;\n for (const frame of frames) {\n yield frame;\n }\n }\n buffer += decoder.decode();\n const { frames } = drainFrames(buffer, true);\n for (const frame of frames) {\n yield frame;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction drainFrames(rawBuffer: string, flush = false): { frames: SseFrame[]; rest: string } {\n const parts = rawBuffer.split(/\\r?\\n\\r?\\n/);\n const rest = parts.pop() ?? \"\";\n const frames: SseFrame[] = [];\n for (const part of parts) {\n const frame = parseSseFrame(part);\n if (frame) {\n frames.push(frame);\n }\n }\n if (flush && rest.trim()) {\n const frame = parseSseFrame(rest);\n if (frame) {\n frames.push(frame);\n }\n return { frames, rest: \"\" };\n }\n return { frames, rest };\n}\n","import type { NcpError, NcpErrorCode } from \"@nextclaw/ncp\";\n\nexport const DEFAULT_BASE_PATH = \"/ncp/agent\";\nexport const DEFAULT_ENDPOINT_ID = \"ncp-http-agent-client\";\n\nexport type FetchLike = (input: URL | string | Request, init?: RequestInit) => Promise<Response>;\n\nexport class NcpHttpAgentClientError extends Error {\n readonly ncpError: NcpError;\n readonly alreadyPublished: boolean;\n\n constructor(ncpError: NcpError, alreadyPublished = false) {\n super(ncpError.message);\n this.name = `NcpHttpAgentClientError(${ncpError.code})`;\n this.ncpError = ncpError;\n this.alreadyPublished = alreadyPublished;\n }\n}\n\nexport function toBaseUrl(baseUrl: string): URL {\n const trimmed = baseUrl.trim();\n if (!trimmed) {\n throw new Error(\"NcpHttpAgentClient requires a non-empty baseUrl.\");\n }\n return new URL(trimmed);\n}\n\nexport function resolveFetchImpl(fetchImpl: FetchLike | undefined): FetchLike {\n if (fetchImpl) {\n return fetchImpl;\n }\n if (typeof globalThis.fetch === \"function\") {\n return globalThis.fetch.bind(globalThis) as FetchLike;\n }\n throw new Error(\"No fetch implementation found. Pass options.fetchImpl explicitly.\");\n}\n\nexport function normalizeBasePath(basePath: string | undefined): string {\n const raw = (basePath ?? DEFAULT_BASE_PATH).trim();\n if (!raw) {\n return DEFAULT_BASE_PATH;\n }\n const withSlash = raw.startsWith(\"/\") ? raw : `/${raw}`;\n return withSlash.endsWith(\"/\") ? withSlash.slice(0, -1) : withSlash;\n}\n\nexport async function safeReadText(response: Response): Promise<string> {\n try {\n const text = await response.text();\n return text.trim();\n } catch {\n return \"\";\n }\n}\n\nexport function toNcpError(error: unknown): NcpError {\n if (isNcpHttpAgentClientError(error)) {\n return error.ncpError;\n }\n if (isNcpError(error)) {\n return error;\n }\n const message = error instanceof Error ? error.message : String(error ?? \"Unknown error\");\n return {\n code: normalizeErrorCode(undefined),\n message,\n ...(error instanceof Error && error.stack ? { details: { stack: error.stack } } : {}),\n };\n}\n\nexport function ncpErrorToError(\n error: NcpError,\n options: { alreadyPublished?: boolean } = {},\n): NcpHttpAgentClientError {\n return new NcpHttpAgentClientError(error, options.alreadyPublished ?? false);\n}\n\nfunction isNcpError(value: unknown): value is NcpError {\n return (\n isRecord(value) &&\n typeof value.code === \"string\" &&\n typeof value.message === \"string\"\n );\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isNcpHttpAgentClientError(error: unknown): error is NcpHttpAgentClientError {\n return error instanceof NcpHttpAgentClientError;\n}\n\nconst ERROR_CODE_MAP: Record<string, NcpErrorCode> = {\n \"config-error\": \"config-error\",\n \"auth-error\": \"auth-error\",\n \"runtime-error\": \"runtime-error\",\n \"timeout-error\": \"timeout-error\",\n \"abort-error\": \"abort-error\",\n};\n\nexport function normalizeErrorCode(code: string | undefined): NcpErrorCode {\n if (!code) {\n return \"runtime-error\";\n }\n const mapped = ERROR_CODE_MAP[code];\n if (mapped) {\n return mapped;\n }\n const lowered = code.toLowerCase();\n if (lowered.includes(\"timeout\")) return \"timeout-error\";\n if (lowered.includes(\"abort\") || lowered.includes(\"cancel\")) return \"abort-error\";\n if (lowered.includes(\"auth\")) return \"auth-error\";\n if (lowered.includes(\"config\")) return \"config-error\";\n return \"runtime-error\";\n}\n","import type { NcpEndpointEvent, NcpError } from \"@nextclaw/ncp\";\nimport { isRecord, normalizeErrorCode } from \"./utils.js\";\n\nexport function parseNcpEvent(rawData: string): NcpEndpointEvent | null {\n const parsed = parseJsonRecord(rawData);\n if (!parsed) {\n return null;\n }\n if (typeof parsed.type !== \"string\" || !parsed.type.trim()) {\n return null;\n }\n return parsed as NcpEndpointEvent;\n}\n\nexport function parseNcpError(rawData: string): NcpError {\n const parsed = parseJsonRecord(rawData);\n if (!parsed) {\n return {\n code: \"runtime-error\",\n message: rawData || \"Unknown stream error.\",\n };\n }\n\n const inputCode = typeof parsed.code === \"string\" ? parsed.code : undefined;\n const normalizedCode = normalizeErrorCode(inputCode);\n const details = isRecord(parsed.details) ? parsed.details : {};\n\n if (inputCode && inputCode !== normalizedCode) {\n details.originalCode = inputCode;\n }\n\n return {\n code: normalizedCode,\n message: typeof parsed.message === \"string\" && parsed.message ? parsed.message : \"Unknown stream error.\",\n ...(Object.keys(details).length > 0 ? { details } : {}),\n };\n}\n\nexport function parseJsonRecord(value: string): Record<string, unknown> | null {\n try {\n const parsed = JSON.parse(value) as unknown;\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n","import {\n createNcpEndpointEvent as createClientEvent,\n type NcpAgentClientEndpoint,\n type NcpAgentSendEnvelope,\n type NcpEndpointEvent,\n type NcpEndpointManifest,\n type NcpEndpointSubscriber,\n type NcpMessageAbortPayload,\n type NcpRunHandle,\n type NcpStreamRequestPayload,\n NcpEventType,\n} from \"@nextclaw/ncp\";\nimport { consumeSseStream } from \"./sse.js\";\nimport { parseNcpEvent, parseNcpError } from \"./parsers.js\";\nimport {\n type FetchLike,\n DEFAULT_ENDPOINT_ID,\n toBaseUrl,\n resolveFetchImpl,\n normalizeBasePath,\n safeReadText,\n toNcpError,\n ncpErrorToError,\n isNcpHttpAgentClientError,\n} from \"./utils.js\";\n\nconst SUPPORTED_PART_TYPES: NcpEndpointManifest[\"supportedPartTypes\"] = [\n \"text\",\n \"file\",\n \"source\",\n \"step-start\",\n \"reasoning\",\n \"tool-invocation\",\n \"card\",\n \"rich-text\",\n \"action\",\n \"extension\",\n];\n\nexport type NcpHttpAgentClientOptions = {\n baseUrl: string;\n basePath?: string;\n endpointId?: string;\n headers?: Record<string, string>;\n fetchImpl?: FetchLike;\n};\n\ntype StreamRequestOptions = {\n path: string;\n method: \"GET\" | \"POST\";\n body?: unknown;\n};\n\nexport class NcpHttpAgentClientEndpoint implements NcpAgentClientEndpoint {\n readonly manifest: NcpEndpointManifest;\n\n private readonly baseUrl: URL;\n private readonly basePath: string;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly subscribers = new Set<NcpEndpointSubscriber>();\n private readonly activeControllers = new Set<AbortController>();\n private started = false;\n\n constructor(options: NcpHttpAgentClientOptions) {\n this.baseUrl = toBaseUrl(options.baseUrl);\n this.basePath = normalizeBasePath(options.basePath);\n this.fetchImpl = resolveFetchImpl(options.fetchImpl);\n this.defaultHeaders = options.headers ?? {};\n this.manifest = {\n endpointKind: \"custom\",\n endpointId: options.endpointId?.trim() || DEFAULT_ENDPOINT_ID,\n version: \"0.1.0\",\n supportsStreaming: true,\n supportsAbort: true,\n supportsProactiveMessages: false,\n supportsLiveSessionStream: true,\n supportedPartTypes: SUPPORTED_PART_TYPES,\n expectedLatency: \"seconds\",\n metadata: { transport: \"http+sse\", scope: \"agent\" },\n };\n }\n\n async start(): Promise<void> {\n if (this.started) {\n return;\n }\n this.started = true;\n this.publish(createClientEvent({ type: NcpEventType.EndpointReady }));\n }\n\n async stop(): Promise<void> {\n if (!this.started) {\n return;\n }\n this.started = false;\n for (const controller of this.activeControllers) {\n controller.abort();\n }\n this.activeControllers.clear();\n }\n\n async emit(event: NcpEndpointEvent): Promise<void> {\n switch (event.type) {\n case \"message.request\":\n await this.send(event.payload);\n return;\n case \"message.stream-request\":\n await this.stream(event.payload);\n return;\n case \"message.abort\":\n await this.abort(event.payload);\n return;\n default:\n this.publish(event);\n return;\n }\n }\n\n subscribe(listener: NcpEndpointSubscriber): () => void {\n this.subscribers.add(listener);\n return () => {\n this.subscribers.delete(listener);\n };\n }\n\n async send(envelope: NcpAgentSendEnvelope): Promise<NcpRunHandle> {\n await this.ensureStarted();\n const controller = new AbortController();\n this.activeControllers.add(controller);\n try {\n const response = await this.fetchImpl(this.resolveUrl(\"/send\"), {\n method: \"POST\",\n headers: {\n ...this.defaultHeaders,\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(envelope),\n signal: controller.signal,\n });\n if (!response.ok) {\n throw new Error(\n `NCP send command failed with HTTP ${response.status}: ${await safeReadText(response)}`,\n );\n }\n const payload = await response.json() as { ok?: boolean; data?: NcpRunHandle; error?: { message?: string } };\n if (!payload.ok || !payload.data) {\n throw new Error(payload.error?.message ?? \"NCP send command returned an invalid handle.\");\n }\n return payload.data;\n } catch (error) {\n if (controller.signal.aborted) {\n throw new Error(\"NCP send command was cancelled.\");\n }\n if (isNcpHttpAgentClientError(error)) {\n throw error;\n }\n const ncpError = toNcpError(error);\n this.publish(createClientEvent({ type: NcpEventType.EndpointError, payload: ncpError }));\n throw ncpErrorToError(ncpError);\n } finally {\n this.activeControllers.delete(controller);\n }\n }\n\n async stream(payload: NcpStreamRequestPayload): Promise<void> {\n await this.ensureStarted();\n const query = new URLSearchParams({\n sessionId: payload.sessionId,\n });\n await this.streamRequest({\n path: `/stream?${query.toString()}`,\n method: \"GET\",\n });\n }\n\n async abort(payload: NcpMessageAbortPayload): Promise<void> {\n await this.ensureStarted();\n const controller = new AbortController();\n this.activeControllers.add(controller);\n try {\n const response = await this.fetchImpl(this.resolveUrl(\"/abort\"), {\n method: \"POST\",\n headers: {\n ...this.defaultHeaders,\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n if (!response.ok) {\n throw new Error(\n `Abort request failed with HTTP ${response.status}: ${await safeReadText(response)}`,\n );\n }\n } catch (error) {\n if (controller.signal.aborted) {\n return;\n }\n const ncpError = toNcpError(error);\n this.publish(createClientEvent({ type: NcpEventType.EndpointError, payload: ncpError }));\n throw ncpErrorToError(ncpError);\n } finally {\n this.activeControllers.delete(controller);\n }\n }\n\n private async ensureStarted(): Promise<void> {\n if (!this.started) {\n await this.start();\n }\n }\n\n private publish(event: NcpEndpointEvent): void {\n for (const subscriber of this.subscribers) {\n subscriber(event);\n }\n }\n\n private resolveUrl(path: string): URL {\n return new URL(`${this.basePath}${path}`, this.baseUrl);\n }\n\n private async streamRequest(options: StreamRequestOptions): Promise<void> {\n const controller = new AbortController();\n this.activeControllers.add(controller);\n\n try {\n const response = await this.fetchImpl(this.resolveUrl(options.path), {\n method: options.method,\n headers: {\n ...this.defaultHeaders,\n accept: \"text/event-stream\",\n ...(options.body !== undefined\n ? { \"content-type\": \"application/json\" }\n : {}),\n },\n body:\n options.body === undefined ? undefined : JSON.stringify(options.body),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(\n `NCP stream request failed with HTTP ${response.status}: ${await safeReadText(response)}`,\n );\n }\n\n if (!response.body) {\n throw new Error(\"NCP stream response has no body.\");\n }\n\n for await (const frame of consumeSseStream(response.body)) {\n if (controller.signal.aborted) {\n return;\n }\n this.handleSseFrame(frame);\n }\n } catch (error) {\n if (controller.signal.aborted) {\n return;\n }\n if (isNcpHttpAgentClientError(error)) {\n throw error;\n }\n const ncpError = toNcpError(error);\n this.publish(createClientEvent({ type: NcpEventType.EndpointError, payload: ncpError }));\n throw ncpErrorToError(ncpError);\n } finally {\n this.activeControllers.delete(controller);\n }\n }\n\n private handleSseFrame(frame: { event: string; data: string }): void {\n if (frame.event === \"ncp-event\") {\n const event = parseNcpEvent(frame.data);\n if (!event) {\n this.publish(createClientEvent({\n type: NcpEventType.EndpointError,\n payload: {\n code: \"runtime-error\",\n message: \"Received malformed ncp-event frame.\",\n },\n }));\n return;\n }\n this.publish(event);\n return;\n }\n\n if (frame.event === \"error\") {\n const ncpError = parseNcpError(frame.data);\n this.publish(createClientEvent({ type: NcpEventType.EndpointError, payload: ncpError }));\n throw ncpErrorToError(ncpError, { alreadyPublished: true });\n }\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextclaw/ncp-http-agent-client",
3
- "version": "0.3.48-beta.0",
3
+ "version": "0.4.0",
4
4
  "private": false,
5
5
  "description": "HTTP/SSE client transport adapter for NCP agent endpoints.",
6
6
  "type": "module",
@@ -15,7 +15,7 @@
15
15
  "dist"
16
16
  ],
17
17
  "dependencies": {
18
- "@nextclaw/ncp": "0.6.6-beta.0"
18
+ "@nextclaw/ncp": "0.7.0"
19
19
  },
20
20
  "devDependencies": {
21
21
  "@types/node": "^20.17.6",