@codespar/sdk 0.0.1 → 0.1.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/README.md +79 -0
- package/dist/__tests__/codespar.test.d.ts +2 -0
- package/dist/__tests__/codespar.test.d.ts.map +1 -0
- package/dist/__tests__/codespar.test.js +257 -0
- package/dist/__tests__/codespar.test.js.map +1 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/session.d.ts +9 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +180 -0
- package/dist/session.js.map +1 -0
- package/dist/types.d.ts +184 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -1
package/README.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# @codespar/sdk
|
|
2
|
+
|
|
3
|
+
Commerce SDK for AI agents — sessions, managed auth, Complete Loop orchestration for Latin American commercial APIs.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @codespar/sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { CodeSpar } from "@codespar/sdk";
|
|
15
|
+
|
|
16
|
+
const cs = new CodeSpar({ apiKey: "ak_..." });
|
|
17
|
+
|
|
18
|
+
const session = await cs.create("user_123", {
|
|
19
|
+
preset: "brazilian",
|
|
20
|
+
manageConnections: { waitForConnections: true },
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// Natural language
|
|
24
|
+
const result = await session.send("Charge R$150 via Pix and issue the NF-e");
|
|
25
|
+
|
|
26
|
+
// Direct tool execution
|
|
27
|
+
const charge = await session.execute("ZOOP_CREATE_CHARGE", {
|
|
28
|
+
amount: 150.0,
|
|
29
|
+
payment_type: "pix",
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Complete Loop
|
|
33
|
+
const loop = await session.loop({
|
|
34
|
+
steps: [
|
|
35
|
+
{ server: "mcp-zoop", tool: "ZOOP_CREATE_CHARGE", params: { amount: 150, payment_type: "pix" } },
|
|
36
|
+
{ server: "mcp-nuvem-fiscal", tool: "NUVEMFISCAL_EMITIR_NFE", params: (prev) => ({ chargeId: prev[0].data }) },
|
|
37
|
+
{ server: "mcp-melhor-envio", tool: "MELHORENVIO_GENERATE_LABEL", params: {} },
|
|
38
|
+
{ server: "mcp-z-api", tool: "ZAPI_SEND_MESSAGE", params: { text: "Your order is on the way!" } },
|
|
39
|
+
],
|
|
40
|
+
onStepComplete: (step, result) => console.log(`✓ ${step.tool}`),
|
|
41
|
+
retryPolicy: { maxRetries: 3, backoff: "exponential" },
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## API
|
|
46
|
+
|
|
47
|
+
### `new CodeSpar(config)`
|
|
48
|
+
|
|
49
|
+
| Option | Type | Default | Description |
|
|
50
|
+
|--------|------|---------|-------------|
|
|
51
|
+
| `apiKey` | `string` | `CODESPAR_API_KEY` env | Your API key |
|
|
52
|
+
| `baseUrl` | `string` | `https://api.codespar.dev` | API base URL |
|
|
53
|
+
| `managed` | `boolean` | `true` | Enable managed billing/logging |
|
|
54
|
+
|
|
55
|
+
### `cs.create(userId, config)`
|
|
56
|
+
|
|
57
|
+
| Option | Type | Description |
|
|
58
|
+
|--------|------|-------------|
|
|
59
|
+
| `servers` | `string[]` | MCP servers to connect |
|
|
60
|
+
| `preset` | `string` | `"brazilian"`, `"mexican"`, `"argentinian"`, `"colombian"`, `"all"` |
|
|
61
|
+
| `manageConnections.waitForConnections` | `boolean` | Block until all servers connected |
|
|
62
|
+
|
|
63
|
+
### Session Methods
|
|
64
|
+
|
|
65
|
+
| Method | Description |
|
|
66
|
+
|--------|-------------|
|
|
67
|
+
| `session.tools()` | Get all available tools |
|
|
68
|
+
| `session.findTools(intent)` | Search tools by description |
|
|
69
|
+
| `session.execute(tool, params)` | Execute a specific tool |
|
|
70
|
+
| `session.send(message)` | Send natural language message |
|
|
71
|
+
| `session.loop(config)` | Run Complete Loop workflow |
|
|
72
|
+
| `session.authorize(serverId)` | Start OAuth flow for a server |
|
|
73
|
+
| `session.connections()` | List connected servers |
|
|
74
|
+
| `session.mcp` | MCP transport URL and headers |
|
|
75
|
+
| `session.close()` | Close session |
|
|
76
|
+
|
|
77
|
+
## License
|
|
78
|
+
|
|
79
|
+
MIT — [codespar.dev](https://codespar.dev)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codespar.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/codespar.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { CodeSpar, SessionConfigSchema } from "../index.js";
|
|
3
|
+
import { createSession } from "../session.js";
|
|
4
|
+
/* ── Helpers ── */
|
|
5
|
+
function mockTool(overrides = {}) {
|
|
6
|
+
return {
|
|
7
|
+
name: "ZOOP_CREATE_CHARGE",
|
|
8
|
+
slug: "zoop_create_charge",
|
|
9
|
+
description: "Create a Pix charge",
|
|
10
|
+
server: "zoop",
|
|
11
|
+
inputSchema: { type: "object", properties: { amount: { type: "number" } } },
|
|
12
|
+
...overrides,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function successResult(tool = "ZOOP_CREATE_CHARGE") {
|
|
16
|
+
return { success: true, data: { id: "ch_1" }, duration: 42, server: "zoop", tool };
|
|
17
|
+
}
|
|
18
|
+
function failResult(tool = "ZOOP_CREATE_CHARGE") {
|
|
19
|
+
return { success: false, data: null, error: "500: Internal Server Error", duration: 10, server: "zoop", tool };
|
|
20
|
+
}
|
|
21
|
+
function mockFetchResponse(body, ok = true, status = 200) {
|
|
22
|
+
return vi.fn().mockResolvedValue({
|
|
23
|
+
ok,
|
|
24
|
+
status,
|
|
25
|
+
json: () => Promise.resolve(body),
|
|
26
|
+
text: () => Promise.resolve(JSON.stringify(body)),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/* ── CodeSpar constructor ── */
|
|
30
|
+
describe("CodeSpar", () => {
|
|
31
|
+
const originalEnv = { ...process.env };
|
|
32
|
+
afterEach(() => {
|
|
33
|
+
process.env = { ...originalEnv };
|
|
34
|
+
});
|
|
35
|
+
it("throws without API key", () => {
|
|
36
|
+
delete process.env.CODESPAR_API_KEY;
|
|
37
|
+
expect(() => new CodeSpar()).toThrow("CodeSpar API key is required");
|
|
38
|
+
});
|
|
39
|
+
it("accepts apiKey via config", () => {
|
|
40
|
+
const cs = new CodeSpar({ apiKey: "ak_test" });
|
|
41
|
+
expect(cs).toBeInstanceOf(CodeSpar);
|
|
42
|
+
});
|
|
43
|
+
it("reads API key from env when not in config", () => {
|
|
44
|
+
process.env.CODESPAR_API_KEY = "ak_env";
|
|
45
|
+
const cs = new CodeSpar();
|
|
46
|
+
expect(cs).toBeInstanceOf(CodeSpar);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
/* ── SessionConfigSchema ── */
|
|
50
|
+
describe("SessionConfigSchema", () => {
|
|
51
|
+
it("validates a valid config", () => {
|
|
52
|
+
const result = SessionConfigSchema.safeParse({
|
|
53
|
+
servers: ["zoop", "nfe"],
|
|
54
|
+
preset: "brazilian",
|
|
55
|
+
manageConnections: { waitForConnections: true, timeout: 5000 },
|
|
56
|
+
metadata: { org: "acme" },
|
|
57
|
+
});
|
|
58
|
+
expect(result.success).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it("validates empty config", () => {
|
|
61
|
+
expect(SessionConfigSchema.safeParse({}).success).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
it("rejects invalid preset", () => {
|
|
64
|
+
const result = SessionConfigSchema.safeParse({ preset: "invalid" });
|
|
65
|
+
expect(result.success).toBe(false);
|
|
66
|
+
});
|
|
67
|
+
it("rejects non-string servers", () => {
|
|
68
|
+
const result = SessionConfigSchema.safeParse({ servers: [123] });
|
|
69
|
+
expect(result.success).toBe(false);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
/* ── createSession ── */
|
|
73
|
+
describe("createSession", () => {
|
|
74
|
+
let fetchMock;
|
|
75
|
+
beforeEach(() => {
|
|
76
|
+
fetchMock = mockFetchResponse({
|
|
77
|
+
id: "sess_1",
|
|
78
|
+
servers: [{ id: "zoop", name: "Zoop", pkg: "@codespar/zoop", connected: true, auth: "oauth2", toolCount: 3 }],
|
|
79
|
+
mcp: { url: "https://mcp.codespar.dev/sess_1", headers: { Authorization: "Bearer tok" } },
|
|
80
|
+
});
|
|
81
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
82
|
+
});
|
|
83
|
+
afterEach(() => {
|
|
84
|
+
vi.restoreAllMocks();
|
|
85
|
+
});
|
|
86
|
+
it("makes POST to /v1/sessions", async () => {
|
|
87
|
+
await createSession("user_1", { preset: "brazilian" }, {
|
|
88
|
+
baseUrl: "https://api.codespar.dev",
|
|
89
|
+
apiKey: "ak_test",
|
|
90
|
+
managed: true,
|
|
91
|
+
});
|
|
92
|
+
expect(fetchMock).toHaveBeenCalledWith("https://api.codespar.dev/v1/sessions", expect.objectContaining({ method: "POST" }));
|
|
93
|
+
});
|
|
94
|
+
it("throws on non-ok response", async () => {
|
|
95
|
+
fetchMock = mockFetchResponse("Unauthorized", false, 401);
|
|
96
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
97
|
+
await expect(createSession("user_1", {}, { baseUrl: "https://api.codespar.dev", apiKey: "bad", managed: true })).rejects.toThrow("Failed to create session");
|
|
98
|
+
});
|
|
99
|
+
it("returns session with correct id and userId", async () => {
|
|
100
|
+
const session = await createSession("user_1", {}, {
|
|
101
|
+
baseUrl: "https://api.codespar.dev",
|
|
102
|
+
apiKey: "ak_test",
|
|
103
|
+
managed: true,
|
|
104
|
+
});
|
|
105
|
+
expect(session.id).toBe("sess_1");
|
|
106
|
+
expect(session.userId).toBe("user_1");
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
/* ── session.findTools ── */
|
|
110
|
+
describe("session.findTools", () => {
|
|
111
|
+
let session;
|
|
112
|
+
beforeEach(async () => {
|
|
113
|
+
const sessionResponse = {
|
|
114
|
+
id: "sess_1",
|
|
115
|
+
servers: [],
|
|
116
|
+
mcp: { url: "https://mcp.codespar.dev/sess_1", headers: {} },
|
|
117
|
+
};
|
|
118
|
+
const connectionsResponse = {
|
|
119
|
+
servers: [],
|
|
120
|
+
tools: [
|
|
121
|
+
mockTool({ name: "ZOOP_CREATE_CHARGE", slug: "zoop_create_charge", description: "Create a Pix charge", server: "zoop" }),
|
|
122
|
+
mockTool({ name: "NFE_ISSUE", slug: "nfe_issue", description: "Issue an NF-e invoice", server: "nfe" }),
|
|
123
|
+
mockTool({ name: "ZOOP_REFUND", slug: "zoop_refund", description: "Refund a charge", server: "zoop" }),
|
|
124
|
+
],
|
|
125
|
+
};
|
|
126
|
+
let callCount = 0;
|
|
127
|
+
vi.stubGlobal("fetch", vi.fn().mockImplementation(() => {
|
|
128
|
+
callCount++;
|
|
129
|
+
if (callCount === 1) {
|
|
130
|
+
return Promise.resolve({ ok: true, json: () => Promise.resolve(sessionResponse) });
|
|
131
|
+
}
|
|
132
|
+
return Promise.resolve({ ok: true, json: () => Promise.resolve(connectionsResponse) });
|
|
133
|
+
}));
|
|
134
|
+
session = await createSession("u1", {}, { baseUrl: "https://api.test", apiKey: "ak", managed: true });
|
|
135
|
+
await session.connections();
|
|
136
|
+
});
|
|
137
|
+
afterEach(() => vi.restoreAllMocks());
|
|
138
|
+
it("filters by tool name", () => {
|
|
139
|
+
expect(session.findTools("refund")).toHaveLength(1);
|
|
140
|
+
expect(session.findTools("refund")[0].slug).toBe("zoop_refund");
|
|
141
|
+
});
|
|
142
|
+
it("filters by server name", () => {
|
|
143
|
+
const zoopTools = session.findTools("zoop");
|
|
144
|
+
expect(zoopTools).toHaveLength(2);
|
|
145
|
+
});
|
|
146
|
+
it("filters by description", () => {
|
|
147
|
+
expect(session.findTools("invoice")).toHaveLength(1);
|
|
148
|
+
});
|
|
149
|
+
it("returns empty when no tools cached", async () => {
|
|
150
|
+
// Create fresh session without calling connections()
|
|
151
|
+
vi.stubGlobal("fetch", mockFetchResponse({
|
|
152
|
+
id: "sess_2", servers: [], mcp: { url: "u", headers: {} },
|
|
153
|
+
}));
|
|
154
|
+
const fresh = await createSession("u2", {}, { baseUrl: "https://api.test", apiKey: "ak", managed: true });
|
|
155
|
+
expect(fresh.findTools("anything")).toEqual([]);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
/* ── session.loop ── */
|
|
159
|
+
describe("session.loop", () => {
|
|
160
|
+
let session;
|
|
161
|
+
let fetchImpl;
|
|
162
|
+
beforeEach(async () => {
|
|
163
|
+
const sessionData = { id: "sess_1", servers: [], mcp: { url: "u", headers: {} } };
|
|
164
|
+
fetchImpl = vi.fn()
|
|
165
|
+
.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(sessionData) }); // createSession
|
|
166
|
+
vi.stubGlobal("fetch", fetchImpl);
|
|
167
|
+
session = await createSession("u1", {}, { baseUrl: "https://api.test", apiKey: "ak", managed: true });
|
|
168
|
+
});
|
|
169
|
+
afterEach(() => vi.restoreAllMocks());
|
|
170
|
+
it("executes steps in order", async () => {
|
|
171
|
+
fetchImpl
|
|
172
|
+
.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(successResult("step_a")) })
|
|
173
|
+
.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(successResult("step_b")) });
|
|
174
|
+
const result = await session.loop({
|
|
175
|
+
steps: [
|
|
176
|
+
{ server: "a", tool: "step_a", params: { x: 1 } },
|
|
177
|
+
{ server: "b", tool: "step_b", params: { y: 2 } },
|
|
178
|
+
],
|
|
179
|
+
});
|
|
180
|
+
expect(result.success).toBe(true);
|
|
181
|
+
expect(result.completedSteps).toBe(2);
|
|
182
|
+
expect(result.totalSteps).toBe(2);
|
|
183
|
+
expect(result.results).toHaveLength(2);
|
|
184
|
+
});
|
|
185
|
+
it("aborts on error by default", async () => {
|
|
186
|
+
fetchImpl
|
|
187
|
+
.mockResolvedValueOnce({ ok: false, status: 500, text: () => Promise.resolve("err") })
|
|
188
|
+
.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(successResult("step_b")) });
|
|
189
|
+
const result = await session.loop({
|
|
190
|
+
steps: [
|
|
191
|
+
{ server: "a", tool: "step_a", params: {} },
|
|
192
|
+
{ server: "b", tool: "step_b", params: {} },
|
|
193
|
+
],
|
|
194
|
+
});
|
|
195
|
+
expect(result.success).toBe(false);
|
|
196
|
+
expect(result.completedSteps).toBe(0);
|
|
197
|
+
// Second step should not have been called
|
|
198
|
+
expect(fetchImpl).toHaveBeenCalledTimes(2); // 1 createSession + 1 failed execute
|
|
199
|
+
});
|
|
200
|
+
it("continues on error when abortOnError is false", async () => {
|
|
201
|
+
fetchImpl
|
|
202
|
+
.mockResolvedValueOnce({ ok: false, status: 500, text: () => Promise.resolve("err") })
|
|
203
|
+
.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(successResult("step_b")) });
|
|
204
|
+
const result = await session.loop({
|
|
205
|
+
steps: [
|
|
206
|
+
{ server: "a", tool: "step_a", params: {} },
|
|
207
|
+
{ server: "b", tool: "step_b", params: {} },
|
|
208
|
+
],
|
|
209
|
+
abortOnError: false,
|
|
210
|
+
});
|
|
211
|
+
expect(result.completedSteps).toBe(1);
|
|
212
|
+
expect(result.results).toHaveLength(2);
|
|
213
|
+
});
|
|
214
|
+
it("retries failed steps", async () => {
|
|
215
|
+
fetchImpl
|
|
216
|
+
.mockResolvedValueOnce({ ok: false, status: 500, text: () => Promise.resolve("err") }) // attempt 0
|
|
217
|
+
.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(successResult("step_a")) }); // attempt 1
|
|
218
|
+
const result = await session.loop({
|
|
219
|
+
steps: [{ server: "a", tool: "step_a", params: {} }],
|
|
220
|
+
retryPolicy: { maxRetries: 1, baseDelay: 1 },
|
|
221
|
+
});
|
|
222
|
+
expect(result.success).toBe(true);
|
|
223
|
+
expect(result.completedSteps).toBe(1);
|
|
224
|
+
});
|
|
225
|
+
it("skips steps when 'when' returns false", async () => {
|
|
226
|
+
fetchImpl
|
|
227
|
+
.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(successResult("step_a")) });
|
|
228
|
+
const result = await session.loop({
|
|
229
|
+
steps: [
|
|
230
|
+
{ server: "a", tool: "step_a", params: {} },
|
|
231
|
+
{ server: "b", tool: "step_b", params: {}, when: () => false },
|
|
232
|
+
],
|
|
233
|
+
});
|
|
234
|
+
expect(result.success).toBe(true);
|
|
235
|
+
expect(result.results).toHaveLength(1);
|
|
236
|
+
});
|
|
237
|
+
it("calls onStepComplete callback", async () => {
|
|
238
|
+
fetchImpl.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(successResult("s")) });
|
|
239
|
+
const onComplete = vi.fn();
|
|
240
|
+
await session.loop({
|
|
241
|
+
steps: [{ server: "a", tool: "s", params: {} }],
|
|
242
|
+
onStepComplete: onComplete,
|
|
243
|
+
});
|
|
244
|
+
expect(onComplete).toHaveBeenCalledOnce();
|
|
245
|
+
expect(onComplete).toHaveBeenCalledWith(expect.objectContaining({ tool: "s" }), expect.objectContaining({ success: true }), 0);
|
|
246
|
+
});
|
|
247
|
+
it("calls onStepError callback on failure", async () => {
|
|
248
|
+
fetchImpl.mockResolvedValueOnce({ ok: false, status: 500, text: () => Promise.resolve("boom") });
|
|
249
|
+
const onError = vi.fn();
|
|
250
|
+
await session.loop({
|
|
251
|
+
steps: [{ server: "a", tool: "s", params: {} }],
|
|
252
|
+
onStepError: onError,
|
|
253
|
+
});
|
|
254
|
+
expect(onError).toHaveBeenCalledOnce();
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
//# sourceMappingURL=codespar.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codespar.test.js","sourceRoot":"","sources":["../../src/__tests__/codespar.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @codespar/sdk — Commerce SDK for AI agents
|
|
3
|
+
*
|
|
4
|
+
* Sessions, managed auth, Complete Loop orchestration
|
|
5
|
+
* for Latin American commercial APIs.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { CodeSpar } from "@codespar/sdk";
|
|
10
|
+
*
|
|
11
|
+
* const cs = new CodeSpar({ apiKey: "ak_..." });
|
|
12
|
+
* const session = await cs.create("user_123", { preset: "brazilian" });
|
|
13
|
+
* const result = await session.send("Charge R$150 via Pix and issue the NF-e");
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @packageDocumentation
|
|
17
|
+
*/
|
|
18
|
+
export type { CodeSparConfig, Session, SessionConfig, Tool, ToolResult, LoopConfig, LoopStep, LoopResult, AuthConfig, AuthResult, ServerConnection, SendResult, } from "./types.js";
|
|
19
|
+
export { SessionConfigSchema } from "./types.js";
|
|
20
|
+
import type { CodeSparConfig, Session, SessionConfig } from "./types.js";
|
|
21
|
+
export declare class CodeSpar {
|
|
22
|
+
private readonly config;
|
|
23
|
+
constructor(config?: CodeSparConfig);
|
|
24
|
+
/**
|
|
25
|
+
* Create a new session for a user.
|
|
26
|
+
*
|
|
27
|
+
* @param userId - Unique user identifier
|
|
28
|
+
* @param config - Session configuration (servers, preset, auth)
|
|
29
|
+
* @returns A session with tools, execute, loop, and send methods
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const session = await cs.create("user_123", {
|
|
34
|
+
* preset: "brazilian",
|
|
35
|
+
* manageConnections: { waitForConnections: true },
|
|
36
|
+
* });
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
create(userId: string, config?: SessionConfig): Promise<Session>;
|
|
40
|
+
/**
|
|
41
|
+
* Auth manager for programmatic OAuth flows.
|
|
42
|
+
*/
|
|
43
|
+
get authManager(): {
|
|
44
|
+
/**
|
|
45
|
+
* Get the OAuth connect URL for a provider.
|
|
46
|
+
* Redirect the user to this URL to start the OAuth flow.
|
|
47
|
+
*/
|
|
48
|
+
getConnectUrl(serverId: string, redirectUrl?: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Check connection status for a server.
|
|
51
|
+
*/
|
|
52
|
+
getStatus(serverId: string): Promise<{
|
|
53
|
+
connected: boolean;
|
|
54
|
+
expiresAt?: string;
|
|
55
|
+
}>;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export default CodeSpar;
|
|
59
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,YAAY,EACV,cAAc,EACd,OAAO,EACP,aAAa,EACb,IAAI,EACJ,UAAU,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EACV,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAMzE,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;gBAEtC,MAAM,GAAE,cAAmB;IAevC;;;;;;;;;;;;;;OAcG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1E;;OAEG;IACH,IAAI,WAAW;QAKX;;;WAGG;gCACqB,MAAM,gBAAgB,MAAM,GAAG,MAAM;QAM7D;;WAEG;4BACuB,MAAM,GAAG,OAAO,CAAC;YAAE,SAAS,EAAE,OAAO,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;MAQzF;CACF;AAED,eAAe,QAAQ,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @codespar/sdk — Commerce SDK for AI agents
|
|
3
|
+
*
|
|
4
|
+
* Sessions, managed auth, Complete Loop orchestration
|
|
5
|
+
* for Latin American commercial APIs.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { CodeSpar } from "@codespar/sdk";
|
|
10
|
+
*
|
|
11
|
+
* const cs = new CodeSpar({ apiKey: "ak_..." });
|
|
12
|
+
* const session = await cs.create("user_123", { preset: "brazilian" });
|
|
13
|
+
* const result = await session.send("Charge R$150 via Pix and issue the NF-e");
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @packageDocumentation
|
|
17
|
+
*/
|
|
18
|
+
export { SessionConfigSchema } from "./types.js";
|
|
19
|
+
import { SessionConfigSchema } from "./types.js";
|
|
20
|
+
import { createSession } from "./session.js";
|
|
21
|
+
const DEFAULT_BASE_URL = "https://api.codespar.dev";
|
|
22
|
+
export class CodeSpar {
|
|
23
|
+
config;
|
|
24
|
+
constructor(config = {}) {
|
|
25
|
+
this.config = {
|
|
26
|
+
apiKey: config.apiKey || process.env.CODESPAR_API_KEY || "",
|
|
27
|
+
baseUrl: config.baseUrl || process.env.CODESPAR_BASE_URL || DEFAULT_BASE_URL,
|
|
28
|
+
managed: config.managed ?? true,
|
|
29
|
+
};
|
|
30
|
+
if (!this.config.apiKey) {
|
|
31
|
+
throw new Error("CodeSpar API key is required. Pass { apiKey: '...' } or set CODESPAR_API_KEY env var.\n" +
|
|
32
|
+
"Get your key at https://dashboard.codespar.dev/settings?tab=api-keys");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create a new session for a user.
|
|
37
|
+
*
|
|
38
|
+
* @param userId - Unique user identifier
|
|
39
|
+
* @param config - Session configuration (servers, preset, auth)
|
|
40
|
+
* @returns A session with tools, execute, loop, and send methods
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* const session = await cs.create("user_123", {
|
|
45
|
+
* preset: "brazilian",
|
|
46
|
+
* manageConnections: { waitForConnections: true },
|
|
47
|
+
* });
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
async create(userId, config = {}) {
|
|
51
|
+
// Validate config
|
|
52
|
+
SessionConfigSchema.parse(config);
|
|
53
|
+
return createSession(userId, config, {
|
|
54
|
+
baseUrl: this.config.baseUrl,
|
|
55
|
+
apiKey: this.config.apiKey,
|
|
56
|
+
managed: this.config.managed,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Auth manager for programmatic OAuth flows.
|
|
61
|
+
*/
|
|
62
|
+
get authManager() {
|
|
63
|
+
const baseUrl = this.config.baseUrl;
|
|
64
|
+
const apiKey = this.config.apiKey;
|
|
65
|
+
return {
|
|
66
|
+
/**
|
|
67
|
+
* Get the OAuth connect URL for a provider.
|
|
68
|
+
* Redirect the user to this URL to start the OAuth flow.
|
|
69
|
+
*/
|
|
70
|
+
getConnectUrl(serverId, redirectUrl) {
|
|
71
|
+
const params = new URLSearchParams({ serverId });
|
|
72
|
+
if (redirectUrl)
|
|
73
|
+
params.set("redirect", redirectUrl);
|
|
74
|
+
return `${baseUrl}/v1/auth/connect?${params.toString()}&key=${apiKey}`;
|
|
75
|
+
},
|
|
76
|
+
/**
|
|
77
|
+
* Check connection status for a server.
|
|
78
|
+
*/
|
|
79
|
+
async getStatus(serverId) {
|
|
80
|
+
const res = await fetch(`${baseUrl}/v1/auth/status/${serverId}`, {
|
|
81
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
82
|
+
});
|
|
83
|
+
if (!res.ok)
|
|
84
|
+
return { connected: false };
|
|
85
|
+
return res.json();
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export default CodeSpar;
|
|
91
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAiBH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAEpD,MAAM,OAAO,QAAQ;IACF,MAAM,CAA2B;IAElD,YAAY,SAAyB,EAAE;QACrC,IAAI,CAAC,MAAM,GAAG;YACZ,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE;YAC3D,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,gBAAgB;YAC5E,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;SAChC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,yFAAyF;gBACzF,sEAAsE,CACvE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,SAAwB,EAAE;QACrD,kBAAkB;QAClB,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAElC,OAAO,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE;YACnC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;SAC7B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAElC,OAAO;YACL;;;eAGG;YACH,aAAa,CAAC,QAAgB,EAAE,WAAoB;gBAClD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACjD,IAAI,WAAW;oBAAE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;gBACrD,OAAO,GAAG,OAAO,oBAAoB,MAAM,CAAC,QAAQ,EAAE,QAAQ,MAAM,EAAE,CAAC;YACzE,CAAC;YAED;;eAEG;YACH,KAAK,CAAC,SAAS,CAAC,QAAgB;gBAC9B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,mBAAmB,QAAQ,EAAE,EAAE;oBAC/D,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE;iBAC/C,CAAC,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,EAAE;oBAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBACzC,OAAO,GAAG,CAAC,IAAI,EAAyD,CAAC;YAC3E,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AAED,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Session, SessionConfig } from "./types.js";
|
|
2
|
+
interface SessionDeps {
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
apiKey: string;
|
|
5
|
+
managed: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function createSession(userId: string, config: SessionConfig, deps: SessionDeps): Promise<Session>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EASd,MAAM,YAAY,CAAC;AAEpB,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,OAAO,CAAC,CAqNlB"}
|
package/dist/session.js
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
export async function createSession(userId, config, deps) {
|
|
2
|
+
const { baseUrl, apiKey, managed } = deps;
|
|
3
|
+
const headers = {
|
|
4
|
+
"Content-Type": "application/json",
|
|
5
|
+
Authorization: `Bearer ${apiKey}`,
|
|
6
|
+
};
|
|
7
|
+
// Create session on backend
|
|
8
|
+
const res = await fetch(`${baseUrl}/v1/sessions`, {
|
|
9
|
+
method: "POST",
|
|
10
|
+
headers,
|
|
11
|
+
body: JSON.stringify({ userId, ...config }),
|
|
12
|
+
});
|
|
13
|
+
if (!res.ok) {
|
|
14
|
+
const body = await res.text();
|
|
15
|
+
throw new Error(`Failed to create session: ${res.status} ${body}`);
|
|
16
|
+
}
|
|
17
|
+
const data = await res.json();
|
|
18
|
+
let cachedTools = null;
|
|
19
|
+
const session = {
|
|
20
|
+
id: data.id,
|
|
21
|
+
userId,
|
|
22
|
+
servers: data.servers,
|
|
23
|
+
createdAt: new Date(),
|
|
24
|
+
mcp: data.mcp,
|
|
25
|
+
tools() {
|
|
26
|
+
if (cachedTools)
|
|
27
|
+
return cachedTools;
|
|
28
|
+
// Tools are loaded lazily on first call
|
|
29
|
+
throw new Error("Call await session.connections() first to load tools, or use session.findTools()");
|
|
30
|
+
},
|
|
31
|
+
findTools(intent) {
|
|
32
|
+
if (!cachedTools)
|
|
33
|
+
return [];
|
|
34
|
+
const q = intent.toLowerCase();
|
|
35
|
+
return cachedTools.filter((t) => t.name.toLowerCase().includes(q) ||
|
|
36
|
+
t.description.toLowerCase().includes(q) ||
|
|
37
|
+
t.server.toLowerCase().includes(q));
|
|
38
|
+
},
|
|
39
|
+
async execute(toolName, params) {
|
|
40
|
+
const start = Date.now();
|
|
41
|
+
const r = await fetch(`${baseUrl}/v1/sessions/${data.id}/execute`, {
|
|
42
|
+
method: "POST",
|
|
43
|
+
headers,
|
|
44
|
+
body: JSON.stringify({ tool: toolName, params }),
|
|
45
|
+
});
|
|
46
|
+
if (!r.ok) {
|
|
47
|
+
const body = await r.text();
|
|
48
|
+
return {
|
|
49
|
+
success: false,
|
|
50
|
+
data: null,
|
|
51
|
+
error: `${r.status}: ${body}`,
|
|
52
|
+
duration: Date.now() - start,
|
|
53
|
+
server: "",
|
|
54
|
+
tool: toolName,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const result = await r.json();
|
|
58
|
+
return { ...result, duration: result.duration || Date.now() - start };
|
|
59
|
+
},
|
|
60
|
+
async loop(loopConfig) {
|
|
61
|
+
const start = Date.now();
|
|
62
|
+
const results = [];
|
|
63
|
+
const maxRetries = loopConfig.retryPolicy?.maxRetries ?? 0;
|
|
64
|
+
const abortOnError = loopConfig.abortOnError ?? true;
|
|
65
|
+
for (let i = 0; i < loopConfig.steps.length; i++) {
|
|
66
|
+
const step = loopConfig.steps[i];
|
|
67
|
+
// Check conditional
|
|
68
|
+
if (step.when && !step.when(results)) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// Resolve params (can be a function of previous results)
|
|
72
|
+
const params = typeof step.params === "function" ? step.params(results) : step.params;
|
|
73
|
+
let lastError = null;
|
|
74
|
+
let result = null;
|
|
75
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
76
|
+
try {
|
|
77
|
+
result = await session.execute(step.tool, params);
|
|
78
|
+
if (result.success) {
|
|
79
|
+
lastError = null;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
lastError = new Error(result.error || "Tool execution failed");
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
86
|
+
}
|
|
87
|
+
// Backoff before retry
|
|
88
|
+
if (attempt < maxRetries) {
|
|
89
|
+
const baseDelay = loopConfig.retryPolicy?.baseDelay ?? 1000;
|
|
90
|
+
const delay = loopConfig.retryPolicy?.backoff === "exponential"
|
|
91
|
+
? baseDelay * Math.pow(2, attempt)
|
|
92
|
+
: baseDelay * (attempt + 1);
|
|
93
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (lastError || !result?.success) {
|
|
97
|
+
if (loopConfig.onStepError) {
|
|
98
|
+
loopConfig.onStepError(step, lastError || new Error("Unknown error"), i);
|
|
99
|
+
}
|
|
100
|
+
if (result)
|
|
101
|
+
results.push(result);
|
|
102
|
+
if (abortOnError) {
|
|
103
|
+
return {
|
|
104
|
+
success: false,
|
|
105
|
+
results,
|
|
106
|
+
duration: Date.now() - start,
|
|
107
|
+
completedSteps: results.filter((r) => r.success).length,
|
|
108
|
+
totalSteps: loopConfig.steps.length,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
results.push(result);
|
|
114
|
+
if (loopConfig.onStepComplete) {
|
|
115
|
+
loopConfig.onStepComplete(step, result, i);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
success: results.every((r) => r.success),
|
|
120
|
+
results,
|
|
121
|
+
duration: Date.now() - start,
|
|
122
|
+
completedSteps: results.filter((r) => r.success).length,
|
|
123
|
+
totalSteps: loopConfig.steps.length,
|
|
124
|
+
};
|
|
125
|
+
},
|
|
126
|
+
async send(message) {
|
|
127
|
+
const start = Date.now();
|
|
128
|
+
const r = await fetch(`${baseUrl}/v1/sessions/${data.id}/send`, {
|
|
129
|
+
method: "POST",
|
|
130
|
+
headers,
|
|
131
|
+
body: JSON.stringify({ message }),
|
|
132
|
+
});
|
|
133
|
+
if (!r.ok) {
|
|
134
|
+
const body = await r.text();
|
|
135
|
+
throw new Error(`Send failed: ${r.status} ${body}`);
|
|
136
|
+
}
|
|
137
|
+
const result = await r.json();
|
|
138
|
+
return { ...result, duration: result.duration || Date.now() - start };
|
|
139
|
+
},
|
|
140
|
+
async authorize(serverId, authConfig) {
|
|
141
|
+
const r = await fetch(`${baseUrl}/v1/sessions/${data.id}/authorize`, {
|
|
142
|
+
method: "POST",
|
|
143
|
+
headers,
|
|
144
|
+
body: JSON.stringify({ serverId, ...authConfig }),
|
|
145
|
+
});
|
|
146
|
+
if (!r.ok) {
|
|
147
|
+
return { connected: false, error: `Auth failed: ${r.status}` };
|
|
148
|
+
}
|
|
149
|
+
return r.json();
|
|
150
|
+
},
|
|
151
|
+
async connections() {
|
|
152
|
+
const r = await fetch(`${baseUrl}/v1/sessions/${data.id}/connections`, { headers });
|
|
153
|
+
if (!r.ok)
|
|
154
|
+
return session.servers;
|
|
155
|
+
const connections = await r.json();
|
|
156
|
+
session.servers = connections.servers;
|
|
157
|
+
cachedTools = connections.tools;
|
|
158
|
+
return connections.servers;
|
|
159
|
+
},
|
|
160
|
+
async close() {
|
|
161
|
+
await fetch(`${baseUrl}/v1/sessions/${data.id}`, {
|
|
162
|
+
method: "DELETE",
|
|
163
|
+
headers,
|
|
164
|
+
});
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
// If waitForConnections, poll until ready
|
|
168
|
+
if (config.manageConnections?.waitForConnections) {
|
|
169
|
+
const timeout = config.manageConnections.timeout ?? 30000;
|
|
170
|
+
const start = Date.now();
|
|
171
|
+
while (Date.now() - start < timeout) {
|
|
172
|
+
const conns = await session.connections();
|
|
173
|
+
if (conns.every((c) => c.connected))
|
|
174
|
+
break;
|
|
175
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return session;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export interface CodeSparConfig {
|
|
3
|
+
/** API key for managed mode. Obtain from dashboard.codespar.dev */
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
/** Base URL for CodeSpar API. Defaults to https://api.codespar.dev */
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
/** Enable managed mode (billing, logging, rate limiting via CodeSpar backend) */
|
|
8
|
+
managed?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface SessionConfig {
|
|
11
|
+
/** MCP servers to connect. Use package names or IDs. */
|
|
12
|
+
servers?: string[];
|
|
13
|
+
/** Preset configurations. "brazilian" enables all BR servers. */
|
|
14
|
+
preset?: "brazilian" | "mexican" | "argentinian" | "colombian" | "all";
|
|
15
|
+
/** Connection management options */
|
|
16
|
+
manageConnections?: {
|
|
17
|
+
/** Block until all servers are connected */
|
|
18
|
+
waitForConnections?: boolean;
|
|
19
|
+
/** Timeout in ms for connection wait. Default: 30000 */
|
|
20
|
+
timeout?: number;
|
|
21
|
+
};
|
|
22
|
+
/** Metadata attached to every tool call in this session */
|
|
23
|
+
metadata?: Record<string, string>;
|
|
24
|
+
}
|
|
25
|
+
export interface Session {
|
|
26
|
+
/** Unique session ID */
|
|
27
|
+
id: string;
|
|
28
|
+
/** User ID that owns this session */
|
|
29
|
+
userId: string;
|
|
30
|
+
/** Connected servers */
|
|
31
|
+
servers: ServerConnection[];
|
|
32
|
+
/** Session creation timestamp */
|
|
33
|
+
createdAt: Date;
|
|
34
|
+
/** Get all available tools from connected servers */
|
|
35
|
+
tools(): Tool[];
|
|
36
|
+
/** Find tools by intent description */
|
|
37
|
+
findTools(intent: string): Tool[];
|
|
38
|
+
/** Execute a specific tool */
|
|
39
|
+
execute(toolName: string, params: Record<string, unknown>): Promise<ToolResult>;
|
|
40
|
+
/** Run a Complete Loop workflow */
|
|
41
|
+
loop(config: LoopConfig): Promise<LoopResult>;
|
|
42
|
+
/** Send a natural language message for the agent to process */
|
|
43
|
+
send(message: string): Promise<SendResult>;
|
|
44
|
+
/** Initiate OAuth flow for a server */
|
|
45
|
+
authorize(serverId: string, config?: AuthConfig): Promise<AuthResult>;
|
|
46
|
+
/** List connected servers and their auth status */
|
|
47
|
+
connections(): Promise<ServerConnection[]>;
|
|
48
|
+
/** MCP transport URLs for IDE integration */
|
|
49
|
+
mcp: {
|
|
50
|
+
url: string;
|
|
51
|
+
headers: Record<string, string>;
|
|
52
|
+
};
|
|
53
|
+
/** Close session and clean up resources */
|
|
54
|
+
close(): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
export interface Tool {
|
|
57
|
+
/** Fully qualified tool name (e.g., ZOOP_CREATE_CHARGE) */
|
|
58
|
+
name: string;
|
|
59
|
+
/** Tool slug for execution */
|
|
60
|
+
slug: string;
|
|
61
|
+
/** Human-readable description */
|
|
62
|
+
description: string;
|
|
63
|
+
/** Server that provides this tool */
|
|
64
|
+
server: string;
|
|
65
|
+
/** Input schema (JSON Schema) */
|
|
66
|
+
inputSchema: Record<string, unknown>;
|
|
67
|
+
}
|
|
68
|
+
export interface ToolResult {
|
|
69
|
+
success: boolean;
|
|
70
|
+
data: unknown;
|
|
71
|
+
error?: string;
|
|
72
|
+
/** Execution time in ms */
|
|
73
|
+
duration: number;
|
|
74
|
+
/** Server that executed the tool */
|
|
75
|
+
server: string;
|
|
76
|
+
/** Tool that was executed */
|
|
77
|
+
tool: string;
|
|
78
|
+
}
|
|
79
|
+
export interface LoopStep {
|
|
80
|
+
/** Server ID or package name */
|
|
81
|
+
server: string;
|
|
82
|
+
/** Tool name to execute */
|
|
83
|
+
tool: string;
|
|
84
|
+
/** Tool parameters */
|
|
85
|
+
params: Record<string, unknown> | ((prevResults: ToolResult[]) => Record<string, unknown>);
|
|
86
|
+
/** Optional: skip this step if condition returns false */
|
|
87
|
+
when?: (prevResults: ToolResult[]) => boolean;
|
|
88
|
+
}
|
|
89
|
+
export interface LoopConfig {
|
|
90
|
+
/** Steps to execute in order */
|
|
91
|
+
steps: LoopStep[];
|
|
92
|
+
/** Called after each step completes */
|
|
93
|
+
onStepComplete?: (step: LoopStep, result: ToolResult, index: number) => void;
|
|
94
|
+
/** Called if a step fails */
|
|
95
|
+
onStepError?: (step: LoopStep, error: Error, index: number) => void;
|
|
96
|
+
/** Retry policy for failed steps */
|
|
97
|
+
retryPolicy?: {
|
|
98
|
+
maxRetries?: number;
|
|
99
|
+
backoff?: "linear" | "exponential";
|
|
100
|
+
baseDelay?: number;
|
|
101
|
+
};
|
|
102
|
+
/** Abort all remaining steps on first failure. Default: true */
|
|
103
|
+
abortOnError?: boolean;
|
|
104
|
+
}
|
|
105
|
+
export interface LoopResult {
|
|
106
|
+
success: boolean;
|
|
107
|
+
/** Results from each step, in order */
|
|
108
|
+
results: ToolResult[];
|
|
109
|
+
/** Total execution time in ms */
|
|
110
|
+
duration: number;
|
|
111
|
+
/** Number of steps completed */
|
|
112
|
+
completedSteps: number;
|
|
113
|
+
/** Total steps attempted */
|
|
114
|
+
totalSteps: number;
|
|
115
|
+
}
|
|
116
|
+
export interface AuthConfig {
|
|
117
|
+
/** API key for direct auth */
|
|
118
|
+
token?: string;
|
|
119
|
+
/** OAuth2 client credentials */
|
|
120
|
+
clientId?: string;
|
|
121
|
+
clientSecret?: string;
|
|
122
|
+
}
|
|
123
|
+
export interface AuthResult {
|
|
124
|
+
/** Whether auth was successful */
|
|
125
|
+
connected: boolean;
|
|
126
|
+
/** OAuth redirect URL (if OAuth flow required) */
|
|
127
|
+
redirectUrl?: string;
|
|
128
|
+
/** Error message if failed */
|
|
129
|
+
error?: string;
|
|
130
|
+
}
|
|
131
|
+
export interface ServerConnection {
|
|
132
|
+
/** Server ID */
|
|
133
|
+
id: string;
|
|
134
|
+
/** Server display name */
|
|
135
|
+
name: string;
|
|
136
|
+
/** npm package name */
|
|
137
|
+
pkg: string;
|
|
138
|
+
/** Whether the server is connected and ready */
|
|
139
|
+
connected: boolean;
|
|
140
|
+
/** Auth method used */
|
|
141
|
+
auth: "oauth2" | "api_key" | "none";
|
|
142
|
+
/** Number of tools available */
|
|
143
|
+
toolCount: number;
|
|
144
|
+
}
|
|
145
|
+
export interface SendResult {
|
|
146
|
+
/** Agent response text */
|
|
147
|
+
text: string;
|
|
148
|
+
/** Tools that were called */
|
|
149
|
+
toolCalls: ToolResult[];
|
|
150
|
+
/** Total execution time in ms */
|
|
151
|
+
duration: number;
|
|
152
|
+
}
|
|
153
|
+
export declare const SessionConfigSchema: z.ZodObject<{
|
|
154
|
+
servers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
155
|
+
preset: z.ZodOptional<z.ZodEnum<["brazilian", "mexican", "argentinian", "colombian", "all"]>>;
|
|
156
|
+
manageConnections: z.ZodOptional<z.ZodObject<{
|
|
157
|
+
waitForConnections: z.ZodOptional<z.ZodBoolean>;
|
|
158
|
+
timeout: z.ZodOptional<z.ZodNumber>;
|
|
159
|
+
}, "strip", z.ZodTypeAny, {
|
|
160
|
+
waitForConnections?: boolean | undefined;
|
|
161
|
+
timeout?: number | undefined;
|
|
162
|
+
}, {
|
|
163
|
+
waitForConnections?: boolean | undefined;
|
|
164
|
+
timeout?: number | undefined;
|
|
165
|
+
}>>;
|
|
166
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
167
|
+
}, "strip", z.ZodTypeAny, {
|
|
168
|
+
servers?: string[] | undefined;
|
|
169
|
+
preset?: "brazilian" | "mexican" | "argentinian" | "colombian" | "all" | undefined;
|
|
170
|
+
manageConnections?: {
|
|
171
|
+
waitForConnections?: boolean | undefined;
|
|
172
|
+
timeout?: number | undefined;
|
|
173
|
+
} | undefined;
|
|
174
|
+
metadata?: Record<string, string> | undefined;
|
|
175
|
+
}, {
|
|
176
|
+
servers?: string[] | undefined;
|
|
177
|
+
preset?: "brazilian" | "mexican" | "argentinian" | "colombian" | "all" | undefined;
|
|
178
|
+
manageConnections?: {
|
|
179
|
+
waitForConnections?: boolean | undefined;
|
|
180
|
+
timeout?: number | undefined;
|
|
181
|
+
} | undefined;
|
|
182
|
+
metadata?: Record<string, string> | undefined;
|
|
183
|
+
}>;
|
|
184
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/* ── Validation schemas ── */
|
|
3
|
+
export const SessionConfigSchema = z.object({
|
|
4
|
+
servers: z.array(z.string()).optional(),
|
|
5
|
+
preset: z.enum(["brazilian", "mexican", "argentinian", "colombian", "all"]).optional(),
|
|
6
|
+
manageConnections: z.object({
|
|
7
|
+
waitForConnections: z.boolean().optional(),
|
|
8
|
+
timeout: z.number().optional(),
|
|
9
|
+
}).optional(),
|
|
10
|
+
metadata: z.record(z.string()).optional(),
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgLxB,8BAA8B;AAE9B,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtF,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC;QAC1B,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC/B,CAAC,CAAC,QAAQ,EAAE;IACb,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1 +1,57 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"name": "@codespar/sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Commerce SDK for AI agents — sessions, managed auth, Complete Loop orchestration for Latin American APIs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"test": "vitest run",
|
|
22
|
+
"typecheck": "tsc --noEmit",
|
|
23
|
+
"clean": "rm -rf dist",
|
|
24
|
+
"prepublishOnly": "npm run build"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"ai-agent",
|
|
28
|
+
"commerce",
|
|
29
|
+
"mcp",
|
|
30
|
+
"pix",
|
|
31
|
+
"nfe",
|
|
32
|
+
"latam",
|
|
33
|
+
"sdk",
|
|
34
|
+
"codespar"
|
|
35
|
+
],
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "https://github.com/codespar/codespar-core",
|
|
40
|
+
"directory": "packages/core"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://codespar.dev",
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/codespar/codespar-core/issues"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=20"
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"zod": "^3.24.0"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@types/node": "^25.6.0",
|
|
54
|
+
"typescript": "^5.8.0",
|
|
55
|
+
"vitest": "^3.1.0"
|
|
56
|
+
}
|
|
57
|
+
}
|