@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.
Files changed (124) hide show
  1. package/README.md +224 -0
  2. package/dist/cli.js +216 -0
  3. package/dist/client/assets/index-8_-boBBA.css +2 -0
  4. package/dist/client/assets/index-s_jjeqha.js +176 -0
  5. package/dist/client/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  6. package/dist/client/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  7. package/dist/client/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  8. package/dist/client/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  9. package/dist/client/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  10. package/dist/client/favicon.svg +62 -0
  11. package/dist/client/icons.svg +24 -0
  12. package/dist/client/index.html +14 -0
  13. package/dist/server/db.js +764 -0
  14. package/dist/server/db.js.map +1 -0
  15. package/dist/server/index.js +5134 -0
  16. package/dist/server/index.js.map +1 -0
  17. package/dist/server/lib/agent.js +1302 -0
  18. package/dist/server/lib/agent.js.map +1 -0
  19. package/dist/server/lib/buildChains.js +2 -0
  20. package/dist/server/lib/buildChains.js.map +1 -0
  21. package/dist/server/lib/buildFlow.js +59 -0
  22. package/dist/server/lib/buildFlow.js.map +1 -0
  23. package/dist/server/lib/buildSequences.js +599 -0
  24. package/dist/server/lib/buildSequences.js.map +1 -0
  25. package/dist/server/lib/bundleActivity.js +95 -0
  26. package/dist/server/lib/bundleActivity.js.map +1 -0
  27. package/dist/server/lib/bundlePullRequests.js +126 -0
  28. package/dist/server/lib/bundlePullRequests.js.map +1 -0
  29. package/dist/server/lib/chatMessages.js +60 -0
  30. package/dist/server/lib/chatMessages.js.map +1 -0
  31. package/dist/server/lib/chatTargets.js +123 -0
  32. package/dist/server/lib/chatTargets.js.map +1 -0
  33. package/dist/server/lib/chatTicketProposals.js +180 -0
  34. package/dist/server/lib/chatTicketProposals.js.map +1 -0
  35. package/dist/server/lib/chats.js +279 -0
  36. package/dist/server/lib/chats.js.map +1 -0
  37. package/dist/server/lib/config.js +3 -0
  38. package/dist/server/lib/config.js.map +1 -0
  39. package/dist/server/lib/cors.js +30 -0
  40. package/dist/server/lib/cors.js.map +1 -0
  41. package/dist/server/lib/directoryPicker.js +174 -0
  42. package/dist/server/lib/directoryPicker.js.map +1 -0
  43. package/dist/server/lib/git.js +1284 -0
  44. package/dist/server/lib/git.js.map +1 -0
  45. package/dist/server/lib/integrations/github.js +511 -0
  46. package/dist/server/lib/integrations/github.js.map +1 -0
  47. package/dist/server/lib/integrations/index.js +162 -0
  48. package/dist/server/lib/integrations/index.js.map +1 -0
  49. package/dist/server/lib/integrations/jira.js +283 -0
  50. package/dist/server/lib/integrations/jira.js.map +1 -0
  51. package/dist/server/lib/integrations/planning.js +27 -0
  52. package/dist/server/lib/integrations/planning.js.map +1 -0
  53. package/dist/server/lib/integrations/types.js +2 -0
  54. package/dist/server/lib/integrations/types.js.map +1 -0
  55. package/dist/server/lib/lightweightPrompt.js +88 -0
  56. package/dist/server/lib/lightweightPrompt.js.map +1 -0
  57. package/dist/server/lib/models.js +219 -0
  58. package/dist/server/lib/models.js.map +1 -0
  59. package/dist/server/lib/preview.js +377 -0
  60. package/dist/server/lib/preview.js.map +1 -0
  61. package/dist/server/lib/previewProxy.js +659 -0
  62. package/dist/server/lib/previewProxy.js.map +1 -0
  63. package/dist/server/lib/projectAutoConfig.js +682 -0
  64. package/dist/server/lib/projectAutoConfig.js.map +1 -0
  65. package/dist/server/lib/projectFileSuggestions.js +133 -0
  66. package/dist/server/lib/projectFileSuggestions.js.map +1 -0
  67. package/dist/server/lib/projectMemory.js +1519 -0
  68. package/dist/server/lib/projectMemory.js.map +1 -0
  69. package/dist/server/lib/projectMemoryPrompt.js +390 -0
  70. package/dist/server/lib/projectMemoryPrompt.js.map +1 -0
  71. package/dist/server/lib/projectMemoryScan.js +681 -0
  72. package/dist/server/lib/projectMemoryScan.js.map +1 -0
  73. package/dist/server/lib/projectMemorySuggestions.js +166 -0
  74. package/dist/server/lib/projectMemorySuggestions.js.map +1 -0
  75. package/dist/server/lib/projectMemoryTransfer.js +958 -0
  76. package/dist/server/lib/projectMemoryTransfer.js.map +1 -0
  77. package/dist/server/lib/projects.js +569 -0
  78. package/dist/server/lib/projects.js.map +1 -0
  79. package/dist/server/lib/promptSkills.js +28 -0
  80. package/dist/server/lib/promptSkills.js.map +1 -0
  81. package/dist/server/lib/queue.js +15 -0
  82. package/dist/server/lib/queue.js.map +1 -0
  83. package/dist/server/lib/reviewFindings.js +390 -0
  84. package/dist/server/lib/reviewFindings.js.map +1 -0
  85. package/dist/server/lib/run.js +416 -0
  86. package/dist/server/lib/run.js.map +1 -0
  87. package/dist/server/lib/runtimePaths.js +93 -0
  88. package/dist/server/lib/runtimePaths.js.map +1 -0
  89. package/dist/server/lib/shell.js +27 -0
  90. package/dist/server/lib/shell.js.map +1 -0
  91. package/dist/server/lib/skills.js +124 -0
  92. package/dist/server/lib/skills.js.map +1 -0
  93. package/dist/server/lib/startDev.js +18 -0
  94. package/dist/server/lib/startDev.js.map +1 -0
  95. package/dist/server/lib/staticClient.js +80 -0
  96. package/dist/server/lib/staticClient.js.map +1 -0
  97. package/dist/server/lib/terminal.js +366 -0
  98. package/dist/server/lib/terminal.js.map +1 -0
  99. package/dist/server/lib/ticketDependencies.js +174 -0
  100. package/dist/server/lib/ticketDependencies.js.map +1 -0
  101. package/dist/server/lib/ticketMessages.js +65 -0
  102. package/dist/server/lib/ticketMessages.js.map +1 -0
  103. package/dist/server/lib/ticketOpenQuestions.js +128 -0
  104. package/dist/server/lib/ticketOpenQuestions.js.map +1 -0
  105. package/dist/server/lib/ticketUndo.js +549 -0
  106. package/dist/server/lib/ticketUndo.js.map +1 -0
  107. package/dist/server/lib/tickets.js +981 -0
  108. package/dist/server/lib/tickets.js.map +1 -0
  109. package/dist/server/lib/types.js +2 -0
  110. package/dist/server/lib/types.js.map +1 -0
  111. package/dist/server/package.json +3 -0
  112. package/dist/server/workers/build.js +229 -0
  113. package/dist/server/workers/build.js.map +1 -0
  114. package/dist/server/workers/chat.js +190 -0
  115. package/dist/server/workers/chat.js.map +1 -0
  116. package/dist/server/workers/followUp.js +204 -0
  117. package/dist/server/workers/followUp.js.map +1 -0
  118. package/dist/server/workers/plan.js +1130 -0
  119. package/dist/server/workers/plan.js.map +1 -0
  120. package/dist/server/workers/planFollowUp.js +360 -0
  121. package/dist/server/workers/planFollowUp.js.map +1 -0
  122. package/dist/server/workers/review.js +167 -0
  123. package/dist/server/workers/review.js.map +1 -0
  124. 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,3 @@
1
+ const config = {};
2
+ export default config;
3
+ //# sourceMappingURL=config.js.map
@@ -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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"}