@axhub/genie 0.2.5 → 0.2.7

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 (139) hide show
  1. package/dist/assets/App-BWSqiXAT.js +220 -0
  2. package/dist/assets/App-DrlLKa8f.css +1 -0
  3. package/dist/assets/ReviewApp-nz3mbArg.js +1 -0
  4. package/dist/assets/{_basePickBy-CFRQvihx.js → _basePickBy-C19AekOu.js} +1 -1
  5. package/dist/assets/{_baseUniq-Dhh8nCvs.js → _baseUniq-JsnevLw_.js} +1 -1
  6. package/dist/assets/{arc-DQ0v3dU4.js → arc-BLpcuBlf.js} +1 -1
  7. package/dist/assets/architectureDiagram-2XIMDMQ5-CarjBOOv.js +36 -0
  8. package/dist/assets/{blockDiagram-WCTKOSBZ-Bbxhj5KC.js → blockDiagram-WCTKOSBZ-DQBLwsUS.js} +3 -3
  9. package/dist/assets/c4Diagram-IC4MRINW-CGobwBIj.js +10 -0
  10. package/dist/assets/channel-DkFNxV_H.js +1 -0
  11. package/dist/assets/{chunk-4BX2VUAB-DlvtrM0q.js → chunk-4BX2VUAB-De63kbgc.js} +1 -1
  12. package/dist/assets/{chunk-55IACEB6-DJUSHyTa.js → chunk-55IACEB6-DtTDDdM9.js} +1 -1
  13. package/dist/assets/{chunk-FMBD7UC4-C6Ch-htf.js → chunk-FMBD7UC4-DHuwd8tw.js} +1 -1
  14. package/dist/assets/{chunk-JSJVCQXG-DzQIht58.js → chunk-JSJVCQXG-BgytFtmO.js} +1 -1
  15. package/dist/assets/{chunk-KX2RTZJC-C05jARMH.js → chunk-KX2RTZJC-nZdp86aN.js} +1 -1
  16. package/dist/assets/chunk-NQ4KR5QH-CMH6EDP2.js +220 -0
  17. package/dist/assets/{chunk-QZHKN3VN-jxti9HTX.js → chunk-QZHKN3VN-DvUQ3mnO.js} +1 -1
  18. package/dist/assets/chunk-WL4C6EOR-Dn7db_6t.js +189 -0
  19. package/dist/assets/classDiagram-VBA2DB6C-DtwCEe8S.js +1 -0
  20. package/dist/assets/classDiagram-v2-RAHNMMFH-DtwCEe8S.js +1 -0
  21. package/dist/assets/clone-C0lCEIEO.js +1 -0
  22. package/dist/assets/cose-bilkent-S5V4N54A-DD_nzqsz.js +1 -0
  23. package/dist/assets/cytoscape.esm-5J0xJHOV.js +321 -0
  24. package/dist/assets/{dagre-KLK3FWXG-DJ3dNSYk.js → dagre-KLK3FWXG-CHYIvW47.js} +1 -1
  25. package/dist/assets/diagram-E7M64L7V-TVdvHtGc.js +24 -0
  26. package/dist/assets/{diagram-IFDJBPK2-Da6K4aP-.js → diagram-IFDJBPK2-Dzsiln_C.js} +1 -1
  27. package/dist/assets/{diagram-P4PSJMXO-vZZKB92A.js → diagram-P4PSJMXO-DKnGbUpE.js} +1 -1
  28. package/dist/assets/erDiagram-INFDFZHY-5Kw0bByo.js +70 -0
  29. package/dist/assets/{flowDiagram-PKNHOUZH-DUV13pHi.js → flowDiagram-PKNHOUZH-BAZ2-jKp.js} +4 -4
  30. package/dist/assets/ganttDiagram-A5KZAMGK-CsADFkcq.js +292 -0
  31. package/dist/assets/{gitGraphDiagram-K3NZZRJ6-BZ5gW69I.js → gitGraphDiagram-K3NZZRJ6-BflpyjGy.js} +1 -1
  32. package/dist/assets/{graph-BbvHswRd.js → graph-suelaXFh.js} +1 -1
  33. package/dist/assets/highlighted-body-OFNGDK62-CZrBMazC.js +1 -0
  34. package/dist/assets/index-B01NxbUv.css +1 -0
  35. package/dist/assets/index-DW5pGgQ_.js +2 -0
  36. package/dist/assets/{infoDiagram-LFFYTUFH-8auUIPKW.js → infoDiagram-LFFYTUFH-pfD1FA3p.js} +1 -1
  37. package/dist/assets/ishikawaDiagram-PHBUUO56-ndm9snwO.js +70 -0
  38. package/dist/assets/journeyDiagram-4ABVD52K-HgF2t7z5.js +139 -0
  39. package/dist/assets/{kanban-definition-K7BYSVSG-Bappd2YO.js → kanban-definition-K7BYSVSG-FWinmur1.js} +5 -5
  40. package/dist/assets/{layout-BmbfFZKy.js → layout-vcz43XvZ.js} +1 -1
  41. package/dist/assets/{linear-WZnF-PT6.js → linear-le4gc0vx.js} +1 -1
  42. package/dist/assets/mermaid-GHXKKRXX-CK8m3lad.js +870 -0
  43. package/dist/assets/mindmap-definition-YRQLILUH-CNq9SKj4.js +68 -0
  44. package/dist/assets/{pieDiagram-SKSYHLDU-uxjlAy1t.js → pieDiagram-SKSYHLDU-C7PKDh3b.js} +2 -2
  45. package/dist/assets/quadrantDiagram-337W2JSQ-B7FnztNO.js +7 -0
  46. package/dist/assets/requirementDiagram-Z7DCOOCP-Bl_BM2Th.js +73 -0
  47. package/dist/assets/{sankeyDiagram-WA2Y5GQK-2-FHHM-R.js → sankeyDiagram-WA2Y5GQK-4gulcOP4.js} +3 -3
  48. package/dist/assets/sequenceDiagram-2WXFIKYE-VEuJDwyJ.js +145 -0
  49. package/dist/assets/{stateDiagram-RAJIS63D-DoW8U53H.js → stateDiagram-RAJIS63D-CB4Vl7qM.js} +1 -1
  50. package/dist/assets/stateDiagram-v2-FVOUBMTO-C85ucl39.js +1 -0
  51. package/dist/assets/timeline-definition-YZTLITO2-BPGKhi7f.js +61 -0
  52. package/dist/assets/{treemap-KZPCXAKY-ajdAP-72.js → treemap-KZPCXAKY-DZSEE6Hz.js} +58 -58
  53. package/dist/assets/vendor-codemirror-CyOKkaQZ.js +31 -0
  54. package/dist/assets/vendor-react-CP4yFTs7.js +8 -0
  55. package/dist/assets/vendor-xterm-DfcmCpbH.js +66 -0
  56. package/dist/assets/{vennDiagram-LZ73GAT5-C9If0AT0.js → vennDiagram-LZ73GAT5-8E_G06fI.js} +4 -4
  57. package/dist/assets/xychartDiagram-JWTSCODW-CbBk50-O.js +7 -0
  58. package/dist/favicon.png +0 -0
  59. package/dist/icons/icon-128x128.png +0 -0
  60. package/dist/icons/icon-144x144.png +0 -0
  61. package/dist/icons/icon-152x152.png +0 -0
  62. package/dist/icons/icon-192x192.png +0 -0
  63. package/dist/icons/icon-384x384.png +0 -0
  64. package/dist/icons/icon-512x512.png +0 -0
  65. package/dist/icons/icon-72x72.png +0 -0
  66. package/dist/icons/icon-96x96.png +0 -0
  67. package/dist/index.html +4 -5
  68. package/dist/logo-128.png +0 -0
  69. package/dist/logo-256.png +0 -0
  70. package/dist/logo-32.png +0 -0
  71. package/dist/logo-512.png +0 -0
  72. package/dist/logo-64.png +0 -0
  73. package/package.json +2 -1
  74. package/server/_legacy-providers/README.md +30 -0
  75. package/server/_legacy-providers/claude-sdk.js +956 -0
  76. package/server/_legacy-providers/gemini-cli.js +368 -0
  77. package/server/_legacy-providers/openai-codex.js +705 -0
  78. package/server/_legacy-providers/opencode-cli.js +674 -0
  79. package/server/acp-runtime/client.js +1805 -0
  80. package/server/acp-runtime/client.test.js +688 -0
  81. package/server/acp-runtime/index.js +419 -0
  82. package/server/acp-runtime/registry.js +45 -0
  83. package/server/acp-runtime/session-store.js +254 -0
  84. package/server/acp-runtime/session-store.test.js +89 -0
  85. package/server/channels/runtime/AgentRuntimeAdapter.js +21 -70
  86. package/server/claude-sdk.js +24 -944
  87. package/server/cli.js +11 -5
  88. package/server/external-agent/service.js +77 -63
  89. package/server/gemini-cli.js +23 -360
  90. package/server/index.js +54 -46
  91. package/server/openai-codex.js +24 -698
  92. package/server/opencode-cli.js +70 -640
  93. package/server/routes/agent.js +2 -0
  94. package/server/routes/codex.js +5 -5
  95. package/server/routes/git.js +3 -20
  96. package/server/routes/mcp.js +18 -34
  97. package/server/routes/session-core.js +44 -10
  98. package/server/session-core/abortSession.js +2 -18
  99. package/server/session-core/eventStore.js +5 -1
  100. package/server/session-core/providerAdapters.js +98 -10
  101. package/server/session-core/providerDiscovery.js +2 -2
  102. package/server/session-core/runtimeState.js +16 -17
  103. package/server/session-core/runtimeWriter.js +19 -12
  104. package/server/utils/codexPath.js +3 -1
  105. package/server/utils/spawnCommand.js +7 -0
  106. package/shared/conversationEvents.js +347 -10
  107. package/shared/conversationEvents.test.js +403 -0
  108. package/dist/assets/App-BxazfNJn.js +0 -484
  109. package/dist/assets/App-qxJ8_QYu.css +0 -32
  110. package/dist/assets/ReviewApp-CsqTAlGU.js +0 -1
  111. package/dist/assets/architectureDiagram-2XIMDMQ5-DmUHdvQH.js +0 -36
  112. package/dist/assets/c4Diagram-IC4MRINW-BOivDlQU.js +0 -10
  113. package/dist/assets/channel-Cj8xVD0X.js +0 -1
  114. package/dist/assets/chunk-NQ4KR5QH-Ci-n7jfu.js +0 -220
  115. package/dist/assets/chunk-WL4C6EOR-C559Mk71.js +0 -189
  116. package/dist/assets/classDiagram-VBA2DB6C-CI2zklxw.js +0 -1
  117. package/dist/assets/classDiagram-v2-RAHNMMFH-CI2zklxw.js +0 -1
  118. package/dist/assets/clone-BEVqubrI.js +0 -1
  119. package/dist/assets/cose-bilkent-S5V4N54A-DNO9ncXL.js +0 -1
  120. package/dist/assets/cytoscape.esm-2ZfV8NB5.js +0 -331
  121. package/dist/assets/diagram-E7M64L7V-Ba_LGLun.js +0 -24
  122. package/dist/assets/erDiagram-INFDFZHY-Csb8dFdP.js +0 -70
  123. package/dist/assets/ganttDiagram-A5KZAMGK-B5Kv9Wfz.js +0 -292
  124. package/dist/assets/highlighted-body-TPN3WLV5-DZJajMGm.js +0 -1
  125. package/dist/assets/index-BFX9lxRB.css +0 -1
  126. package/dist/assets/index-BiErUGrv.js +0 -2
  127. package/dist/assets/ishikawaDiagram-PHBUUO56-JmsNlo2I.js +0 -70
  128. package/dist/assets/journeyDiagram-4ABVD52K-Cuudv7Vv.js +0 -139
  129. package/dist/assets/mermaid-O7DHMXV3-D-2fQRvw.js +0 -988
  130. package/dist/assets/mindmap-definition-YRQLILUH-BQHnzzud.js +0 -68
  131. package/dist/assets/quadrantDiagram-337W2JSQ-DpwZU-f_.js +0 -7
  132. package/dist/assets/requirementDiagram-Z7DCOOCP-C_9ClOWm.js +0 -73
  133. package/dist/assets/sequenceDiagram-2WXFIKYE-egns-0XI.js +0 -145
  134. package/dist/assets/stateDiagram-v2-FVOUBMTO-BoFZZ4Ds.js +0 -1
  135. package/dist/assets/timeline-definition-YZTLITO2-chPa8ppH.js +0 -61
  136. package/dist/assets/vendor-codemirror-Dz7_EqNA.js +0 -39
  137. package/dist/assets/vendor-react-Cpt6D04s.js +0 -59
  138. package/dist/assets/vendor-xterm-DfaPXD3y.js +0 -66
  139. package/dist/assets/xychartDiagram-JWTSCODW-DD42U6Or.js +0 -7
