@zmeel/adapter-cloud 2026.405.0-canary.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.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/execute.test.d.ts +2 -0
  3. package/dist/__tests__/execute.test.d.ts.map +1 -0
  4. package/dist/__tests__/execute.test.js +142 -0
  5. package/dist/__tests__/execute.test.js.map +1 -0
  6. package/dist/__tests__/llm-client.test.d.ts +2 -0
  7. package/dist/__tests__/llm-client.test.d.ts.map +1 -0
  8. package/dist/__tests__/llm-client.test.js +90 -0
  9. package/dist/__tests__/llm-client.test.js.map +1 -0
  10. package/dist/__tests__/pricing.test.d.ts +2 -0
  11. package/dist/__tests__/pricing.test.d.ts.map +1 -0
  12. package/dist/__tests__/pricing.test.js +32 -0
  13. package/dist/__tests__/pricing.test.js.map +1 -0
  14. package/dist/execute.d.ts +3 -0
  15. package/dist/execute.d.ts.map +1 -0
  16. package/dist/execute.js +158 -0
  17. package/dist/execute.js.map +1 -0
  18. package/dist/index.d.ts +6 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +26 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/llm-client.d.ts +46 -0
  23. package/dist/llm-client.d.ts.map +1 -0
  24. package/dist/llm-client.js +32 -0
  25. package/dist/llm-client.js.map +1 -0
  26. package/dist/pricing.d.ts +16 -0
  27. package/dist/pricing.d.ts.map +1 -0
  28. package/dist/pricing.js +25 -0
  29. package/dist/pricing.js.map +1 -0
  30. package/dist/server.d.ts +4 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +4 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/session-codec.d.ts +3 -0
  35. package/dist/session-codec.d.ts.map +1 -0
  36. package/dist/session-codec.js +33 -0
  37. package/dist/session-codec.js.map +1 -0
  38. package/dist/test-environment.d.ts +3 -0
  39. package/dist/test-environment.d.ts.map +1 -0
  40. package/dist/test-environment.js +15 -0
  41. package/dist/test-environment.js.map +1 -0
  42. package/package.json +46 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Paperclip AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=execute.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/execute.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,142 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { execute } from "../execute.js";
