@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.
- package/dist/assets/App-BWSqiXAT.js +220 -0
- package/dist/assets/App-DrlLKa8f.css +1 -0
- package/dist/assets/ReviewApp-nz3mbArg.js +1 -0
- package/dist/assets/{_basePickBy-DkiHsp3X.js → _basePickBy-C19AekOu.js} +1 -1
- package/dist/assets/{_baseUniq-7ElXb2sX.js → _baseUniq-JsnevLw_.js} +1 -1
- package/dist/assets/{arc-CEsS3MdK.js → arc-BLpcuBlf.js} +1 -1
- package/dist/assets/architectureDiagram-2XIMDMQ5-CarjBOOv.js +36 -0
- package/dist/assets/{blockDiagram-WCTKOSBZ-Cza6M6Ht.js → blockDiagram-WCTKOSBZ-DQBLwsUS.js} +3 -3
- package/dist/assets/c4Diagram-IC4MRINW-CGobwBIj.js +10 -0
- package/dist/assets/channel-DkFNxV_H.js +1 -0
- package/dist/assets/{chunk-4BX2VUAB--HkodwbY.js → chunk-4BX2VUAB-De63kbgc.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-CyBuez4e.js → chunk-55IACEB6-DtTDDdM9.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-CuzG4iAl.js → chunk-FMBD7UC4-DHuwd8tw.js} +1 -1
- package/dist/assets/{chunk-JSJVCQXG-BNi8S861.js → chunk-JSJVCQXG-BgytFtmO.js} +1 -1
- package/dist/assets/{chunk-KX2RTZJC-D817O-GT.js → chunk-KX2RTZJC-nZdp86aN.js} +1 -1
- package/dist/assets/chunk-NQ4KR5QH-CMH6EDP2.js +220 -0
- package/dist/assets/{chunk-QZHKN3VN-VMEn-zxh.js → chunk-QZHKN3VN-DvUQ3mnO.js} +1 -1
- package/dist/assets/chunk-WL4C6EOR-Dn7db_6t.js +189 -0
- package/dist/assets/classDiagram-VBA2DB6C-DtwCEe8S.js +1 -0
- package/dist/assets/classDiagram-v2-RAHNMMFH-DtwCEe8S.js +1 -0
- package/dist/assets/clone-C0lCEIEO.js +1 -0
- package/dist/assets/cose-bilkent-S5V4N54A-DD_nzqsz.js +1 -0
- package/dist/assets/cytoscape.esm-5J0xJHOV.js +321 -0
- package/dist/assets/{dagre-KLK3FWXG-Bqp7DjEa.js → dagre-KLK3FWXG-CHYIvW47.js} +1 -1
- package/dist/assets/diagram-E7M64L7V-TVdvHtGc.js +24 -0
- package/dist/assets/{diagram-IFDJBPK2--fHfW6V2.js → diagram-IFDJBPK2-Dzsiln_C.js} +1 -1
- package/dist/assets/{diagram-P4PSJMXO-D1kQI5RB.js → diagram-P4PSJMXO-DKnGbUpE.js} +1 -1
- package/dist/assets/erDiagram-INFDFZHY-5Kw0bByo.js +70 -0
- package/dist/assets/{flowDiagram-PKNHOUZH-DWeNr4yg.js → flowDiagram-PKNHOUZH-BAZ2-jKp.js} +4 -4
- package/dist/assets/ganttDiagram-A5KZAMGK-CsADFkcq.js +292 -0
- package/dist/assets/{gitGraphDiagram-K3NZZRJ6-B5a8UWjN.js → gitGraphDiagram-K3NZZRJ6-BflpyjGy.js} +1 -1
- package/dist/assets/{graph-Cw1rYoD9.js → graph-suelaXFh.js} +1 -1
- package/dist/assets/highlighted-body-OFNGDK62-CZrBMazC.js +1 -0
- package/dist/assets/index-B01NxbUv.css +1 -0
- package/dist/assets/index-DW5pGgQ_.js +2 -0
- package/dist/assets/{infoDiagram-LFFYTUFH-D2u70rhN.js → infoDiagram-LFFYTUFH-pfD1FA3p.js} +1 -1
- package/dist/assets/ishikawaDiagram-PHBUUO56-ndm9snwO.js +70 -0
- package/dist/assets/journeyDiagram-4ABVD52K-HgF2t7z5.js +139 -0
- package/dist/assets/{kanban-definition-K7BYSVSG-DbVt0v29.js → kanban-definition-K7BYSVSG-FWinmur1.js} +5 -5
- package/dist/assets/{layout-W_tRx4UV.js → layout-vcz43XvZ.js} +1 -1
- package/dist/assets/{linear-CcMb2ay-.js → linear-le4gc0vx.js} +1 -1
- package/dist/assets/mermaid-GHXKKRXX-CK8m3lad.js +870 -0
- package/dist/assets/mindmap-definition-YRQLILUH-CNq9SKj4.js +68 -0
- package/dist/assets/{pieDiagram-SKSYHLDU-CDyJaACv.js → pieDiagram-SKSYHLDU-C7PKDh3b.js} +2 -2
- package/dist/assets/quadrantDiagram-337W2JSQ-B7FnztNO.js +7 -0
- package/dist/assets/requirementDiagram-Z7DCOOCP-Bl_BM2Th.js +73 -0
- package/dist/assets/{sankeyDiagram-WA2Y5GQK-Di1ShaMF.js → sankeyDiagram-WA2Y5GQK-4gulcOP4.js} +3 -3
- package/dist/assets/sequenceDiagram-2WXFIKYE-VEuJDwyJ.js +145 -0
- package/dist/assets/{stateDiagram-RAJIS63D-CVZYMqyW.js → stateDiagram-RAJIS63D-CB4Vl7qM.js} +1 -1
- package/dist/assets/stateDiagram-v2-FVOUBMTO-C85ucl39.js +1 -0
- package/dist/assets/timeline-definition-YZTLITO2-BPGKhi7f.js +61 -0
- package/dist/assets/{treemap-KZPCXAKY-CGG4gx3C.js → treemap-KZPCXAKY-DZSEE6Hz.js} +58 -58
- package/dist/assets/vendor-codemirror-CyOKkaQZ.js +31 -0
- package/dist/assets/vendor-react-CP4yFTs7.js +8 -0
- package/dist/assets/vendor-xterm-DfcmCpbH.js +66 -0
- package/dist/assets/{vennDiagram-LZ73GAT5-Dds37L2k.js → vennDiagram-LZ73GAT5-8E_G06fI.js} +4 -4
- package/dist/assets/xychartDiagram-JWTSCODW-CbBk50-O.js +7 -0
- package/dist/index.html +4 -4
- package/package.json +2 -1
- package/server/_legacy-providers/README.md +30 -0
- package/server/_legacy-providers/claude-sdk.js +956 -0
- package/server/_legacy-providers/gemini-cli.js +368 -0
- package/server/_legacy-providers/openai-codex.js +705 -0
- package/server/_legacy-providers/opencode-cli.js +674 -0
- package/server/acp-runtime/client.js +1805 -0
- package/server/acp-runtime/client.test.js +688 -0
- package/server/acp-runtime/index.js +419 -0
- package/server/acp-runtime/registry.js +45 -0
- package/server/acp-runtime/session-store.js +254 -0
- package/server/acp-runtime/session-store.test.js +89 -0
- package/server/channels/runtime/AgentRuntimeAdapter.js +21 -70
- package/server/claude-sdk.js +24 -944
- package/server/cli.js +4 -2
- package/server/external-agent/service.js +52 -63
- package/server/gemini-cli.js +23 -360
- package/server/index.js +47 -44
- package/server/openai-codex.js +24 -698
- package/server/opencode-cli.js +70 -640
- package/server/routes/agent.js +2 -0
- package/server/routes/git.js +3 -20
- package/server/routes/session-core.js +44 -10
- package/server/session-core/abortSession.js +2 -18
- package/server/session-core/eventStore.js +5 -1
- package/server/session-core/providerAdapters.js +98 -10
- package/server/session-core/runtimeState.js +16 -17
- package/server/session-core/runtimeWriter.js +19 -12
- package/shared/conversationEvents.js +347 -10
- package/shared/conversationEvents.test.js +403 -0
- package/dist/assets/App-CYTE30Cf.js +0 -484
- package/dist/assets/App-qxJ8_QYu.css +0 -32
- package/dist/assets/ReviewApp-BEicSBzW.js +0 -1
- package/dist/assets/architectureDiagram-2XIMDMQ5-BubZ7T3U.js +0 -36
- package/dist/assets/c4Diagram-IC4MRINW-jhjtOQ12.js +0 -10
- package/dist/assets/channel-RmqTALN0.js +0 -1
- package/dist/assets/chunk-NQ4KR5QH-DyujyOvx.js +0 -220
- package/dist/assets/chunk-WL4C6EOR-CQHHFLvx.js +0 -189
- package/dist/assets/classDiagram-VBA2DB6C-wvVV1ggz.js +0 -1
- package/dist/assets/classDiagram-v2-RAHNMMFH-wvVV1ggz.js +0 -1
- package/dist/assets/clone-oT5aWXpf.js +0 -1
- package/dist/assets/cose-bilkent-S5V4N54A-qykDd54p.js +0 -1
- package/dist/assets/cytoscape.esm-2ZfV8NB5.js +0 -331
- package/dist/assets/diagram-E7M64L7V-BKtx468K.js +0 -24
- package/dist/assets/erDiagram-INFDFZHY-DT9YzdNw.js +0 -70
- package/dist/assets/ganttDiagram-A5KZAMGK--IgwcUhI.js +0 -292
- package/dist/assets/highlighted-body-TPN3WLV5-BCxJHuqY.js +0 -1
- package/dist/assets/index-CBuAXA5S.js +0 -2
- package/dist/assets/index-CyLWKyxy.css +0 -1
- package/dist/assets/ishikawaDiagram-PHBUUO56-Cl8yrezU.js +0 -70
- package/dist/assets/journeyDiagram-4ABVD52K-ddP0AMU9.js +0 -139
- package/dist/assets/mermaid-O7DHMXV3-BBJqt8pT.js +0 -988
- package/dist/assets/mindmap-definition-YRQLILUH-BGhZa7Na.js +0 -68
- package/dist/assets/quadrantDiagram-337W2JSQ-BSYuqf0Q.js +0 -7
- package/dist/assets/requirementDiagram-Z7DCOOCP-Cfi9YX9H.js +0 -73
- package/dist/assets/sequenceDiagram-2WXFIKYE-CYTTG38e.js +0 -145
- package/dist/assets/stateDiagram-v2-FVOUBMTO-Bbl0b4-i.js +0 -1
- package/dist/assets/timeline-definition-YZTLITO2-B1sdb5mK.js +0 -61
- package/dist/assets/vendor-codemirror-Dz7_EqNA.js +0 -39
- package/dist/assets/vendor-react-Cpt6D04s.js +0 -59
- package/dist/assets/vendor-xterm-DfaPXD3y.js +0 -66
- 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 === '
|
|
59
|
-
|
|
60
|
-
|
|
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
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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 === '
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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,
|