@@ -0,0 +1,89 @@
1
+ import assert from 'node:assert/strict';
2
+ import fs from 'fs/promises';
3
+ import os from 'os';
4
+ import path from 'path';
5
+ import test from 'node:test';
6
+ import { pathToFileURL } from 'node:url';
7
+
8
+ async function loadSessionStore(sessionRoot) {
9
+ process.env.AXHUB_GENIE_ACP_SESSION_ROOT = sessionRoot;
10
+ const moduleUrl = `${pathToFileURL(path.resolve('server/acp-runtime/session-store.js')).href}?root=${encodeURIComponent(sessionRoot)}&ts=${Date.now()}`;
11
+ return import(moduleUrl);
12
+ }
13
+
14
+ async function createTempSessionRoot() {
15
+ return fs.mkdtemp(path.join(os.tmpdir(), 'axhub-genie-acp-sessions-'));
16
+ }
17
+
18
+ test('session-store persists and lists ACP sessions', async () => {
19
+ const sessionRoot = await createTempSessionRoot();
20
+
21
+ try {
22
+ const sessionStore = await loadSessionStore(sessionRoot);
23
+
24
+ await sessionStore.writeAcpSessionRecord({
25
+ provider: 'claude',
26
+ sessionId: 'session-a',
27
+ projectPath: '/tmp/project-a',
28
+ model: 'claude-sonnet-4',
29
+ title: 'Session A',
30
+ lastActivity: '2026-03-30T10:00:00.000Z',
31
+ lastPromptAt: '2026-03-30T10:00:00.000Z'
32
+ });
33
+
34
+ const record = await sessionStore.readAcpSessionRecord('claude', 'session-a');
35
+ assert.equal(record.provider, 'claude');
36
+ assert.equal(record.sessionId, 'session-a');
37
+ assert.equal(record.projectPath, '/tmp/project-a');
38
+
39
+ const sessions = await sessionStore.listAcpSessions({
40
+ provider: 'claude',
41
+ projectPath: '/tmp/project-a'
42
+ });
43
+
44
+ assert.equal(sessions.length, 1);
45
+ assert.equal(sessions[0].id, 'session-a');
46
+ assert.equal(sessions[0].model, 'claude-sonnet-4');
47
+ assert.equal(sessions[0].source, 'acp');
48
+ } finally {
49
+ delete process.env.AXHUB_GENIE_ACP_SESSION_ROOT;
50
+ await fs.rm(sessionRoot, { recursive: true, force: true });
51
+ }
52
+ });
53
+
54
+ test('session-store GC removes only stale closed session records by default', async () => {
55
+ const sessionRoot = await createTempSessionRoot();
56
+
57
+ try {
58
+ const sessionStore = await loadSessionStore(sessionRoot);
59
+
60
+ await sessionStore.writeAcpSessionRecord({
61
+ provider: 'codex',
62
+ sessionId: 'closed-session',
63
+ projectPath: '/tmp/project-b',
64
+ lastActivity: '2025-01-01T00:00:00.000Z',
65
+ closedAt: '2025-01-01T00:00:00.000Z',
66
+ isClosed: true
67
+ });
68
+
69
+ await sessionStore.writeAcpSessionRecord({
70
+ provider: 'codex',
71
+ sessionId: 'open-session',
72
+ projectPath: '/tmp/project-b',
73
+ lastActivity: '2025-01-01T00:00:00.000Z',
74
+ isClosed: false
75
+ });
76
+
77
+ const gcResult = await sessionStore.gcOldAcpSessions({
78
+ provider: 'codex',
79
+ maxAgeDays: 30
80
+ });
81
+
82
+ assert.equal(gcResult.removed, 1);
83
+ assert.equal(await sessionStore.readAcpSessionRecord('codex', 'closed-session'), null);
84
+ assert.ok(await sessionStore.readAcpSessionRecord('codex', 'open-session'));
85
+ } finally {
86
+ delete process.env.AXHUB_GENIE_ACP_SESSION_ROOT;
87
+ await fs.rm(sessionRoot, { recursive: true, force: true });
88
+ }
89
+ });
@@ -1,8 +1,5 @@
1
- import { queryClaudeSDK } from '../../claude-sdk.js';
2
- import { queryCodex } from '../../openai-codex.js';
3
- import { queryGemini } from '../../gemini-cli.js';
4
- import { queryOpencode } from '../../opencode-cli.js';
5
1
  import { CODEX_MODELS, GEMINI_MODELS, OPENCODE_MODELS } from '../../../shared/modelConstants.js';