3
+ // ---------------------------------------------------------------------------
4
+ // Helpers
5
+ // ---------------------------------------------------------------------------
6
+ function fakeMsg(overrides = {}) {
7
+ return {
8
+ id: "msg_test",
9
+ type: "message",
10
+ role: "assistant",
11
+ content: [{ type: "text", text: "Hello from the LLM" }],
12
+ model: "claude-sonnet-4-20250514",
13
+ stop_reason: "end_turn",
14
+ stop_sequence: null,
15
+ usage: { input_tokens: 100, output_tokens: 50 },
16
+ ...overrides,
17
+ };
18
+ }
19
+ function makeCtx(configOverrides = {}) {
20
+ return {
21
+ runId: "run_test",
22
+ agent: {
23
+ id: "agent_1",
24
+ companyId: "co_1",
25
+ name: "Test Agent",
26
+ adapterType: "cloud",
27
+ adapterConfig: {},
28
+ },
29
+ runtime: {
30
+ sessionId: null,
31
+ sessionParams: null,
32
+ sessionDisplayId: null,
33
+ taskKey: null,
34
+ },
35
+ config: {
36
+ provider: "anthropic",
37
+ model: "claude-sonnet-4-20250514",
38
+ apiKey: "sk-test",
39
+ systemPrompt: "You are a test agent.",
40
+ maxIterations: 10,
41
+ tools: [],
42
+ ...configOverrides,
43
+ },
44
+ context: {
45
+ issueTitle: "Fix the login bug",
46
+ issueBody: "Users cannot log in after the latest deploy.",
47
+ goalTitle: "Restore login functionality",
48
+ },
49
+ onLog: vi.fn().mockResolvedValue(undefined),
50
+ };
51
+ }
52
+ // ---------------------------------------------------------------------------
53
+ // Tests
54
+ // ---------------------------------------------------------------------------
55
+ describe("execute", () => {
56
+ it("simple text response — returns exitCode 0, summary, usage, costUsd > 0", async () => {
57
+ const createFn = vi.fn().mockResolvedValue(fakeMsg());
58
+ const ctx = makeCtx({ _createFn: createFn });
59
+ const result = await execute(ctx);
60
+ expect(result.exitCode).toBe(0);
61
+ expect(result.summary).toBe("Hello from the LLM");
62
+ expect(result.usage).toEqual({
63
+ inputTokens: 100,
64
+ outputTokens: 50,
65
+ cachedInputTokens: 0,
66
+ });
67
+ expect(result.costUsd).toBeGreaterThan(0);
68
+ expect(result.provider).toBe("anthropic");
69
+ expect(result.model).toBe("claude-sonnet-4-20250514");
70
+ expect(result.sessionParams).toBeDefined();
71
+ expect(createFn).toHaveBeenCalledOnce();
72
+ });
73
+ it("tool use loop — two API calls, accumulated tokens", async () => {
74
+ const toolUseResponse = fakeMsg({
75
+ content: [
76
+ {
77
+ type: "tool_use",
78
+ id: "toolu_1",
79
+ name: "get_weather",
80
+ input: { city: "NYC" },
81
+ },
82
+ ],
83
+ stop_reason: "tool_use",
84
+ usage: { input_tokens: 80, output_tokens: 30 },
85
+ });
86
+ const textResponse = fakeMsg({
87
+ content: [{ type: "text", text: "The weather is sunny." }],
88
+ stop_reason: "end_turn",
89
+ usage: { input_tokens: 120, output_tokens: 40 },
90
+ });
91
+ const createFn = vi
92
+ .fn()
93
+ .mockResolvedValueOnce(toolUseResponse)
94
+ .mockResolvedValueOnce(textResponse);
95
+ const ctx = makeCtx({ _createFn: createFn });
96
+ const result = await execute(ctx);
97
+ expect(result.exitCode).toBe(0);
98
+ expect(createFn).toHaveBeenCalledTimes(2);
99
+ expect(result.usage).toEqual({
100
+ inputTokens: 200,
101
+ outputTokens: 70,
102
+ cachedInputTokens: 0,
103
+ });
104
+ expect(result.summary).toBe("The weather is sunny.");
105
+ });
106
+ it("max iterations — stops when maxIterations reached", async () => {
107
+ const toolUseResponse = fakeMsg({
108
+ content: [
109
+ {
110
+ type: "tool_use",
111
+ id: "toolu_loop",
112
+ name: "infinite_tool",
113
+ input: {},
114
+ },
115
+ ],
116
+ stop_reason: "tool_use",
117
+ usage: { input_tokens: 50, output_tokens: 20 },
118
+ });
119
+ const createFn = vi.fn().mockResolvedValue(toolUseResponse);
120
+ const ctx = makeCtx({ _createFn: createFn, maxIterations: 3 });
121
+ const result = await execute(ctx);
122
+ expect(result.exitCode).toBe(0);
123
+ // 3 iterations: each calls the API once
124
+ expect(createFn).toHaveBeenCalledTimes(3);
125
+ expect(result.usage).toEqual({
126
+ inputTokens: 150,
127
+ outputTokens: 60,
128
+ cachedInputTokens: 0,
129
+ });
130
+ });
131
+ it("API error — returns exitCode 1, errorMessage", async () => {
132
+ const createFn = vi
133
+ .fn()
134
+ .mockRejectedValue(new Error("Rate limit exceeded"));
135
+ const ctx = makeCtx({ _createFn: createFn });
136
+ const result = await execute(ctx);
137
+ expect(result.exitCode).toBe(1);
138
+ expect(result.errorMessage).toBe("Rate limit exceeded");
139
+ expect(ctx.onLog).toHaveBeenCalledWith("stderr", expect.stringContaining("Rate limit exceeded"));
140
+ });
141
+ });
142
+ //# sourceMappingURL=execute.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.test.js","sourceRoot":"","sources":["../../src/__tests__/execute.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=llm-client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-client.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/llm-client.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,90 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { createLlmClient } from "../llm-client.js";
3
+ function fakeResponse(overrides = {}) {
4
+ return {
5
+ id: "msg_test123",
6
+ type: "message",
7
+ role: "assistant",
8
+ content: [{ type: "text", text: "Hello world" }],
9
+ model: "claude-sonnet-4-20250514",
10
+ stop_reason: "end_turn",
11
+ stop_sequence: null,
12
+ usage: { input_tokens: 42, output_tokens: 17 },
13
+ ...overrides,
14
+ };
15
+ }
16
+ describe("createLlmClient", () => {
17
+ it("passes mapped params to the underlying createFn", async () => {
18
+ const createFn = vi.fn().mockResolvedValue(fakeResponse());
19
+ const client = createLlmClient({ apiKey: "sk-test", createFn });
20
+ const params = {
21
+ model: "claude-sonnet-4-20250514",
22
+ maxTokens: 1024,
23
+ system: "You are helpful.",
24
+ messages: [{ role: "user", content: "Hi" }],
25
+ tools: [
26
+ {
27
+ name: "get_weather",
28
+ description: "Get weather",
29
+ input_schema: { type: "object", properties: {} },
30
+ },
31
+ ],
32
+ stopSequences: ["STOP"],
33
+ };
34
+ await client.chat(params);
35
+ expect(createFn).toHaveBeenCalledOnce();
36
+ const arg = createFn.mock.calls[0][0];
37
+ expect(arg.model).toBe("claude-sonnet-4-20250514");
38
+ expect(arg.max_tokens).toBe(1024);
39
+ expect(arg.system).toBe("You are helpful.");
40
+ expect(arg.messages).toEqual([{ role: "user", content: "Hi" }]);
41
+ expect(arg.tools).toEqual(params.tools);
42
+ expect(arg.stop_sequences).toEqual(["STOP"]);
43
+ });
44
+ it("maps response fields from snake_case to camelCase", async () => {
45
+ const createFn = vi.fn().mockResolvedValue(fakeResponse({
46
+ id: "msg_abc",
47
+ stop_reason: "max_tokens",
48
+ model: "claude-opus-4-20250514",
49
+ usage: { input_tokens: 100, output_tokens: 200 },
50
+ content: [{ type: "text", text: "Result" }],
51
+ }));
52
+ const client = createLlmClient({ apiKey: "sk-test", createFn });
53
+ const result = await client.chat({
54
+ model: "claude-opus-4-20250514",
55
+ maxTokens: 4096,
56
+ messages: [{ role: "user", content: "Test" }],
57
+ });
58
+ expect(result.id).toBe("msg_abc");
59
+ expect(result.stopReason).toBe("max_tokens");
60
+ expect(result.model).toBe("claude-opus-4-20250514");
61
+ expect(result.inputTokens).toBe(100);
62
+ expect(result.outputTokens).toBe(200);
63
+ expect(result.content).toEqual([{ type: "text", text: "Result" }]);
64
+ });
65
+ it("omits optional fields when not provided", async () => {
66
+ const createFn = vi.fn().mockResolvedValue(fakeResponse());
67
+ const client = createLlmClient({ apiKey: "sk-test", createFn });
68
+ await client.chat({
69
+ model: "claude-sonnet-4-20250514",
70
+ maxTokens: 1024,
71
+ messages: [{ role: "user", content: "Hi" }],
72
+ });
73
+ const arg = createFn.mock.calls[0][0];
74
+ expect(arg.system).toBeUndefined();
75
+ expect(arg.tools).toBeUndefined();
76
+ expect(arg.stop_sequences).toBeUndefined();
77
+ });
78
+ it("propagates errors from createFn", async () => {
79
+ const createFn = vi
80
+ .fn()
81
+ .mockRejectedValue(new Error("API rate limit exceeded"));
82
+ const client = createLlmClient({ apiKey: "sk-test", createFn });
83
+ await expect(client.chat({
84
+ model: "claude-sonnet-4-20250514",
85
+ maxTokens: 1024,
86
+ messages: [{ role: "user", content: "Hi" }],
87
+ })).rejects.toThrow("API rate limit exceeded");
88
+ });
89
+ });
90
+ //# sourceMappingURL=llm-client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-client.test.js","sourceRoot":"","sources":["../../src/__tests__/llm-client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pricing.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/pricing.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { calculateCostUsd } from '../pricing.js';
3
+ describe('calculateCostUsd', () => {
4
+ it('calculates Sonnet 4 cost correctly', () => {
5
+ const cost = calculateCostUsd('claude-sonnet-4-20250514', {
6
+ inputTokens: 1000,
7
+ outputTokens: 500,
8
+ cachedInputTokens: 0,
9
+ });
10
+ // (1000 * 3 + 0 * 0.3 + 500 * 15) / 1_000_000 = (3000 + 7500) / 1_000_000 = 0.0105
11
+ expect(cost).toBeCloseTo(0.0105, 6);
12
+ });
13
+ it('applies cached input discount', () => {
14
+ const cost = calculateCostUsd('claude-sonnet-4-20250514', {
15
+ inputTokens: 1000,
16
+ outputTokens: 100,
17
+ cachedInputTokens: 500,
18
+ });
19
+ // uncached = 1000 - 500 = 500
20
+ // (500 * 3 + 500 * 0.3 + 100 * 15) / 1_000_000 = (1500 + 150 + 1500) / 1_000_000 = 0.00315
21
+ expect(cost).toBeCloseTo(0.00315, 6);
22
+ });
23
+ it('returns 0 for unknown model', () => {
24
+ const cost = calculateCostUsd('unknown-model', {
25
+ inputTokens: 1000,
26
+ outputTokens: 500,
27
+ cachedInputTokens: 0,
28
+ });
29
+ expect(cost).toBe(0);
30
+ });
31
+ });
32
+ //# sourceMappingURL=pricing.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.test.js","sourceRoot":"","sources":["../../src/__tests__/pricing.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,IAAI,GAAG,gBAAgB,CAAC,0BAA0B,EAAE;YACxD,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,GAAG;YACjB,iBAAiB,EAAE,CAAC;SACrB,CAAC,CAAA;QACF,mFAAmF;QACnF,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,IAAI,GAAG,gBAAgB,CAAC,0BAA0B,EAAE;YACxD,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,GAAG;YACjB,iBAAiB,EAAE,GAAG;SACvB,CAAC,CAAA;QACF,8BAA8B;QAC9B,2FAA2F;QAC3F,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAAG,gBAAgB,CAAC,eAAe,EAAE;YAC7C,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,GAAG;YACjB,iBAAiB,EAAE,CAAC;SACrB,CAAC,CAAA;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACtB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { AdapterExecutionContext, AdapterExecutionResult } from "@zmeel/adapter-utils";
2
+ export declare function execute(ctx: AdapterExecutionContext): Promise<AdapterExecutionResult>;
3
+ //# sourceMappingURL=execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../src/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;AAwD9B,wBAAsB,OAAO,CAC3B,GAAG,EAAE,uBAAuB,GAC3B,OAAO,CAAC,sBAAsB,CAAC,CA4IjC"}
@@ -0,0 +1,158 @@
1
+ import { createLlmClient } from "./llm-client.js";
2
+ import { calculateCostUsd } from "./pricing.js";
3
+ // ---------------------------------------------------------------------------
4
+ // Helpers
5
+ // ---------------------------------------------------------------------------
6
+ function buildSystemPrompt(basePrompt, context) {
7
+ const parts = [basePrompt];
8
+ if (context.issueTitle) {
9
+ parts.push(`\n\n## Current Task\n**${context.issueTitle}**`);
10
+ }
11
+ if (context.issueBody) {
12
+ parts.push(`\n${context.issueBody}`);
13
+ }
14
+ if (context.goalTitle) {
15
+ parts.push(`\n\n## Goal\n${context.goalTitle}`);
16
+ }
17
+ return parts.join("");
18
+ }
19
+ function buildInitialUserMessage(context) {
20
+ const parts = [];
21
+ if (context.issueTitle) {
22
+ parts.push(`Task: ${context.issueTitle}`);
23
+ }
24
+ if (context.issueBody) {
25
+ parts.push(`\nDetails:\n${context.issueBody}`);
26
+ }
27
+ if (context.goalTitle) {
28
+ parts.push(`\nGoal: ${context.goalTitle}`);
29
+ }
30
+ return parts.length > 0
31
+ ? parts.join("")
32
+ : "Please proceed with the assigned task.";
33
+ }
34
+ function extractTextFromContent(content) {
35
+ return content
36
+ .filter((b) => b.type === "text" && b.text)
37
+ .map((b) => b.text)
38
+ .join("\n");
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // Main execute
42
+ // ---------------------------------------------------------------------------
43
+ export async function execute(ctx) {
44
+ const config = ctx.config;
45
+ const context = ctx.context;
46
+ const model = config.model ?? "claude-sonnet-4-20250514";
47
+ const provider = config.provider ?? "anthropic";
48
+ const apiKey = config.apiKey;
49
+ const systemPrompt = config.systemPrompt ?? "You are a helpful assistant.";
50
+ const maxIterations = config.maxIterations ?? 10;
51
+ const tools = (config.tools ?? []);
52
+ const createFn = config._createFn;
53
+ try {
54
+ // Build LLM client
55
+ const client = createLlmClient({
56
+ apiKey,
57
+ ...(createFn ? { createFn: createFn } : {}),
58
+ });
59
+ // Build system prompt with context
60
+ const system = buildSystemPrompt(systemPrompt, context);
61
+ // Restore or initialise messages
62
+ const sessionMessages = ctx.runtime.sessionParams?.messages;
63
+ const messages = sessionMessages
64
+ ? [...sessionMessages]
65
+ : [];
66
+ // If fresh conversation, add initial user message
67
+ if (messages.length === 0) {
68
+ messages.push({ role: "user", content: buildInitialUserMessage(context) });
69
+ }
70
+ // Token accumulators
71
+ let totalInputTokens = 0;
72
+ let totalOutputTokens = 0;
73
+ let totalCachedInputTokens = 0;
74
+ let lastTextContent = "";
75
+ // Agent loop
76
+ for (let iteration = 0; iteration < maxIterations; iteration++) {
77
+ await ctx.onLog("stdout", `[cloud-adapter] iteration ${iteration + 1}/${maxIterations}\n`);
78
+ const result = await client.chat({
79
+ model,
80
+ maxTokens: 4096,
81
+ system,
82
+ messages,
83
+ ...(tools.length > 0 ? { tools: tools } : {}),
84
+ });
85
+ // Accumulate tokens
86
+ totalInputTokens += result.inputTokens;
87
+ totalOutputTokens += result.outputTokens;
88
+ // Extract text for summary
89
+ const text = extractTextFromContent(result.content);
90
+ if (text) {
91
+ lastTextContent = text;
92
+ }
93
+ // Append assistant message
94
+ messages.push({ role: "assistant", content: result.content });
95
+ // Check stop reason
96
+ if (result.stopReason === "end_turn" || result.stopReason === "max_tokens") {
97
+ await ctx.onLog("stdout", `[cloud-adapter] stop_reason=${result.stopReason}\n`);
98
+ break;
99
+ }
100
+ // Handle tool_use
101
+ if (result.stopReason === "tool_use") {
102
+ const toolUseBlocks = result.content.filter((b) => b.type === "tool_use");
103
+ const toolResults = toolUseBlocks.map((block) => ({
104
+ type: "tool_result",
105
+ tool_use_id: block.id,
106
+ content: JSON.stringify({
107
+ status: "ok",
108
+ result: `[placeholder] Tool "${block.name}" executed successfully.`,
109
+ }),
110
+ }));
111
+ messages.push({ role: "user", content: toolResults });
112
+ await ctx.onLog("stdout", `[cloud-adapter] handled ${toolUseBlocks.length} tool call(s)\n`);
113
+ continue;
114
+ }
115
+ // Unknown stop reason — break
116
+ await ctx.onLog("stdout", `[cloud-adapter] unknown stop_reason=${result.stopReason}, stopping\n`);
117
+ break;
118
+ }
119
+ // Calculate cost
120
+ const costUsd = calculateCostUsd(model, {
121
+ inputTokens: totalInputTokens,
122
+ outputTokens: totalOutputTokens,
123
+ cachedInputTokens: totalCachedInputTokens,
124
+ });
125
+ // Build summary (first 500 chars of last text)
126
+ const summary = lastTextContent.length > 500
127
+ ? lastTextContent.slice(0, 500) + "..."
128
+ : lastTextContent || null;
129
+ return {
130
+ exitCode: 0,
131
+ signal: null,
132
+ timedOut: false,
133
+ usage: {
134
+ inputTokens: totalInputTokens,
135
+ outputTokens: totalOutputTokens,
136
+ cachedInputTokens: totalCachedInputTokens,
137
+ },
138
+ provider,
139
+ model,
140
+ billingType: "api",
141
+ costUsd,
142
+ summary,
143
+ sessionParams: { messages },
144
+ sessionDisplayId: ctx.runtime.sessionDisplayId ?? null,
145
+ };
146
+ }
147
+ catch (err) {
148
+ const errorMessage = err instanceof Error ? err.message : String(err);
149
+ await ctx.onLog("stderr", `[cloud-adapter] error: ${errorMessage}\n`);
150
+ return {
151
+ exitCode: 1,
152
+ signal: null,
153
+ timedOut: false,
154
+ errorMessage,
155
+ };
156
+ }
157
+ }
158
+ //# sourceMappingURL=execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../src/execute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { AdapterModel } from "@zmeel/adapter-utils";
2
+ export declare const type = "cloud";
3
+ export declare const label = "Claude (cloud API)";
4
+ export declare const models: AdapterModel[];
5
+ export declare const agentConfigurationDoc = "# cloud agent configuration\n\nAdapter: cloud\n\nCore fields:\n- model (string, optional): Anthropic model id (defaults to claude-sonnet-4-20250514)\n- maxTokens (number, optional): max output tokens per message (default 16384)\n- systemPrompt (string, optional): system prompt prepended to every conversation\n- promptTemplate (string, optional): run prompt template\n\nOperational fields:\n- timeoutSec (number, optional): run timeout in seconds\n- graceSec (number, optional): SIGTERM grace period in seconds\n\nNotes:\n- This adapter calls the Anthropic Messages API directly from the server.\n- An ANTHROPIC_API_KEY must be available (injected by zmeel or set in env).\n";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,eAAO,MAAM,IAAI,UAAU,CAAC;AAC5B,eAAO,MAAM,KAAK,uBAAuB,CAAC;AAE1C,eAAO,MAAM,MAAM,EAAE,YAAY,EAIhC,CAAC;AAEF,eAAO,MAAM,qBAAqB,wqBAiBjC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,26 @@
1
+ export const type = "cloud";
2
+ export const label = "Claude (cloud API)";
3
+ export const models = [
4
+ { id: "claude-sonnet-4-20250514", label: "Claude Sonnet 4" },
5
+ { id: "claude-opus-4-20250514", label: "Claude Opus 4" },
6
+ { id: "claude-haiku-4-20250506", label: "Claude Haiku 4" },
7
+ ];
8
+ export const agentConfigurationDoc = `# cloud agent configuration
9
+
10
+ Adapter: cloud
11
+
12
+ Core fields:
13
+ - model (string, optional): Anthropic model id (defaults to claude-sonnet-4-20250514)
14
+ - maxTokens (number, optional): max output tokens per message (default 16384)
15
+ - systemPrompt (string, optional): system prompt prepended to every conversation
16
+ - promptTemplate (string, optional): run prompt template
17
+
18
+ Operational fields:
19
+ - timeoutSec (number, optional): run timeout in seconds
20
+ - graceSec (number, optional): SIGTERM grace period in seconds
21
+
22
+ Notes:
23
+ - This adapter calls the Anthropic Messages API directly from the server.
24
+ - An ANTHROPIC_API_KEY must be available (injected by zmeel or set in env).
25
+ `;
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC;AAC5B,MAAM,CAAC,MAAM,KAAK,GAAG,oBAAoB,CAAC;AAE1C,MAAM,CAAC,MAAM,MAAM,GAAmB;IACpC,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAC5D,EAAE,EAAE,EAAE,wBAAwB,EAAE,KAAK,EAAE,eAAe,EAAE;IACxD,EAAE,EAAE,EAAE,yBAAyB,EAAE,KAAK,EAAE,gBAAgB,EAAE;CAC3D,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;CAiBpC,CAAC"}
@@ -0,0 +1,46 @@
1
+ import Anthropic from "@anthropic-ai/sdk";
2
+ export interface LlmMessage {
3
+ role: "user" | "assistant";
4
+ content: string | LlmContentBlock[];
5
+ }
6
+ export interface LlmTool {
7
+ name: string;
8
+ description: string;
9
+ input_schema: Record<string, unknown>;
10
+ }
11
+ export interface LlmChatParams {
12
+ model: string;
13
+ maxTokens: number;
14
+ system?: string;
15
+ messages: LlmMessage[];
16
+ tools?: LlmTool[];
17
+ stopSequences?: string[];
18
+ }
19
+ export interface LlmContentBlock {
20
+ type: "text" | "tool_use" | "tool_result";
21
+ text?: string;
22
+ id?: string;
23
+ name?: string;
24
+ input?: unknown;
25
+ tool_use_id?: string;
26
+ content?: string;
27
+ }
28
+ export interface LlmChatResult {
29
+ id: string;
30
+ content: LlmContentBlock[];
31
+ stopReason: string | null;
32
+ model: string;
33
+ inputTokens: number;
34
+ outputTokens: number;
35
+ }
36
+ type CreateFn = (params: Anthropic.MessageCreateParamsNonStreaming) => Promise<Anthropic.Message>;
37
+ export interface LlmClientOptions {
38
+ apiKey: string;
39
+ createFn?: CreateFn;
40
+ }
41
+ export interface LlmClient {
42
+ chat(params: LlmChatParams): Promise<LlmChatResult>;
43
+ }
44
+ export declare function createLlmClient(opts: LlmClientOptions): LlmClient;
45
+ export {};
46
+ //# sourceMappingURL=llm-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-client.d.ts","sourceRoot":"","sources":["../src/llm-client.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAM1C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,aAAa,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,KAAK,QAAQ,GAAG,CACd,MAAM,EAAE,SAAS,CAAC,+BAA+B,KAC9C,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAEhC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACrD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAiCjE"}
@@ -0,0 +1,32 @@
1
+ import Anthropic from "@anthropic-ai/sdk";
2
+ export function createLlmClient(opts) {
3
+ const create = opts.createFn ??
4
+ (() => {
5
+ const client = new Anthropic({ apiKey: opts.apiKey });
6
+ return (params) => client.messages.create(params);
7
+ })();
8
+ return {
9
+ async chat(params) {
10
+ const body = {
11
+ model: params.model,
12
+ max_tokens: params.maxTokens,
13
+ messages: params.messages,
14
+ ...(params.system ? { system: params.system } : {}),
15
+ ...(params.tools ? { tools: params.tools } : {}),
16
+ ...(params.stopSequences
17
+ ? { stop_sequences: params.stopSequences }
18
+ : {}),
19
+ };
20
+ const response = await create(body);
21
+ return {
22
+ id: response.id,
23
+ content: response.content,
24
+ stopReason: response.stop_reason,
25
+ model: response.model,
26
+ inputTokens: response.usage.input_tokens,
27
+ outputTokens: response.usage.output_tokens,
28
+ };
29
+ },
30
+ };
31
+ }
32
+ //# sourceMappingURL=llm-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../src/llm-client.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AA8D1C,MAAM,UAAU,eAAe,CAAC,IAAsB;IACpD,MAAM,MAAM,GACV,IAAI,CAAC,QAAQ;QACb,CAAC,GAAG,EAAE;YACJ,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,MAAqB;YAC9B,MAAM,IAAI,GAA8C;gBACtD,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,UAAU,EAAE,MAAM,CAAC,SAAS;gBAC5B,QAAQ,EAAE,MAAM,CAAC,QAAoC;gBACrD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAyB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpE,GAAG,CAAC,MAAM,CAAC,aAAa;oBACtB,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,aAAa,EAAE;oBAC1C,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAEpC,OAAO;gBACL,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,OAAO,EAAE,QAAQ,CAAC,OAAuC;gBACzD,UAAU,EAAE,QAAQ,CAAC,WAAW;gBAChC,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY;gBACxC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa;aAC3C,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Token pricing calculator for Claude models.
3
+ * Calculates USD cost from token usage per model.
4
+ */
5
+ interface TokenUsage {
6
+ inputTokens: number;
7
+ outputTokens: number;
8
+ cachedInputTokens: number;
9
+ }
10
+ /**
11
+ * Calculate the USD cost for a given model and token usage.
12
+ * Returns 0 for unknown models.
13
+ */
14
+ export declare function calculateCostUsd(model: string, usage: TokenUsage): number;
15
+ export {};
16
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAeD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,GAChB,MAAM,CAWR"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Token pricing calculator for Claude models.
3
+ * Calculates USD cost from token usage per model.
4
+ */
5
+ /** USD per million tokens */
6
+ const MODEL_PRICING = {
7
+ 'claude-sonnet-4-20250514': { input: 3, cached: 0.3, output: 15 },
8
+ 'claude-opus-4-20250514': { input: 15, cached: 1.5, output: 75 },
9
+ 'claude-haiku-4-20250514': { input: 0.8, cached: 0.08, output: 4 },
10
+ };
11
+ /**
12
+ * Calculate the USD cost for a given model and token usage.
13
+ * Returns 0 for unknown models.
14
+ */
15
+ export function calculateCostUsd(model, usage) {
16
+ const pricing = MODEL_PRICING[model];
17
+ if (!pricing)
18
+ return 0;
19
+ const uncachedInput = usage.inputTokens - usage.cachedInputTokens;
20
+ return ((uncachedInput * pricing.input +
21
+ usage.cachedInputTokens * pricing.cached +
22
+ usage.outputTokens * pricing.output) /
23
+ 1_000_000);
24
+ }
25
+ //# sourceMappingURL=pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,6BAA6B;AAC7B,MAAM,aAAa,GAAiC;IAClD,0BAA0B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;IACjE,wBAAwB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;IAChE,yBAAyB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE;CACnE,CAAA;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,KAAiB;IAEjB,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IACpC,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAA;IAEtB,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,iBAAiB,CAAA;IACjE,OAAO,CACL,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK;QAC5B,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,MAAM;QACxC,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;QACtC,SAAS,CACV,CAAA;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { execute } from "./execute.js";
2
+ export { testEnvironment } from "./test-environment.js";
3
+ export { sessionCodec } from "./session-codec.js";
4
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/server.js ADDED
@@ -0,0 +1,4 @@
1
+ export { execute } from "./execute.js";
2
+ export { testEnvironment } from "./test-environment.js";
3
+ export { sessionCodec } from "./session-codec.js";
4
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AdapterSessionCodec } from "@zmeel/adapter-utils";
2
+ export declare const sessionCodec: AdapterSessionCodec;
3
+ //# sourceMappingURL=session-codec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-codec.d.ts","sourceRoot":"","sources":["../src/session-codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAQhE,eAAO,MAAM,YAAY,EAAE,mBA4B1B,CAAC"}
@@ -0,0 +1,33 @@
1
+ function readNonEmptyString(value) {
2
+ return typeof value === "string" && value.trim().length > 0
3
+ ? value.trim()
4
+ : null;
5
+ }
6
+ export const sessionCodec = {
7
+ deserialize(raw) {
8
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw))
9
+ return null;
10
+ const record = raw;
11
+ const conversationId = readNonEmptyString(record.conversationId) ??
12
+ readNonEmptyString(record.conversation_id);
13
+ if (!conversationId)
14
+ return null;
15
+ return { conversationId };
16
+ },
17
+ serialize(params) {
18
+ if (!params)
19
+ return null;
20
+ const conversationId = readNonEmptyString(params.conversationId) ??
21
+ readNonEmptyString(params.conversation_id);
22
+ if (!conversationId)
23
+ return null;
24
+ return { conversationId };
25
+ },
26
+ getDisplayId(params) {
27
+ if (!params)
28
+ return null;
29
+ return (readNonEmptyString(params.conversationId) ??
30
+ readNonEmptyString(params.conversation_id));
31
+ },
32
+ };
33
+ //# sourceMappingURL=session-codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-codec.js","sourceRoot":"","sources":["../src/session-codec.ts"],"names":[],"mappings":"AAEA,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACzD,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;QACd,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAwB;IAC/C,WAAW,CAAC,GAAY;QACtB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,MAAM,MAAM,GAAG,GAA8B,CAAC;QAC9C,MAAM,cAAc,GAClB,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC;YACzC,kBAAkB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC7C,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC;QACjC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC5B,CAAC;IAED,SAAS,CAAC,MAAsC;QAC9C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,cAAc,GAClB,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC;YACzC,kBAAkB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC7C,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC;QACjC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC5B,CAAC;IAED,YAAY,CAAC,MAAsC;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,CACL,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC;YACzC,kBAAkB,CAAC,MAAM,CAAC,eAAe,CAAC,CAC3C,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AdapterEnvironmentTestContext, AdapterEnvironmentTestResult } from "@zmeel/adapter-utils";
2
+ export declare function testEnvironment(ctx: AdapterEnvironmentTestContext): Promise<AdapterEnvironmentTestResult>;
3
+ //# sourceMappingURL=test-environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-environment.d.ts","sourceRoot":"","sources":["../src/test-environment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,sBAAsB,CAAC;AAE9B,wBAAsB,eAAe,CACnC,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,4BAA4B,CAAC,CAavC"}
@@ -0,0 +1,15 @@
1
+ export async function testEnvironment(ctx) {
2
+ return {
3
+ adapterType: ctx.adapterType,
4
+ status: "pass",
5
+ checks: [
6
+ {
7
+ code: "cloud_adapter_available",
8
+ level: "info",
9
+ message: "Cloud adapter is available (API-based, no local binary required).",
10
+ },
11
+ ],
12
+ testedAt: new Date().toISOString(),
13
+ };
14
+ }
15
+ //# sourceMappingURL=test-environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-environment.js","sourceRoot":"","sources":["../src/test-environment.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAkC;IAElC,OAAO;QACL,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,MAAM,EAAE,MAAM;QACd,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,yBAAyB;gBAC/B,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,mEAAmE;aAC7E;SACF;QACD,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACnC,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@zmeel/adapter-cloud",
3
+ "version": "2026.405.0-canary.0",
4
+ "license": "MIT",
5
+ "homepage": "https://github.com/zmeel/zmeel",
6
+ "bugs": {
7
+ "url": "https://github.com/zmeel/zmeel/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/zmeel/zmeel",
12
+ "directory": "packages/adapters/cloud"
13
+ },
14
+ "type": "module",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ },
20
+ "./server": {
21
+ "types": "./dist/server.d.ts",
22
+ "import": "./dist/server.js"
23
+ }
24
+ },
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "dependencies": {
32
+ "@anthropic-ai/sdk": "^0.39.0",
33
+ "@zmeel/adapter-utils": "2026.405.0-canary.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^24.6.0",
37
+ "typescript": "^5.7.3"
38
+ },
39
+ "scripts": {
40
+ "build": "tsc --noCheck",
41
+ "clean": "rm -rf dist",
42
+ "typecheck": "tsc --noEmit"
43
+ },
44
+ "main": "./dist/index.js",
45
+ "types": "./dist/index.d.ts"
46
+ }