@axhub/genie 0.2.6 → 0.2.8

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 (102) hide show
  1. package/dist/api-docs.html +2 -2
  2. package/dist/assets/App-CTKZtqB1.js +460 -0
  3. package/dist/assets/{ReviewApp-BEicSBzW.js → ReviewApp-DM6BNAzR.js} +1 -1
  4. package/dist/assets/{_basePickBy-DkiHsp3X.js → _basePickBy-CqJbRZ9y.js} +1 -1
  5. package/dist/assets/{_baseUniq-7ElXb2sX.js → _baseUniq-BS8YH8jO.js} +1 -1
  6. package/dist/assets/{arc-CEsS3MdK.js → arc-BBmKEN-S.js} +1 -1
  7. package/dist/assets/{architectureDiagram-2XIMDMQ5-BubZ7T3U.js → architectureDiagram-2XIMDMQ5-N5lcb82R.js} +1 -1
  8. package/dist/assets/{blockDiagram-WCTKOSBZ-Cza6M6Ht.js → blockDiagram-WCTKOSBZ-DTMwHuLn.js} +1 -1
  9. package/dist/assets/{c4Diagram-IC4MRINW-jhjtOQ12.js → c4Diagram-IC4MRINW-BTKlkXI9.js} +1 -1
  10. package/dist/assets/channel-1oJBvF-0.js +1 -0
  11. package/dist/assets/{chunk-4BX2VUAB--HkodwbY.js → chunk-4BX2VUAB-DUdoTxAc.js} +1 -1
  12. package/dist/assets/{chunk-55IACEB6-CyBuez4e.js → chunk-55IACEB6-Bm_92xe4.js} +1 -1
  13. package/dist/assets/{chunk-FMBD7UC4-CuzG4iAl.js → chunk-FMBD7UC4-CGW0g62g.js} +1 -1
  14. package/dist/assets/{chunk-JSJVCQXG-BNi8S861.js → chunk-JSJVCQXG-DYkTH3w1.js} +1 -1
  15. package/dist/assets/{chunk-KX2RTZJC-D817O-GT.js → chunk-KX2RTZJC-C9oTlISU.js} +1 -1
  16. package/dist/assets/{chunk-NQ4KR5QH-DyujyOvx.js → chunk-NQ4KR5QH-CM50ygWP.js} +1 -1
  17. package/dist/assets/{chunk-QZHKN3VN-VMEn-zxh.js → chunk-QZHKN3VN-7dzpYeNJ.js} +1 -1
  18. package/dist/assets/{chunk-WL4C6EOR-CQHHFLvx.js → chunk-WL4C6EOR-Cm9nQrsr.js} +1 -1
  19. package/dist/assets/classDiagram-VBA2DB6C-d5TeKFM4.js +1 -0
  20. package/dist/assets/classDiagram-v2-RAHNMMFH-d5TeKFM4.js +1 -0
  21. package/dist/assets/clone-CinxIlEu.js +1 -0
  22. package/dist/assets/{cose-bilkent-S5V4N54A-qykDd54p.js → cose-bilkent-S5V4N54A-Ccp_p0JZ.js} +1 -1
  23. package/dist/assets/{dagre-KLK3FWXG-Bqp7DjEa.js → dagre-KLK3FWXG-fBwTLUp9.js} +1 -1
  24. package/dist/assets/{diagram-E7M64L7V-BKtx468K.js → diagram-E7M64L7V-CeNVmFUp.js} +1 -1
  25. package/dist/assets/{diagram-IFDJBPK2--fHfW6V2.js → diagram-IFDJBPK2-CtavyLGa.js} +1 -1
  26. package/dist/assets/{diagram-P4PSJMXO-D1kQI5RB.js → diagram-P4PSJMXO-CpQTjQwc.js} +1 -1
  27. package/dist/assets/{erDiagram-INFDFZHY-DT9YzdNw.js → erDiagram-INFDFZHY-B8R5vwhd.js} +1 -1
  28. package/dist/assets/{flowDiagram-PKNHOUZH-DWeNr4yg.js → flowDiagram-PKNHOUZH-BvkVVwIQ.js} +1 -1
  29. package/dist/assets/{ganttDiagram-A5KZAMGK--IgwcUhI.js → ganttDiagram-A5KZAMGK-DOu3hSNa.js} +1 -1
  30. package/dist/assets/{gitGraphDiagram-K3NZZRJ6-B5a8UWjN.js → gitGraphDiagram-K3NZZRJ6-C7zT67YE.js} +1 -1
  31. package/dist/assets/{graph-Cw1rYoD9.js → graph-D11wiwHo.js} +1 -1
  32. package/dist/assets/{highlighted-body-TPN3WLV5-BCxJHuqY.js → highlighted-body-TPN3WLV5-Babpthg-.js} +1 -1
  33. package/dist/assets/index-DFxzgWoO.js +2 -0
  34. package/dist/assets/index-YCFGDVKw.css +1 -0
  35. package/dist/assets/{infoDiagram-LFFYTUFH-D2u70rhN.js → infoDiagram-LFFYTUFH-BmA7IpQG.js} +1 -1
  36. package/dist/assets/{ishikawaDiagram-PHBUUO56-Cl8yrezU.js → ishikawaDiagram-PHBUUO56-BEquZd3E.js} +1 -1
  37. package/dist/assets/{journeyDiagram-4ABVD52K-ddP0AMU9.js → journeyDiagram-4ABVD52K-BfemGz7f.js} +1 -1
  38. package/dist/assets/{kanban-definition-K7BYSVSG-DbVt0v29.js → kanban-definition-K7BYSVSG-CWja3mln.js} +1 -1
  39. package/dist/assets/{layout-W_tRx4UV.js → layout-BLUNf-PJ.js} +1 -1
  40. package/dist/assets/{linear-CcMb2ay-.js → linear-DukIV_Xv.js} +1 -1
  41. package/dist/assets/{mermaid-O7DHMXV3-BBJqt8pT.js → mermaid-O7DHMXV3-SgtM28qI.js} +265 -215
  42. package/dist/assets/{mindmap-definition-YRQLILUH-BGhZa7Na.js → mindmap-definition-YRQLILUH-4UjqXITU.js} +1 -1
  43. package/dist/assets/{pieDiagram-SKSYHLDU-CDyJaACv.js → pieDiagram-SKSYHLDU-8AxqJd0M.js} +1 -1
  44. package/dist/assets/{quadrantDiagram-337W2JSQ-BSYuqf0Q.js → quadrantDiagram-337W2JSQ-D60m8V8r.js} +1 -1
  45. package/dist/assets/{requirementDiagram-Z7DCOOCP-Cfi9YX9H.js → requirementDiagram-Z7DCOOCP-zqh9jBVf.js} +1 -1
  46. package/dist/assets/{sankeyDiagram-WA2Y5GQK-Di1ShaMF.js → sankeyDiagram-WA2Y5GQK-CDZILTLI.js} +1 -1
  47. package/dist/assets/{sequenceDiagram-2WXFIKYE-CYTTG38e.js → sequenceDiagram-2WXFIKYE-7BReFd0L.js} +1 -1
  48. package/dist/assets/{stateDiagram-RAJIS63D-CVZYMqyW.js → stateDiagram-RAJIS63D-HPTVdIG4.js} +1 -1
  49. package/dist/assets/stateDiagram-v2-FVOUBMTO-DTUf5_gC.js +1 -0
  50. package/dist/assets/{timeline-definition-YZTLITO2-B1sdb5mK.js → timeline-definition-YZTLITO2-CTVllFgr.js} +1 -1
  51. package/dist/assets/{treemap-KZPCXAKY-CGG4gx3C.js → treemap-KZPCXAKY-BtyxboJZ.js} +1 -1
  52. package/dist/assets/{vennDiagram-LZ73GAT5-Dds37L2k.js → vennDiagram-LZ73GAT5-D96ZI6Mg.js} +1 -1
  53. package/dist/assets/{xychartDiagram-JWTSCODW-C8QKSyRR.js → xychartDiagram-JWTSCODW-eRk-39YO.js} +1 -1
  54. package/dist/index.html +2 -2
  55. package/package.json +35 -33
  56. package/server/_legacy-providers/README.md +30 -0
  57. package/server/_legacy-providers/claude-sdk.js +956 -0
  58. package/server/_legacy-providers/gemini-cli.js +368 -0
  59. package/server/_legacy-providers/openai-codex.js +705 -0
  60. package/server/_legacy-providers/opencode-cli.js +674 -0
  61. package/server/acp-runtime/client.js +1872 -0
  62. package/server/acp-runtime/index.js +408 -0
  63. package/server/acp-runtime/registry.js +45 -0
  64. package/server/acp-runtime/session-store.js +254 -0
  65. package/server/channels/runtime/AgentRuntimeAdapter.js +22 -80
  66. package/server/claude-sdk.js +24 -946
  67. package/server/cli.js +140 -2
  68. package/server/external-agent/service.js +52 -63
  69. package/server/gemini-cli.js +21 -360
  70. package/server/index.js +133 -58
  71. package/server/openai-codex.js +19 -695
  72. package/server/opencode-cli.js +68 -640
  73. package/server/projects.js +128 -85
  74. package/server/routes/agent.js +2 -0
  75. package/server/routes/cc-connect.js +1131 -0
  76. package/server/routes/cli-auth.js +1 -73
  77. package/server/routes/commands.js +4 -9
  78. package/server/routes/git.js +3 -20
  79. package/server/routes/projects.js +45 -24
  80. package/server/routes/session-core.js +44 -10
  81. package/server/session-core/abortSession.js +2 -18
  82. package/server/session-core/eventStore.js +5 -1
  83. package/server/session-core/providerAdapters.js +98 -10
  84. package/server/session-core/providerDiscovery.js +8 -3
  85. package/server/session-core/runtimeState.js +16 -17
  86. package/server/session-core/runtimeWriter.js +19 -12
  87. package/server/utils/ccConnectManager.js +390 -0
  88. package/server/utils/ccConnectState.js +575 -0
  89. package/server/utils/resolveCommandPath.js +71 -0
  90. package/server/utils/workspaceRoots.js +154 -0
  91. package/shared/conversationEvents.js +347 -10
  92. package/dist/assets/App-CYTE30Cf.js +0 -484
  93. package/dist/assets/channel-RmqTALN0.js +0 -1
  94. package/dist/assets/classDiagram-VBA2DB6C-wvVV1ggz.js +0 -1
  95. package/dist/assets/classDiagram-v2-RAHNMMFH-wvVV1ggz.js +0 -1
  96. package/dist/assets/clone-oT5aWXpf.js +0 -1
  97. package/dist/assets/index-CBuAXA5S.js +0 -2
  98. package/dist/assets/index-CyLWKyxy.css +0 -1
  99. package/dist/assets/stateDiagram-v2-FVOUBMTO-Bbl0b4-i.js +0 -1
  100. package/server/cli.test.js +0 -76
  101. package/server/external-agent/service.test.js +0 -53
  102. package/server/external-agent/ws.test.js +0 -289
