catelog 0.0.0-stage → 1.0.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.
@@ -0,0 +1,126 @@
1
+ import { createHash, createHmac, timingSafeEqual } from "node:crypto";
2
+ export class SecurityVerificationError extends Error {
3
+ code;
4
+ statusCode;
5
+ constructor(code, message, statusCode = 401) {
6
+ super(message);
7
+ this.code = code;
8
+ this.statusCode = statusCode;
9
+ this.name = "SecurityVerificationError";
10
+ }
11
+ }
12
+ export class SecurityManager {
13
+ secret;
14
+ maxTimestampDriftMs;
15
+ nonceTtlMs;
16
+ seenNonces = new Map();
17
+ activeRunIds = new Set();
18
+ completedRunIds = new Map();
19
+ constructor(options = {}) {
20
+ this.secret = options.secret;
21
+ this.maxTimestampDriftMs = options.maxTimestampDriftMs ?? 300_000; // 5 minutes
22
+ this.nonceTtlMs = options.nonceTtlMs ?? 300_000; // 5 minutes
23
+ }
24
+ setSecret(secret) {
25
+ this.secret = secret;
26
+ }
27
+ getSecret() {
28
+ return this.secret;
29
+ }
30
+ /**
31
+ * Computes SHA-256 hash in lowercase hex of request body
32
+ */
33
+ computeBodyHash(rawBody) {
34
+ return createHash("sha256").update(rawBody).digest("hex");
35
+ }
36
+ /**
37
+ * Constructs the canonical string according to MAPS 1.0.0:
38
+ * METHOD\nPATH\nTIMESTAMP\nNONCE\nRUN_ID\nBodyHash
39
+ */
40
+ buildCanonicalString(method, path, timestamp, nonce, runId, bodyHash) {
41
+ const normalizedMethod = method.toUpperCase();
42
+ const normalizedPath = path.split("?")[0] || "/";
43
+ return `${normalizedMethod}\n${normalizedPath}\n${timestamp}\n${nonce}\n${runId}\n${bodyHash}`;
44
+ }
45
+ /**
46
+ * Calculates HMAC-SHA256 signature in lowercase hex
47
+ */
48
+ calculateSignature(canonicalString, secret) {
49
+ return createHmac("sha256", secret).update(canonicalString).digest("hex");
50
+ }
51
+ /**
52
+ * Verifies headers, timestamp, nonce, and HMAC-SHA256 signature.
53
+ */
54
+ verifyRequest(params) {
55
+ this.cleanupOldEntries();
56
+ // If no secret configured, skip HMAC check (e.g. local dev / unauthenticated mode)
57
+ if (!this.secret) {
58
+ const runId = params.headers["x-marketplace-run-id"] || "dev-run-id";
59
+ const nonce = params.headers["x-marketplace-nonce"] || "dev-nonce";
60
+ const timestamp = Date.now();
61
+ return { runId, nonce, timestamp };
62
+ }
63
+ const timestampHeader = params.headers["x-marketplace-timestamp"];
64
+ const nonceHeader = params.headers["x-marketplace-nonce"];
65
+ const runIdHeader = params.headers["x-marketplace-run-id"];
66
+ const signatureHeader = params.headers["x-marketplace-signature"];
67
+ if (!timestampHeader || !nonceHeader || !runIdHeader || !signatureHeader) {
68
+ throw new SecurityVerificationError("AUTH_INVALID_SIGNATURE", "Missing required marketplace authentication headers", 401);
69
+ }
70
+ const timestamp = Number.parseInt(timestampHeader, 10);
71
+ if (Number.isNaN(timestamp)) {
72
+ throw new SecurityVerificationError("AUTH_TIMESTAMP_OUT_OF_BOUNDS", "Malformed X-Marketplace-Timestamp header", 401);
73
+ }
74
+ // 1. Timestamp Bounds: Reject if |CurrentTime - Timestamp| > 5 minutes
75
+ const now = Date.now();
76
+ if (Math.abs(now - timestamp) > this.maxTimestampDriftMs) {
77
+ throw new SecurityVerificationError("AUTH_TIMESTAMP_OUT_OF_BOUNDS", `Timestamp out of allowable bounds (clock drift > ${this.maxTimestampDriftMs}ms)`, 401);
78
+ }
79
+ // 2. Nonce Uniqueness: Sliding cache
80
+ if (this.seenNonces.has(nonceHeader)) {
81
+ throw new SecurityVerificationError("AUTH_REPLAY_DETECTED", "Duplicate nonce detected (replay attack guard)", 401);
82
+ }
83
+ // 3. Run ID Idempotency: Duplicate active or completed run
84
+ if (this.activeRunIds.has(runIdHeader) || this.completedRunIds.has(runIdHeader)) {
85
+ throw new SecurityVerificationError("AUTH_REPLAY_DETECTED", `Run ID ${runIdHeader} is currently executing or has already been completed`, 401);
86
+ }
87
+ // 4. Verify HMAC signature
88
+ const bodyHash = this.computeBodyHash(params.rawBody);
89
+ const canonicalString = this.buildCanonicalString(params.method, params.path, timestampHeader, nonceHeader, runIdHeader, bodyHash);
90
+ const expectedSignature = this.calculateSignature(canonicalString, this.secret);
91
+ const sigBuf = Buffer.from(signatureHeader.toLowerCase(), "utf8");
92
+ const expBuf = Buffer.from(expectedSignature.toLowerCase(), "utf8");
93
+ if (sigBuf.length !== expBuf.length || !timingSafeEqual(sigBuf, expBuf)) {
94
+ throw new SecurityVerificationError("AUTH_INVALID_SIGNATURE", "HMAC-SHA256 signature verification failed", 401);
95
+ }
96
+ // Mark nonce as seen
97
+ this.seenNonces.set(nonceHeader, now);
98
+ return {
99
+ runId: runIdHeader,
100
+ nonce: nonceHeader,
101
+ timestamp,
102
+ };
103
+ }
104
+ markRunStarted(runId) {
105
+ this.activeRunIds.add(runId);
106
+ }
107
+ markRunCompleted(runId) {
108
+ this.activeRunIds.delete(runId);
109
+ this.completedRunIds.set(runId, Date.now());
110
+ }
111
+ cleanupOldEntries() {
112
+ const now = Date.now();
113
+ const expiry = now - this.nonceTtlMs;
114
+ for (const [nonce, time] of this.seenNonces.entries()) {
115
+ if (time < expiry) {
116
+ this.seenNonces.delete(nonce);
117
+ }
118
+ }
119
+ for (const [runId, time] of this.completedRunIds.entries()) {
120
+ if (time < expiry) {
121
+ this.completedRunIds.delete(runId);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type Server } from "node:http";
2
+ import type { MarketplaceAgent } from "./agent.js";
3
+ export interface ServerOptions {
4
+ port?: number;
5
+ host?: string;
6
+ silent?: boolean;
7
+ onListening?: (url: string) => void;
8
+ }
9
+ export declare function startAgentServer(agent: MarketplaceAgent<any, any>, options?: ServerOptions): Server;
10
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAA6C,MAAM,WAAW,CAAC;AACjG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAwBvG"}
package/dist/server.js ADDED
@@ -0,0 +1,26 @@
1
+ import { createServer } from "node:http";
2
+ import { renderBanner } from "./banner.js";
3
+ export function startAgentServer(agent, options = {}) {
4
+ const port = options.port ?? (process.env.PORT ? Number.parseInt(process.env.PORT, 10) : 3000);
5
+ const host = options.host ?? "0.0.0.0";
6
+ const server = createServer((req, res) => {
7
+ agent.handleRequest(req, res).catch((err) => {
8
+ console.error("[catelog-sdk] Unhandled error during request handling:", err);
9
+ if (!res.writableEnded) {
10
+ res.writeHead(500, { "Content-Type": "application/json" });
11
+ res.end(JSON.stringify({ error: { code: "INTERNAL_CRASH", message: "Server encountered an unhandled error" } }));
12
+ }
13
+ });
14
+ });
15
+ server.listen(port, host, () => {
16
+ const url = `http://${host === "0.0.0.0" ? "localhost" : host}:${port}`;
17
+ if (options.onListening) {
18
+ options.onListening(url);
19
+ }
20
+ else if (!options.silent) {
21
+ renderBanner("startup", { name: agent.name, url });
22
+ }
23
+ });
24
+ return server;
25
+ }
26
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AAEjG,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,MAAM,UAAU,gBAAgB,CAAC,KAAiC,EAAE,UAAyB,EAAE;IAC7F,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;IAEvC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAoB,EAAE,GAAmB,EAAE,EAAE;QACxE,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1C,OAAO,CAAC,KAAK,CAAC,wDAAwD,EAAE,GAAG,CAAC,CAAC;YAC7E,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBACvB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,uCAAuC,EAAE,EAAE,CAAC,CAAC,CAAC;YACnH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;QAC7B,MAAM,GAAG,GAAG,UAAU,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;QACxE,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3B,YAAY,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/sse.d.ts ADDED
@@ -0,0 +1,32 @@
1
+ import type { ServerResponse } from "node:http";
2
+ import type { AgentStream, StructuredError, TelemetryData } from "./types.js";
3
+ export interface SSEWriterOptions {
4
+ heartbeatIntervalMs?: number;
5
+ onClientDisconnect?: () => void;
6
+ }
7
+ export declare class SSEWriter implements AgentStream {
8
+ private runId;
9
+ private res;
10
+ private heartbeatTimer?;
11
+ private stepIndex;
12
+ private deltaIndex;
13
+ private closed;
14
+ private abortController;
15
+ constructor(runId: string, res: ServerResponse, options?: SSEWriterOptions);
16
+ get signal(): AbortSignal;
17
+ isClosed(): boolean;
18
+ /**
19
+ * Generic raw event sender adhering to SSE framing:
20
+ * event: <EVENT_TYPE>\ndata: <JSON_STRING>\n\n
21
+ */
22
+ sendEvent(eventType: string, data: unknown): void;
23
+ sendRunStarted(): void;
24
+ step(label: string): void;
25
+ delta(content: string, delta_type?: "text" | "json_patch"): void;
26
+ emit(event: string, data: unknown): void;
27
+ sendRunSucceeded<TOutput>(output: TOutput, durationMs: number, telemetry?: TelemetryData): void;
28
+ sendRunFailed(error: StructuredError, durationMs: number): void;
29
+ close(): void;
30
+ private clearHeartbeat;
31
+ }
32
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EACV,WAAW,EAOX,eAAe,EACf,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED,qBAAa,SAAU,YAAW,WAAW;IAC3C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,GAAG,CAAiB;IAC5B,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAkB;gBAE7B,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,OAAO,GAAE,gBAAqB;IAwC9E,IAAW,MAAM,IAAI,WAAW,CAE/B;IAEM,QAAQ,IAAI,OAAO;IAI1B;;;OAGG;IACI,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAUjD,cAAc,IAAI,IAAI;IAStB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAYzB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,GAAG,YAAqB,GAAG,IAAI;IAWxE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAIxC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,aAAa,GAAG,IAAI;IAa/F,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAY/D,KAAK,IAAI,IAAI;IAWpB,OAAO,CAAC,cAAc;CAMvB"}
package/dist/sse.js ADDED
@@ -0,0 +1,141 @@
1
+ export class SSEWriter {
2
+ runId;
3
+ res;
4
+ heartbeatTimer;
5
+ stepIndex = 0;
6
+ deltaIndex = 0;
7
+ closed = false;
8
+ abortController;
9
+ constructor(runId, res, options = {}) {
10
+ this.runId = runId;
11
+ this.res = res;
12
+ this.abortController = new AbortController();
13
+ // Set standard SSE headers
14
+ this.res.writeHead(200, {
15
+ "Content-Type": "text/event-stream; charset=utf-8",
16
+ "Cache-Control": "no-cache, no-transform",
17
+ Connection: "keep-alive",
18
+ "X-Accel-Buffering": "no",
19
+ });
20
+ // Flush headers if supported
21
+ if (typeof this.res.flushHeaders === "function") {
22
+ this.res.flushHeaders();
23
+ }
24
+ // Client disconnect detection
25
+ this.res.on("close", () => {
26
+ if (!this.closed) {
27
+ this.closed = true;
28
+ this.clearHeartbeat();
29
+ this.abortController.abort();
30
+ options.onClientDisconnect?.();
31
+ }
32
+ });
33
+ // Start 15-second heartbeat
34
+ const interval = options.heartbeatIntervalMs ?? 15_000;
35
+ this.heartbeatTimer = setInterval(() => {
36
+ if (!this.closed) {
37
+ this.sendEvent("heartbeat", {
38
+ event: "heartbeat",
39
+ timestamp: Date.now(),
40
+ });
41
+ }
42
+ }, interval);
43
+ }
44
+ get signal() {
45
+ return this.abortController.signal;
46
+ }
47
+ isClosed() {
48
+ return this.closed;
49
+ }
50
+ /**
51
+ * Generic raw event sender adhering to SSE framing:
52
+ * event: <EVENT_TYPE>\ndata: <JSON_STRING>\n\n
53
+ */
54
+ sendEvent(eventType, data) {
55
+ if (this.closed)
56
+ return;
57
+ try {
58
+ this.res.write(`event: ${eventType}\ndata: ${JSON.stringify(data)}\n\n`);
59
+ }
60
+ catch {
61
+ this.closed = true;
62
+ this.clearHeartbeat();
63
+ }
64
+ }
65
+ sendRunStarted() {
66
+ const payload = {
67
+ event: "run.started",
68
+ run_id: this.runId,
69
+ timestamp: Date.now(),
70
+ };
71
+ this.sendEvent("run.started", payload);
72
+ }
73
+ step(label) {
74
+ this.stepIndex += 1;
75
+ const payload = {
76
+ event: "step.started",
77
+ run_id: this.runId,
78
+ step_index: this.stepIndex,
79
+ label,
80
+ timestamp: Date.now(),
81
+ };
82
+ this.sendEvent("step.started", payload);
83
+ }
84
+ delta(content, delta_type = "text") {
85
+ const payload = {
86
+ event: "output.delta",
87
+ run_id: this.runId,
88
+ index: this.deltaIndex++,
89
+ delta_type,
90
+ content,
91
+ };
92
+ this.sendEvent("output.delta", payload);
93
+ }
94
+ emit(event, data) {
95
+ this.sendEvent(event, data);
96
+ }
97
+ sendRunSucceeded(output, durationMs, telemetry) {
98
+ if (this.closed)
99
+ return;
100
+ const payload = {
101
+ event: "run.succeeded",
102
+ run_id: this.runId,
103
+ duration_ms: durationMs,
104
+ output,
105
+ telemetry,
106
+ };
107
+ this.sendEvent("run.succeeded", payload);
108
+ this.close();
109
+ }
110
+ sendRunFailed(error, durationMs) {
111
+ if (this.closed)
112
+ return;
113
+ const payload = {
114
+ event: "run.failed",
115
+ run_id: this.runId,
116
+ duration_ms: durationMs,
117
+ error,
118
+ };
119
+ this.sendEvent("run.failed", payload);
120
+ this.close();
121
+ }
122
+ close() {
123
+ if (this.closed)
124
+ return;
125
+ this.closed = true;
126
+ this.clearHeartbeat();
127
+ try {
128
+ this.res.end();
129
+ }
130
+ catch {
131
+ // Ignore write errors on close
132
+ }
133
+ }
134
+ clearHeartbeat() {
135
+ if (this.heartbeatTimer) {
136
+ clearInterval(this.heartbeatTimer);
137
+ this.heartbeatTimer = undefined;
138
+ }
139
+ }
140
+ }
141
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ export declare const PROTOCOL_VERSION = "1.0.0";
2
+ /**
3
+ * Standard error codes defined by Marketplace Agent Protocol Specification (MAPS)
4
+ */
5
+ export type ErrorCode = "AUTH_INVALID_SIGNATURE" | "AUTH_TIMESTAMP_OUT_OF_BOUNDS" | "AUTH_REPLAY_DETECTED" | "INVALID_INPUT" | "MODEL_RATE_LIMIT" | "UPSTREAM_TIMEOUT" | "EXECUTION_TIMEOUT" | "INTERNAL_CRASH" | "TOOL_FAILURE";
6
+ export interface StructuredError {
7
+ code: ErrorCode | string;
8
+ message: string;
9
+ retryable: boolean;
10
+ details?: Record<string, unknown>;
11
+ }
12
+ export interface TelemetryData {
13
+ llm_tokens?: {
14
+ prompt?: number;
15
+ completion?: number;
16
+ total?: number;
17
+ };
18
+ model_used?: string;
19
+ cost_usd?: number;
20
+ }
21
+ export interface AgentCapabilities {
22
+ streaming: boolean;
23
+ delta_stream?: boolean;
24
+ max_timeout_seconds?: number;
25
+ }
26
+ export interface AgentManifest {
27
+ id: string;
28
+ name: string;
29
+ version: string;
30
+ description: string;
31
+ protocol_version: string;
32
+ capabilities: AgentCapabilities;
33
+ input_schema: Record<string, unknown>;
34
+ output_schema: Record<string, unknown>;
35
+ }
36
+ export interface HealthCheckResponse {
37
+ status: "ready" | "degraded" | "not_ready";
38
+ protocol_version: string;
39
+ uptime_seconds: number;
40
+ environment_ready: boolean;
41
+ details?: Record<string, unknown>;
42
+ }
43
+ export interface ExecuteRequest<TInput = Record<string, unknown>> {
44
+ run_id: string;
45
+ input: TInput;
46
+ deadline_ms?: number;
47
+ metadata?: {
48
+ buyer_id?: string;
49
+ session_id?: string;
50
+ [key: string]: unknown;
51
+ };
52
+ }
53
+ export interface ExecuteSuccessResponse<TOutput = Record<string, unknown>> {
54
+ run_id: string;
55
+ status: "succeeded";
56
+ duration_ms: number;
57
+ output: TOutput;
58
+ error?: false;
59
+ telemetry?: TelemetryData;
60
+ }
61
+ export interface ExecuteFailureResponse {
62
+ run_id: string;
63
+ status: "failed" | "cancelled";
64
+ duration_ms: number;
65
+ error: StructuredError;
66
+ output?: false;
67
+ telemetry?: TelemetryData;
68
+ }
69
+ export type ExecuteResponse<TOutput = Record<string, unknown>> = ExecuteSuccessResponse<TOutput> | ExecuteFailureResponse;
70
+ export interface RunStartedEvent {
71
+ event: "run.started";
72
+ run_id: string;
73
+ timestamp: number;
74
+ }
75
+ export interface StepStartedEvent {
76
+ event: "step.started";
77
+ run_id: string;
78
+ step_index: number;
79
+ label: string;
80
+ timestamp: number;
81
+ }
82
+ export interface OutputDeltaEvent {
83
+ event: "output.delta";
84
+ run_id: string;
85
+ index: number;
86
+ delta_type: "text" | "json_patch";
87
+ content: string;
88
+ }
89
+ export interface HeartbeatEvent {
90
+ event: "heartbeat";
91
+ timestamp: number;
92
+ }
93
+ export interface RunSucceededEvent<TOutput = Record<string, unknown>> {
94
+ event: "run.succeeded";
95
+ run_id: string;
96
+ duration_ms: number;
97
+ output: TOutput;
98
+ telemetry?: TelemetryData;
99
+ }
100
+ export interface RunFailedEvent {
101
+ event: "run.failed";
102
+ run_id: string;
103
+ duration_ms: number;
104
+ error: StructuredError;
105
+ }
106
+ export type SSEProtocolEvent = RunStartedEvent | StepStartedEvent | OutputDeltaEvent | HeartbeatEvent | RunSucceededEvent | RunFailedEvent;
107
+ /**
108
+ * Stream controller passed to agent execute handlers
109
+ */
110
+ export interface AgentStream {
111
+ step: (label: string) => void;
112
+ delta: (content: string, type?: "text" | "json_patch") => void;
113
+ emit: (event: string, data: unknown) => void;
114
+ isClosed: () => boolean;
115
+ }
116
+ export interface AgentExecutionContext<TInput = Record<string, unknown>> {
117
+ runId: string;
118
+ input: TInput;
119
+ stream: AgentStream;
120
+ signal: AbortSignal;
121
+ metadata?: Record<string, unknown>;
122
+ deadlineMs?: number;
123
+ }
124
+ export interface AgentExecutionResult<TOutput = Record<string, unknown>> {
125
+ output: TOutput;
126
+ telemetry?: TelemetryData;
127
+ }
128
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAExC;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,wBAAwB,GACxB,8BAA8B,GAC9B,sBAAsB,GACtB,eAAe,GACf,kBAAkB,GAClB,kBAAkB,GAClB,mBAAmB,GACnB,gBAAgB,GAChB,cAAc,CAAC;AAEnB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE;QACX,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,iBAAiB,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;IAC3C,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAED,MAAM,MAAM,eAAe,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACzD,sBAAsB,CAAC,OAAO,CAAC,GAC/B,sBAAsB,CAAC;AAG3B,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,YAAY,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAClE,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,MAAM,gBAAgB,GACxB,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,cAAc,GACd,iBAAiB,GACjB,cAAc,CAAC;AAEnB;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,KAAK,IAAI,CAAC;IAC/D,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,QAAQ,EAAE,MAAM,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrE,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export const PROTOCOL_VERSION = "1.0.0";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,53 @@
1
1
  {
2
2
  "name": "catelog",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "Official TypeScript SDK for Marketplace Agent Protocol Specification (MAPS)",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "bin": {
15
+ "catelog": "./scripts/postinstall.js"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "scripts",
20
+ "README.md",
21
+ "DECISION.md",
22
+ "LICENSE"
23
+ ],
24
+ "author": "ROX",
25
+ "license": "MIT",
26
+ "keywords": [
27
+ "ai",
28
+ "agent",
29
+ "marketplace",
30
+ "maps",
31
+ "protocol",
32
+ "langgraph",
33
+ "openai",
34
+ "paypal",
35
+ "sdk"
36
+ ],
37
+ "scripts": {
38
+ "build": "tsc",
39
+ "dev": "tsc --watch",
40
+ "test": "tsx test/index.test.ts",
41
+ "prepublishOnly": "npm run build",
42
+ "postinstall": "node ./scripts/postinstall.js"
43
+ },
44
+ "dependencies": {
45
+ "zod": "^3.23.8",
46
+ "zod-to-json-schema": "^3.24.1"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^22.0.0",
50
+ "tsx": "^4.19.0",
51
+ "typescript": "^5.5.0"
52
+ }
53
+ }
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Catelog postinstall hook - Pure zero-dependency Node.js script
5
+ * Runs smoothly in npm, pnpm, yarn, and bun environments.
6
+ */
7
+
8
+ if (process.env.CI || process.env.CATELOG_SILENT || process.env.npm_config_loglevel === "silent") {
9
+ process.exit(0);
10
+ }
11
+
12
+ const c = {
13
+ reset: "\x1b[0m",
14
+ bold: "\x1b[1m",
15
+ dim: "\x1b[2m",
16
+ italic: "\x1b[3m",
17
+ cyan: "\x1b[36m",
18
+ brightCyan: "\x1b[96m",
19
+ magenta: "\x1b[35m",
20
+ brightMagenta: "\x1b[95m",
21
+ green: "\x1b[32m",
22
+ yellow: "\x1b[33m",
23
+ brightYellow: "\x1b[93m",
24
+ gray: "\x1b[90m",
25
+ white: "\x1b[97m",
26
+ brightBlue: "\x1b[94m",
27
+ bgMagenta: "\x1b[45m",
28
+ };
29
+
30
+ const ascii = `
31
+ ${c.brightCyan} ██████╗ █████╗ ████████╗███████╗██╗ ██████╗ ██████╗
32
+ ${c.brightCyan} ██╔════╝██╔══██╗╚══██╔══╝██╔════╝██║ ██╔═══██╗██╔════╝
33
+ ${c.brightMagenta} ██║ ███████║ ██║ █████╗ ██║ ██║ ██║██║ ███╗
34
+ ${c.brightMagenta} ██║ ██╔══██║ ██║ ██╔══╝ ██║ ██║ ██║██║ ██║
35
+ ${c.magenta} ╚██████╗██║ ██║ ██║ ███████╗███████╗╚██████╔╝╚██████╔╝
36
+ ${c.magenta} ╚═════╝╚═╝ ╚═╝ ╚═╝ ╚══════╝╚══════╝ ╚═════╝ ╚═════╝
37
+ `.trimEnd();
38
+
39
+ const width = 68;
40
+ const line = c.gray + "─".repeat(width) + c.reset;
41
+ const doubleLine = c.brightMagenta + "═".repeat(width) + c.reset;
42
+
43
+ console.log("\n" + doubleLine);
44
+ console.log(ascii);
45
+ console.log(line);
46
+ console.log(` ${c.bgMagenta}${c.white}${c.bold} NOTE FROM TEAM ROX ${c.reset}`);
47
+ console.log(
48
+ ` ${c.brightYellow}${c.italic}“Welcome to the agent economy, where humans and agents rent out intelligence.”${c.reset}`
49
+ );
50
+ console.log(line);
51
+ console.log(` ${c.green}✔${c.reset} ${c.bold}Catelog SDK installed successfully!${c.reset}`);
52
+ console.log(` ${c.dim}Supported runtimes & package managers:${c.reset}`);
53
+ console.log(
54
+ ` ${c.cyan}pnpm${c.reset} ${c.gray}|${c.reset} ${c.brightBlue}npm${c.reset} ${c.gray}|${c.reset} ${c.brightMagenta}yarn${c.reset} ${c.gray}|${c.reset} ${c.brightYellow}bun${c.reset} ${c.gray}• Node.js 18+ • TypeScript 5+${c.reset}`
55
+ );
56
+ console.log("");
57
+ console.log(` ${c.bold}Quick Start:${c.reset}`);
58
+ console.log(` ${c.dim}import { createMarketplaceAgent } from "catelog";${c.reset}`);
59
+ console.log(` ${c.dim}const agent = createMarketplaceAgent({ ... });${c.reset}`);
60
+ console.log(` ${c.dim}agent.serve(3000);${c.reset}`);
61
+ console.log(doubleLine + "\n");