@axhub/genie 0.2.8 → 0.2.10
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/LICENSE +21 -675
- package/dist/api-docs.html +2 -2
- package/dist/assets/App-CYCCsgwf.js +264 -0
- package/dist/assets/ReviewApp-0srHIXwb.js +1 -0
- package/dist/assets/{_basePickBy-CqJbRZ9y.js → _basePickBy-DVVb07UV.js} +1 -1
- package/dist/assets/{_baseUniq-BS8YH8jO.js → _baseUniq-BtbziL5G.js} +1 -1
- package/dist/assets/{arc-BBmKEN-S.js → arc-BsCC8yBD.js} +1 -1
- package/dist/assets/{architectureDiagram-2XIMDMQ5-N5lcb82R.js → architectureDiagram-2XIMDMQ5-woFp6eNI.js} +1 -1
- package/dist/assets/{blockDiagram-WCTKOSBZ-DTMwHuLn.js → blockDiagram-WCTKOSBZ-ya8VAc2k.js} +1 -1
- package/dist/assets/{c4Diagram-IC4MRINW-BTKlkXI9.js → c4Diagram-IC4MRINW-CY1dZmIZ.js} +1 -1
- package/dist/assets/channel-BMhScXFe.js +1 -0
- package/dist/assets/{chunk-4BX2VUAB-DUdoTxAc.js → chunk-4BX2VUAB-CR1lAd74.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-Bm_92xe4.js → chunk-55IACEB6-CP98WcFC.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-CGW0g62g.js → chunk-FMBD7UC4-D9c7ijAB.js} +1 -1
- package/dist/assets/{chunk-JSJVCQXG-DYkTH3w1.js → chunk-JSJVCQXG-DQAGYOn-.js} +1 -1
- package/dist/assets/{chunk-KX2RTZJC-C9oTlISU.js → chunk-KX2RTZJC-BbTXiDq7.js} +1 -1
- package/dist/assets/{chunk-NQ4KR5QH-CM50ygWP.js → chunk-NQ4KR5QH-BI6AX0dr.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-7dzpYeNJ.js → chunk-QZHKN3VN-DB3V2Ifo.js} +1 -1
- package/dist/assets/{chunk-WL4C6EOR-Cm9nQrsr.js → chunk-WL4C6EOR-DhzTthv6.js} +1 -1
- package/dist/assets/classDiagram-VBA2DB6C-CMIxlWcT.js +1 -0
- package/dist/assets/classDiagram-v2-RAHNMMFH-CMIxlWcT.js +1 -0
- package/dist/assets/clone-BPqOt4r3.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-Ccp_p0JZ.js → cose-bilkent-S5V4N54A-BQ09ZE2j.js} +1 -1
- package/dist/assets/{dagre-KLK3FWXG-fBwTLUp9.js → dagre-KLK3FWXG-Dc2ueD_R.js} +1 -1
- package/dist/assets/{diagram-E7M64L7V-CeNVmFUp.js → diagram-E7M64L7V-DP-LsQoL.js} +1 -1
- package/dist/assets/{diagram-IFDJBPK2-CtavyLGa.js → diagram-IFDJBPK2-Cg6r42cB.js} +1 -1
- package/dist/assets/{diagram-P4PSJMXO-CpQTjQwc.js → diagram-P4PSJMXO-aHsfoUZE.js} +1 -1
- package/dist/assets/{erDiagram-INFDFZHY-B8R5vwhd.js → erDiagram-INFDFZHY-qBXJ4aAz.js} +1 -1
- package/dist/assets/{flowDiagram-PKNHOUZH-BvkVVwIQ.js → flowDiagram-PKNHOUZH-D_13emJM.js} +1 -1
- package/dist/assets/{ganttDiagram-A5KZAMGK-DOu3hSNa.js → ganttDiagram-A5KZAMGK-BvIcOLwz.js} +1 -1
- package/dist/assets/{gitGraphDiagram-K3NZZRJ6-C7zT67YE.js → gitGraphDiagram-K3NZZRJ6-ad0vvNcU.js} +1 -1
- package/dist/assets/{graph-D11wiwHo.js → graph-CeJCMjan.js} +1 -1
- package/dist/assets/{highlighted-body-TPN3WLV5-Babpthg-.js → highlighted-body-TPN3WLV5-B_novwSz.js} +1 -1
- package/dist/assets/index-C514cLyb.js +2 -0
- package/dist/assets/index-h1DBl_g3.css +1 -0
- package/dist/assets/{infoDiagram-LFFYTUFH-BmA7IpQG.js → infoDiagram-LFFYTUFH-lOxAqb3m.js} +1 -1
- package/dist/assets/{ishikawaDiagram-PHBUUO56-BEquZd3E.js → ishikawaDiagram-PHBUUO56-DIr-51gj.js} +1 -1
- package/dist/assets/{journeyDiagram-4ABVD52K-BfemGz7f.js → journeyDiagram-4ABVD52K-CYcIW0ZU.js} +1 -1
- package/dist/assets/{kanban-definition-K7BYSVSG-CWja3mln.js → kanban-definition-K7BYSVSG-C1ZK616a.js} +1 -1
- package/dist/assets/{layout-BLUNf-PJ.js → layout-CI2RM-v6.js} +1 -1
- package/dist/assets/{linear-DukIV_Xv.js → linear-DE7bISck.js} +1 -1
- package/dist/assets/{mermaid-O7DHMXV3-SgtM28qI.js → mermaid-O7DHMXV3-XxAJo8EK.js} +6 -6
- package/dist/assets/{mindmap-definition-YRQLILUH-4UjqXITU.js → mindmap-definition-YRQLILUH-Dz6EFjmn.js} +1 -1
- package/dist/assets/{pieDiagram-SKSYHLDU-8AxqJd0M.js → pieDiagram-SKSYHLDU-DPpEzUed.js} +1 -1
- package/dist/assets/{quadrantDiagram-337W2JSQ-D60m8V8r.js → quadrantDiagram-337W2JSQ-xdoXNet7.js} +1 -1
- package/dist/assets/{requirementDiagram-Z7DCOOCP-zqh9jBVf.js → requirementDiagram-Z7DCOOCP-DUq8H3CL.js} +1 -1
- package/dist/assets/{sankeyDiagram-WA2Y5GQK-CDZILTLI.js → sankeyDiagram-WA2Y5GQK-CmqEUxRu.js} +1 -1
- package/dist/assets/{sequenceDiagram-2WXFIKYE-7BReFd0L.js → sequenceDiagram-2WXFIKYE-DhtXRNiH.js} +1 -1
- package/dist/assets/{stateDiagram-RAJIS63D-HPTVdIG4.js → stateDiagram-RAJIS63D-Dj0HOlbN.js} +1 -1
- package/dist/assets/stateDiagram-v2-FVOUBMTO-C9utf5gv.js +1 -0
- package/dist/assets/{timeline-definition-YZTLITO2-CTVllFgr.js → timeline-definition-YZTLITO2-DUuJzZB5.js} +1 -1
- package/dist/assets/{treemap-KZPCXAKY-BtyxboJZ.js → treemap-KZPCXAKY-DpYBQ0qr.js} +1 -1
- package/dist/assets/vendor-codemirror-CMHSJ_9p.js +9 -0
- package/dist/assets/{vendor-react-Cpt6D04s.js → vendor-react-xmA_f8ig.js} +1 -1
- package/dist/assets/{vennDiagram-LZ73GAT5-D96ZI6Mg.js → vennDiagram-LZ73GAT5-DpePUyOd.js} +1 -1
- package/dist/assets/{xychartDiagram-JWTSCODW-eRk-39YO.js → xychartDiagram-JWTSCODW-Cfp1I4_U.js} +1 -1
- package/dist/index.html +5 -5
- package/package.json +8 -7
- package/server/acp-runtime/client.js +129 -16
- package/server/acp-runtime/index.js +54 -0
- package/server/acp-runtime/registry.js +2 -2
- package/server/acp-runtime/session-store.js +79 -5
- package/server/cli.js +55 -10
- package/server/database/db.js +20 -0
- package/server/external-agent/service.js +24 -6
- package/server/external-agent/ws.js +540 -27
- package/server/index.js +112 -151
- package/server/lan-access/core.js +79 -0
- package/server/lan-access/state.js +102 -0
- package/server/middleware/auth.js +57 -14
- package/server/projects.js +930 -667
- package/server/routes/auth.js +24 -4
- package/server/routes/cli-auth.js +21 -25
- package/server/routes/codex.js +84 -298
- package/server/routes/commands.js +322 -407
- package/server/routes/lan-access.js +231 -0
- package/server/routes/projects.js +154 -158
- package/server/routes/session-core.js +160 -91
- package/server/routes/settings.js +113 -99
- package/server/session-core/eventStore.js +60 -20
- package/server/session-core/providerAdapters.js +75 -38
- package/server/session-core/runtimeState.js +8 -0
- package/server/session-core/sessionListMerge.js +47 -0
- package/shared/conversationEvents.js +174 -15
- package/shared/modelConstants.js +79 -99
- package/dist/assets/App-CTKZtqB1.js +0 -460
- package/dist/assets/ReviewApp-DM6BNAzR.js +0 -1
- package/dist/assets/channel-1oJBvF-0.js +0 -1
- package/dist/assets/classDiagram-VBA2DB6C-d5TeKFM4.js +0 -1
- package/dist/assets/classDiagram-v2-RAHNMMFH-d5TeKFM4.js +0 -1
- package/dist/assets/clone-CinxIlEu.js +0 -1
- package/dist/assets/index-DFxzgWoO.js +0 -2
- package/dist/assets/index-YCFGDVKw.css +0 -1
- package/dist/assets/stateDiagram-v2-FVOUBMTO-DTUf5_gC.js +0 -1
- package/dist/assets/vendor-codemirror-Dz7_EqNA.js +0 -39
- package/server/_legacy-providers/README.md +0 -30
- package/server/_legacy-providers/claude-sdk.js +0 -956
- package/server/_legacy-providers/gemini-cli.js +0 -368
- package/server/_legacy-providers/openai-codex.js +0 -705
- package/server/_legacy-providers/opencode-cli.js +0 -674
- package/server/routes/git.js +0 -1110
- package/server/routes/mcp-utils.js +0 -48
- package/server/routes/mcp.js +0 -536
- package/server/routes/taskmaster.js +0 -1963
- package/server/utils/mcp-detector.js +0 -198
- package/server/utils/taskmaster-websocket.js +0 -129
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import jwt from 'jsonwebtoken';
|
|
2
2
|
import { userDb } from '../database/db.js';
|
|
3
3
|
import { IS_PLATFORM } from '../constants/config.js';
|
|
4
|
+
import { getLanSessionVersion } from '../lan-access/state.js';
|
|
5
|
+
import { isLoopbackRequest } from '../lan-access/core.js';
|
|
4
6
|
|
|
5
7
|
// Get JWT secret from environment or use default (for development)
|
|
6
8
|
const JWT_SECRET = process.env.JWT_SECRET || 'claude-ui-dev-secret-change-in-production';
|
|
@@ -10,6 +12,37 @@ const PUBLIC_GET_ROUTE_PATTERNS = [
|
|
|
10
12
|
/^\/api\/session-core\/providers(?:\/[^/]+)?\/?$/i,
|
|
11
13
|
];
|
|
12
14
|
|
|
15
|
+
const DEFAULT_TOKEN_EXPIRY = '30d';
|
|
16
|
+
|
|
17
|
+
function isSessionVersionAllowed(decodedToken, currentSessionVersion = getLanSessionVersion()) {
|
|
18
|
+
const expectedSessionVersion = Number.isInteger(currentSessionVersion) ? currentSessionVersion : 0;
|
|
19
|
+
const tokenSessionVersion = Number(decodedToken?.sessionVersion);
|
|
20
|
+
|
|
21
|
+
if (expectedSessionVersion <= 0) {
|
|
22
|
+
return tokenSessionVersion === 0 || Number.isNaN(tokenSessionVersion);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return Number.isInteger(tokenSessionVersion) && tokenSessionVersion === expectedSessionVersion;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function verifySignedToken(token, { expectedPurpose = null } = {}) {
|
|
29
|
+
const decoded = jwt.verify(token, JWT_SECRET);
|
|
30
|
+
|
|
31
|
+
if (expectedPurpose && decoded?.purpose !== expectedPurpose) {
|
|
32
|
+
const error = new Error('Invalid token purpose');
|
|
33
|
+
error.code = 'INVALID_TOKEN_PURPOSE';
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (!isSessionVersionAllowed(decoded)) {
|
|
38
|
+
const error = new Error('Token session is no longer valid');
|
|
39
|
+
error.code = 'STALE_SESSION_VERSION';
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return decoded;
|
|
44
|
+
}
|
|
45
|
+
|
|
13
46
|
// Optional API key middleware
|
|
14
47
|
const validateApiKey = (req, res, next) => {
|
|
15
48
|
// Skip API key validation if not configured
|
|
@@ -36,17 +69,17 @@ const authenticateToken = async (req, res, next) => {
|
|
|
36
69
|
}
|
|
37
70
|
|
|
38
71
|
// Platform mode: use single database user
|
|
39
|
-
if (IS_PLATFORM) {
|
|
72
|
+
if (IS_PLATFORM || isLoopbackRequest(req)) {
|
|
40
73
|
try {
|
|
41
74
|
const user = userDb.getFirstUser();
|
|
42
75
|
if (!user) {
|
|
43
|
-
return res.status(500).json({ error: '
|
|
76
|
+
return res.status(500).json({ error: 'No default user found in database' });
|
|
44
77
|
}
|
|
45
78
|
req.user = user;
|
|
46
79
|
return next();
|
|
47
80
|
} catch (error) {
|
|
48
|
-
console.error('
|
|
49
|
-
return res.status(500).json({ error: '
|
|
81
|
+
console.error('Local authentication bypass error:', error);
|
|
82
|
+
return res.status(500).json({ error: 'Failed to resolve local user' });
|
|
50
83
|
}
|
|
51
84
|
}
|
|
52
85
|
|
|
@@ -64,7 +97,7 @@ const authenticateToken = async (req, res, next) => {
|
|
|
64
97
|
}
|
|
65
98
|
|
|
66
99
|
try {
|
|
67
|
-
const decoded =
|
|
100
|
+
const decoded = verifySignedToken(token);
|
|
68
101
|
|
|
69
102
|
// Verify user still exists and is active
|
|
70
103
|
const user = userDb.getUserById(decoded.userId);
|
|
@@ -81,21 +114,29 @@ const authenticateToken = async (req, res, next) => {
|
|
|
81
114
|
};
|
|
82
115
|
|
|
83
116
|
// Generate JWT token (never expires)
|
|
84
|
-
const generateToken = (user) => {
|
|
117
|
+
const generateToken = (user, options = {}) => {
|
|
118
|
+
const {
|
|
119
|
+
expiresIn = DEFAULT_TOKEN_EXPIRY,
|
|
120
|
+
purpose = 'app',
|
|
121
|
+
sessionVersion = getLanSessionVersion(),
|
|
122
|
+
} = options;
|
|
123
|
+
|
|
85
124
|
return jwt.sign(
|
|
86
|
-
{
|
|
87
|
-
userId: user.id,
|
|
88
|
-
username: user.username
|
|
125
|
+
{
|
|
126
|
+
userId: user.id,
|
|
127
|
+
username: user.username,
|
|
128
|
+
purpose,
|
|
129
|
+
sessionVersion,
|
|
89
130
|
},
|
|
90
|
-
JWT_SECRET
|
|
91
|
-
|
|
131
|
+
JWT_SECRET,
|
|
132
|
+
expiresIn ? { expiresIn } : undefined
|
|
92
133
|
);
|
|
93
134
|
};
|
|
94
135
|
|
|
95
136
|
// WebSocket authentication function
|
|
96
|
-
const authenticateWebSocket = (token) => {
|
|
137
|
+
const authenticateWebSocket = (token, request = null) => {
|
|
97
138
|
// Platform mode: bypass token validation, return first user
|
|
98
|
-
if (IS_PLATFORM) {
|
|
139
|
+
if (IS_PLATFORM || isLoopbackRequest(request)) {
|
|
99
140
|
try {
|
|
100
141
|
const user = userDb.getFirstUser();
|
|
101
142
|
if (user) {
|
|
@@ -114,7 +155,7 @@ const authenticateWebSocket = (token) => {
|
|
|
114
155
|
}
|
|
115
156
|
|
|
116
157
|
try {
|
|
117
|
-
const decoded =
|
|
158
|
+
const decoded = verifySignedToken(token);
|
|
118
159
|
return decoded;
|
|
119
160
|
} catch (error) {
|
|
120
161
|
console.error('WebSocket token verification error:', error);
|
|
@@ -127,5 +168,7 @@ export {
|
|
|
127
168
|
authenticateToken,
|
|
128
169
|
generateToken,
|
|
129
170
|
authenticateWebSocket,
|
|
171
|
+
isSessionVersionAllowed,
|
|
172
|
+
verifySignedToken,
|
|
130
173
|
JWT_SECRET
|
|
131
174
|
};
|