@@ -1,289 +0,0 @@
1
- import test from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { EventEmitter } from 'node:events';
4
- import os from 'node:os';
5
- import path from 'node:path';
6
- import { promises as fs } from 'node:fs';
7
-
8
- import { handleExternalAgentWebSocketConnection } from './ws.js';
9
-
10
- class FakeWebSocket extends EventEmitter {
11
- constructor() {
12
- super();
13
- this.readyState = 1;
14
- this.sent = [];
15
- }
16
-
17
- send(payload) {
18
- this.sent.push(JSON.parse(String(payload)));
19
- }
20
-
21
- close() {
22
- this.readyState = 3;
23
- this.emit('close');
24
- }
25
-
26
- lastMessage() {
27
- return this.sent[this.sent.length - 1] || null;
28
- }
29
- }
30
-
31
- function attachSocket(socket) {
32
- handleExternalAgentWebSocketConnection(socket, { user: null });
33
- return socket;
34
- }
35
-
36
- function sendMessage(socket, payload) {
37
- socket.emit('message', JSON.stringify(payload));
38
- }
39
-
40
- async function flushAsyncWork() {
41
- await new Promise((resolve) => setImmediate(resolve));
42
- }
43
-
44
- async function createTempDir(prefix) {
45
- return fs.mkdtemp(path.join(os.tmpdir(), `${prefix}-`));
46
- }
47
-
48
- async function waitFor(check, { timeoutMs = 1000, intervalMs = 10 } = {}) {
49
- const startedAt = Date.now();
50
- while (Date.now() - startedAt < timeoutMs) {
51
- const result = check();
52
- if (result) {
53
- return result;
54
- }
55
- await new Promise((resolve) => setTimeout(resolve, intervalMs));
56
- }
57
- throw new Error('Timed out waiting for async WebSocket message');
58
- }
59
-
60
- const TEST_PNG_DATA_URL =
61
- 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO7Z0bUAAAAASUVORK5CYII=';
62
-
63
- test('integration.editor.clients.list returns connected frontend clients', async () => {
64
- const frontend = attachSocket(new FakeWebSocket());
65
- const external = attachSocket(new FakeWebSocket());
66
-
67
- try {
68
- sendMessage(frontend, {
69
- type: 'integration.connect',
70
- requestId: 'conn_frontend',
71
- payload: {
72
- role: 'frontend-page',
73
- channel: 'project-a',
74
- clientId: 'figma-123',
75
- pageUrl: 'http://localhost:5173/session/1',
76
- sessionId: 'session-1',
77
- capabilities: ['editor.snapshot'],
78
- },
79
- });
80
-
81
- sendMessage(external, {
82
- type: 'integration.editor.clients.list',
83
- requestId: 'editor_clients',
84
- payload: {
85
- channel: 'project-a',
86
- },
87
- });
88
-
89
- const message = external.lastMessage();
90
- assert.equal(message.type, 'integration.editor.clients.result');
91
- assert.equal(message.requestId, 'editor_clients');
92
- assert.equal(message.payload.total, 1);
93
- assert.equal(message.payload.items[0].clientId, 'figma-123');
94
- assert.deepEqual(message.payload.items[0].capabilities, ['editor.snapshot']);
95
- } finally {
96
- external.close();
97
- frontend.close();
98
- }
99
- });
100
-
101
- test('integration.editor.node.screenshot.result materializes frontend data URL on the server', async () => {
102
- const frontend = attachSocket(new FakeWebSocket());
103
- const external = attachSocket(new FakeWebSocket());
104
- const outputDir = await createTempDir('axhub-genie-shot');
105
-
106
- try {
107
- sendMessage(frontend, {
108
- type: 'integration.connect',
109
- requestId: 'conn_frontend',
110
- payload: {
111
- role: 'frontend-page',
112
- channel: 'project-a',
113
- clientId: 'figma-123',
114
- capabilities: ['editor.node.screenshot'],
115
- },
116
- });
117
-
118
- sendMessage(external, {
119
- type: 'integration.editor.node.screenshot.get',
120
- requestId: 'editor_shot',
121
- payload: {
122
- channel: 'project-a',
123
- targetClientId: 'figma-123',
124
- elementKey: 'hero-card',
125
- downloadPath: outputDir,
126
- },
127
- });
128
-
129
- const forwardedRequest = frontend.lastMessage();
130
- assert.equal(forwardedRequest.type, 'integration.editor.node.screenshot.get');
131
- assert.equal(forwardedRequest.payload.downloadPath, outputDir);
132
-
133
- sendMessage(frontend, {
134
- type: 'integration.ack',
135
- requestId: 'editor_shot',
136
- payload: {
137
- accepted: true,
138
- },
139
- });
140
-
141
- sendMessage(frontend, {
142
- type: 'integration.editor.node.screenshot.result',
143
- requestId: 'editor_shot',
144
- payload: {
145
- width: 1440,
146
- height: 640,
147
- image: {
148
- name: 'hero-card.png',
149
- data: TEST_PNG_DATA_URL,
150
- },
151
- },
152
- });
153
-
154
- await flushAsyncWork();
155
-
156
- const message = await waitFor(() => {
157
- const last = external.lastMessage();
158
- return last?.type === 'integration.editor.node.screenshot.result' ? last : null;
159
- });
160
- assert.equal(message.type, 'integration.editor.node.screenshot.result');
161
- assert.equal(message.requestId, 'editor_shot');
162
- assert.equal(message.payload.elementKey, 'hero-card');
163
- assert.equal(message.payload.mimeType, 'image/png');
164
- assert.equal(message.payload.width, 1440);
165
- assert.equal(message.payload.height, 640);
166
- assert.ok(path.isAbsolute(message.payload.absolutePath));
167
- assert.ok(message.payload.absolutePath.startsWith(outputDir));
168
-
169
- const stat = await fs.stat(message.payload.absolutePath);
170
- assert.equal(stat.size, message.payload.size);
171
- } finally {
172
- external.close();
173
- frontend.close();
174
- await fs.rm(outputDir, { recursive: true, force: true });
175
- }
176
- });
177
-
178
- test('integration.editor.context-images.result materializes frontend data URLs on the server', async () => {
179
- const frontend = attachSocket(new FakeWebSocket());
180
- const external = attachSocket(new FakeWebSocket());
181
- const outputDir = await createTempDir('axhub-genie-context');
182
-
183
- try {
184
- sendMessage(frontend, {
185
- type: 'integration.connect',
186
- requestId: 'conn_frontend',
187
- payload: {
188
- role: 'frontend-page',
189
- channel: 'project-a',
190
- clientId: 'figma-123',
191
- capabilities: ['editor.context-images'],
192
- },
193
- });
194
-
195
- sendMessage(external, {
196
- type: 'integration.editor.context-images.get',
197
- requestId: 'editor_context_images',
198
- payload: {
199
- channel: 'project-a',
200
- targetClientId: 'figma-123',
201
- downloadPath: outputDir,
202
- },
203
- });
204
-
205
- const forwardedRequest = frontend.lastMessage();
206
- assert.equal(forwardedRequest.type, 'integration.editor.context-images.get');
207
- assert.equal(forwardedRequest.payload.downloadPath, outputDir);
208
-
209
- sendMessage(frontend, {
210
- type: 'integration.editor.context-images.result',
211
- requestId: 'editor_context_images',
212
- payload: {
213
- items: [
214
- {
215
- id: 'img_001',
216
- name: 'clipboard-image-1.png',
217
- createdAt: 1742547600000,
218
- source: 'prompt-context',
219
- data: TEST_PNG_DATA_URL,
220
- },
221
- {
222
- id: 'img_002',
223
- name: 'clipboard-image-2.png',
224
- createdAt: 1742547600001,
225
- source: 'prompt-context',
226
- data: TEST_PNG_DATA_URL,
227
- },
228
- ],
229
- },
230
- });
231
-
232
- await flushAsyncWork();
233
-
234
- const message = await waitFor(() => {
235
- const last = external.lastMessage();
236
- return last?.type === 'integration.editor.context-images.result' ? last : null;
237
- });
238
- assert.equal(message.type, 'integration.editor.context-images.result');
239
- assert.equal(message.requestId, 'editor_context_images');
240
- assert.equal(message.payload.items.length, 2);
241
-
242
- for (const item of message.payload.items) {
243
- assert.equal(item.mimeType, 'image/png');
244
- assert.ok(path.isAbsolute(item.absolutePath));
245
- assert.ok(item.absolutePath.startsWith(outputDir));
246
- const stat = await fs.stat(item.absolutePath);
247
- assert.equal(stat.size, item.size);
248
- }
249
- } finally {
250
- external.close();
251
- frontend.close();
252
- await fs.rm(outputDir, { recursive: true, force: true });
253
- }
254
- });
255
-
256
- test('integration.editor.snapshot.get returns unsupported capability error when frontend lacks capability', async () => {
257
- const frontend = attachSocket(new FakeWebSocket());
258
- const external = attachSocket(new FakeWebSocket());
259
-
260
- try {
261
- sendMessage(frontend, {
262
- type: 'integration.connect',
263
- requestId: 'conn_frontend',
264
- payload: {
265
- role: 'frontend-page',
266
- channel: 'project-a',
267
- clientId: 'figma-123',
268
- capabilities: ['context.update'],
269
- },
270
- });
271
-
272
- sendMessage(external, {
273
- type: 'integration.editor.snapshot.get',
274
- requestId: 'editor_snapshot',
275
- payload: {
276
- channel: 'project-a',
277
- targetClientId: 'figma-123',
278
- },
279
- });
280
-
281
- const message = external.lastMessage();
282
- assert.equal(message.type, 'integration.error');
283
- assert.equal(message.requestId, 'editor_snapshot');
284
- assert.equal(message.payload.code, 'UNSUPPORTED_FRONTEND_CAPABILITY');
285
- } finally {
286
- external.close();
287
- frontend.close();
288
- }
289
- });