2
+ import { executeAgentPrompt } from '../../acp-runtime/index.js';
6
3
 
7
4
  function normalizeBackend(backend) {
8
5
  const normalized = String(backend || '').trim().toLowerCase();
@@ -55,69 +52,28 @@ function createWriter(callbacks) {
55
52
  return;
56
53
  }
57
54
 
58
- if (payload.type === 'claude-response') {
59
- const delta = payload?.data?.delta?.text;
60
- if (payload?.data?.type === 'content_block_delta' && typeof delta === 'string' && delta.length > 0) {
61
- callbacks.onDelta?.(delta);
55
+ if (payload.type === 'conversation-event' && payload.event) {
56
+ if (payload.event.kind === 'assistant_text_delta' && typeof payload.event.payload?.text === 'string') {
57
+ callbacks.onDelta?.(payload.event.payload.text);
62
58
  return;
63
59
  }
64
60
 
65
- if (payload?.data?.type === 'content_block_stop') {
66
- state.done = true;
67
- }
68
-
69
- return;
70
- }
71
-
72
- if (payload.type === 'codex-response') {
73
- if (payload?.data?.type === 'item_delta' && typeof payload?.data?.delta === 'string' && payload.data.delta.length > 0) {
74
- const itemId = payload?.data?.itemId ? String(payload.data.itemId) : null;
75
- const isReasoning = !!payload?.data?.isReasoning || payload?.data?.itemType === 'reasoning';
76
-
77
- // Feishu channel does not output model reasoning/thinking content.
78
- if (isReasoning) {
79
- return;
61
+ if (payload.event.kind === 'session_state_changed') {
62
+ const nextState = String(payload.event.payload?.state || '').trim().toLowerCase();
63
+ if (nextState === 'completed') {
64
+ state.done = true;
65
+ } else if (nextState === 'errored') {
66
+ state.failed = true;
67
+ callbacks.onError?.(new Error(payload.event.payload?.message || 'Agent runtime error'));
68
+ } else if (nextState === 'aborted') {
69
+ state.failed = true;
70
+ callbacks.onError?.(new Error('Agent session aborted'));
80
71
  }
81
-
82
- if (itemId) {
83
- state.codexDeltaItems.add(itemId);
84
- }
85
-
86
- callbacks.onDelta?.(payload.data.delta);
87
- return;
88
72
  }
89
-
90
- if (payload?.data?.type === 'item_done' && typeof payload?.data?.content === 'string' && payload.data.content.length > 0) {
91
- const itemId = payload?.data?.itemId ? String(payload.data.itemId) : null;
92
- const isReasoning = !!payload?.data?.isReasoning || payload?.data?.itemType === 'reasoning';
93
- const hasDeltaStreamed = !!(itemId && state.codexDeltaItems.has(itemId));
94
-
95
- // Feishu channel does not output model reasoning/thinking content.
96
- if (isReasoning) {
97
- if (itemId) {
98
- state.codexDeltaItems.delete(itemId);
99
- }
100
- return;
101
- }
102
-
103
- if (!hasDeltaStreamed) {
104
- callbacks.onDelta?.(payload.data.content);
105
- }
106
-
107
- if (itemId) {
108
- state.codexDeltaItems.delete(itemId);
109
- }
110
- }
111
-
112
73
  return;
113
74
  }
114
75
 
115
- if (payload.type === 'claude-complete' || payload.type === 'codex-complete') {
116
- state.done = true;
117
- return;
118
- }
119
-
120
- if (payload.type === 'claude-error' || payload.type === 'codex-error') {
76
+ if (payload.type === 'error') {
121
77
  state.failed = true;
122
78
  callbacks.onError?.(new Error(payload.error || 'Agent runtime error'));
123
79
  }
@@ -158,17 +114,12 @@ export async function runBackendSession({
158
114
  skipPermissions: true,
159
115
  };
160
116
 
161
- if (resolvedBackend === 'claude') {
162
- await queryClaudeSDK(message, options, writer);
163
- } else if (resolvedBackend === 'codex') {
164
- await queryCodex(message, options, writer);
165
- } else if (resolvedBackend === 'gemini') {
166
- await queryGemini(message, options, writer);
167
- } else if (resolvedBackend === 'opencode') {
168
- await queryOpencode(message, options, writer);
169
- } else {
170
- throw new Error(`Unsupported backend: ${resolvedBackend}`);
171
- }
117
+ await executeAgentPrompt({
118
+ agentKey: resolvedBackend,
119
+ command: message,
120
+ options,
121
+ writer
122
+ });
172
123
 
173
124
  return {
174
125
  sessionId: writer.getState().sessionId || sessionId || null,