@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.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts.map
CHANGED
|
@@ -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;;;
|
|
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
|
+
"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.
|
|
18
|
+
"@nextclaw/ncp": "0.7.0"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@types/node": "^20.17.6",
|