circuschief 0.7.0 → 0.8.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/package.json +1 -1
- package/packages/server/src/agents/adapters/CodexAdapter.js +5 -4
- package/packages/server/src/api/canvas.js +22 -57
- package/packages/server/src/api/index.js +2 -0
- package/packages/server/src/api/kanban.js +4 -2
- package/packages/server/src/api/projects-helpers.js +20 -3
- package/packages/server/src/api/projects-session-helpers.js +10 -4
- package/packages/server/src/api/projects.js +10 -0
- package/packages/server/src/api/providers.js +11 -1
- package/packages/server/src/api/sessions-commands.js +35 -17
- package/packages/server/src/api/sessions-lifecycle.js +10 -10
- package/packages/server/src/api/sessions-patch.js +4 -0
- package/packages/server/src/api/sessions.js +6 -5
- package/packages/server/src/database.js +0 -2
- package/packages/server/src/db/DatabaseManager.js +5 -1
- package/packages/server/src/db/ProjectDefaultsRepository.js +3 -3
- package/packages/server/src/db/ProviderRepository.js +87 -32
- package/packages/server/src/db/SessionRepository.js +1 -0
- package/packages/server/src/db/index.js +0 -3
- package/packages/server/src/db/migrations/index.js +36 -202
- package/packages/server/src/db/seedBaselineData.js +137 -0
- package/packages/server/src/db/session-helpers.js +6 -3
- package/packages/server/src/middleware/sessionLookup.js +81 -8
- package/packages/server/src/schema.sql +149 -132
- package/packages/server/src/scripts/backupDatabase.js +21 -0
- package/packages/server/src/scripts/dbUtils.js +81 -0
- package/packages/server/src/scripts/inspectDatabaseSchema.js +81 -0
- package/packages/server/src/scripts/validateDatabaseBaseline.js +212 -0
- package/packages/server/src/services/codexSpawnHelper.js +9 -0
- package/packages/server/src/services/commandButtonPrompts.js +8 -8
- package/packages/server/src/services/commandRunner.js +7 -1
- package/packages/server/src/services/e2eSpawnCapture.js +147 -0
- package/packages/server/src/services/gitCommitAttribution.js +120 -0
- package/packages/server/src/services/gitService.js +11 -2
- package/packages/server/src/services/gitSessionSetup.js +11 -1
- package/packages/server/src/services/kanbanTriggers.js +6 -3
- package/packages/server/src/services/nodeSpawnHelper.js +9 -0
- package/packages/server/src/services/prUrlService.js +3 -3
- package/packages/server/src/services/queryParamBuilder.js +90 -0
- package/packages/server/src/services/sessionDuplicator.js +1 -5
- package/packages/server/src/services/sessionExecution.js +56 -108
- package/packages/server/src/services/sessionPrompts.js +12 -47
- package/packages/server/src/services/sessionProvider.js +10 -0
- package/packages/server/src/services/summaryService.js +5 -3
- package/packages/server/src/services/summaryStaleCheck.js +23 -4
- package/packages/server/src/services/templateTriggerService.js +3 -1
- package/packages/shared/src/constants.js +3 -0
- package/packages/shared/src/contracts/commandButtons.js +16 -2
- package/packages/shared/src/contracts/projects.js +2 -2
- package/packages/shared/src/contracts/providers.js +60 -0
- package/packages/shared/src/contracts/sessions.js +2 -1
- package/packages/shared/src/contracts/templates.js +2 -2
- package/packages/shared/src/types.js +1 -9
- package/packages/shared/src/utils.js +2 -2
- package/packages/web/dist/assets/{ActiveSessionsView-UJsCILDL.js → ActiveSessionsView-B0XHqLmv.js} +1 -1
- package/packages/web/dist/assets/{AgentLogsView-BGFPLjLa.js → AgentLogsView-DmsjUMlB.js} +2 -2
- package/packages/web/dist/assets/ApiClient-C3ztI9s9.js +1 -0
- package/packages/web/dist/assets/ArchiveConfirmModal-BlCyn5Vt.js +1 -0
- package/packages/web/dist/assets/ArchiveConfirmModal-DeoCVGXt.css +1 -0
- package/packages/web/dist/assets/{CommandButtonDetailView-D8S258uP.js → CommandButtonDetailView-CdSCPp78.js} +1 -1
- package/packages/web/dist/assets/EffortLevelSelector-hc2MNKg6.js +1 -0
- package/packages/web/dist/assets/{GeneralSettingsView-DsHChEhv.js → GeneralSettingsView-D1nI8_zk.js} +1 -1
- package/packages/web/dist/assets/InputWithButton-CAkttyqx.js +1 -0
- package/packages/web/dist/assets/{InputWithButton-cYdrEmTs.css → InputWithButton-D9HMvfR5.css} +1 -1
- package/packages/web/dist/assets/{InterpolationHelp-CIkOSkWX.js → InterpolationHelp-BO1j9Z3_.js} +1 -1
- package/packages/web/dist/assets/MarkdownEditor-ucRAP_UM.js +2 -0
- package/packages/web/dist/assets/{ModelSelector-D8hbTRIt.css → ModelSelector-BSxKUSus.css} +1 -1
- package/packages/web/dist/assets/{ModelSelector-BMpR0DPr.js → ModelSelector-CwTz8ZWO.js} +1 -1
- package/packages/web/dist/assets/{NewSessionView-CUUdHkfv.css → NewSessionView-BDPb-1qr.css} +1 -1
- package/packages/web/dist/assets/NewSessionView-BsDrp8mj.js +3 -0
- package/packages/web/dist/assets/ProjectEditView-CwTOeSun.js +1 -0
- package/packages/web/dist/assets/{ProjectEditView-D9sK0fdH.css → ProjectEditView-J15mcsWz.css} +1 -1
- package/packages/web/dist/assets/{ProjectListView-B9FuWESY.js → ProjectListView-DcNyuINs.js} +1 -1
- package/packages/web/dist/assets/{ProjectNewView-D62jYlBL.js → ProjectNewView-B5YV62hv.js} +1 -1
- package/packages/web/dist/assets/ProvidersView-bZemq_Rv.css +1 -0
- package/packages/web/dist/assets/ProvidersView-nY9GnDdO.js +1 -0
- package/packages/web/dist/assets/QuickResponseSettings-B352c75l.css +1 -0
- package/packages/web/dist/assets/{QuickResponseSettings-CDm5vwP7.js → QuickResponseSettings-BQwQXuL7.js} +1 -1
- package/packages/web/dist/assets/{QuickResponsesPanel-DZ_Lre_l.js → QuickResponsesPanel-BzSYcCSP.js} +1 -1
- package/packages/web/dist/assets/{ResizableTextarea-DiIOEGjN.js → ResizableTextarea-B3YIdIXv.js} +1 -1
- package/packages/web/dist/assets/{SessionCard-DmjnVYWn.js → SessionCard-CjE1tXiT.js} +1 -1
- package/packages/web/dist/assets/SessionDetailView-3cPZrbS3.js +36 -0
- package/packages/web/dist/assets/SessionDetailView-CZRZMrfM.css +1 -0
- package/packages/web/dist/assets/{SessionFormOptions-DYUISplS.js → SessionFormOptions-B6AxyREh.js} +1 -1
- package/packages/web/dist/assets/SessionListView-B5_6gW49.css +1 -0
- package/packages/web/dist/assets/SessionListView-CLXBfLcq.js +1 -0
- package/packages/web/dist/assets/{SessionLogStream-DpUE6Xsh.js → SessionLogStream-LlZ3z_Xj.js} +1 -1
- package/packages/web/dist/assets/{SettingsView-BC055tIA.js → SettingsView-CTGiGvR2.js} +1 -1
- package/packages/web/dist/assets/{SlashCommandWizard-DmTyNG9O.js → SlashCommandWizard-Cy04d7-o.js} +1 -1
- package/packages/web/dist/assets/{SlashCommandWizard-Dn7sNaBd.css → SlashCommandWizard-DJzw3LP5.css} +1 -1
- package/packages/web/dist/assets/{SummarySettingsView-BgnRCwlq.js → SummarySettingsView-BR2ZjEa3.js} +1 -1
- package/packages/web/dist/assets/{TemplateDetailView-BlhOmLUX.js → TemplateDetailView-DH6Oswsp.js} +1 -1
- package/packages/web/dist/assets/{commandButtons-D4RPpLiu.js → commandButtons-BfqR-fqq.js} +1 -1
- package/packages/web/dist/assets/{index-CfL84oGW.js → index-1zziPL6l.js} +1 -1
- package/packages/web/dist/assets/{index-OfCywayk.js → index-7kzHPxSF.js} +1 -1
- package/packages/web/dist/assets/{index-PDesaJc6.js → index-B0N_obMc.js} +1 -1
- package/packages/web/dist/assets/{index-Cpy4-yv3.js → index-BNk_gdfI.js} +1 -1
- package/packages/web/dist/assets/{index-Cs2nxhrT.css → index-BY174HVJ.css} +1 -1
- package/packages/web/dist/assets/{index-9vb2KaAd.js → index-CSqaAH-0.js} +1 -1
- package/packages/web/dist/assets/{index-CNwkdB0T.js → index-C_q4WlK8.js} +1 -1
- package/packages/web/dist/assets/{index-B0CvZXuN.js → index-D1wpU4y0.js} +1 -1
- package/packages/web/dist/assets/{index-4rhEeO0B.js → index-D5zCA8sD.js} +1 -1
- package/packages/web/dist/assets/{index-CkmxO8Mm.js → index-DGR8ELWY.js} +1 -1
- package/packages/web/dist/assets/{index-CrAQJmoZ.js → index-DHga8pXo.js} +1 -1
- package/packages/web/dist/assets/{index-BUhvkAdF.js → index-DSby02Wl.js} +1 -1
- package/packages/web/dist/assets/{index-BGwH4Cfn.js → index-DgkC10TW.js} +3 -3
- package/packages/web/dist/assets/{index-DfrE0gAC.js → index-DqjXJTVI.js} +1 -1
- package/packages/web/dist/assets/{index-Bn5xdGFM.js → index-DtfUt785.js} +1 -1
- package/packages/web/dist/assets/{index-KwEyz0F3.js → index-_4S2uLDI.js} +1 -1
- package/packages/web/dist/assets/{index-B6G18FqB.js → index-fK8FIZgP.js} +15 -14
- package/packages/web/dist/assets/{index-BcnkUk2o.js → index-gmiZeFXN.js} +1 -1
- package/packages/web/dist/assets/{index-D6Ky9vJe.js → index-irD539ZM.js} +1 -1
- package/packages/web/dist/assets/{index-uB6nhSvz.js → index-yq-E1Y00.js} +1 -1
- package/packages/web/dist/assets/{projects-BUiOGmmb.js → projects-DXYQNJIi.js} +1 -1
- package/packages/web/dist/assets/{providers-Bh1ZiiJi.js → providers-1bnH-exJ.js} +1 -1
- package/packages/web/dist/assets/sessions-6zGUlFrt.js +1 -0
- package/packages/web/dist/assets/{settings-Z4AVVmkJ.js → settings-MbfRir0d.js} +1 -1
- package/packages/web/dist/index.html +2 -2
- package/packages/server/src/api/sessions-notes.js +0 -51
- package/packages/server/src/db/SessionNoteRepository.js +0 -60
- package/packages/server/src/db/migrations/canvasItemsMigrations.js +0 -109
- package/packages/server/src/db/migrations/conversationsMigrations.js +0 -187
- package/packages/server/src/db/migrations/kanbanMigrations.js +0 -99
- package/packages/server/src/db/migrations/miscMigrations.js +0 -369
- package/packages/server/src/db/migrations/projectsMigrations.js +0 -99
- package/packages/server/src/db/migrations/sessionsMigrations.js +0 -287
- package/packages/web/dist/assets/ApiClient-B4YTtyY4.js +0 -1
- package/packages/web/dist/assets/ArchiveConfirmModal-BQ-4gI0R.css +0 -1
- package/packages/web/dist/assets/ArchiveConfirmModal-OFaj_uX5.js +0 -1
- package/packages/web/dist/assets/EffortLevelSelector-C2378L8e.js +0 -1
- package/packages/web/dist/assets/InputWithButton-Ci15ox0a.js +0 -1
- package/packages/web/dist/assets/MarkdownEditor-5-bexzUT.js +0 -2
- package/packages/web/dist/assets/NewSessionView-BCqtIgWH.js +0 -3
- package/packages/web/dist/assets/ProjectEditView-RFaxHhAX.js +0 -1
- package/packages/web/dist/assets/ProvidersView-DDKMIQWZ.js +0 -1
- package/packages/web/dist/assets/ProvidersView-DE82G_5W.css +0 -1
- package/packages/web/dist/assets/QuickResponseSettings-B8188A1D.css +0 -1
- package/packages/web/dist/assets/SessionDetailView-CL7nmfiB.js +0 -36
- package/packages/web/dist/assets/SessionDetailView-CupIkI7u.css +0 -1
- package/packages/web/dist/assets/SessionListView-BcxGz4aC.js +0 -1
- package/packages/web/dist/assets/SessionListView-fHlQyecX.css +0 -1
- package/packages/web/dist/assets/sessions-DH1R-NhV.js +0 -1
|
@@ -162,10 +162,7 @@ CRITICAL: Do NOT start coding until you have presented a plan and received appro
|
|
|
162
162
|
*/
|
|
163
163
|
function buildCanvasWriteSystemPrompt(session) {
|
|
164
164
|
const apiUrl = getApiBaseUrl();
|
|
165
|
-
|
|
166
|
-
const sessionId = session
|
|
167
|
-
? (sessions.getRootSessionId(session.id) || session.id)
|
|
168
|
-
: 'unknown-session';
|
|
165
|
+
const sessionId = session?.id || 'unknown-session';
|
|
169
166
|
return `When you generate artifacts that should be displayed on the canvas (images, markdown documents, code snippets, data visualizations, PDFs), POST them to:
|
|
170
167
|
|
|
171
168
|
POST ${apiUrl}/api/sessions/${sessionId}/canvas
|
|
@@ -187,10 +184,7 @@ The file type is automatically detected from the file extension. Supported forma
|
|
|
187
184
|
*/
|
|
188
185
|
function buildCanvasReadSystemPrompt(session) {
|
|
189
186
|
const apiUrl = getApiBaseUrl();
|
|
190
|
-
|
|
191
|
-
const sessionId = session
|
|
192
|
-
? (sessions.getRootSessionId(session.id) || session.id)
|
|
193
|
-
: 'unknown-session';
|
|
187
|
+
const sessionId = session?.id || 'unknown-session';
|
|
194
188
|
return `## Reading from Canvas
|
|
195
189
|
|
|
196
190
|
To list all files on the canvas:
|
|
@@ -225,9 +219,10 @@ function buildSessionCrudOps(apiUrl, projectId) {
|
|
|
225
219
|
\`\`\`bash
|
|
226
220
|
curl -X POST ${apiUrl}/api/projects/${projectId}/sessions \\
|
|
227
221
|
-H "Content-Type: application/json" \\
|
|
228
|
-
-d '{"prompt": "Your task description here"
|
|
222
|
+
-d '{"prompt": "Your task description here"}'
|
|
229
223
|
\`\`\`
|
|
230
|
-
|
|
224
|
+
Only \`prompt\` is required. Omitted settings are automatically derived from the project's session defaults, then system defaults, matching UI behavior.
|
|
225
|
+
Optional override fields: \`name\`, \`mode\`, \`thinkingEnabled\` (boolean), \`effortLevel\` (low/medium/high/max/auto), \`model\`, \`providerId\`, \`gitBranch\`, \`gitMode\`, \`templateId\`, \`nextTemplateId\`, \`parentSessionId\` (to create a related follow-up session from the current session), \`startImmediately\`, \`scheduledAt\`, \`autoRescheduleEnabled\`, \`rescheduleDelayMinutes\`, \`rescheduleOnTokenLimit\`, \`rescheduleOnServiceError\`, \`maxRescheduleCount\`, \`maxTotalTokens\`, and \`rescheduleAtTokenCount\`.
|
|
231
226
|
|
|
232
227
|
### Send a Follow-up Message
|
|
233
228
|
\`\`\`bash
|
|
@@ -258,8 +253,8 @@ curl -X PATCH ${apiUrl}/api/sessions/<session_id> \\
|
|
|
258
253
|
\`\`\``;
|
|
259
254
|
}
|
|
260
255
|
|
|
261
|
-
/** Build project
|
|
262
|
-
function
|
|
256
|
+
/** Build project and summary operations section */
|
|
257
|
+
function buildProjectOps(apiUrl, sessionId) {
|
|
263
258
|
return `### Project Operations
|
|
264
259
|
\`\`\`bash
|
|
265
260
|
curl ${apiUrl}/api/projects # List all projects
|
|
@@ -271,18 +266,10 @@ curl -X POST ${apiUrl}/api/projects \\
|
|
|
271
266
|
\`\`\`
|
|
272
267
|
Optional field: \`systemPrompt\`
|
|
273
268
|
|
|
274
|
-
###
|
|
269
|
+
### Workflow Summary
|
|
275
270
|
\`\`\`bash
|
|
276
|
-
curl ${apiUrl}/api/sessions
|
|
277
|
-
curl -X POST ${apiUrl}/api/sessions
|
|
278
|
-
-H "Content-Type: application/json" \\
|
|
279
|
-
-d '{"content": "Note content"}'
|
|
280
|
-
\`\`\`
|
|
281
|
-
|
|
282
|
-
### Session Summary
|
|
283
|
-
\`\`\`bash
|
|
284
|
-
curl "${apiUrl}/api/sessions/<session_id>/summary?generate=true"
|
|
285
|
-
curl -X POST ${apiUrl}/api/sessions/<session_id>/summary # Regenerate
|
|
271
|
+
curl "${apiUrl}/api/sessions/${sessionId}/summary?generate=true"
|
|
272
|
+
curl -X POST ${apiUrl}/api/sessions/${sessionId}/summary # Regenerate
|
|
286
273
|
\`\`\``;
|
|
287
274
|
}
|
|
288
275
|
|
|
@@ -299,7 +286,7 @@ You can create and modify sessions in this system using curl or similar HTTP too
|
|
|
299
286
|
|
|
300
287
|
${buildSessionCrudOps(apiUrl, projectId)}
|
|
301
288
|
|
|
302
|
-
${
|
|
289
|
+
${buildProjectOps(apiUrl, sessionId)}`;
|
|
303
290
|
}
|
|
304
291
|
|
|
305
292
|
/**
|
|
@@ -336,7 +323,7 @@ ${laneContext}
|
|
|
336
323
|
curl ${apiUrl}/api/projects/${projectId}/kanban
|
|
337
324
|
\`\`\`
|
|
338
325
|
|
|
339
|
-
### Add
|
|
326
|
+
### Add Current Workflow to the Board
|
|
340
327
|
\`\`\`bash
|
|
341
328
|
curl -X POST ${apiUrl}/api/projects/${projectId}/kanban/cards \\
|
|
342
329
|
-H "Content-Type: application/json" \\
|
|
@@ -394,26 +381,6 @@ This session is running in an isolated git worktree:
|
|
|
394
381
|
CRITICAL: Do NOT use \`cd\` to navigate to the main repository. Your working directory is already set to the worktree. Running \`cd /home/ubuntu/workspace/circus-chief && ...\` will escape the worktree isolation and affect the main repository instead.`;
|
|
395
382
|
}
|
|
396
383
|
|
|
397
|
-
/**
|
|
398
|
-
* Build child session context for system prompt
|
|
399
|
-
* @param {Object} session - Session object
|
|
400
|
-
* @returns {string} Child session context or empty string
|
|
401
|
-
*/
|
|
402
|
-
function buildChildSessionContext(session) {
|
|
403
|
-
if (!session || !session.parentSessionId) {
|
|
404
|
-
return '';
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
// Get root session ID using existing method
|
|
408
|
-
const rootSessionId = sessions.getRootSessionId(session.id);
|
|
409
|
-
|
|
410
|
-
return `## Child Session
|
|
411
|
-
|
|
412
|
-
This session is part of a multi-session workflow:
|
|
413
|
-
- Parent Session ID: ${session.parentSessionId}
|
|
414
|
-
- Root Session ID: ${rootSessionId}`;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
384
|
/**
|
|
418
385
|
* Build the full system prompt configuration
|
|
419
386
|
* @param {string} sessionId
|
|
@@ -432,7 +399,6 @@ export function buildSystemPromptConfig(sessionId, projectId, customSystemPrompt
|
|
|
432
399
|
const kanbanApiInstructions = buildKanbanApiInstructions(sessionId, projectId);
|
|
433
400
|
const attachmentsContext = getSessionAttachmentsContext(sessionId);
|
|
434
401
|
const worktreeContext = buildWorktreeContext(session);
|
|
435
|
-
const childSessionContext = buildChildSessionContext(session);
|
|
436
402
|
const basePrompt = customSystemPrompt || DEFAULT_SYSTEM_PROMPT;
|
|
437
403
|
|
|
438
404
|
// Prepend plan mode instructions if in plan mode
|
|
@@ -442,7 +408,6 @@ export function buildSystemPromptConfig(sessionId, projectId, customSystemPrompt
|
|
|
442
408
|
const parts = [
|
|
443
409
|
modePrompt,
|
|
444
410
|
basePrompt,
|
|
445
|
-
childSessionContext,
|
|
446
411
|
worktreeContext,
|
|
447
412
|
attachmentsContext,
|
|
448
413
|
canvasWriteInstructions,
|
|
@@ -11,6 +11,16 @@ export function resolveProviderFromModel(modelId) {
|
|
|
11
11
|
return modelProviders.getProviderByModelId(modelId);
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
export function resolveProviderMetadataFromModel(modelId) {
|
|
15
|
+
if (!modelId) {
|
|
16
|
+
return modelProviders.getById?.('anthropic-default') || null;
|
|
17
|
+
}
|
|
18
|
+
if (typeof modelProviders.getProviderMetadataByModelId === 'function') {
|
|
19
|
+
return modelProviders.getProviderMetadataByModelId(modelId);
|
|
20
|
+
}
|
|
21
|
+
return modelProviders.getProviderByModelId(modelId);
|
|
22
|
+
}
|
|
23
|
+
|
|
14
24
|
/**
|
|
15
25
|
* Resolve the agent type (claude-code vs codex) for a given model ID.
|
|
16
26
|
* Uses the owning provider's kind:
|
|
@@ -200,18 +200,19 @@ function updateSessionFromSummary(sessionId, session, summaryData) {
|
|
|
200
200
|
if (summaryData.sessionTitle || summaryData.prUrl) {
|
|
201
201
|
const updateData = {};
|
|
202
202
|
const freshSession = sessions.getById(sessionId);
|
|
203
|
+
const shouldApplySummaryPrUrl = summaryData.prUrl && !freshSession.prUrlAutoLinkDisabled;
|
|
203
204
|
|
|
204
205
|
if (summaryData.sessionTitle && !freshSession.manuallyNamed) {
|
|
205
206
|
updateData.name = summaryData.sessionTitle;
|
|
206
207
|
}
|
|
207
208
|
|
|
208
|
-
if (
|
|
209
|
+
if (shouldApplySummaryPrUrl) {
|
|
209
210
|
updateData.prUrl = summaryData.prUrl;
|
|
210
211
|
}
|
|
211
212
|
|
|
212
213
|
const updatedSession = sessions.update(sessionId, updateData);
|
|
213
214
|
|
|
214
|
-
if (
|
|
215
|
+
if (shouldApplySummaryPrUrl) {
|
|
215
216
|
propagatePrUrlToParent(sessionId, summaryData.prUrl);
|
|
216
217
|
}
|
|
217
218
|
|
|
@@ -521,7 +522,7 @@ export function propagatePrUrlToParent(sessionId, prUrl) {
|
|
|
521
522
|
if (!rootId || rootId === sessionId) return;
|
|
522
523
|
|
|
523
524
|
const root = sessions.getById(rootId);
|
|
524
|
-
if (!root || root.prUrl) return; // Don't overwrite existing PR URL
|
|
525
|
+
if (!root || root.prUrl || root.prUrlAutoLinkDisabled) return; // Don't overwrite existing or user-cleared PR URL
|
|
525
526
|
|
|
526
527
|
sessions.update(root.id, { prUrl });
|
|
527
528
|
|
|
@@ -536,6 +537,7 @@ export {
|
|
|
536
537
|
MAX_MESSAGES, MIN_MESSAGES_FOR_SUMMARY, MAX_RETRIES, DEFAULT_SESSION_TITLE_PROMPT,
|
|
537
538
|
SUMMARY_SYSTEM_PROMPT, formatMessages, buildIncrementalPrompt, parseSummaryResponse,
|
|
538
539
|
stripMarkdownCodeBlock as _stripMarkdownCodeBlock, trackMessageMetadata as _trackMessageMetadata,
|
|
540
|
+
updateSessionFromSummary as _updateSessionFromSummary,
|
|
539
541
|
};
|
|
540
542
|
export { callSummaryModel };
|
|
541
543
|
export { callClaude } from './summaryClaudeClient.js';
|
|
@@ -3,10 +3,24 @@
|
|
|
3
3
|
* Extracted from summaryService.js for modularity.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { sessionSummaries, messages } from '../database.js';
|
|
6
|
+
import { sessionSummaries, messages, sessions } from '../database.js';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
|
-
* Check if
|
|
9
|
+
* Check if any descendant session has a summary newer than the given timestamp.
|
|
10
|
+
* @param {string} sessionId
|
|
11
|
+
* @param {number} generatedAt
|
|
12
|
+
* @returns {boolean}
|
|
13
|
+
*/
|
|
14
|
+
function hasNewerDescendantSummary(sessionId, generatedAt) {
|
|
15
|
+
const descendantIds = sessions.getAllDescendantIds(sessionId);
|
|
16
|
+
if (descendantIds.length === 0) return false;
|
|
17
|
+
|
|
18
|
+
const descendantSummaries = sessionSummaries.getBySessionIds(descendantIds);
|
|
19
|
+
return descendantSummaries.some(ds => ds.generatedAt > generatedAt);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Check if a summary is stale (message count, last message ID, or descendant summaries have changed)
|
|
10
24
|
* @param {string} sessionId
|
|
11
25
|
* @returns {boolean}
|
|
12
26
|
*/
|
|
@@ -27,9 +41,14 @@ export function isSummaryStale(sessionId) {
|
|
|
27
41
|
}
|
|
28
42
|
|
|
29
43
|
// Also validate count as a secondary check (defensive programming)
|
|
30
|
-
|
|
44
|
+
if (allMessages.length !== summary.messageCount) return true;
|
|
31
45
|
}
|
|
32
46
|
|
|
33
47
|
// Fallback to count-based staleness detection for old summaries
|
|
34
|
-
|
|
48
|
+
if (allMessages.length !== summary.messageCount) return true;
|
|
49
|
+
|
|
50
|
+
// Check if any descendant session has a newer summary
|
|
51
|
+
if (hasNewerDescendantSummary(sessionId, summary.generatedAt)) return true;
|
|
52
|
+
|
|
53
|
+
return false;
|
|
35
54
|
}
|
|
@@ -4,7 +4,7 @@ import { setupGitForSession } from './gitSessionSetup.js';
|
|
|
4
4
|
import { runSession } from './sessionManager.js';
|
|
5
5
|
import { broadcastToProject } from '../websocket.js';
|
|
6
6
|
import { WS_MESSAGE_TYPES } from '../../../shared/src/index.js';
|
|
7
|
-
import { resolveAgentTypeFromModel } from './sessionProvider.js';
|
|
7
|
+
import { resolveAgentTypeFromModel, resolveProviderMetadataFromModel } from './sessionProvider.js';
|
|
8
8
|
|
|
9
9
|
const liquid = new Liquid();
|
|
10
10
|
|
|
@@ -100,6 +100,8 @@ async function resolveWorkingDirectory(parentSession, project, settings, newSess
|
|
|
100
100
|
gitBranch: settings.gitBranch,
|
|
101
101
|
sessionId: newSessionId,
|
|
102
102
|
worktreeBasePath: project.worktreePath || null,
|
|
103
|
+
commitAttributionOverride:
|
|
104
|
+
resolveProviderMetadataFromModel(settings.model)?.commitAttributionOverride ?? null,
|
|
103
105
|
});
|
|
104
106
|
return { workingDirectory: gitSetup.workingDirectory, gitWorktree: gitSetup.gitWorktree };
|
|
105
107
|
}
|
|
@@ -20,6 +20,9 @@ export const WS_RECONNECT_MAX_DELAY = 30000;
|
|
|
20
20
|
|
|
21
21
|
export const TOAST_DURATION = 5000;
|
|
22
22
|
|
|
23
|
+
/** Default delay (in minutes) before auto-rescheduling a session. */
|
|
24
|
+
export const DEFAULT_RESCHEDULE_DELAY_MINUTES = 60;
|
|
25
|
+
|
|
23
26
|
export const DEFAULT_SYSTEM_PROMPT = `You are Claude Code, an AI coding assistant. You help users with software engineering tasks including writing code, debugging, refactoring, and explaining code. You have full access to the shell and can execute any commands needed to assist the user. Be helpful, accurate, and thorough.
|
|
24
27
|
|
|
25
28
|
IMPORTANT: Your working directory is already set correctly for this session. NEVER use \`cd\` to change to a hardcoded project path before running commands (e.g., \`cd /path/to/project && git status\`). This bypasses git worktree isolation and causes commands to run in the wrong directory. Always run commands directly without changing directory.
|
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
|
|
3
|
+
const OPTION_TOKEN_DASHES = /(^|\s)([-\u2010-\u2015\u2212]+)(?=[A-Za-z0-9-])/g;
|
|
4
|
+
const UNICODE_DASHES = /[\u2010-\u2015\u2212]/g;
|
|
5
|
+
const HAS_UNICODE_DASH = /[\u2010-\u2015\u2212]/;
|
|
6
|
+
|
|
7
|
+
export function normalizeCommandOptionDashes(command) {
|
|
8
|
+
return command.replace(OPTION_TOKEN_DASHES, (match, prefix, dashes) => {
|
|
9
|
+
if (!HAS_UNICODE_DASH.test(dashes)) {
|
|
10
|
+
return match;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return `${prefix}${dashes.replace(UNICODE_DASHES, '-')}`;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
3
17
|
export const CreateCommandButtonRequest = z.object({
|
|
4
18
|
label: z.string().min(1, 'Label is required'),
|
|
5
|
-
command: z.string().min(1, 'Command is required'),
|
|
19
|
+
command: z.string().min(1, 'Command is required').transform(normalizeCommandOptionDashes),
|
|
6
20
|
sortOrder: z.number().int().optional().default(0),
|
|
7
21
|
showOnList: z.boolean().optional().default(false),
|
|
8
22
|
});
|
|
9
23
|
|
|
10
24
|
export const UpdateCommandButtonRequest = z.object({
|
|
11
25
|
label: z.string().min(1).optional(),
|
|
12
|
-
command: z.string().min(1).optional(),
|
|
26
|
+
command: z.string().min(1).transform(normalizeCommandOptionDashes).optional(),
|
|
13
27
|
sortOrder: z.number().int().optional(),
|
|
14
28
|
showOnList: z.boolean().optional(),
|
|
15
29
|
}).refine(obj => Object.keys(obj).length > 0, 'At least one field must be provided for update');
|
|
@@ -46,7 +46,7 @@ export const ProjectSessionDefaultsRequest = z.object({
|
|
|
46
46
|
thinkingEnabled: z.boolean().nullable().optional(),
|
|
47
47
|
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable().optional(),
|
|
48
48
|
startImmediately: z.boolean().nullable().optional(),
|
|
49
|
-
gitMode: z.enum(['branch', 'worktree']).nullable().optional(),
|
|
49
|
+
gitMode: z.enum(['branch', 'worktree', 'current']).nullable().optional(),
|
|
50
50
|
gitBranch: z.string().nullable().optional(),
|
|
51
51
|
model: z.string().nullable().optional(),
|
|
52
52
|
providerId: z.string().nullable().optional(),
|
|
@@ -59,7 +59,7 @@ export const ProjectSessionDefaultsResponse = z.object({
|
|
|
59
59
|
thinkingEnabled: z.boolean().nullable(),
|
|
60
60
|
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable(),
|
|
61
61
|
startImmediately: z.boolean().nullable(),
|
|
62
|
-
gitMode: z.enum(['branch', 'worktree']).nullable(),
|
|
62
|
+
gitMode: z.enum(['branch', 'worktree', 'current']).nullable(),
|
|
63
63
|
gitBranch: z.string().nullable(),
|
|
64
64
|
model: z.string().nullable(),
|
|
65
65
|
providerId: z.string().nullable(),
|
|
@@ -1,5 +1,62 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
|
|
3
|
+
export const COMMIT_ATTRIBUTION_VALIDATION_MESSAGE =
|
|
4
|
+
'Commit attribution must be in the format "Name <email@example.com>" or "Co-authored-by: Name <email@example.com>".';
|
|
5
|
+
|
|
6
|
+
const CO_AUTHOR_PREFIX_RE = /^Co-authored-by:\s*/i;
|
|
7
|
+
const TRAILER_RE = /^([^\n<>]+?)\s*<([^\s<>\n@]+@[^\s<>\n@]+\.[^\s<>\n@]+)>$/;
|
|
8
|
+
|
|
9
|
+
export function parseCommitAttributionOverride(value) {
|
|
10
|
+
if (value === undefined || value === null) {
|
|
11
|
+
return { success: true, value: null };
|
|
12
|
+
}
|
|
13
|
+
if (typeof value !== 'string') {
|
|
14
|
+
return { success: false, error: COMMIT_ATTRIBUTION_VALIDATION_MESSAGE };
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const trimmed = value.trim();
|
|
18
|
+
if (!trimmed) {
|
|
19
|
+
return { success: true, value: null };
|
|
20
|
+
}
|
|
21
|
+
if (trimmed.includes('\n') || trimmed.includes('\r')) {
|
|
22
|
+
return { success: false, error: COMMIT_ATTRIBUTION_VALIDATION_MESSAGE };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const withoutPrefix = trimmed.replace(CO_AUTHOR_PREFIX_RE, '').trim();
|
|
26
|
+
const match = withoutPrefix.match(TRAILER_RE);
|
|
27
|
+
if (!match) {
|
|
28
|
+
return { success: false, error: COMMIT_ATTRIBUTION_VALIDATION_MESSAGE };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const name = match[1].trim();
|
|
32
|
+
const email = match[2].trim();
|
|
33
|
+
if (!name || !email) {
|
|
34
|
+
return { success: false, error: COMMIT_ATTRIBUTION_VALIDATION_MESSAGE };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return { success: true, value: `Co-authored-by: ${name} <${email}>` };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function normalizeCommitAttributionOverride(value) {
|
|
41
|
+
const result = parseCommitAttributionOverride(value);
|
|
42
|
+
if (!result.success) {
|
|
43
|
+
throw new Error(result.error);
|
|
44
|
+
}
|
|
45
|
+
return result.value;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const CommitAttributionOverride = z
|
|
49
|
+
.any()
|
|
50
|
+
.transform((value, ctx) => {
|
|
51
|
+
const result = parseCommitAttributionOverride(value);
|
|
52
|
+
if (result.success) return result.value;
|
|
53
|
+
ctx.addIssue({
|
|
54
|
+
code: 'custom',
|
|
55
|
+
message: result.error,
|
|
56
|
+
});
|
|
57
|
+
return z.NEVER;
|
|
58
|
+
});
|
|
59
|
+
|
|
3
60
|
/**
|
|
4
61
|
* Provider "kind" == wire protocol / env-var convention.
|
|
5
62
|
* 'anthropic' → Claude Code SDK (ANTHROPIC_* env vars)
|
|
@@ -16,6 +73,7 @@ export const CreateProviderRequest = z.object({
|
|
|
16
73
|
authToken: z.string().nullable().optional(),
|
|
17
74
|
apiTimeoutMs: z.number().int().positive().nullable().optional(),
|
|
18
75
|
additionalEnvVars: z.record(z.string()).nullable().optional(),
|
|
76
|
+
commitAttributionOverride: CommitAttributionOverride.optional(),
|
|
19
77
|
});
|
|
20
78
|
|
|
21
79
|
// `kind` is intentionally omitted. `.strict()` makes any extra key (including
|
|
@@ -28,6 +86,7 @@ export const UpdateProviderRequest = z
|
|
|
28
86
|
authToken: z.string().nullable().optional(),
|
|
29
87
|
apiTimeoutMs: z.number().int().positive().nullable().optional(),
|
|
30
88
|
additionalEnvVars: z.record(z.string()).nullable().optional(),
|
|
89
|
+
commitAttributionOverride: CommitAttributionOverride.optional(),
|
|
31
90
|
})
|
|
32
91
|
.strict();
|
|
33
92
|
|
|
@@ -39,6 +98,7 @@ export const ProviderResponse = z.object({
|
|
|
39
98
|
authToken: z.string().nullable(), // Will be redacted in API responses
|
|
40
99
|
apiTimeoutMs: z.number().nullable(),
|
|
41
100
|
additionalEnvVars: z.record(z.string()).nullable(),
|
|
101
|
+
commitAttributionOverride: z.string().nullable(),
|
|
42
102
|
isBuiltIn: z.boolean(),
|
|
43
103
|
createdAt: z.number(),
|
|
44
104
|
updatedAt: z.number(),
|
|
@@ -7,7 +7,7 @@ export const CreateSessionRequest = z.object({
|
|
|
7
7
|
thinkingEnabled: z.boolean().optional(),
|
|
8
8
|
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).optional(),
|
|
9
9
|
gitBranch: z.string().optional(),
|
|
10
|
-
gitMode: z.enum(['branch', 'worktree']).optional(),
|
|
10
|
+
gitMode: z.enum(['branch', 'worktree', 'current']).optional(),
|
|
11
11
|
templateId: z.string().uuid().optional(), // Template to apply on session creation
|
|
12
12
|
nextTemplateId: z.string().uuid().nullable().optional(),
|
|
13
13
|
// Scheduling fields
|
|
@@ -64,6 +64,7 @@ export const SessionResponse = z.object({
|
|
|
64
64
|
gitBranch: z.string().nullable(),
|
|
65
65
|
gitWorktree: z.string().nullable(),
|
|
66
66
|
prUrl: z.string().nullable(),
|
|
67
|
+
prUrlAutoLinkDisabled: z.boolean(),
|
|
67
68
|
manuallyNamed: z.boolean(),
|
|
68
69
|
error: z.string().nullable(),
|
|
69
70
|
nextTemplateId: z.string().uuid().nullable(),
|
|
@@ -6,7 +6,7 @@ export const CreateSessionTemplateRequest = z.object({
|
|
|
6
6
|
nextTemplateId: z.string().uuid().nullable().optional(),
|
|
7
7
|
thinkingEnabled: z.boolean().nullable().optional(),
|
|
8
8
|
gitBranch: z.string().nullable().optional(),
|
|
9
|
-
gitMode: z.enum(['branch', 'worktree']).nullable().optional(),
|
|
9
|
+
gitMode: z.enum(['branch', 'worktree', 'current']).nullable().optional(),
|
|
10
10
|
model: z.string().nullable().optional(),
|
|
11
11
|
mode: z.enum(['plan', 'standard', 'yolo']).nullable().optional(),
|
|
12
12
|
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable().optional(),
|
|
@@ -19,7 +19,7 @@ export const UpdateSessionTemplateRequest = z.object({
|
|
|
19
19
|
nextTemplateId: z.string().uuid().nullable().optional(),
|
|
20
20
|
thinkingEnabled: z.boolean().nullable().optional(),
|
|
21
21
|
gitBranch: z.string().nullable().optional(),
|
|
22
|
-
gitMode: z.enum(['branch', 'worktree']).nullable().optional(),
|
|
22
|
+
gitMode: z.enum(['branch', 'worktree', 'current']).nullable().optional(),
|
|
23
23
|
model: z.string().nullable().optional(),
|
|
24
24
|
mode: z.enum(['plan', 'standard', 'yolo']).nullable().optional(),
|
|
25
25
|
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable().optional(),
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
* @property {string|null} gitBranch
|
|
48
48
|
* @property {string|null} gitWorktree
|
|
49
49
|
* @property {string|null} prUrl
|
|
50
|
+
* @property {boolean} prUrlAutoLinkDisabled
|
|
50
51
|
* @property {string|null} error
|
|
51
52
|
* @property {number} createdAt
|
|
52
53
|
* @property {number} updatedAt
|
|
@@ -77,15 +78,6 @@
|
|
|
77
78
|
* @property {number} createdAt
|
|
78
79
|
*/
|
|
79
80
|
|
|
80
|
-
/**
|
|
81
|
-
* @typedef {Object} SessionNote
|
|
82
|
-
* @property {string} id
|
|
83
|
-
* @property {string} sessionId
|
|
84
|
-
* @property {string} content
|
|
85
|
-
* @property {number} createdAt
|
|
86
|
-
* @property {number} updatedAt
|
|
87
|
-
*/
|
|
88
|
-
|
|
89
81
|
/**
|
|
90
82
|
* @typedef {Object} GlobalToolTemplate
|
|
91
83
|
* @property {string} id
|
|
@@ -70,7 +70,7 @@ export function extractSlugFromPrompt(prompt) {
|
|
|
70
70
|
* Generate a git branch name for a worktree
|
|
71
71
|
* @param {string} [sessionName] - Optional session name
|
|
72
72
|
* @param {string} [prompt] - Optional prompt to extract slug from
|
|
73
|
-
* @returns {string} Branch name in format:
|
|
73
|
+
* @returns {string} Branch name in format: circus-chief/{shortId}-{slug}
|
|
74
74
|
*/
|
|
75
75
|
export function generateWorktreeBranch(sessionName, prompt) {
|
|
76
76
|
const shortId = generateShortId();
|
|
@@ -89,5 +89,5 @@ export function generateWorktreeBranch(sessionName, prompt) {
|
|
|
89
89
|
slug = 'session';
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
return `
|
|
92
|
+
return `circus-chief/${shortId}-${slug}`;
|
|
93
93
|
}
|
package/packages/web/dist/assets/{ActiveSessionsView-UJsCILDL.js → ActiveSessionsView-B0XHqLmv.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as K}from"./sessions-
|
|
1
|
+
import{u as K}from"./sessions-6zGUlFrt.js";import{u as Q}from"./commandButtons-BfqR-fqq.js";import{z as j,W as c,_ as X,o as Z,A as ee,l as te,a,c as l,b as f,F as A,r as C,E as O,u as S,t as b,d as se,w as re,f as ne,x as D,g as oe,n as ie,y as R,G as ae}from"./index-fK8FIZgP.js";import{a as x}from"./ApiClient-C3ztI9s9.js";import{S as le}from"./SessionCard-CjE1tXiT.js";import"./SessionLogStream-LlZ3z_Xj.js";function ce(){const{on:E,off:s}=j(),d=h=>p=>{const i=F=>{F.session&&p(F.session,F.projectId)};return E(h,i),()=>s(h,i)},I=d(c.SESSION_CREATED),w=d(c.SESSION_UPDATED);return{onSessionCreated:I,onSessionUpdated:w,onSessionDeleted:h=>{const p=i=>{i.sessionId&&h(i.sessionId,i.projectId)};return E(c.SESSION_DELETED,p),()=>s(c.SESSION_DELETED,p)},onSessionSummaryUpdated:h=>{const p=i=>{i.sessionId&&i.summary&&h(i.sessionId,i.summary,i.projectId)};return E(c.SESSION_SUMMARY_UPDATED,p),()=>s(c.SESSION_SUMMARY_UPDATED,p)}}}const de=["data-state"],ue={class:"filters-container"},fe={class:"status-filters"},Se=["onClick"],pe=["title"],me={key:0,class:"star-icon"},he={key:1,class:"star-icon star-crossed"},_e={key:2,class:"star-icon"},ye={key:0,class:"skeleton-list"},ve={key:1,class:"error-message"},Fe={key:2,class:"empty-state","data-testid":"active-sessions-empty"},Ee={key:3,class:"empty-state","data-testid":"active-sessions-empty"},Ie={key:4,class:"session-list"},we={__name:"ActiveSessionsView",setup(E){const s=K(),d=Q(),I=["waiting","stopped","error"],w=["running","starting"],v=ie(new Set),g=e=>{s.statusFilter===e?s.setStatusFilter(null):s.setStatusFilter(e)},h=()=>{s.starredFilter===null?s.setStarredFilter("starred"):s.starredFilter==="starred"?s.setStarredFilter("unstarred"):s.setStarredFilter(null)},p=D(()=>s.starredFilter==="starred"?"Showing starred sessions only. Click to filter unstarred.":s.starredFilter==="unstarred"?"Showing unstarred sessions only. Click to show all.":"Showing all sessions. Click to filter by starred."),i=D(()=>{let e=s.activeSessions;return s.statusFilter&&(e=e.filter(t=>{const r=t.status;return!!(s.statusFilter==="idle"&&I.includes(r)||s.statusFilter==="running"&&w.includes(r))})),s.starredFilter==="starred"?e=e.filter(t=>t.starred):s.starredFilter==="unstarred"&&(e=e.filter(t=>!t.starred)),e}),F=D(()=>s.loading?"loading":s.error?"error":s.activeSessions.length===0?"empty-all":i.value.length===0?"empty-filtered":"results"),_=R({}),u=R({}),m=R({});let N=null;const y=[],{onSessionCreated:P,onSessionUpdated:B,onSessionDeleted:L,onSessionSummaryUpdated:V}=ce();async function M(){const e=new Set(s.activeSessions.map(t=>t.projectId).filter(t=>t&&!v.value.has(t)));for(const t of e)try{await d.fetchButtons(t),await d.fetchLatestRunsForProject(t),v.value.add(t)}catch(r){console.error(`Failed to fetch buttons for project ${t}:`,r)}}function U(e,t,r){d.runs[e]||(d.runs[e]={runId:e,buttonId:t,sessionId:r,status:"running",output:"",exitCode:null,startedAt:Date.now(),outputTruncated:!1})}function H(e){["running","waiting","starting"].includes(e.status)&&(s.activeSessions.some(r=>r.id===e.id)||(s.activeSessions.unshift(e),e.projectId&&!v.value.has(e.projectId)&&(d.fetchButtons(e.projectId),v.value.add(e.projectId))))}function G(e){const t=["running","waiting","starting"].includes(e.status),r=s.activeSessions.findIndex(n=>n.id===e.id);t?r>=0?s.activeSessions[r]=e:s.activeSessions.unshift(e):r>=0&&(s.activeSessions.splice(r,1),delete _[e.id],delete u[e.id],delete m[e.id])}function W(e){const t=s.activeSessions.findIndex(r=>r.id===e);t>=0&&s.activeSessions.splice(t,1),delete _[e],delete u[e],delete m[e]}function Y(e,t){_[e]=t,u[e]=!1,m[e]=!1}function $(e,t,r){const n=o=>{U(o.runId,o.buttonId,o.sessionId),d.appendOutput(o.runId,o.output)};e(c.COMMAND_RUN_OUTPUT,n),r.push(()=>t(c.COMMAND_RUN_OUTPUT,n));const k=o=>{U(o.runId,o.buttonId,o.sessionId),d.completeRun(o.runId,o.exitCode,o.output)};e(c.COMMAND_RUN_COMPLETE,k),r.push(()=>t(c.COMMAND_RUN_COMPLETE,k));const T=o=>{U(o.runId,o.buttonId,o.sessionId),d.errorRun(o.runId,o.error)};e(c.COMMAND_RUN_ERROR,T),r.push(()=>t(c.COMMAND_RUN_ERROR,T))}Z(async()=>{s.restoreStatusFilter(),s.restoreStarredFilter(),await s.fetchActiveSessions(),await M(),y.push(P(H)),y.push(B(G)),y.push(L(W)),y.push(V(Y));const{on:e,off:t}=j();$(e,t,y),N=setInterval(()=>{s.fetchActiveSessions(!1)},3e4)}),ee(()=>{y.forEach(e=>e()),N&&clearInterval(N)}),te(()=>s.activeSessions,()=>{z(),M()},{immediate:!0});async function z(){const t=s.activeSessions.filter(r=>!_[r.id]&&!u[r.id]).map(r=>r.id);if(t.length!==0){for(const r of t)u[r]=!0,m[r]=!1;try{const r=await x.getSessionSummariesBatch(t);for(const n of t)r[n]&&(_[n]=r[n]),u[n]=!1}catch(r){console.warn("Failed to fetch summaries batch:",r.message);for(const n of t)m[n]=!0,u[n]=!1}}}async function q(e){var t;u[e]=!0,m[e]=!1;try{const r=await x.getSessionSummary(e);r&&(_[e]=r)}catch(r){((t=r.response)==null?void 0:t.status)!==404&&(console.warn(`Failed to fetch summary for session ${e}:`,r.message),m[e]=!0)}finally{u[e]=!1}}async function J(e){m[e]=!1,await q(e)}return(e,t)=>{const r=oe("router-link");return a(),l("div",{class:"container","data-testid":"active-sessions-view","data-state":F.value},[t[3]||(t[3]=f("div",{class:"page-header"},[f("div",null,[f("p",{class:"page-description"}," All active sessions across your projects ")])],-1)),f("div",ue,[f("div",fe,[(a(),l(A,null,C(["running","idle"],n=>f("button",{key:n,class:O(["filter-btn",{active:S(s).statusFilter===n}]),onClick:k=>g(n)},b(n),11,Se)),64)),f("button",{class:O(["filter-btn star-btn",{"star-filter-active":S(s).starredFilter==="starred","star-filter-unstarred":S(s).starredFilter==="unstarred","star-filter-all":S(s).starredFilter===null}]),title:p.value,onClick:h},[S(s).starredFilter==="starred"?(a(),l("span",me,"⭐")):S(s).starredFilter==="unstarred"?(a(),l("span",he,"⭐")):(a(),l("span",_e,"☆"))],10,pe)])]),S(s).loading?(a(),l("div",ye,[(a(),l(A,null,C(3,n=>f("div",{key:n,class:"skeleton card",style:{height:"120px"}})),64))])):S(s).error?(a(),l("div",ve,b(S(s).error),1)):S(s).activeSessions.length===0?(a(),l("div",Fe,[t[1]||(t[1]=f("p",null,"No active sessions. All sessions are completed or there are no sessions yet.",-1)),se(r,{to:"/",class:"btn btn-primary"},{default:re(()=>[...t[0]||(t[0]=[ne(" View Projects ",-1)])]),_:1})])):i.value.length===0?(a(),l("div",Ee,[...t[2]||(t[2]=[f("p",null,"No sessions match the current filter.",-1)])])):(a(),l("div",Ie,[(a(!0),l(A,null,C(i.value,n=>(a(),ae(le,{key:n.id,session:n,"show-project":!0,"show-summary":!0,summary:_[n.id],"summary-loading":u[n.id],"summary-error":m[n.id],onRetrySummary:J},null,8,["session","summary","summary-loading","summary-error"]))),128))]))],8,de)}}},Re=X(we,[["__scopeId","data-v-9a53578e"]]);export{Re as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`)||"No token data"}function b(l){return l==null||l===0?"0":l.toLocaleString()}function v(l){if(l==null)return"—";if(l<1e3)return`${l}ms`;if(l<6e4)return`${(l/1e3).toFixed(1)}s`;const d=Math.floor(l/6e4),C=Math.floor(l%6e4/1e3);return`${d}m ${C}s`}function a(l){const d=Date.now()-l;return d<6e4?"just now":d<36e5?`${Math.floor(d/6e4)}m ago`:d<864e5?`${Math.floor(d/36e5)}h ago`:`${Math.floor(d/864e5)}d ago`}function n(l){try{if(l.metadata)return(typeof l.metadata=="string"?JSON.parse(l.metadata):l.metadata).effortLevel||null}catch{}return null}function P(l){return{auto:"Auto",low:"Low",medium:"Med",high:"High",max:"Max"}[l]||l}return(l,d)=>{const C=W("router-link");return r(),i("div",pt,[s.loading?(r(),i("div",ht,[...d[0]||(d[0]=[t("div",{class:"spinner"},null,-1)])])):_("",!0),t("table",yt,[t("thead",null,[t("tr",null,[(r(),i(k,null,$(e,o=>t("th",{key:o.key,class:A(["th",o.sortable?"sortable":""]),onClick:S=>o.sortable?l.$emit("sort",o.key):null},[F(f(o.label)+" ",1),o.sortable&&s.sortBy===o.key?(r(),i("span",mt,f(s.sortOrder==="ASC"?"↑":"↓"),1)):_("",!0)],10,bt)),64))])]),t("tbody",null,[!s.loading&&s.logs.length===0?(r(),i("tr",kt,[t("td",{colspan:e.length,class:"empty-cell"}," No agent call logs found. ",8,$t)])):_("",!0),(r(!0),i(k,null,$(s.logs,o=>(r(),i("tr",{key:o.id,class:"log-row"},[t("td",Ct,[t("span",{class:A(["status-dot",y(o.status)])},null,2),t("span",_t,f(o.status),1)]),t("td",Tt,f(o.agentType||"—"),1),t("td",At,f(o.callType||"—"),1),t("td",Pt,f(o.model||"—"),1),t("td",Lt,[o.sessionId?(r(),z(C,{key:0,to:`/sessions/${o.sessionId}`,class:"session-link"},{default:G(()=>[F(f(o.sessionName||o.sessionId),1)]),_:2},1032,["to"])):(r(),i("span",Ot,"—"))]),t("td",St,[n(o)?(r(),i("span",{key:0,class:A(["effort-badge",`effort-${n(o)}`])},f(P(n(o))),3)):(r(),i("span",Dt,"—"))]),t("td",{class:"td text-right",title:h(o)},f(b(o.totalTokens)),9,Ft),t("td",wt,f(v(o.durationMs)),1),t("td",{class:"td text-right",title:o.startedAt?new Date(o.startedAt).toLocaleString():""},f(o.startedAt?a(o.startedAt):"—"),9,
|
|
1
|
+
import{M as q,_ as O,a as r,c as i,b as t,F as k,r as $,t as f,i as _,E as A,x as p,g as W,f as F,G as z,w as G,o as H,A as J,d as w,u as m,n as M}from"./index-fK8FIZgP.js";import{a as L}from"./ApiClient-C3ztI9s9.js";const U=q("agentLogs",{state:()=>({logs:[],pagination:{total:0,limit:25,offset:0,hasMore:!1},filters:{agentType:null,callType:null,status:null,model:null,startDate:null,endDate:null,sessionId:null},filterOptions:{agentTypes:[],callTypes:[],statuses:[],models:[]},perPage:25,currentPage:1,sortBy:"started_at",sortOrder:"DESC",loading:!1,error:null}),getters:{totalPages:s=>Math.ceil(s.pagination.total/s.perPage)||0,activeFilters:s=>{const e={};for(const[y,h]of Object.entries(s.filters))h!=null&&(e[y]=h);return e}},actions:{async fetchLogs(){this.loading=!0,this.error=null;try{const s=(this.currentPage-1)*this.perPage,e=await L.getAgentCallLogs({limit:this.perPage,offset:s,...this.activeFilters,sortBy:this.sortBy,sortOrder:this.sortOrder});this.logs=e.logs,this.pagination=e.pagination}catch(s){this.error=s.message}finally{this.loading=!1}},async fetchFilterOptions(){try{const s=await L.getAgentCallFilterOptions();this.filterOptions=s}catch(s){console.error("Failed to fetch filter options:",s)}},setFilter(s,e){this.filters[s]=e||null,this.currentPage=1,this.fetchLogs()},clearFilters(){Object.keys(this.filters).forEach(s=>this.filters[s]=null),this.currentPage=1,this.fetchLogs()},setPage(s){this.currentPage=s,this.fetchLogs()},setPerPage(s){this.perPage=s,this.currentPage=1,this.fetchLogs()},setSort(s,e){this.sortBy=s,this.sortOrder=e,this.currentPage=1,this.fetchLogs()},async clearAllLogs(){this.loading=!0,this.error=null;try{await L.deleteAllAgentCallLogs(),this.logs=[],this.pagination={total:0,limit:this.perPage,offset:0,hasMore:!1},this.currentPage=1,await this.fetchFilterOptions()}catch(s){this.error=s.message}finally{this.loading=!1}}}}),Z={class:"filter-bar"},Q={class:"filter-row"},X={class:"filter-group"},Y=["value"],K={class:"filter-group"},tt=["value"],et={class:"filter-group"},st=["value"],lt=["value"],at={class:"filter-group"},nt=["value"],ot=["value"],rt={class:"filter-group"},it=["value"],ut=["value"],dt={class:"filter-group"},ct=["value"],ft=["value"],gt={__name:"AgentLogFilters",props:{filters:{type:Object,required:!0},filterOptions:{type:Object,required:!0},hasActiveFilters:{type:Boolean,default:!1},confirming:{type:Boolean,default:!1}},emits:["filter-change","date-change","clear-filters","clear-all"],setup(s){const e=s;function y(v){return new Date(v).toISOString().slice(0,10)}const h=p(()=>e.filters.startDate?y(e.filters.startDate):""),b=p(()=>e.filters.endDate?y(e.filters.endDate):"");return(v,a)=>(r(),i("div",Z,[t("div",Q,[t("div",X,[a[8]||(a[8]=t("label",{class:"filter-label"},"From",-1)),t("input",{type:"date",class:"filter-input",value:h.value,onChange:a[0]||(a[0]=n=>v.$emit("date-change","startDate",n))},null,40,Y)]),t("div",K,[a[9]||(a[9]=t("label",{class:"filter-label"},"To",-1)),t("input",{type:"date",class:"filter-input",value:b.value,onChange:a[1]||(a[1]=n=>v.$emit("date-change","endDate",n))},null,40,tt)]),t("div",et,[a[11]||(a[11]=t("label",{class:"filter-label"},"Agent Type",-1)),t("select",{class:"filter-select",value:s.filters.agentType||"",onChange:a[2]||(a[2]=n=>v.$emit("filter-change","agentType",n.target.value))},[a[10]||(a[10]=t("option",{value:""}," All ",-1)),(r(!0),i(k,null,$(s.filterOptions.agentTypes,n=>(r(),i("option",{key:n,value:n},f(n),9,lt))),128))],40,st)]),t("div",at,[a[13]||(a[13]=t("label",{class:"filter-label"},"Call Type",-1)),t("select",{class:"filter-select",value:s.filters.callType||"",onChange:a[3]||(a[3]=n=>v.$emit("filter-change","callType",n.target.value))},[a[12]||(a[12]=t("option",{value:""}," All ",-1)),(r(!0),i(k,null,$(s.filterOptions.callTypes,n=>(r(),i("option",{key:n,value:n},f(n),9,ot))),128))],40,nt)]),t("div",rt,[a[15]||(a[15]=t("label",{class:"filter-label"},"Status",-1)),t("select",{class:"filter-select",value:s.filters.status||"",onChange:a[4]||(a[4]=n=>v.$emit("filter-change","status",n.target.value))},[a[14]||(a[14]=t("option",{value:""}," All ",-1)),(r(!0),i(k,null,$(s.filterOptions.statuses,n=>(r(),i("option",{key:n,value:n},f(n),9,ut))),128))],40,it)]),t("div",dt,[a[17]||(a[17]=t("label",{class:"filter-label"},"Model",-1)),t("select",{class:"filter-select",value:s.filters.model||"",onChange:a[5]||(a[5]=n=>v.$emit("filter-change","model",n.target.value))},[a[16]||(a[16]=t("option",{value:""}," All ",-1)),(r(!0),i(k,null,$(s.filterOptions.models,n=>(r(),i("option",{key:n,value:n},f(n),9,ft))),128))],40,ct)]),s.hasActiveFilters?(r(),i("button",{key:0,class:"btn-clear",onClick:a[6]||(a[6]=n=>v.$emit("clear-filters"))}," Clear Filters ")):_("",!0),t("button",{class:A(["btn-clear-all",{confirming:s.confirming}]),onClick:a[7]||(a[7]=n=>v.$emit("clear-all"))},f(s.confirming?"Confirm Clear All?":"Clear All Logs"),3)])]))}},vt=O(gt,[["__scopeId","data-v-780329d3"]]),pt={class:"table-wrapper"},ht={key:0,class:"loading-overlay"},yt={class:"log-table"},bt=["onClick"],mt={key:0,class:"sort-indicator"},kt={key:0},$t=["colspan"],Ct={class:"td"},_t={class:"status-text"},Tt={class:"td font-mono text-sm"},At={class:"td font-mono text-sm"},Pt={class:"td model-cell"},Lt={class:"td"},Ot={key:1},St={class:"td"},Dt={key:1},Ft=["title"],wt={class:"td text-right"},Mt=["title"],Bt={__name:"AgentLogTable",props:{logs:{type:Array,required:!0},loading:{type:Boolean,default:!1},sortBy:{type:String,default:"started_at"},sortOrder:{type:String,default:"DESC"}},emits:["sort"],setup(s){const e=[{key:"status",label:"Status",sortable:!0},{key:"agent_type",label:"Agent Type",sortable:!0},{key:"call_type",label:"Call Type",sortable:!0},{key:"model",label:"Model",sortable:!0},{key:"session",label:"Session",sortable:!1},{key:"effort",label:"Effort",sortable:!1},{key:"total_tokens",label:"Tokens",sortable:!0},{key:"duration_ms",label:"Duration",sortable:!0},{key:"started_at",label:"Started",sortable:!0}];function y(l){switch(l){case"completed":return"dot-completed";case"error":return"dot-error";case"streaming":case"pending":return"dot-pending";default:return"dot-default"}}function h(l){const d=[];return l.inputTokens&&d.push(`Input: ${b(l.inputTokens)}`),l.outputTokens&&d.push(`Output: ${b(l.outputTokens)}`),l.thinkingTokens&&d.push(`Thinking: ${b(l.thinkingTokens)}`),l.cacheReadTokens&&d.push(`Cache Read: ${b(l.cacheReadTokens)}`),l.cacheWriteTokens&&d.push(`Cache Write: ${b(l.cacheWriteTokens)}`),d.join(`
|
|
2
|
+
`)||"No token data"}function b(l){return l==null||l===0?"0":l.toLocaleString()}function v(l){if(l==null)return"—";if(l<1e3)return`${l}ms`;if(l<6e4)return`${(l/1e3).toFixed(1)}s`;const d=Math.floor(l/6e4),C=Math.floor(l%6e4/1e3);return`${d}m ${C}s`}function a(l){const d=Date.now()-l;return d<6e4?"just now":d<36e5?`${Math.floor(d/6e4)}m ago`:d<864e5?`${Math.floor(d/36e5)}h ago`:`${Math.floor(d/864e5)}d ago`}function n(l){try{if(l.metadata)return(typeof l.metadata=="string"?JSON.parse(l.metadata):l.metadata).effortLevel||null}catch{}return null}function P(l){return{auto:"Auto",low:"Low",medium:"Med",high:"High",max:"Max"}[l]||l}return(l,d)=>{const C=W("router-link");return r(),i("div",pt,[s.loading?(r(),i("div",ht,[...d[0]||(d[0]=[t("div",{class:"spinner"},null,-1)])])):_("",!0),t("table",yt,[t("thead",null,[t("tr",null,[(r(),i(k,null,$(e,o=>t("th",{key:o.key,class:A(["th",o.sortable?"sortable":""]),onClick:S=>o.sortable?l.$emit("sort",o.key):null},[F(f(o.label)+" ",1),o.sortable&&s.sortBy===o.key?(r(),i("span",mt,f(s.sortOrder==="ASC"?"↑":"↓"),1)):_("",!0)],10,bt)),64))])]),t("tbody",null,[!s.loading&&s.logs.length===0?(r(),i("tr",kt,[t("td",{colspan:e.length,class:"empty-cell"}," No agent call logs found. ",8,$t)])):_("",!0),(r(!0),i(k,null,$(s.logs,o=>(r(),i("tr",{key:o.id,class:"log-row"},[t("td",Ct,[t("span",{class:A(["status-dot",y(o.status)])},null,2),t("span",_t,f(o.status),1)]),t("td",Tt,f(o.agentType||"—"),1),t("td",At,f(o.callType||"—"),1),t("td",Pt,f(o.model||"—"),1),t("td",Lt,[o.sessionId?(r(),z(C,{key:0,to:`/sessions/${o.sessionId}`,class:"session-link"},{default:G(()=>[F(f(o.sessionName||o.sessionId),1)]),_:2},1032,["to"])):(r(),i("span",Ot,"—"))]),t("td",St,[n(o)?(r(),i("span",{key:0,class:A(["effort-badge",`effort-${n(o)}`])},f(P(n(o))),3)):(r(),i("span",Dt,"—"))]),t("td",{class:"td text-right",title:h(o)},f(b(o.totalTokens)),9,Ft),t("td",wt,f(v(o.durationMs)),1),t("td",{class:"td text-right",title:o.startedAt?new Date(o.startedAt).toLocaleString():""},f(o.startedAt?a(o.startedAt):"—"),9,Mt)]))),128))])])])}}},It=O(Bt,[["__scopeId","data-v-20d5856a"]]),Et={class:"agent-logs"},Nt={key:0,class:"error-banner"},Vt={key:1,class:"pagination-bar"},xt={class:"per-page-control"},jt=["value"],Rt=["value"],qt={class:"page-info"},Wt={class:"page-buttons"},zt=["disabled"],Gt=["disabled"],Ht={key:0,class:"page-ellipsis"},Jt=["onClick"],Ut=["disabled"],Zt=["disabled"],Qt={__name:"AgentLogsView",setup(s){const e=U(),y=M(!1),h=M(null),b=p(()=>e.logs),v=p(()=>e.pagination),a=p(()=>e.filters),n=p(()=>e.filterOptions),P=p(()=>e.perPage),l=p(()=>e.currentPage),d=p(()=>e.totalPages),C=p(()=>e.sortBy),o=p(()=>e.sortOrder),S=p(()=>e.loading),D=p(()=>e.error),B=p(()=>Object.values(e.filters).some(g=>g!=null)),I=p(()=>v.value.total===0?0:v.value.offset+1),E=p(()=>Math.min(v.value.offset+P.value,v.value.total)),N=p(()=>{const g=d.value,c=l.value;if(g<=7)return Array.from({length:g},(T,R)=>R+1);const u=[];return c<=4?u.push(1,2,3,4,5,"...",g):c>=g-3?u.push(1,"...",g-4,g-3,g-2,g-1,g):u.push(1,"...",c-1,c,c+1,"...",g),u});function V(g){C.value===g?e.setSort(g,o.value==="ASC"?"DESC":"ASC"):e.setSort(g,"DESC")}function x(g,c){const u=c.target.value;if(!u){e.setFilter(g,null);return}const T=new Date(`${u}T00:00:00Z`).getTime();e.filters[g]=T,e.currentPage=1,e.fetchLogs()}function j(){y.value?(h.value&&(clearTimeout(h.value),h.value=null),y.value=!1,e.clearAllLogs()):(y.value=!0,h.value=setTimeout(()=>{y.value=!1,h.value=null},3e3))}return H(()=>{e.fetchLogs(),e.fetchFilterOptions()}),J(()=>{h.value&&clearTimeout(h.value)}),(g,c)=>(r(),i("div",Et,[w(vt,{filters:a.value,"filter-options":n.value,"has-active-filters":B.value,confirming:y.value,onFilterChange:c[0]||(c[0]=(u,T)=>m(e).setFilter(u,T)),onDateChange:x,onClearFilters:c[1]||(c[1]=u=>m(e).clearFilters()),onClearAll:j},null,8,["filters","filter-options","has-active-filters","confirming"]),D.value?(r(),i("div",Nt,[t("span",null,f(D.value),1),t("button",{class:"btn-retry",onClick:c[2]||(c[2]=u=>m(e).fetchLogs())}," Retry ")])):_("",!0),w(It,{logs:b.value,loading:S.value,"sort-by":C.value,"sort-order":o.value,onSort:V},null,8,["logs","loading","sort-by","sort-order"]),v.value.total>0?(r(),i("div",Vt,[t("div",xt,[c[8]||(c[8]=t("label",{class:"filter-label"},"Per page",-1)),t("select",{class:"filter-select per-page-select",value:P.value,onChange:c[3]||(c[3]=u=>m(e).setPerPage(parseInt(u.target.value)))},[(r(),i(k,null,$([10,25,50,100],u=>t("option",{key:u,value:u},f(u),9,Rt)),64))],40,jt)]),t("div",qt," Showing "+f(I.value)+"–"+f(E.value)+" of "+f(v.value.total)+" logs ",1),t("div",Wt,[t("button",{class:"page-btn",disabled:l.value===1,onClick:c[4]||(c[4]=u=>m(e).setPage(1))}," « ",8,zt),t("button",{class:"page-btn",disabled:l.value===1,onClick:c[5]||(c[5]=u=>m(e).setPage(l.value-1))}," ‹ ",8,Gt),(r(!0),i(k,null,$(N.value,u=>(r(),i(k,{key:u},[u==="..."?(r(),i("span",Ht,"…")):(r(),i("button",{key:1,class:A(["page-btn",{"page-btn-active":u===l.value}]),onClick:T=>m(e).setPage(u)},f(u),11,Jt))],64))),128)),t("button",{class:"page-btn",disabled:l.value===d.value,onClick:c[6]||(c[6]=u=>m(e).setPage(l.value+1))}," › ",8,Ut),t("button",{class:"page-btn",disabled:l.value===d.value,onClick:c[7]||(c[7]=u=>m(e).setPage(d.value))}," » ",8,Zt)])])):_("",!0)]))}},Kt=O(Qt,[["__scopeId","data-v-e1df2011"]]);export{Kt as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var b=n=>{throw TypeError(n)};var g=(n,e,s)=>e.has(n)||b("Cannot "+s);var h=(n,e,s)=>(g(n,e,"read from private field"),s?s.call(n):e.get(n)),y=(n,e,s)=>e.has(n)?b("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,s),C=(n,e,s,t)=>(g(n,e,"write to private field"),t?t.call(n,s):e.set(n,s),s),l=(n,e,s)=>(g(n,e,"access private method"),s);function S(n){Object.assign(n.prototype,{async getProjects(){return this._get("/projects")},async getProject(e){return this._get(`/projects/${e}`)},async createProject(e){return this._post("/projects",e)},async updateProject(e,s){return this._put(`/projects/${e}`,s)},async deleteProject(e){return this._delete(`/projects/${e}`)}})}function j(n,e,s){for(const t of s)e[t]!==void 0&&e[t]!==null&&n.append(t,e[t])}function k(n,e,s){for(const t of s)e[t]!==void 0&&e[t]!==null&&n.append(t,String(e[t]))}function P(n,e){const s=new FormData;s.append("prompt",n.prompt),j(s,n,["name","mode","model","providerId","effortLevel","gitBranch","gitMode","templateId","parentSessionId"]),k(s,n,["thinkingEnabled","startImmediately","autoRescheduleEnabled","rescheduleOnTokenLimit","rescheduleOnServiceError"]),j(s,n,["scheduledAt","rescheduleDelayMinutes","maxRescheduleCount","maxTotalTokens","rescheduleAtTokenCount"]);for(const t of e)s.append("files",t);return s}function T(n){Object.assign(n.prototype,{async getActiveSessions(){return this._get("/sessions")},async getProjectSessions(e,s=null,t=null,{limit:r=null,offset:a=0}={}){const o={};return s!==null&&(o.archived=s),t==="starred"?o.starred=!0:t==="unstarred"&&(o.starred=!1),r!==null&&(o.limit=r,o.offset=a),this._get(this._buildQueryPath(`/projects/${e}/sessions`,o))},async createSession(e,s){const{files:t,...r}=s;if(t&&t.length>0){const a=P(r,t);return this._uploadFormData(`/projects/${e}/sessions`,a)}return this._post(`/projects/${e}/sessions`,r)},async getSession(e){return this._get(`/sessions/${e}`)},async getSessionMessages(e){return this._get(`/sessions/${e}/messages`)},async getSessionWorkLogs(e){return this._get(`/sessions/${e}/work-logs`)},async sendMessage(e,s,t=[],r=null){if(console.log(`[MODEL AUDIT - ApiClient] sendMessage called with model: "${r}"`),t&&t.length>0){const a=new FormData;a.append("content",s),r&&a.append("model",r);for(const o of t)a.append("files",o);return this._uploadFormData(`/sessions/${e}/message`,a)}return this._post(`/sessions/${e}/message`,{content:s,model:r})},async stopSession(e){return this._post(`/sessions/${e}/stop`)},async getSessionChanges(e,s="local",t=null){const r={};return s==="branch"&&(r.compareMode="branch",t&&(r.branch=t)),this._get(this._buildQueryPath(`/sessions/${e}/changes`,r))},async getSessionDefaultBranch(e){return this._get(`/sessions/${e}/default-branch`)},async getSessionFilesCount(e){return this._get(`/sessions/${e}/files-count`)},async getSessionFile(e,s){return this._get(`/sessions/${e}/file?path=${encodeURIComponent(s)}`)},async restartSession(e){return this._post(`/sessions/${e}/restart`)},async startSession(e,s,t,r){const a={};return s!==void 0&&(a.prompt=s),t!==void 0&&(a.model=t),r!==void 0&&(a.providerId=r),this._post(`/sessions/${e}/start`,Object.keys(a).length>0?a:void 0)},async updateSessionInitialPrompt(e,s){return this._put(`/sessions/${e}/initial-prompt`,{prompt:s})},async updateSession(e,s){return this._patch(`/sessions/${e}`,s)},async updateSessionPendingPrompt(e,s){return this._patch(`/sessions/${e}/pending-prompt`,{pendingPrompt:s})},async deleteSession(e){return this._delete(`/sessions/${e}`)},async archiveSession(e,{cleanup:s=!1}={}){return this._post(`/sessions/${e}/archive`,{cleanup:s})},async unarchiveSession(e){return this._post(`/sessions/${e}/unarchive`)},async toggleSessionStar(e){return this._post(`/sessions/${e}/star`)},async duplicateSession(e,s={}){return this._post(`/sessions/${e}/duplicate`,s)},async scheduleSession(e,s){return this._post(`/sessions/${e}/schedule`,s)}})}function w(n){Object.assign(n.prototype,{async getCanvasItems(e){return this._get(`/sessions/${e}/canvas`)},async getCanvasFileContent(e,s){return this._get(`/sessions/${e}/canvas/file/${encodeURIComponent(s)}/content`)},async getCanvasItemContent(e,s){return this._get(`/sessions/${e}/canvas/${s}/content`)},async getAllCanvasItems(e){return this._get(`/sessions/${e}/canvas/all`)},async uploadCanvasItem(e,s){const t=new FormData;return t.append("file",s),this._uploadFormData(`/sessions/${e}/canvas`,t)},async createCanvasItem(e,s){return this._post(`/sessions/${e}/canvas`,s)},async updateCanvasItem(e,s,t){return this._put(`/sessions/${e}/canvas/${s}`,t)},async deleteCanvasItem(e,s){return this._delete(`/sessions/${e}/canvas/${s}`)},async getCanvasTrash(e){return this._get(`/sessions/${e}/canvas-trash`)},async recoverCanvasItem(e,s){return this._post(`/sessions/${e}/canvas/${s}/recover`)},async recoverCanvasFile(e,s){return this._post(`/sessions/${e}/canvas-trash/recover-file/${encodeURIComponent(s)}`)},async permanentlyDeleteCanvasItem(e,s){return this._delete(`/sessions/${e}/canvas/${s}/permanent`)},async bulkDeleteCanvasItems(e,s){return this._post(`/sessions/${e}/canvas/bulk-delete`,{itemIds:s})},async bulkRecoverCanvasItems(e,s){return this._post(`/sessions/${e}/canvas/bulk-recover`,{itemIds:s})},async bulkPermanentlyDeleteCanvasItems(e,s){return this._delete(`/sessions/${e}/canvas/bulk-delete-permanent`,{itemIds:s})}})}function A(n){Object.assign(n.prototype,{async getProviders(){return this._get("/providers")},async getProvider(e){return this._get(`/providers/${e}`)},async createProvider(e){return this._post("/providers",e)},async updateProvider(e,s){return this._patch(`/providers/${e}`,s)},async deleteProvider(e){return this._delete(`/providers/${e}`)},async testProviderConnection(e){return this._post("/providers/test",e)},async testExistingProvider(e){return this._post(`/providers/${e}/test`)},async getProviderModels(e){return this._get(`/providers/${e}/models`)},async addProviderModel(e,s){return this._post(`/providers/${e}/models`,s)},async updateProviderModel(e,s,t){return this._patch(`/providers/${e}/models/${s}`,t)},async removeProviderModel(e,s){return this._delete(`/providers/${e}/models/${s}`)}})}function R(n){Object.assign(n.prototype,{async getAgents(){return this._get("/agents")}})}function I(n){Object.assign(n.prototype,{async getCommandButtons(e){return this._get(`/projects/${e}/command-buttons`)},async createCommandButton(e,s){return this._post(`/projects/${e}/command-buttons`,s)},async getCommandButton(e,s){return this._get(`/projects/${e}/command-buttons/${s}`)},async updateCommandButton(e,s,t){return this._patch(`/projects/${e}/command-buttons/${s}`,t)},async deleteCommandButton(e,s){return this._delete(`/projects/${e}/command-buttons/${s}`)},async runCommandButton(e,s){return this._post(`/sessions/${e}/command-buttons/${s}/run`)},async getActiveRuns(e){return this._get(`/sessions/${e}/command-buttons/runs`)},async getCommandRun(e,s){return this._get(`/sessions/${e}/command-buttons/runs/${s}`)},async getLatestRunsForProject(e){return this._get(`/projects/${e}/command-buttons/latest-runs`)},async killCommandRun(e,s){return this._post(`/sessions/${e}/command-buttons/runs/${s}/kill`)},async deleteCommandRun(e,s){return this._delete(`/sessions/${e}/command-buttons/runs/${s}`)},async deleteAllRunsForButton(e,s){return this._delete(`/sessions/${e}/command-buttons/${s}/runs/all`)}})}function O(n){Object.assign(n.prototype,{async getTokenCostWeights(){return this._get("/settings/token-weights")},async updateTokenCostWeights(e){return this._put("/settings/token-weights",e)},async resetTokenCostWeights(){return this._delete("/settings/token-weights")},async getSummarySettings(){return this._get("/settings/summary")},async updateSummarySettings(e){return this._put("/settings/summary",e)},async resetSummarySettings(){return this._delete("/settings/summary")},async getGeneralSettings(){return this._get("/settings/general")},async updateGeneralSettings(e){return this._put("/settings/general",e)},async resetGeneralSettings(){return this._delete("/settings/general")}})}function D(n){Object.assign(n.prototype,{async getConversations(e){return this._get(`/sessions/${e}/conversations`)},async createConversation(e,s=null){return this._post(`/sessions/${e}/conversations`,{name:s})},async getConversation(e,s){return this._get(`/sessions/${e}/conversations/${s}`)},async updateConversation(e,s,t){return this._patch(`/sessions/${e}/conversations/${s}`,t)},async deleteConversation(e,s){return this._delete(`/sessions/${e}/conversations/${s}`)},async branchConversation(e,s,t){return this._post(`/sessions/${e}/conversations/${s}/branch`,t)},async getConversationMessages(e,s){return this._get(`/sessions/${e}/messages?conversation_id=${s}`)}})}function F(n){Object.assign(n.prototype,{async getGlobalTemplates(){return this._get("/templates")},async createGlobalTemplate(e){return this._post("/templates",e)},async getTemplate(e){return this._get(`/templates/${e}`)},async updateTemplate(e,s){return this._patch(`/templates/${e}`,s)},async deleteTemplate(e){return this._delete(`/templates/${e}`)},async getProjectTemplates(e){return this._get(`/projects/${e}/templates`)},async createProjectTemplate(e,s){return this._post(`/projects/${e}/templates`,s)}})}function Q(n){Object.assign(n.prototype,{async getQuickResponses(e){return this._get(`/projects/${e}/quick-responses`)},async getGlobalQuickResponses(){return this._get("/quick-responses/global")},async createQuickResponse(e,s){return this._post(`/projects/${e}/quick-responses`,s)},async updateQuickResponse(e,s){return this._patch(`/quick-responses/${e}`,s)},async deleteQuickResponse(e){return this._delete(`/quick-responses/${e}`)},async reorderQuickResponses(e,s){return this._post(`/projects/${e}/quick-responses/reorder`,s)},async reorderGlobalQuickResponses(e){return this._post("/quick-responses/global/reorder",e)}})}function B(n){Object.assign(n.prototype,{async getGitStatus(e){return this._get(`/git/projects/${e}/status`)},async getWorktrees(e){return this._get(`/git/projects/${e}/worktrees`)},async detectWorktreePath(e){return this._get(this._buildQueryPath("/git/detect-worktree-path",{directory:e}))},async getSessionTodos(e,s=null){return this._get(this._buildQueryPath(`/sessions/${e}/todos`,{conversation_id:s||void 0}))},async getSessionSummary(e,s=!1){const t=s?this._buildQueryPath(`/sessions/${e}/summary`,{generate:"true"}):`/sessions/${e}/summary`;try{return await this._get(t)}catch(r){if(r.message.includes("404")||r.message.includes("not found"))return null;throw r}},async getSessionSummariesBatch(e){return!e||e.length===0?{}:this._post("/sessions/summaries/batch",{ids:e})},async generateSessionSummary(e){return this._post(`/sessions/${e}/summary`)},async getWorkflowLatestResponse(e){try{return await this._get(`/sessions/${e}/workflow-latest-response`)}catch(s){if(s.message.includes("404"))return null;throw s}},async browseDirectory(e=""){return this._get(this._buildQueryPath("/filesystem/browse",{path:e||void 0}))},async getSlashCommands(e){return this._get(`/commands?directory=${encodeURIComponent(e)}`)},async getSlashCommand(e,s){return this._get(`/commands/${encodeURIComponent(s)}?directory=${encodeURIComponent(e)}`)},async executeSlashCommand(e,s,t={}){return this._post(`/commands/${encodeURIComponent(s)}/execute`,{sessionId:e,args:t})},async getAgentCallLogs({limit:e,offset:s,agentType:t,callType:r,status:a,startDate:o,endDate:m,sessionId:_,model:$,sortBy:f,sortOrder:v}={}){const c={};return e!=null&&(c.limit=e),s!=null&&(c.offset=s),t&&(c.agentType=t),r&&(c.callType=r),a&&(c.status=a),o&&(c.startDate=o),m&&(c.endDate=m),_&&(c.sessionId=_),$&&(c.model=$),f&&(c.sortBy=f),v&&(c.sortOrder=v),this._get(this._buildQueryPath("/agent-calls",c))},async getAgentCallFilterOptions(){return this._get("/agent-calls/filter-options")},async deleteAllAgentCallLogs(){return this._delete("/agent-calls")},async getProjectSessionDefaults(e){return this._get(`/projects/${e}/session-defaults`)},async updateProjectSessionDefaults(e,s){return this._post(`/projects/${e}/session-defaults`,s)},async resetProjectSessionDefaults(e){return this._delete(`/projects/${e}/session-defaults`)}})}function L(n){Object.assign(n.prototype,{async getKanbanBoard(e){return this._get(`/projects/${e}/kanban`)},async deleteKanbanBoard(e){return this._delete(`/projects/${e}/kanban`)},async createKanbanLane(e,s){return this._post(`/projects/${e}/kanban/lanes`,s)},async updateKanbanLane(e,s,t){return this._patch(`/projects/${e}/kanban/lanes/${s}`,t)},async deleteKanbanLane(e,s){return this._delete(`/projects/${e}/kanban/lanes/${s}`)},async reorderKanbanLanes(e,s){return this._put(`/projects/${e}/kanban/lanes/reorder`,s)},async createKanbanCard(e,s){return this._post(`/projects/${e}/kanban/cards`,s)},async moveKanbanCard(e,s,t){return this._patch(`/projects/${e}/kanban/cards/${s}/move`,t)},async deleteKanbanCard(e,s){return this._delete(`/projects/${e}/kanban/cards/${s}`)},async reorderKanbanCards(e,s,t){return this._put(`/projects/${e}/kanban/lanes/${s}/cards/reorder`,t)}})}var p,u,d;class i{constructor(e="/api"){y(this,u);y(this,p);C(this,p,e)}get baseUrl(){return h(this,p)}async _uploadFormData(e,s){const t=await fetch(`${h(this,p)}${e}`,{method:"POST",body:s});if(!t.ok){const r=await t.json().catch(()=>({}));throw new Error(r.message||r.error||`HTTP ${t.status}`)}return t.json()}_buildQueryPath(e,s){const t=new URLSearchParams;for(const[a,o]of Object.entries(s))o!=null&&t.append(a,o);const r=t.toString();return r?`${e}?${r}`:e}_get(e){return l(this,u,d).call(this,"GET",e)}_post(e,s){return l(this,u,d).call(this,"POST",e,s)}_put(e,s){return l(this,u,d).call(this,"PUT",e,s)}_patch(e,s){return l(this,u,d).call(this,"PATCH",e,s)}_delete(e,s){return l(this,u,d).call(this,"DELETE",e,s)}}p=new WeakMap,u=new WeakSet,d=async function(e,s,t=null){const r={method:e,headers:{"Content-Type":"application/json"}};t&&e!=="GET"&&(r.body=JSON.stringify(t));const a=await fetch(`${h(this,p)}${s}`,r);if(!a.ok){const o=await a.json().catch(()=>({}));throw new Error(o.message||o.error||`HTTP ${a.status}`)}return a.status===204?null:a.json()};S(i);T(i);w(i);A(i);R(i);I(i);O(i);D(i);F(i);Q(i);B(i);L(i);const E=new i;export{E as a};
|