@axhub/genie 0.2.6 → 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 (120) 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-DkiHsp3X.js → _basePickBy-C19AekOu.js} +1 -1
  5. package/dist/assets/{_baseUniq-7ElXb2sX.js → _baseUniq-JsnevLw_.js} +1 -1
  6. package/dist/assets/{arc-CEsS3MdK.js → arc-BLpcuBlf.js} +1 -1
  7. package/dist/assets/architectureDiagram-2XIMDMQ5-CarjBOOv.js +36 -0
  8. package/dist/assets/{blockDiagram-WCTKOSBZ-Cza6M6Ht.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--HkodwbY.js → chunk-4BX2VUAB-De63kbgc.js} +1 -1
  12. package/dist/assets/{chunk-55IACEB6-CyBuez4e.js → chunk-55IACEB6-DtTDDdM9.js} +1 -1
  13. package/dist/assets/{chunk-FMBD7UC4-CuzG4iAl.js → chunk-FMBD7UC4-DHuwd8tw.js} +1 -1
  14. package/dist/assets/{chunk-JSJVCQXG-BNi8S861.js → chunk-JSJVCQXG-BgytFtmO.js} +1 -1
  15. package/dist/assets/{chunk-KX2RTZJC-D817O-GT.js → chunk-KX2RTZJC-nZdp86aN.js} +1 -1
  16. package/dist/assets/chunk-NQ4KR5QH-CMH6EDP2.js +220 -0
  17. package/dist/assets/{chunk-QZHKN3VN-VMEn-zxh.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-Bqp7DjEa.js → dagre-KLK3FWXG-CHYIvW47.js} +1 -1
  25. package/dist/assets/diagram-E7M64L7V-TVdvHtGc.js +24 -0
  26. package/dist/assets/{diagram-IFDJBPK2--fHfW6V2.js → diagram-IFDJBPK2-Dzsiln_C.js} +1 -1
  27. package/dist/assets/{diagram-P4PSJMXO-D1kQI5RB.js → diagram-P4PSJMXO-DKnGbUpE.js} +1 -1
  28. package/dist/assets/erDiagram-INFDFZHY-5Kw0bByo.js +70 -0
  29. package/dist/assets/{flowDiagram-PKNHOUZH-DWeNr4yg.js → flowDiagram-PKNHOUZH-BAZ2-jKp.js} +4 -4
  30. package/dist/assets/ganttDiagram-A5KZAMGK-CsADFkcq.js +292 -0
  31. package/dist/assets/{gitGraphDiagram-K3NZZRJ6-B5a8UWjN.js → gitGraphDiagram-K3NZZRJ6-BflpyjGy.js} +1 -1
  32. package/dist/assets/{graph-Cw1rYoD9.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-D2u70rhN.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-DbVt0v29.js → kanban-definition-K7BYSVSG-FWinmur1.js} +5 -5
  40. package/dist/assets/{layout-W_tRx4UV.js → layout-vcz43XvZ.js} +1 -1
  41. package/dist/assets/{linear-CcMb2ay-.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-CDyJaACv.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-Di1ShaMF.js → sankeyDiagram-WA2Y5GQK-4gulcOP4.js} +3 -3
  48. package/dist/assets/sequenceDiagram-2WXFIKYE-VEuJDwyJ.js +145 -0
  49. package/dist/assets/{stateDiagram-RAJIS63D-CVZYMqyW.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-CGG4gx3C.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-Dds37L2k.js → vennDiagram-LZ73GAT5-8E_G06fI.js} +4 -4
  57. package/dist/assets/xychartDiagram-JWTSCODW-CbBk50-O.js +7 -0
  58. package/dist/index.html +4 -4
  59. package/package.json +2 -1
  60. package/server/_legacy-providers/README.md +30 -0
  61. package/server/_legacy-providers/claude-sdk.js +956 -0
  62. package/server/_legacy-providers/gemini-cli.js +368 -0
  63. package/server/_legacy-providers/openai-codex.js +705 -0
  64. package/server/_legacy-providers/opencode-cli.js +674 -0
  65. package/server/acp-runtime/client.js +1805 -0
  66. package/server/acp-runtime/client.test.js +688 -0
  67. package/server/acp-runtime/index.js +419 -0
  68. package/server/acp-runtime/registry.js +45 -0
  69. package/server/acp-runtime/session-store.js +254 -0
  70. package/server/acp-runtime/session-store.test.js +89 -0
  71. package/server/channels/runtime/AgentRuntimeAdapter.js +21 -70
  72. package/server/claude-sdk.js +24 -944
  73. package/server/cli.js +4 -2
  74. package/server/external-agent/service.js +52 -63
  75. package/server/gemini-cli.js +23 -360
  76. package/server/index.js +47 -44
  77. package/server/openai-codex.js +24 -698
  78. package/server/opencode-cli.js +70 -640
  79. package/server/routes/agent.js +2 -0
  80. package/server/routes/git.js +3 -20
  81. package/server/routes/session-core.js +44 -10
  82. package/server/session-core/abortSession.js +2 -18
  83. package/server/session-core/eventStore.js +5 -1
  84. package/server/session-core/providerAdapters.js +98 -10
  85. package/server/session-core/runtimeState.js +16 -17
  86. package/server/session-core/runtimeWriter.js +19 -12
  87. package/shared/conversationEvents.js +347 -10
  88. package/shared/conversationEvents.test.js +403 -0
  89. package/dist/assets/App-CYTE30Cf.js +0 -484
  90. package/dist/assets/App-qxJ8_QYu.css +0 -32
  91. package/dist/assets/ReviewApp-BEicSBzW.js +0 -1
  92. package/dist/assets/architectureDiagram-2XIMDMQ5-BubZ7T3U.js +0 -36
  93. package/dist/assets/c4Diagram-IC4MRINW-jhjtOQ12.js +0 -10
  94. package/dist/assets/channel-RmqTALN0.js +0 -1
  95. package/dist/assets/chunk-NQ4KR5QH-DyujyOvx.js +0 -220
  96. package/dist/assets/chunk-WL4C6EOR-CQHHFLvx.js +0 -189
  97. package/dist/assets/classDiagram-VBA2DB6C-wvVV1ggz.js +0 -1
  98. package/dist/assets/classDiagram-v2-RAHNMMFH-wvVV1ggz.js +0 -1
  99. package/dist/assets/clone-oT5aWXpf.js +0 -1
  100. package/dist/assets/cose-bilkent-S5V4N54A-qykDd54p.js +0 -1
  101. package/dist/assets/cytoscape.esm-2ZfV8NB5.js +0 -331
  102. package/dist/assets/diagram-E7M64L7V-BKtx468K.js +0 -24
  103. package/dist/assets/erDiagram-INFDFZHY-DT9YzdNw.js +0 -70
  104. package/dist/assets/ganttDiagram-A5KZAMGK--IgwcUhI.js +0 -292
  105. package/dist/assets/highlighted-body-TPN3WLV5-BCxJHuqY.js +0 -1
  106. package/dist/assets/index-CBuAXA5S.js +0 -2
  107. package/dist/assets/index-CyLWKyxy.css +0 -1
  108. package/dist/assets/ishikawaDiagram-PHBUUO56-Cl8yrezU.js +0 -70
  109. package/dist/assets/journeyDiagram-4ABVD52K-ddP0AMU9.js +0 -139
  110. package/dist/assets/mermaid-O7DHMXV3-BBJqt8pT.js +0 -988
  111. package/dist/assets/mindmap-definition-YRQLILUH-BGhZa7Na.js +0 -68
  112. package/dist/assets/quadrantDiagram-337W2JSQ-BSYuqf0Q.js +0 -7
  113. package/dist/assets/requirementDiagram-Z7DCOOCP-Cfi9YX9H.js +0 -73
  114. package/dist/assets/sequenceDiagram-2WXFIKYE-CYTTG38e.js +0 -145
  115. package/dist/assets/stateDiagram-v2-FVOUBMTO-Bbl0b4-i.js +0 -1
  116. package/dist/assets/timeline-definition-YZTLITO2-B1sdb5mK.js +0 -61
  117. package/dist/assets/vendor-codemirror-Dz7_EqNA.js +0 -39
  118. package/dist/assets/vendor-react-Cpt6D04s.js +0 -59
  119. package/dist/assets/vendor-xterm-DfaPXD3y.js +0 -66
  120. package/dist/assets/xychartDiagram-JWTSCODW-C8QKSyRR.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,