@axiom-lattice/client-sdk 3.0.6 → 4.0.1

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 (46) hide show
  1. package/README.md +37 -0
  2. package/dist/__tests__/a2a-keys.test.d.ts +8 -0
  3. package/dist/__tests__/a2a-keys.test.d.ts.map +1 -0
  4. package/dist/__tests__/a2a-keys.test.js +110 -0
  5. package/dist/__tests__/a2a-keys.test.js.map +1 -0
  6. package/dist/__tests__/export-import.test.d.ts +2 -0
  7. package/dist/__tests__/export-import.test.d.ts.map +1 -0
  8. package/dist/__tests__/export-import.test.js +245 -0
  9. package/dist/__tests__/export-import.test.js.map +1 -0
  10. package/dist/__tests__/tasks.test.d.ts +2 -0
  11. package/dist/__tests__/tasks.test.d.ts.map +1 -0
  12. package/dist/__tests__/tasks.test.js +67 -0
  13. package/dist/__tests__/tasks.test.js.map +1 -0
  14. package/dist/__tests__/web-apps.test.d.ts +8 -0
  15. package/dist/__tests__/web-apps.test.d.ts.map +1 -0
  16. package/dist/__tests__/web-apps.test.js +166 -0
  17. package/dist/__tests__/web-apps.test.js.map +1 -0
  18. package/dist/__tests__/workspace-client.test.d.ts +10 -0
  19. package/dist/__tests__/workspace-client.test.d.ts.map +1 -0
  20. package/dist/__tests__/workspace-client.test.js +56 -0
  21. package/dist/__tests__/workspace-client.test.js.map +1 -0
  22. package/dist/abstract-client.d.ts +106 -2
  23. package/dist/abstract-client.d.ts.map +1 -1
  24. package/dist/abstract-client.js +170 -3
  25. package/dist/abstract-client.js.map +1 -1
  26. package/dist/client.d.ts +2 -0
  27. package/dist/client.d.ts.map +1 -1
  28. package/dist/client.js +2 -0
  29. package/dist/client.js.map +1 -1
  30. package/dist/export-import.d.ts +136 -24
  31. package/dist/export-import.d.ts.map +1 -1
  32. package/dist/export-import.js +142 -48
  33. package/dist/export-import.js.map +1 -1
  34. package/dist/index.d.ts +322 -35
  35. package/dist/index.js +359 -96
  36. package/dist/index.js.map +1 -1
  37. package/dist/index.mjs +359 -96
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/types.d.ts +72 -1
  40. package/dist/types.d.ts.map +1 -1
  41. package/dist/types.js.map +1 -1
  42. package/dist/workspace-client.d.ts +2 -2
  43. package/dist/workspace-client.d.ts.map +1 -1
  44. package/dist/workspace-client.js +7 -2
  45. package/dist/workspace-client.js.map +1 -1
  46. package/package.json +2 -2
package/README.md CHANGED
@@ -15,6 +15,43 @@ The Client SDK provides a simple interface for interacting with the Axiom Lattic
15
15
  - Handle tool calls and responses
16
16
  - Process streaming message chunks with ChunkMessageMerger
17
17
  - Standardized HTTP client using axios for all API calls
18
+ - Authenticated Agent Web App publication management through `client.webApps`
19
+
20
+ ## Agent Web App Management
21
+
22
+ `client.webApps` is the authenticated Console management API, not the anonymous external runtime client. It provides `list`, `get`, `create`, `update`, `enable`, `disable`, and `delete`.
23
+
24
+ ```typescript
25
+ import { Client, type CreateAgentWebAppInput } from "@axiom-lattice/client-sdk";
26
+
27
+ const client = new Client({
28
+ baseURL: "http://localhost:4001",
29
+ apiKey: "console-session-token",
30
+ assistantId: "support-agent",
31
+ transport: "sse",
32
+ });
33
+
34
+ const input: CreateAgentWebAppInput = {
35
+ assistantId: "support-agent",
36
+ name: "Support",
37
+ integration: { type: "react_sdk" },
38
+ scope: { defaultProjectId: "support", allowedProjectIds: ["support"] },
39
+ features: {
40
+ projectSelector: false,
41
+ modelSelector: false,
42
+ threadManagement: true,
43
+ attachments: false,
44
+ hitl: false,
45
+ genUI: false,
46
+ },
47
+ appearance: { title: "Support assistant" },
48
+ };
49
+
50
+ const publication = await client.webApps.create(input);
51
+ await client.webApps.enable(publication.id);
52
+ ```
53
+
54
+ Use `@axiom-lattice/react-sdk/web-app` in the external React application. The default/local SQLite setup currently uses an in-memory Web App store, so publication definitions do not survive gateway restart; configure the PostgreSQL store for persistence. See [the management guide](../../docs/guides/web-apps/management.md).
18
55
 
