@straiffi/archon 1.0.0
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/README.md +224 -0
- package/dist/cli.js +216 -0
- package/dist/client/assets/index-8_-boBBA.css +2 -0
- package/dist/client/assets/index-s_jjeqha.js +176 -0
- package/dist/client/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- package/dist/client/favicon.svg +62 -0
- package/dist/client/icons.svg +24 -0
- package/dist/client/index.html +14 -0
- package/dist/server/db.js +764 -0
- package/dist/server/db.js.map +1 -0
- package/dist/server/index.js +5134 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/lib/agent.js +1302 -0
- package/dist/server/lib/agent.js.map +1 -0
- package/dist/server/lib/buildChains.js +2 -0
- package/dist/server/lib/buildChains.js.map +1 -0
- package/dist/server/lib/buildFlow.js +59 -0
- package/dist/server/lib/buildFlow.js.map +1 -0
- package/dist/server/lib/buildSequences.js +599 -0
- package/dist/server/lib/buildSequences.js.map +1 -0
- package/dist/server/lib/bundleActivity.js +95 -0
- package/dist/server/lib/bundleActivity.js.map +1 -0
- package/dist/server/lib/bundlePullRequests.js +126 -0
- package/dist/server/lib/bundlePullRequests.js.map +1 -0
- package/dist/server/lib/chatMessages.js +60 -0
- package/dist/server/lib/chatMessages.js.map +1 -0
- package/dist/server/lib/chatTargets.js +123 -0
- package/dist/server/lib/chatTargets.js.map +1 -0
- package/dist/server/lib/chatTicketProposals.js +180 -0
- package/dist/server/lib/chatTicketProposals.js.map +1 -0
- package/dist/server/lib/chats.js +279 -0
- package/dist/server/lib/chats.js.map +1 -0
- package/dist/server/lib/config.js +3 -0
- package/dist/server/lib/config.js.map +1 -0
- package/dist/server/lib/cors.js +30 -0
- package/dist/server/lib/cors.js.map +1 -0
- package/dist/server/lib/directoryPicker.js +174 -0
- package/dist/server/lib/directoryPicker.js.map +1 -0
- package/dist/server/lib/git.js +1284 -0
- package/dist/server/lib/git.js.map +1 -0
- package/dist/server/lib/integrations/github.js +511 -0
- package/dist/server/lib/integrations/github.js.map +1 -0
- package/dist/server/lib/integrations/index.js +162 -0
- package/dist/server/lib/integrations/index.js.map +1 -0
- package/dist/server/lib/integrations/jira.js +283 -0
- package/dist/server/lib/integrations/jira.js.map +1 -0
- package/dist/server/lib/integrations/planning.js +27 -0
- package/dist/server/lib/integrations/planning.js.map +1 -0
- package/dist/server/lib/integrations/types.js +2 -0
- package/dist/server/lib/integrations/types.js.map +1 -0
- package/dist/server/lib/lightweightPrompt.js +88 -0
- package/dist/server/lib/lightweightPrompt.js.map +1 -0
- package/dist/server/lib/models.js +219 -0
- package/dist/server/lib/models.js.map +1 -0
- package/dist/server/lib/preview.js +377 -0
- package/dist/server/lib/preview.js.map +1 -0
- package/dist/server/lib/previewProxy.js +659 -0
- package/dist/server/lib/previewProxy.js.map +1 -0
- package/dist/server/lib/projectAutoConfig.js +682 -0
- package/dist/server/lib/projectAutoConfig.js.map +1 -0
- package/dist/server/lib/projectFileSuggestions.js +133 -0
- package/dist/server/lib/projectFileSuggestions.js.map +1 -0
- package/dist/server/lib/projectMemory.js +1519 -0
- package/dist/server/lib/projectMemory.js.map +1 -0
- package/dist/server/lib/projectMemoryPrompt.js +390 -0
- package/dist/server/lib/projectMemoryPrompt.js.map +1 -0
- package/dist/server/lib/projectMemoryScan.js +681 -0
- package/dist/server/lib/projectMemoryScan.js.map +1 -0
- package/dist/server/lib/projectMemorySuggestions.js +166 -0
- package/dist/server/lib/projectMemorySuggestions.js.map +1 -0
- package/dist/server/lib/projectMemoryTransfer.js +958 -0
- package/dist/server/lib/projectMemoryTransfer.js.map +1 -0
- package/dist/server/lib/projects.js +569 -0
- package/dist/server/lib/projects.js.map +1 -0
- package/dist/server/lib/promptSkills.js +28 -0
- package/dist/server/lib/promptSkills.js.map +1 -0
- package/dist/server/lib/queue.js +15 -0
- package/dist/server/lib/queue.js.map +1 -0
- package/dist/server/lib/reviewFindings.js +390 -0
- package/dist/server/lib/reviewFindings.js.map +1 -0
- package/dist/server/lib/run.js +416 -0
- package/dist/server/lib/run.js.map +1 -0
- package/dist/server/lib/runtimePaths.js +93 -0
- package/dist/server/lib/runtimePaths.js.map +1 -0
- package/dist/server/lib/shell.js +27 -0
- package/dist/server/lib/shell.js.map +1 -0
- package/dist/server/lib/skills.js +124 -0
- package/dist/server/lib/skills.js.map +1 -0
- package/dist/server/lib/startDev.js +18 -0
- package/dist/server/lib/startDev.js.map +1 -0
- package/dist/server/lib/staticClient.js +80 -0
- package/dist/server/lib/staticClient.js.map +1 -0
- package/dist/server/lib/terminal.js +366 -0
- package/dist/server/lib/terminal.js.map +1 -0
- package/dist/server/lib/ticketDependencies.js +174 -0
- package/dist/server/lib/ticketDependencies.js.map +1 -0
- package/dist/server/lib/ticketMessages.js +65 -0
- package/dist/server/lib/ticketMessages.js.map +1 -0
- package/dist/server/lib/ticketOpenQuestions.js +128 -0
- package/dist/server/lib/ticketOpenQuestions.js.map +1 -0
- package/dist/server/lib/ticketUndo.js +549 -0
- package/dist/server/lib/ticketUndo.js.map +1 -0
- package/dist/server/lib/tickets.js +981 -0
- package/dist/server/lib/tickets.js.map +1 -0
- package/dist/server/lib/types.js +2 -0
- package/dist/server/lib/types.js.map +1 -0
- package/dist/server/package.json +3 -0
- package/dist/server/workers/build.js +229 -0
- package/dist/server/workers/build.js.map +1 -0
- package/dist/server/workers/chat.js +190 -0
- package/dist/server/workers/chat.js.map +1 -0
- package/dist/server/workers/followUp.js +204 -0
- package/dist/server/workers/followUp.js.map +1 -0
- package/dist/server/workers/plan.js +1130 -0
- package/dist/server/workers/plan.js.map +1 -0
- package/dist/server/workers/planFollowUp.js +360 -0
- package/dist/server/workers/planFollowUp.js.map +1 -0
- package/dist/server/workers/review.js +167 -0
- package/dist/server/workers/review.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
import db from '../db.js';
|
|
3
|
+
import { resolveChatSessionTarget } from './chatTargets.js';
|
|
4
|
+
import { listChatMessages } from './chatMessages.js';
|
|
5
|
+
import { getProjectBranch } from './git.js';
|
|
6
|
+
import { getProjectActiveTarget, getProjectById } from './projects.js';
|
|
7
|
+
import { getBundle, isProjectRootBundle } from './tickets.js';
|
|
8
|
+
const DEFAULT_CHAT_SESSION_TITLE = 'New chat';
|
|
9
|
+
const DEFAULT_CHAT_TARGET_LABEL = 'Project root';
|
|
10
|
+
const lastUserMessageAtSelect = `(
|
|
11
|
+
SELECT MAX(chat_messages.created_at)
|
|
12
|
+
FROM chat_messages
|
|
13
|
+
WHERE chat_messages.chat_session_id = chat_sessions.id
|
|
14
|
+
AND chat_messages.role = 'user'
|
|
15
|
+
)`;
|
|
16
|
+
const lastMessageAtSelect = `(
|
|
17
|
+
SELECT MAX(chat_messages.created_at)
|
|
18
|
+
FROM chat_messages
|
|
19
|
+
WHERE chat_messages.chat_session_id = chat_sessions.id
|
|
20
|
+
)`;
|
|
21
|
+
const firstUserMessagePreviewSelect = `(
|
|
22
|
+
SELECT chat_messages.content
|
|
23
|
+
FROM chat_messages
|
|
24
|
+
WHERE chat_messages.chat_session_id = chat_sessions.id
|
|
25
|
+
AND chat_messages.role = 'user'
|
|
26
|
+
ORDER BY chat_messages.created_at ASC, chat_messages.rowid ASC
|
|
27
|
+
LIMIT 1
|
|
28
|
+
)`;
|
|
29
|
+
const pendingMemorySuggestionCountSelect = `(
|
|
30
|
+
SELECT COUNT(*)
|
|
31
|
+
FROM project_memory_suggestions
|
|
32
|
+
WHERE project_memory_suggestions.chat_session_id = chat_sessions.id
|
|
33
|
+
AND project_memory_suggestions.status = 'pending'
|
|
34
|
+
)`;
|
|
35
|
+
const activityAtSelect = `COALESCE(${lastMessageAtSelect}, chat_sessions.created_at)`;
|
|
36
|
+
const listChatSessionsStatement = db.prepare(`
|
|
37
|
+
SELECT id, project_id, title, mode, tool, model, variant, skills_json, agent_status, agent_log, streaming_response,
|
|
38
|
+
target_kind, target_bundle_id, target_branch_snapshot, target_label_snapshot,
|
|
39
|
+
claude_session_id, opencode_session_id,
|
|
40
|
+
usage_snapshot_context_window, usage_snapshot_max_output_tokens, usage_snapshot_total_tokens,
|
|
41
|
+
usage_snapshot_input_tokens, usage_snapshot_output_tokens, usage_snapshot_cache_read_tokens,
|
|
42
|
+
usage_snapshot_reasoning_tokens, ${firstUserMessagePreviewSelect} AS first_user_message_preview,
|
|
43
|
+
${pendingMemorySuggestionCountSelect} AS pending_memory_suggestion_count,
|
|
44
|
+
${lastUserMessageAtSelect} AS last_user_message_at,
|
|
45
|
+
${activityAtSelect} AS activity_at, created_at, updated_at
|
|
46
|
+
FROM chat_sessions
|
|
47
|
+
WHERE project_id = ?
|
|
48
|
+
ORDER BY activity_at DESC, id DESC
|
|
49
|
+
`);
|
|
50
|
+
const getChatSessionStatement = db.prepare(`
|
|
51
|
+
SELECT id, project_id, title, mode, tool, model, variant, skills_json, agent_status, agent_log, streaming_response,
|
|
52
|
+
target_kind, target_bundle_id, target_branch_snapshot, target_label_snapshot,
|
|
53
|
+
claude_session_id, opencode_session_id,
|
|
54
|
+
usage_snapshot_context_window, usage_snapshot_max_output_tokens, usage_snapshot_total_tokens,
|
|
55
|
+
usage_snapshot_input_tokens, usage_snapshot_output_tokens, usage_snapshot_cache_read_tokens,
|
|
56
|
+
usage_snapshot_reasoning_tokens, ${firstUserMessagePreviewSelect} AS first_user_message_preview,
|
|
57
|
+
${pendingMemorySuggestionCountSelect} AS pending_memory_suggestion_count,
|
|
58
|
+
${lastUserMessageAtSelect} AS last_user_message_at,
|
|
59
|
+
${activityAtSelect} AS activity_at, created_at, updated_at
|
|
60
|
+
FROM chat_sessions
|
|
61
|
+
WHERE id = ?
|
|
62
|
+
`);
|
|
63
|
+
const insertChatSessionStatement = db.prepare(`
|
|
64
|
+
INSERT INTO chat_sessions (
|
|
65
|
+
id, project_id, title, mode, tool, model, variant, skills_json,
|
|
66
|
+
agent_status, agent_log, streaming_response, target_kind, target_bundle_id, target_branch_snapshot,
|
|
67
|
+
target_label_snapshot, claude_session_id, opencode_session_id
|
|
68
|
+
)
|
|
69
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, NULL, ?, ?, ?, ?, NULL, NULL)
|
|
70
|
+
`);
|
|
71
|
+
const updateChatSessionModeStatement = db.prepare(`
|
|
72
|
+
UPDATE chat_sessions
|
|
73
|
+
SET mode = ?, updated_at = CURRENT_TIMESTAMP
|
|
74
|
+
WHERE id = ?
|
|
75
|
+
`);
|
|
76
|
+
const updateChatSessionTitleStatement = db.prepare(`
|
|
77
|
+
UPDATE chat_sessions
|
|
78
|
+
SET title = ?, updated_at = CURRENT_TIMESTAMP
|
|
79
|
+
WHERE id = ?
|
|
80
|
+
`);
|
|
81
|
+
const updateChatSessionRunConfigStatement = db.prepare(`
|
|
82
|
+
UPDATE chat_sessions
|
|
83
|
+
SET tool = ?, model = ?, variant = ?, skills_json = ?, updated_at = CURRENT_TIMESTAMP
|
|
84
|
+
WHERE id = ?
|
|
85
|
+
`);
|
|
86
|
+
const updateChatSessionStatusStatement = db.prepare(`
|
|
87
|
+
UPDATE chat_sessions
|
|
88
|
+
SET agent_status = ?, agent_log = ?, streaming_response = ?, updated_at = CURRENT_TIMESTAMP
|
|
89
|
+
WHERE id = ?
|
|
90
|
+
`);
|
|
91
|
+
const updateClaudeSessionIdStatement = db.prepare(`
|
|
92
|
+
UPDATE chat_sessions
|
|
93
|
+
SET claude_session_id = ?, updated_at = CURRENT_TIMESTAMP
|
|
94
|
+
WHERE id = ?
|
|
95
|
+
`);
|
|
96
|
+
const updateOpencodeSessionIdStatement = db.prepare(`
|
|
97
|
+
UPDATE chat_sessions
|
|
98
|
+
SET opencode_session_id = ?, updated_at = CURRENT_TIMESTAMP
|
|
99
|
+
WHERE id = ?
|
|
100
|
+
`);
|
|
101
|
+
const updateChatSessionUsageSnapshotStatement = db.prepare(`
|
|
102
|
+
UPDATE chat_sessions
|
|
103
|
+
SET usage_snapshot_context_window = ?,
|
|
104
|
+
usage_snapshot_max_output_tokens = ?,
|
|
105
|
+
usage_snapshot_total_tokens = ?,
|
|
106
|
+
usage_snapshot_input_tokens = ?,
|
|
107
|
+
usage_snapshot_output_tokens = ?,
|
|
108
|
+
usage_snapshot_cache_read_tokens = ?,
|
|
109
|
+
usage_snapshot_reasoning_tokens = ?,
|
|
110
|
+
updated_at = CURRENT_TIMESTAMP
|
|
111
|
+
WHERE id = ?
|
|
112
|
+
`);
|
|
113
|
+
const deleteChatSessionStatement = db.prepare(`
|
|
114
|
+
DELETE FROM chat_sessions
|
|
115
|
+
WHERE id = ?
|
|
116
|
+
`);
|
|
117
|
+
const deleteChatMessagesStatement = db.prepare(`
|
|
118
|
+
DELETE FROM chat_messages
|
|
119
|
+
WHERE chat_session_id = ?
|
|
120
|
+
`);
|
|
121
|
+
const deleteChatSessionMemorySuggestionsStatement = db.prepare(`
|
|
122
|
+
DELETE FROM project_memory_suggestions
|
|
123
|
+
WHERE chat_session_id = ?
|
|
124
|
+
`);
|
|
125
|
+
const parseChatSkills = (value) => {
|
|
126
|
+
if (!value) {
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const parsed = JSON.parse(value);
|
|
131
|
+
if (!Array.isArray(parsed)) {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
return parsed
|
|
135
|
+
.filter((entry) => typeof entry === 'string')
|
|
136
|
+
.map(entry => entry.trim())
|
|
137
|
+
.filter(Boolean)
|
|
138
|
+
.filter((entry, index, values) => values.indexOf(entry) === index);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
const normalizeChatMessagePreview = (value) => {
|
|
145
|
+
if (!value) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
const normalized = value.replace(/\s+/g, ' ').trim();
|
|
149
|
+
return normalized || null;
|
|
150
|
+
};
|
|
151
|
+
const resolveInitialChatTarget = (projectId) => {
|
|
152
|
+
const project = getProjectById(projectId);
|
|
153
|
+
const activeTarget = getProjectActiveTarget(project);
|
|
154
|
+
if (activeTarget.kind === 'bundle' && activeTarget.bundle_id) {
|
|
155
|
+
const bundle = getBundle(activeTarget.bundle_id, projectId);
|
|
156
|
+
if (bundle && !isProjectRootBundle(bundle)) {
|
|
157
|
+
return {
|
|
158
|
+
targetKind: 'bundle',
|
|
159
|
+
targetBundleId: bundle.id,
|
|
160
|
+
targetBranchSnapshot: bundle.branch,
|
|
161
|
+
targetLabelSnapshot: bundle.name,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const branchState = getProjectBranch(project, { includeDiffStats: false });
|
|
166
|
+
return {
|
|
167
|
+
targetKind: 'repo_root',
|
|
168
|
+
targetBundleId: null,
|
|
169
|
+
targetBranchSnapshot: branchState.branch,
|
|
170
|
+
targetLabelSnapshot: DEFAULT_CHAT_TARGET_LABEL,
|
|
171
|
+
};
|
|
172
|
+
};
|
|
173
|
+
const serializeChatSession = (row, options = {}) => {
|
|
174
|
+
if (!row) {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
const targetResolution = resolveChatSessionTarget({
|
|
178
|
+
project_id: row.project_id,
|
|
179
|
+
target_kind: row.target_kind,
|
|
180
|
+
target_bundle_id: row.target_bundle_id ?? null,
|
|
181
|
+
target_branch_snapshot: row.target_branch_snapshot ?? null,
|
|
182
|
+
});
|
|
183
|
+
const chatSessionBase = {
|
|
184
|
+
id: row.id,
|
|
185
|
+
project_id: row.project_id,
|
|
186
|
+
title: row.title,
|
|
187
|
+
first_user_message_preview: normalizeChatMessagePreview(row.first_user_message_preview),
|
|
188
|
+
pending_memory_suggestion_count: typeof row.pending_memory_suggestion_count === 'number' ? row.pending_memory_suggestion_count : 0,
|
|
189
|
+
mode: row.mode,
|
|
190
|
+
tool: row.tool,
|
|
191
|
+
model: row.model,
|
|
192
|
+
variant: row.variant,
|
|
193
|
+
skills: parseChatSkills(row.skills_json),
|
|
194
|
+
agent_status: row.agent_status,
|
|
195
|
+
agent_log: row.agent_log,
|
|
196
|
+
streaming_response: row.streaming_response,
|
|
197
|
+
target_kind: row.target_kind,
|
|
198
|
+
target_bundle_id: row.target_bundle_id ?? null,
|
|
199
|
+
target_branch_snapshot: row.target_branch_snapshot ?? null,
|
|
200
|
+
target_label_snapshot: row.target_label_snapshot ?? null,
|
|
201
|
+
target_available: targetResolution.target_available,
|
|
202
|
+
target_unavailable_reason: targetResolution.target_unavailable_reason,
|
|
203
|
+
claude_session_id: row.claude_session_id,
|
|
204
|
+
opencode_session_id: row.opencode_session_id,
|
|
205
|
+
usage_snapshot_context_window: row.usage_snapshot_context_window ?? null,
|
|
206
|
+
usage_snapshot_max_output_tokens: row.usage_snapshot_max_output_tokens ?? null,
|
|
207
|
+
usage_snapshot_total_tokens: row.usage_snapshot_total_tokens ?? null,
|
|
208
|
+
usage_snapshot_input_tokens: row.usage_snapshot_input_tokens ?? null,
|
|
209
|
+
usage_snapshot_output_tokens: row.usage_snapshot_output_tokens ?? null,
|
|
210
|
+
usage_snapshot_cache_read_tokens: row.usage_snapshot_cache_read_tokens ?? null,
|
|
211
|
+
usage_snapshot_reasoning_tokens: row.usage_snapshot_reasoning_tokens ?? null,
|
|
212
|
+
activity_at: row.activity_at,
|
|
213
|
+
last_user_message_at: row.last_user_message_at ?? null,
|
|
214
|
+
created_at: row.created_at,
|
|
215
|
+
updated_at: row.updated_at,
|
|
216
|
+
};
|
|
217
|
+
return options.includeMessages
|
|
218
|
+
? {
|
|
219
|
+
...chatSessionBase,
|
|
220
|
+
messages: listChatMessages(row.id),
|
|
221
|
+
}
|
|
222
|
+
: chatSessionBase;
|
|
223
|
+
};
|
|
224
|
+
export const getDefaultChatSessionTitle = () => DEFAULT_CHAT_SESSION_TITLE;
|
|
225
|
+
export const deriveChatSessionTitle = (prompt) => {
|
|
226
|
+
const normalized = prompt
|
|
227
|
+
.replace(/\s+/g, ' ')
|
|
228
|
+
.trim();
|
|
229
|
+
if (!normalized) {
|
|
230
|
+
return DEFAULT_CHAT_SESSION_TITLE;
|
|
231
|
+
}
|
|
232
|
+
return normalized.length > 80 ? `${normalized.slice(0, 77).trimEnd()}...` : normalized;
|
|
233
|
+
};
|
|
234
|
+
export const listChatSessions = (projectId) => {
|
|
235
|
+
return listChatSessionsStatement.all(projectId)
|
|
236
|
+
.map(row => serializeChatSession(row))
|
|
237
|
+
.filter((session) => session !== null);
|
|
238
|
+
};
|
|
239
|
+
export const getChatSession = (id, options = {}) => {
|
|
240
|
+
return serializeChatSession(getChatSessionStatement.get(id), options);
|
|
241
|
+
};
|
|
242
|
+
export const createChatSession = ({ projectId, mode, tool, model, variant, skills, title = DEFAULT_CHAT_SESSION_TITLE, }) => {
|
|
243
|
+
const id = randomUUID();
|
|
244
|
+
const target = resolveInitialChatTarget(projectId);
|
|
245
|
+
insertChatSessionStatement.run(id, projectId, title.trim() || DEFAULT_CHAT_SESSION_TITLE, mode, tool, model, variant, JSON.stringify(skills ?? []), target.targetKind, target.targetBundleId, target.targetBranchSnapshot, target.targetLabelSnapshot);
|
|
246
|
+
return getChatSession(id, { includeMessages: true });
|
|
247
|
+
};
|
|
248
|
+
export const updateChatSessionMode = (chatSessionId, mode) => {
|
|
249
|
+
updateChatSessionModeStatement.run(mode, chatSessionId);
|
|
250
|
+
return getChatSession(chatSessionId, { includeMessages: true });
|
|
251
|
+
};
|
|
252
|
+
export const updateChatSessionTitle = (chatSessionId, title) => {
|
|
253
|
+
updateChatSessionTitleStatement.run(title.trim() || DEFAULT_CHAT_SESSION_TITLE, chatSessionId);
|
|
254
|
+
};
|
|
255
|
+
export const updateChatSessionRunConfig = ({ chatSessionId, tool, model, variant, skills, }) => {
|
|
256
|
+
updateChatSessionRunConfigStatement.run(tool, model, variant, JSON.stringify(skills), chatSessionId);
|
|
257
|
+
};
|
|
258
|
+
export const updateChatSessionStatus = (chatSessionId, status, log, streamingResponse) => {
|
|
259
|
+
updateChatSessionStatusStatement.run(status, log, streamingResponse, chatSessionId);
|
|
260
|
+
};
|
|
261
|
+
export const clearChatSessionStreamingResponse = (chatSessionId) => {
|
|
262
|
+
db.prepare('UPDATE chat_sessions SET streaming_response = NULL, updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(chatSessionId);
|
|
263
|
+
};
|
|
264
|
+
export const updateChatSessionResumeId = (chatSessionId, tool, sessionId) => {
|
|
265
|
+
if (tool === 'claude') {
|
|
266
|
+
updateClaudeSessionIdStatement.run(sessionId, chatSessionId);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
updateOpencodeSessionIdStatement.run(sessionId, chatSessionId);
|
|
270
|
+
};
|
|
271
|
+
export const updateChatSessionUsageSnapshot = (chatSessionId, usage) => {
|
|
272
|
+
updateChatSessionUsageSnapshotStatement.run(usage.usage_snapshot_context_window, usage.usage_snapshot_max_output_tokens, usage.usage_snapshot_total_tokens, usage.usage_snapshot_input_tokens, usage.usage_snapshot_output_tokens, usage.usage_snapshot_cache_read_tokens, usage.usage_snapshot_reasoning_tokens, chatSessionId);
|
|
273
|
+
};
|
|
274
|
+
export const deleteChatSession = (chatSessionId) => {
|
|
275
|
+
deleteChatMessagesStatement.run(chatSessionId);
|
|
276
|
+
deleteChatSessionMemorySuggestionsStatement.run(chatSessionId);
|
|
277
|
+
deleteChatSessionStatement.run(chatSessionId);
|
|
278
|
+
};
|
|
279
|
+
//# sourceMappingURL=chats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chats.js","sourceRoot":"","sources":["../../../server/lib/chats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../server/lib/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAqC,EAAE,CAAA;AAEnD,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const LOOPBACK_ORIGIN_TOKEN = 'loopback';
|
|
2
|
+
const LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '::1', '[::1]']);
|
|
3
|
+
export const parseCorsOrigins = (value, fallback = LOOPBACK_ORIGIN_TOKEN) => {
|
|
4
|
+
const source = typeof value === 'string' && value.trim() !== '' ? value : fallback;
|
|
5
|
+
return source
|
|
6
|
+
.split(',')
|
|
7
|
+
.map(origin => origin.trim())
|
|
8
|
+
.filter(origin => origin !== '');
|
|
9
|
+
};
|
|
10
|
+
export const isLoopbackOrigin = (origin) => {
|
|
11
|
+
try {
|
|
12
|
+
const url = new URL(origin);
|
|
13
|
+
return (url.protocol === 'http:' || url.protocol === 'https:') && LOOPBACK_HOSTS.has(url.hostname);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export const isAllowedCorsOrigin = (origin, allowedOrigins) => {
|
|
20
|
+
if (!origin) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
return allowedOrigins.includes(origin) || (allowedOrigins.includes(LOOPBACK_ORIGIN_TOKEN) && isLoopbackOrigin(origin));
|
|
24
|
+
};
|
|
25
|
+
export const createCorsOriginResolver = (allowedOrigins) => {
|
|
26
|
+
return (origin, callback) => {
|
|
27
|
+
callback(null, isAllowedCorsOrigin(origin, allowedOrigins));
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=cors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../../../server/lib/cors.ts"],"names":[],"mappings":"AAAA,MAAM,qBAAqB,GAAG,UAAU,CAAA;AACxC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;AAE1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAyB,EAAE,QAAQ,GAAG,qBAAqB,EAAE,EAAE;IAC9F,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAA;IAElF,OAAO,MAAM;SACV,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,CAAA;AACpC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAA;QAE3B,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACpG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAA0B,EAAE,cAAwB,EAAE,EAAE;IAC1F,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAA;AACxH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,cAAwB,EAAE,EAAE;IACnE,OAAO,CAAC,MAA0B,EAAE,QAAwD,EAAE,EAAE;QAC9F,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAA;IAC7D,CAAC,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { execFileSync } from 'child_process';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
const WINDOWS_PICKER_SCRIPT = [
|
|
4
|
+
'Add-Type -AssemblyName System.Windows.Forms',
|
|
5
|
+
"$dialog = New-Object System.Windows.Forms.FolderBrowserDialog",
|
|
6
|
+
"$dialog.Description = 'Select repository folder'",
|
|
7
|
+
'$dialog.UseDescriptionForTitle = $true',
|
|
8
|
+
'$result = $dialog.ShowDialog()',
|
|
9
|
+
'if ($result -eq [System.Windows.Forms.DialogResult]::OK) {',
|
|
10
|
+
' [Console]::WriteLine($dialog.SelectedPath)',
|
|
11
|
+
'}',
|
|
12
|
+
].join('; ');
|
|
13
|
+
const getPickerCommands = () => {
|
|
14
|
+
if (process.platform === 'darwin') {
|
|
15
|
+
return [{
|
|
16
|
+
command: 'osascript',
|
|
17
|
+
args: [
|
|
18
|
+
'-e',
|
|
19
|
+
'set chosenFolder to choose folder with prompt "Select repository folder"',
|
|
20
|
+
'-e',
|
|
21
|
+
'POSIX path of chosenFolder',
|
|
22
|
+
],
|
|
23
|
+
}];
|
|
24
|
+
}
|
|
25
|
+
if (process.platform === 'win32') {
|
|
26
|
+
return [
|
|
27
|
+
{
|
|
28
|
+
command: 'powershell',
|
|
29
|
+
args: ['-NoProfile', '-NonInteractive', '-Command', WINDOWS_PICKER_SCRIPT],
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
command: 'pwsh',
|
|
33
|
+
args: ['-NoProfile', '-NonInteractive', '-Command', WINDOWS_PICKER_SCRIPT],
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
if (process.platform === 'linux') {
|
|
38
|
+
return [
|
|
39
|
+
{
|
|
40
|
+
command: 'zenity',
|
|
41
|
+
args: ['--file-selection', '--directory', '--title=Select repository folder'],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
command: 'kdialog',
|
|
45
|
+
args: ['--getexistingdirectory', process.env.HOME ?? '/', 'Select repository folder'],
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
return [];
|
|
50
|
+
};
|
|
51
|
+
const getUnavailablePickerMessage = () => {
|
|
52
|
+
if (process.platform === 'linux') {
|
|
53
|
+
return 'No supported folder picker is installed. Install zenity or kdialog to enable browsing.';
|
|
54
|
+
}
|
|
55
|
+
if (process.platform === 'darwin') {
|
|
56
|
+
return 'Unable to launch macOS folder picker (osascript not found).';
|
|
57
|
+
}
|
|
58
|
+
if (process.platform === 'win32') {
|
|
59
|
+
return 'Unable to launch Windows folder picker (powershell not found).';
|
|
60
|
+
}
|
|
61
|
+
return 'Folder picker is not supported on this platform.';
|
|
62
|
+
};
|
|
63
|
+
const normalizeCommandErrorOutput = (output) => {
|
|
64
|
+
if (typeof output === 'string') {
|
|
65
|
+
return output.trim();
|
|
66
|
+
}
|
|
67
|
+
if (Buffer.isBuffer(output)) {
|
|
68
|
+
return output.toString('utf8').trim();
|
|
69
|
+
}
|
|
70
|
+
return '';
|
|
71
|
+
};
|
|
72
|
+
const isCancellationError = (error, commandName) => {
|
|
73
|
+
if (error.status === 130) {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
const message = typeof error.message === 'string' ? error.message : '';
|
|
77
|
+
const stderr = normalizeCommandErrorOutput(error.stderr);
|
|
78
|
+
if (error.status === 1 && (commandName === 'zenity' || commandName === 'kdialog')) {
|
|
79
|
+
const normalizedStderr = stderr.toLowerCase();
|
|
80
|
+
if (normalizedStderr.includes('cannot open display') || normalizedStderr.includes('no protocol specified')) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
if (error.status === 1) {
|
|
86
|
+
if (stderr === '') {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
const normalizedStderr = stderr.toLowerCase();
|
|
90
|
+
if (normalizedStderr.includes('canceled') || normalizedStderr.includes('cancelled')) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return message.includes('-128') || stderr.includes('-128');
|
|
95
|
+
};
|
|
96
|
+
const runPickerCommand = (command) => {
|
|
97
|
+
try {
|
|
98
|
+
const output = execFileSync(command.command, command.args, {
|
|
99
|
+
encoding: 'utf8',
|
|
100
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
101
|
+
});
|
|
102
|
+
return { status: 'success', output: output.trim() };
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (!(error instanceof Error)) {
|
|
106
|
+
return { status: 'failed', error: 'Folder picker failed with an unknown error.' };
|
|
107
|
+
}
|
|
108
|
+
const pickerError = error;
|
|
109
|
+
if (pickerError.code === 'ENOENT') {
|
|
110
|
+
return { status: 'missing' };
|
|
111
|
+
}
|
|
112
|
+
if (isCancellationError(pickerError, command.command)) {
|
|
113
|
+
return { status: 'cancelled' };
|
|
114
|
+
}
|
|
115
|
+
const stderr = normalizeCommandErrorOutput(pickerError.stderr);
|
|
116
|
+
const message = stderr || pickerError.message || 'Folder picker failed.';
|
|
117
|
+
return { status: 'failed', error: message };
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
const resolvePickedPath = (output) => {
|
|
121
|
+
const selectedLine = output
|
|
122
|
+
.split(/\r?\n/u)
|
|
123
|
+
.map(line => line.trim())
|
|
124
|
+
.find(line => line !== '');
|
|
125
|
+
if (!selectedLine) {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
return resolve(selectedLine);
|
|
129
|
+
};
|
|
130
|
+
export const browseRepoPath = () => {
|
|
131
|
+
const pickerCommands = getPickerCommands();
|
|
132
|
+
if (pickerCommands.length === 0) {
|
|
133
|
+
return {
|
|
134
|
+
status: 'unavailable',
|
|
135
|
+
error: 'Folder picker is not supported on this platform.',
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
let hasMissingCommand = false;
|
|
139
|
+
for (const command of pickerCommands) {
|
|
140
|
+
const commandResult = runPickerCommand(command);
|
|
141
|
+
if (commandResult.status === 'cancelled') {
|
|
142
|
+
return { status: 'cancelled' };
|
|
143
|
+
}
|
|
144
|
+
if (commandResult.status === 'missing') {
|
|
145
|
+
hasMissingCommand = true;
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (commandResult.status === 'failed') {
|
|
149
|
+
return {
|
|
150
|
+
status: 'failed',
|
|
151
|
+
error: commandResult.error,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const pickedPath = resolvePickedPath(commandResult.output);
|
|
155
|
+
if (!pickedPath) {
|
|
156
|
+
return { status: 'cancelled' };
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
status: 'selected',
|
|
160
|
+
repoPath: pickedPath,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
if (hasMissingCommand) {
|
|
164
|
+
return {
|
|
165
|
+
status: 'unavailable',
|
|
166
|
+
error: getUnavailablePickerMessage(),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
status: 'failed',
|
|
171
|
+
error: 'Unable to open folder picker.',
|
|
172
|
+
};
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=directoryPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directoryPicker.js","sourceRoot":"","sources":["../../../server/lib/directoryPicker.ts"],"names":[],"mappings":"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"}
|