19
56
  ## Installation
20
57
 
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Client.a2aKeys namespace tests.
3
+ *
4
+ * Asserts the six A2A API key management methods hit the gateway's
5
+ * `/api/a2a/keys` endpoints with the correct URL, HTTP method, and body.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=a2a-keys.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-keys.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/a2a-keys.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Client.a2aKeys namespace tests.
3
+ *
4
+ * Asserts the six A2A API key management methods hit the gateway's
5
+ * `/api/a2a/keys` endpoints with the correct URL, HTTP method, and body.
6
+ */
7
+ import { Client } from "../client";
8
+ const mockFetch = jest.fn();
9
+ global.fetch = mockFetch;
10
+ const record = {
11
+ id: "key-1",
12
+ key: "a2a_abc123...",
13
+ tenantId: "t1",
14
+ projectId: "p1",
15
+ assistantIds: ["a1"],
16
+ label: "prod",
17
+ enabled: true,
18
+ createdAt: "2026-08-19T00:00:00.000Z",
19
+ updatedAt: "2026-08-19T00:00:00.000Z",
20
+ };
21
+ function makeClient() {
22
+ return new Client({
23
+ baseURL: "http://localhost:3000",
24
+ apiKey: "test-key",
25
+ assistantId: "asst-1",
26
+ transport: "sse",
27
+ });
28
+ }
29
+ function mockJsonResponse(body) {
30
+ mockFetch.mockResolvedValue({
31
+ ok: true,
32
+ json: async () => body,
33
+ });
34
+ }
35
+ function lastFetch() {
36
+ return mockFetch.mock.calls[mockFetch.mock.calls.length - 1];
37
+ }
38
+ beforeEach(() => {
39
+ jest.clearAllMocks();
40
+ });
41
+ describe("Client.a2aKeys", () => {
42
+ it("list -> GET /api/a2a/keys with tenantId/limit/offset query", async () => {
43
+ mockJsonResponse({ success: true, data: { records: [record], total: 1 } });
44
+ const result = await makeClient().a2aKeys.list({
45
+ tenantId: "t1",
46
+ limit: 10,
47
+ offset: 20,
48
+ });
49
+ const [url, init] = lastFetch();
50
+ expect(url).toBe("http://localhost:3000/api/a2a/keys?tenantId=t1&limit=10&offset=20");
51
+ expect(init.method).toBe("GET");
52
+ expect(result).toEqual({ records: [record], total: 1 });
53
+ });
54
+ it("list sends no query string when params omitted", async () => {
55
+ mockJsonResponse({ success: true, data: { records: [], total: 0 } });
56
+ await makeClient().a2aKeys.list();
57
+ const [url] = lastFetch();
58
+ expect(url).toBe("http://localhost:3000/api/a2a/keys");
59
+ });
60
+ it("create -> POST /api/a2a/keys with tenantId/projectId/assistantIds/label", async () => {
61
+ mockJsonResponse({ success: true, data: { ...record, key: "a2a_full_key" } });
62
+ const result = await makeClient().a2aKeys.create({
63
+ tenantId: "t1",
64
+ projectId: "p1",
65
+ assistantIds: ["a1", "a2"],
66
+ label: "prod",
67
+ });
68
+ const [url, init] = lastFetch();
69
+ expect(url).toBe("http://localhost:3000/api/a2a/keys");
70
+ expect(init.method).toBe("POST");
71
+ expect(JSON.parse(init.body)).toEqual({
72
+ tenantId: "t1",
73
+ projectId: "p1",
74
+ assistantIds: ["a1", "a2"],
75
+ label: "prod",
76
+ });
77
+ expect(result.key).toBe("a2a_full_key");
78
+ });
79
+ it("delete -> DELETE /api/a2a/keys/:id", async () => {
80
+ mockJsonResponse({ success: true });
81
+ await makeClient().a2aKeys.delete("key-1");
82
+ const [url, init] = lastFetch();
83
+ expect(url).toBe("http://localhost:3000/api/a2a/keys/key-1");
84
+ expect(init.method).toBe("DELETE");
85
+ });
86
+ it("disable -> POST /api/a2a/keys/:id/disable", async () => {
87
+ mockJsonResponse({ success: true, data: { ...record, enabled: false } });
88
+ const result = await makeClient().a2aKeys.disable("key-1");
89
+ const [url, init] = lastFetch();
90
+ expect(url).toBe("http://localhost:3000/api/a2a/keys/key-1/disable");
91
+ expect(init.method).toBe("POST");
92
+ expect(result.enabled).toBe(false);
93
+ });
94
+ it("enable -> POST /api/a2a/keys/:id/enable", async () => {
95
+ mockJsonResponse({ success: true, data: record });
96
+ await makeClient().a2aKeys.enable("key-1");
97
+ const [url, init] = lastFetch();
98
+ expect(url).toBe("http://localhost:3000/api/a2a/keys/key-1/enable");
99
+ expect(init.method).toBe("POST");
100
+ });
101
+ it("rotate -> POST /api/a2a/keys/:id/rotate", async () => {
102
+ mockJsonResponse({ success: true, data: { ...record, key: "a2a_rotated" } });
103
+ const result = await makeClient().a2aKeys.rotate("key-1");
104
+ const [url, init] = lastFetch();
105
+ expect(url).toBe("http://localhost:3000/api/a2a/keys/key-1/rotate");
106
+ expect(init.method).toBe("POST");
107
+ expect(result.key).toBe("a2a_rotated");
108
+ });
109
+ });
110
+ //# sourceMappingURL=a2a-keys.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-keys.test.js","sourceRoot":"","sources":["../../src/__tests__/a2a-keys.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=export-import.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-import.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/export-import.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,245 @@
1
+ import { Client } from "../client";
2
+ import { ExportImportClient, } from "../export-import";
3
+ const mockFetch = jest.fn();
4
+ global.fetch = mockFetch;
5
+ function mockJsonResponse(body, ok = true, status = 200) {
6
+ mockFetch.mockResolvedValue({
7
+ ok,
8
+ status,
9
+ json: async () => body,
10
+ });
11
+ }
12
+ function formDataEntries() {
13
+ return Object.fromEntries(lastFetch()[1].body.entries());
14
+ }
15
+ function lastFetch() {
16
+ return mockFetch.mock.calls[mockFetch.mock.calls.length - 1];
17
+ }
18
+ function requestBody() {
19
+ return JSON.parse(lastFetch()[1].body);
20
+ }
21
+ const bundle = {
22
+ version: 1,
23
+ exportedAt: "2026-08-21T00:00:00.000Z",
24
+ sourceTenantId: "source-tenant",
25
+ entities: {
26
+ assistants: [{ _exportId: "assistant-1", data: { name: "Agent" } }],
27
+ },
28
+ dependencyOrder: ["assistants"],
29
+ };
30
+ const resolutions = {
31
+ "assistant-1": { _exportId: "assistant-1", action: "overwrite" },
32
+ };
33
+ beforeEach(() => {
34
+ jest.clearAllMocks();
35
+ });
36
+ describe("ExportImportClient gateway contract", () => {
37
+ it("gets typed exportable types from the JSON envelope", async () => {
38
+ mockJsonResponse({
39
+ success: true,
40
+ data: [{
41
+ entityType: "assistants",
42
+ label: "Assistants",
43
+ category: "core",
44
+ dependsOn: [],
45
+ cascadeParents: [],
46
+ }],
47
+ });
48
+ const client = new ExportImportClient({
49
+ baseURL: "http://localhost:3000",
50
+ apiKey: "key",
51
+ assistantId: "assistant",
52
+ transport: "sse",
53
+ });
54
+ const result = await client.getExportableTypes();
55
+ expect(lastFetch()[0]).toBe("http://localhost:3000/api/tenants/exportable-types");
56
+ expect(lastFetch()[1].method).toBe("GET");
57
+ expect(result[0].entityType).toBe("assistants");
58
+ });
59
+ it("sends optional entity IDs for export and confirmation", async () => {
60
+ const client = new ExportImportClient({
61
+ baseURL: "http://localhost:3000",
62
+ apiKey: "key",
63
+ assistantId: "assistant",
64
+ transport: "sse",
65
+ });
66
+ const entityIds = { assistants: ["assistant-1"] };
67
+ mockJsonResponse({ success: true, data: { jobId: "job-1", summary: { assistants: 1 } } });
68
+ await client.exportConfig("tenant-1", ["assistants"], entityIds);
69
+ expect(lastFetch()[0]).toBe("http://localhost:3000/api/tenants/tenant-1/export");
70
+ expect(lastFetch()[1].method).toBe("POST");
71
+ expect(requestBody()).toEqual({ entityTypes: ["assistants"], entityIds });
72
+ mockJsonResponse({ success: true, data: { jobId: "job-2", summary: { assistants: 1 } } });
73
+ await client.exportConfigConfirm("tenant-1", ["assistants"], entityIds);
74
+ expect(lastFetch()[0]).toBe("http://localhost:3000/api/tenants/tenant-1/export/confirm");
75
+ expect(lastFetch()[1].method).toBe("POST");
76
+ expect(requestBody()).toEqual({ entityTypes: ["assistants"], entityIds });
77
+ });
78
+ it("omits entityIds when no explicit selection is provided", async () => {
79
+ mockJsonResponse({ success: true, data: { jobId: "job-1", summary: {} } });
80
+ const client = new ExportImportClient({
81
+ baseURL: "http://localhost:3000",
82
+ apiKey: "key",
83
+ assistantId: "assistant",
84
+ transport: "sse",
85
+ });
86
+ await client.exportConfig("tenant-1", ["assistants"]);
87
+ expect(requestBody()).toEqual({ entityTypes: ["assistants"] });
88
+ });
89
+ it("previews selectable entities", async () => {
90
+ mockJsonResponse({
91
+ success: true,
92
+ data: { assistants: [{ id: "assistant-1", name: "Agent", description: "Primary" }] },
93
+ });
94
+ const client = new ExportImportClient({
95
+ baseURL: "http://localhost:3000",
96
+ apiKey: "key",
97
+ assistantId: "assistant",
98
+ transport: "sse",
99
+ });
100
+ const result = await client.previewEntities("tenant-1", ["assistants"]);
101
+ expect(lastFetch()[0]).toBe("http://localhost:3000/api/tenants/tenant-1/export/entities");
102
+ expect(lastFetch()[1].method).toBe("POST");
103
+ expect(requestBody()).toEqual({ entityTypes: ["assistants"] });
104
+ expect(result.assistants[0].name).toBe("Agent");
105
+ });
106
+ it("downloads raw archive bytes and reads the attachment filename", async () => {
107
+ mockFetch.mockResolvedValue({
108
+ ok: true,
109
+ status: 200,
110
+ headers: new Headers({
111
+ "Content-Disposition": "attachment; filename=\"tenant export.tar.gz\"",
112
+ }),
113
+ arrayBuffer: async () => new Uint8Array([0, 1, 254, 255]).buffer,
114
+ });
115
+ const client = new ExportImportClient({
116
+ baseURL: "http://localhost:3000",
117
+ apiKey: "key",
118
+ assistantId: "assistant",
119
+ transport: "sse",
120
+ });
121
+ const result = await client.downloadExport("tenant-1", "job-1");
122
+ expect(lastFetch()[0]).toBe("http://localhost:3000/api/tenants/tenant-1/export/job-1/download");
123
+ expect(lastFetch()[1].method).toBe("GET");
124
+ expect(result.filename).toBe("tenant export.tar.gz");
125
+ expect(Array.from(result.data)).toEqual([0, 1, 254, 255]);
126
+ });
127
+ it.each([
128
+ ["base64 string", "AAH+/w=="],
129
+ ["Uint8Array", new Uint8Array([0, 1, 254, 255])],
130
+ ["ArrayBuffer", new Uint8Array([0, 1, 254, 255]).buffer],
131
+ ["Blob", new Blob([new Uint8Array([0, 1, 254, 255])])],
132
+ ])("previews an archive from %s as multipart", async (_label, archive) => {
133
+ mockJsonResponse({ success: true, data: { conflicts: [], insertions: [], errors: [] } });
134
+ const client = new ExportImportClient({
135
+ baseURL: "http://localhost:3000",
136
+ apiKey: "key",
137
+ assistantId: "assistant",
138
+ transport: "sse",
139
+ });
140
+ await client.importPreview("tenant-1", { archive });
141
+ expect(lastFetch()[0]).toBe("http://localhost:3000/api/tenants/tenant-1/import/preview");
142
+ expect(lastFetch()[1].method).toBe("POST");
143
+ expect(lastFetch()[1].body).toBeInstanceOf(FormData);
144
+ const entries = formDataEntries();
145
+ expect(Object.keys(entries)).toEqual(["file"]);
146
+ expect(entries.file).toBeInstanceOf(Blob);
147
+ expect(Array.from(new Uint8Array(await entries.file.arrayBuffer())))
148
+ .toEqual([0, 1, 254, 255]);
149
+ expect(entries.file.name).toBe("tenant-import.tar.gz");
150
+ expect(lastFetch()[1].headers).toEqual(expect.not.objectContaining({
151
+ "Content-Type": expect.anything(),
152
+ }));
153
+ });
154
+ it("previews a plain bundle explicitly", async () => {
155
+ mockJsonResponse({ success: true, data: { conflicts: [], insertions: [], errors: [] } });
156
+ const client = new ExportImportClient({
157
+ baseURL: "http://localhost:3000",
158
+ apiKey: "key",
159
+ assistantId: "assistant",
160
+ transport: "sse",
161
+ });
162
+ await client.importPreview("tenant-1", { bundle });
163
+ expect(requestBody()).toEqual({ bundle });
164
+ });
165
+ it("applies archive imports as multipart with resolutions JSON", async () => {
166
+ const result = { results: [], idMap: {} };
167
+ const client = new ExportImportClient({
168
+ baseURL: "http://localhost:3000",
169
+ apiKey: "key",
170
+ assistantId: "assistant",
171
+ transport: "sse",
172
+ });
173
+ mockJsonResponse({ success: true, data: result });
174
+ await client.importApply("tenant-1", { archive: new Uint8Array([0, 1, 254, 255]) }, resolutions);
175
+ const entries = formDataEntries();
176
+ expect(JSON.parse(entries.resolutions)).toEqual(resolutions);
177
+ expect(Array.from(new Uint8Array(await entries.file.arrayBuffer())))
178
+ .toEqual([0, 1, 254, 255]);
179
+ });
180
+ it("applies plain bundle imports as JSON", async () => {
181
+ const result = { results: [], idMap: {} };
182
+ const client = new ExportImportClient({
183
+ baseURL: "http://localhost:3000",
184
+ apiKey: "key",
185
+ assistantId: "assistant",
186
+ transport: "sse",
187
+ });
188
+ mockJsonResponse({ success: true, data: result });
189
+ await client.importApply("tenant-1", { bundle }, resolutions);
190
+ expect(requestBody()).toEqual({ bundle, resolutions });
191
+ });
192
+ it("strips configured and live JSON content types for multipart only", async () => {
193
+ mockJsonResponse({ success: true, data: { conflicts: [], insertions: [], errors: [] } });
194
+ const client = new ExportImportClient({
195
+ baseURL: "http://localhost:3000",
196
+ apiKey: "key",
197
+ assistantId: "assistant",
198
+ transport: "sse",
199
+ headers: { "content-type": "application/problem+json", "x-custom": "configured" },
200
+ }, () => ({ "Content-Type": "application/json", "x-tenant-id": "tenant-live" }));
201
+ await client.importPreview("tenant-1", { archive: new Uint8Array([1, 2, 3]) });
202
+ expect(lastFetch()[1].headers).toEqual({
203
+ Authorization: "Bearer key",
204
+ "x-custom": "configured",
205
+ "x-tenant-id": "tenant-live",
206
+ });
207
+ });
208
+ it.each([
209
+ [{ message: "message failure" }, "message failure"],
210
+ [{ error: "error failure" }, "error failure"],
211
+ ])("reads gateway errors from either field", async (body, expected) => {
212
+ mockJsonResponse(body, false, 400);
213
+ const client = new ExportImportClient({
214
+ baseURL: "http://localhost:3000",
215
+ apiKey: "key",
216
+ assistantId: "assistant",
217
+ transport: "sse",
218
+ });
219
+ await expect(client.getExportableTypes()).rejects.toThrow(expected);
220
+ });
221
+ });
222
+ describe("Client.exportImport", () => {
223
+ it("uses live auth, custom, tenant, workspace, and project headers", async () => {
224
+ const client = new Client({
225
+ baseURL: "http://localhost:3000",
226
+ apiKey: "key",
227
+ assistantId: "assistant",
228
+ transport: "sse",
229
+ headers: { "x-custom": "configured" },
230
+ });
231
+ client.setTenantId("tenant-header");
232
+ client.setWorkspaceContext("workspace-1", "project-1");
233
+ mockJsonResponse({ success: true, data: {} });
234
+ await client.exportImport.previewEntities("tenant-path", ["assistants"]);
235
+ expect(lastFetch()[1].headers).toEqual(expect.objectContaining({
236
+ Authorization: "Bearer key",
237
+ "Content-Type": "application/json",
238
+ "x-custom": "configured",
239
+ "x-tenant-id": "tenant-header",
240
+ "x-workspace-id": "workspace-1",
241
+ "x-project-id": "project-1",
242
+ }));
243
+ });
244
+ });
245
+ //# sourceMappingURL=export-import.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-import.test.js","sourceRoot":"","sources":["../../src/__tests__/export-import.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tasks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tasks.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ import { Client } from "../client";
2
+ const mockFetch = jest.fn();
3
+ global.fetch = mockFetch;
4
+ function makeClient() {
5
+ return new Client({
6
+ baseURL: "http://localhost:3000",
7
+ apiKey: "test-key",
8
+ assistantId: "agent-1",
9
+ transport: "sse",
10
+ });
11
+ }
12
+ beforeEach(() => {
13
+ jest.clearAllMocks();
14
+ mockFetch.mockResolvedValue({
15
+ ok: true,
16
+ json: async () => ({ success: true, data: { id: "task-1", status: "completed" } }),
17
+ });
18
+ });
19
+ describe("Client.tasks lifecycle methods", () => {
20
+ it("sends completion evidence to PATCH /api/tasks/:id/complete", async () => {
21
+ await makeClient().tasks.complete("task-1", {
22
+ result: "done",
23
+ beliefImpact: [{ key: "Confidence", after: 0.9, basis: "verified" }],
24
+ });
25
+ const [url, init] = mockFetch.mock.calls[0];
26
+ expect(url).toBe("http://localhost:3000/api/tasks/task-1/complete");
27
+ expect(init.method).toBe("PATCH");
28
+ expect(JSON.parse(init.body)).toEqual({
29
+ result: "done",
30
+ beliefImpact: [{ key: "Confidence", after: 0.9, basis: "verified" }],
31
+ });
32
+ });
33
+ it("preserves completion lifecycle metadata in the response envelope", async () => {
34
+ const warnings = [{
35
+ code: "PARENT_ACTIVITY_WRITE_FAILED",
36
+ taskId: "task-1",
37
+ evidenceId: "evidence-1",
38
+ eventKey: "completion:task-1",
39
+ parentTaskId: "parent-1",
40
+ }];
41
+ mockFetch.mockResolvedValueOnce({
42
+ ok: true,
43
+ json: async () => ({
44
+ success: true,
45
+ data: { id: "task-1", status: "completed" },
46
+ evidenceId: "evidence-1",
47
+ eventKey: "completion:task-1",
48
+ warnings,
49
+ }),
50
+ });
51
+ const result = await makeClient().tasks.complete("task-1", { result: "done" });
52
+ expect(result).toEqual({
53
+ success: true,
54
+ data: { id: "task-1", status: "completed" },
55
+ evidenceId: "evidence-1",
56
+ eventKey: "completion:task-1",
57
+ warnings,
58
+ });
59
+ });
60
+ it("does not expose detached approve or reject task methods", () => {
61
+ const tasks = makeClient().tasks;
62
+ expect(tasks.approve).toBeUndefined();
63
+ expect(tasks.reject).toBeUndefined();
64
+ expect(tasks.resume).toBeUndefined();
65
+ });
66
+ });
67
+ //# sourceMappingURL=tasks.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.test.js","sourceRoot":"","sources":["../../src/__tests__/tasks.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Client.webApps namespace tests.
3
+ *
4
+ * Asserts Agent Web App management calls use the gateway's `/api/web-apps`
5
+ * endpoints without adding tenant, workspace, lifecycle, or runtime fields.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=web-apps.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-apps.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/web-apps.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}