circuschief 0.7.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/commandButtons.js +16 -15
- package/packages/server/src/api/index.js +2 -0
- package/packages/server/src/api/kanban.js +4 -2
- package/packages/server/src/api/projects-commandButtons.js +6 -6
- package/packages/server/src/api/projects-helpers.js +20 -3
- package/packages/server/src/api/projects-session-create.js +109 -0
- package/packages/server/src/api/projects-session-defaults.js +51 -0
- package/packages/server/src/api/projects-session-helpers.js +57 -5
- package/packages/server/src/api/projects-templates.js +38 -0
- package/packages/server/src/api/projects.js +28 -170
- package/packages/server/src/api/providers.js +11 -1
- package/packages/server/src/api/sessions-commands.js +46 -25
- package/packages/server/src/api/sessions-lifecycle.js +10 -10
- package/packages/server/src/api/sessions-patch.js +45 -1
- 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 +2 -1
- package/packages/server/src/db/SessionTemplateRepository.js +23 -2
- package/packages/server/src/db/index.js +0 -3
- package/packages/server/src/db/migrations/index.js +60 -7
- package/packages/server/src/db/migrations/kanbanMigrations.js +1 -1
- package/packages/server/src/db/migrations/miscMigrations.js +59 -184
- package/packages/server/src/db/migrations/projectsMigrations.js +31 -0
- package/packages/server/src/db/migrations/providerCommitAttributionMigrations.js +30 -0
- package/packages/server/src/db/migrations/providerMigrations.js +165 -0
- package/packages/server/src/db/migrations/sessionTableRecreate.js +136 -0
- package/packages/server/src/db/migrations/sessionsMigrations.js +18 -5
- package/packages/server/src/db/seedBaselineData.js +137 -0
- package/packages/server/src/db/session-helpers.js +32 -4
- package/packages/server/src/middleware/sessionLookup.js +81 -8
- package/packages/server/src/schema.sql +153 -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 +14 -12
- 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 +150 -0
- package/packages/server/src/services/gitDiff.js +132 -0
- package/packages/server/src/services/gitRepoUrl.js +174 -0
- package/packages/server/src/services/gitService.js +48 -311
- package/packages/server/src/services/gitSessionSetup.js +11 -1
- package/packages/server/src/services/gitWorktree.js +127 -0
- 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 +29 -2
- package/packages/shared/src/contracts/templates.js +12 -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-Cxh8mHmB.js} +1 -1
- package/packages/web/dist/assets/{AgentLogsView-BGFPLjLa.js → AgentLogsView-xdfI2bR6.js} +2 -2
- package/packages/web/dist/assets/ApiClient-DfbJwzpz.js +1 -0
- package/packages/web/dist/assets/ArchiveConfirmModal-DXZYdzHR.js +1 -0
- package/packages/web/dist/assets/ArchiveConfirmModal-DeoCVGXt.css +1 -0
- package/packages/web/dist/assets/CommandButtonDetailView-D8xfqLAp.js +1 -0
- package/packages/web/dist/assets/CommandButtonDetailView-D9zjx9ME.css +1 -0
- package/packages/web/dist/assets/EffortLevelSelector-D2Hdzc_8.js +1 -0
- package/packages/web/dist/assets/{GeneralSettingsView-DsHChEhv.js → GeneralSettingsView-sPXkLlLy.js} +1 -1
- package/packages/web/dist/assets/InputWithButton-B-o0DgMH.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-Dxn1li4l.js} +1 -1
- package/packages/web/dist/assets/MarkdownEditor-D4Kbb-9l.js +2 -0
- package/packages/web/dist/assets/ModelSelector-72C7MUH4.js +1 -0
- package/packages/web/dist/assets/{ModelSelector-D8hbTRIt.css → ModelSelector-BNYKujL-.css} +1 -1
- package/packages/web/dist/assets/NewSessionView-BR_COfgW.js +3 -0
- package/packages/web/dist/assets/NewSessionView-DBl7T2Xp.css +1 -0
- package/packages/web/dist/assets/ProjectEditView-DbqTbA0q.css +1 -0
- package/packages/web/dist/assets/ProjectEditView-WImU7sNd.js +1 -0
- package/packages/web/dist/assets/{ProjectListView-B9FuWESY.js → ProjectListView-CYmmAcBD.js} +1 -1
- package/packages/web/dist/assets/{ProjectNewView-D62jYlBL.js → ProjectNewView-DEhqw3Jv.js} +1 -1
- package/packages/web/dist/assets/ProvidersView-XZh3jkmH.js +1 -0
- package/packages/web/dist/assets/ProvidersView-bZemq_Rv.css +1 -0
- package/packages/web/dist/assets/QuickResponsesPanel-BqmnTd-D.js +1 -0
- package/packages/web/dist/assets/QuickResponsesPanel-dk-Rj8xx.css +1 -0
- package/packages/web/dist/assets/ResizableTextarea-BQNw5e0C.css +1 -0
- package/packages/web/dist/assets/ResizableTextarea-DpWdIAP6.js +1 -0
- package/packages/web/dist/assets/SessionCard-Bw77-KwD.js +1 -0
- package/packages/web/dist/assets/SessionDetailView-B59TEkr-.js +36 -0
- package/packages/web/dist/assets/SessionDetailView-CKVBnR4T.css +1 -0
- package/packages/web/dist/assets/{SessionFormOptions-DYUISplS.js → SessionFormOptions-hqijxc0S.js} +1 -1
- package/packages/web/dist/assets/SessionListView-3-xx6EVs.css +1 -0
- package/packages/web/dist/assets/SessionListView-DYXHM9I-.js +1 -0
- package/packages/web/dist/assets/{SessionLogStream-DpUE6Xsh.js → SessionLogStream-5NfVr9pF.js} +6 -6
- package/packages/web/dist/assets/{SettingsView-BC055tIA.js → SettingsView-DI8ncOAV.js} +1 -1
- package/packages/web/dist/assets/{SlashCommandWizard-DmTyNG9O.js → SlashCommandWizard-BQ_rMzn-.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-C2Qs35mm.js} +1 -1
- package/packages/web/dist/assets/TemplateDetailView-B5NI2oTR.css +1 -0
- package/packages/web/dist/assets/TemplateDetailView-zVkIvgtu.js +1 -0
- package/packages/web/dist/assets/{commandButtons-D4RPpLiu.js → commandButtons-CoU3G4zK.js} +1 -1
- package/packages/web/dist/assets/index-9yF1uCCA.js +1 -0
- package/packages/web/dist/assets/index-BKstCaYU.js +1 -0
- package/packages/web/dist/assets/index-BhbH7eOk.js +1 -0
- package/packages/web/dist/assets/{index-BGwH4Cfn.js → index-BjuRttEY.js} +3 -3
- package/packages/web/dist/assets/index-Bo7PdwM5.js +1 -0
- package/packages/web/dist/assets/index-C2QFVD7d.js +83 -0
- package/packages/web/dist/assets/index-C7Ww2auW.js +1 -0
- package/packages/web/dist/assets/index-CAGdsDh7.js +1 -0
- package/packages/web/dist/assets/index-CLRsVASf.js +3 -0
- package/packages/web/dist/assets/{index-Bn5xdGFM.js → index-CP-SxOlV.js} +1 -1
- package/packages/web/dist/assets/index-CslU0psO.js +1 -0
- package/packages/web/dist/assets/index-DI4NxaWD.js +1 -0
- package/packages/web/dist/assets/index-DOzONENy.js +1 -0
- package/packages/web/dist/assets/index-DUa7adFh.js +1 -0
- package/packages/web/dist/assets/index-DZBpETI5.js +1 -0
- package/packages/web/dist/assets/index-DsjWqc6R.js +7 -0
- package/packages/web/dist/assets/index-c99Bo3JV.js +1 -0
- package/packages/web/dist/assets/index-mT1JpxDc.js +1 -0
- package/packages/web/dist/assets/index-rkQx2tso.js +1 -0
- package/packages/web/dist/assets/{index-Cs2nxhrT.css → index-uySCcnA_.css} +1 -1
- package/packages/web/dist/assets/projectDefaults-B8esIcYq.js +1 -0
- package/packages/web/dist/assets/{projects-BUiOGmmb.js → projects-C-8PSxKi.js} +1 -1
- package/packages/web/dist/assets/{providers-Bh1ZiiJi.js → providers-oXifvvqN.js} +1 -1
- package/packages/web/dist/assets/sessions-Nq5VafSf.js +1 -0
- package/packages/web/dist/assets/{settings-Z4AVVmkJ.js → settings-DtpuiyT6.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/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/CommandButtonDetailView-D8S258uP.js +0 -1
- package/packages/web/dist/assets/CommandButtonDetailView-DBm3rzhw.css +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/ModelSelector-BMpR0DPr.js +0 -1
- package/packages/web/dist/assets/NewSessionView-BCqtIgWH.js +0 -3
- package/packages/web/dist/assets/NewSessionView-CUUdHkfv.css +0 -1
- package/packages/web/dist/assets/ProjectEditView-D9sK0fdH.css +0 -1
- 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/QuickResponseSettings-CDm5vwP7.js +0 -1
- package/packages/web/dist/assets/QuickResponsesPanel-BlFDvnZ2.css +0 -1
- package/packages/web/dist/assets/QuickResponsesPanel-DZ_Lre_l.js +0 -1
- package/packages/web/dist/assets/ResizableTextarea-DiIOEGjN.js +0 -1
- package/packages/web/dist/assets/ResizableTextarea-DsU3TVwF.css +0 -1
- package/packages/web/dist/assets/SessionCard-DmjnVYWn.js +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/TemplateDetailView-BlhOmLUX.js +0 -1
- package/packages/web/dist/assets/TemplateDetailView-DT2m06W7.css +0 -1
- package/packages/web/dist/assets/index-4rhEeO0B.js +0 -1
- package/packages/web/dist/assets/index-9vb2KaAd.js +0 -1
- package/packages/web/dist/assets/index-B0CvZXuN.js +0 -7
- package/packages/web/dist/assets/index-B6G18FqB.js +0 -82
- package/packages/web/dist/assets/index-BUhvkAdF.js +0 -1
- package/packages/web/dist/assets/index-BcnkUk2o.js +0 -1
- package/packages/web/dist/assets/index-CNwkdB0T.js +0 -1
- package/packages/web/dist/assets/index-CfL84oGW.js +0 -1
- package/packages/web/dist/assets/index-CkmxO8Mm.js +0 -1
- package/packages/web/dist/assets/index-Cpy4-yv3.js +0 -1
- package/packages/web/dist/assets/index-CrAQJmoZ.js +0 -1
- package/packages/web/dist/assets/index-D6Ky9vJe.js +0 -3
- package/packages/web/dist/assets/index-DfrE0gAC.js +0 -1
- package/packages/web/dist/assets/index-KwEyz0F3.js +0 -1
- package/packages/web/dist/assets/index-OfCywayk.js +0 -1
- package/packages/web/dist/assets/index-PDesaJc6.js +0 -1
- package/packages/web/dist/assets/index-uB6nhSvz.js +0 -1
- package/packages/web/dist/assets/sessions-DH1R-NhV.js +0 -1
|
@@ -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(),
|
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
|
|
3
|
+
const SCHEDULED_AT_FORMAT_MESSAGE = 'scheduledAt must be a valid ISO 8601 date-time string with a timezone';
|
|
4
|
+
const ISO_8601_DATE_TIME_WITH_TIMEZONE = /^(\d{4})-(\d{2})-(\d{2})T([01]\d|2[0-3]):([0-5]\d):([0-5]\d)(?:\.\d+)?(Z|[+-](?:[01]\d|2[0-3]):[0-5]\d)$/;
|
|
5
|
+
|
|
6
|
+
function hasValidDateParts(year, month, day) {
|
|
7
|
+
const parsed = new Date(Date.UTC(year, month - 1, day));
|
|
8
|
+
return parsed.getUTCFullYear() === year
|
|
9
|
+
&& parsed.getUTCMonth() === month - 1
|
|
10
|
+
&& parsed.getUTCDate() === day;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function isScheduledAtIsoString(value) {
|
|
14
|
+
const match = ISO_8601_DATE_TIME_WITH_TIMEZONE.exec(value);
|
|
15
|
+
if (!match) return false;
|
|
16
|
+
|
|
17
|
+
const year = Number(match[1]);
|
|
18
|
+
const month = Number(match[2]);
|
|
19
|
+
const day = Number(match[3]);
|
|
20
|
+
if (!hasValidDateParts(year, month, day)) return false;
|
|
21
|
+
|
|
22
|
+
return Number.isFinite(Date.parse(value));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const ScheduledAtIsoString = z.string().refine(isScheduledAtIsoString, {
|
|
26
|
+
message: SCHEDULED_AT_FORMAT_MESSAGE,
|
|
27
|
+
});
|
|
28
|
+
|
|
3
29
|
export const CreateSessionRequest = z.object({
|
|
4
30
|
prompt: z.string().min(1),
|
|
5
31
|
name: z.string().optional(),
|
|
@@ -7,11 +33,11 @@ export const CreateSessionRequest = z.object({
|
|
|
7
33
|
thinkingEnabled: z.boolean().optional(),
|
|
8
34
|
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).optional(),
|
|
9
35
|
gitBranch: z.string().optional(),
|
|
10
|
-
gitMode: z.enum(['branch', 'worktree']).optional(),
|
|
36
|
+
gitMode: z.enum(['branch', 'worktree', 'current']).optional(),
|
|
11
37
|
templateId: z.string().uuid().optional(), // Template to apply on session creation
|
|
12
38
|
nextTemplateId: z.string().uuid().nullable().optional(),
|
|
13
39
|
// Scheduling fields
|
|
14
|
-
scheduledAt:
|
|
40
|
+
scheduledAt: ScheduledAtIsoString.optional(),
|
|
15
41
|
autoRescheduleEnabled: z.boolean().optional(),
|
|
16
42
|
rescheduleDelayMinutes: z.number().min(5).max(1440).optional(), // 5 min to 24 hours
|
|
17
43
|
rescheduleOnTokenLimit: z.boolean().optional(),
|
|
@@ -64,6 +90,7 @@ export const SessionResponse = z.object({
|
|
|
64
90
|
gitBranch: z.string().nullable(),
|
|
65
91
|
gitWorktree: z.string().nullable(),
|
|
66
92
|
prUrl: z.string().nullable(),
|
|
93
|
+
prUrlAutoLinkDisabled: z.boolean(),
|
|
67
94
|
manuallyNamed: z.boolean(),
|
|
68
95
|
error: z.string().nullable(),
|
|
69
96
|
nextTemplateId: z.string().uuid().nullable(),
|
|
@@ -6,11 +6,14 @@ 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(),
|
|
13
13
|
targetLaneId: z.string().uuid().nullable().optional(), // Lane to place session in when created from this template
|
|
14
|
+
showInQuickResponses: z.boolean().optional(),
|
|
15
|
+
quickResponseAutoSubmit: z.boolean().optional(),
|
|
16
|
+
quickResponseSortOrder: z.number().int().optional(),
|
|
14
17
|
});
|
|
15
18
|
|
|
16
19
|
export const UpdateSessionTemplateRequest = z.object({
|
|
@@ -19,11 +22,14 @@ export const UpdateSessionTemplateRequest = z.object({
|
|
|
19
22
|
nextTemplateId: z.string().uuid().nullable().optional(),
|
|
20
23
|
thinkingEnabled: z.boolean().nullable().optional(),
|
|
21
24
|
gitBranch: z.string().nullable().optional(),
|
|
22
|
-
gitMode: z.enum(['branch', 'worktree']).nullable().optional(),
|
|
25
|
+
gitMode: z.enum(['branch', 'worktree', 'current']).nullable().optional(),
|
|
23
26
|
model: z.string().nullable().optional(),
|
|
24
27
|
mode: z.enum(['plan', 'standard', 'yolo']).nullable().optional(),
|
|
25
28
|
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable().optional(),
|
|
26
29
|
targetLaneId: z.string().uuid().nullable().optional(),
|
|
30
|
+
showInQuickResponses: z.boolean().optional(),
|
|
31
|
+
quickResponseAutoSubmit: z.boolean().optional(),
|
|
32
|
+
quickResponseSortOrder: z.number().int().optional(),
|
|
27
33
|
});
|
|
28
34
|
|
|
29
35
|
export const SessionTemplateResponse = z.object({
|
|
@@ -39,6 +45,10 @@ export const SessionTemplateResponse = z.object({
|
|
|
39
45
|
mode: z.string().nullable(),
|
|
40
46
|
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable(),
|
|
41
47
|
targetLaneId: z.string().uuid().nullable(),
|
|
48
|
+
showInQuickResponses: z.boolean(),
|
|
49
|
+
quickResponseAutoSubmit: z.boolean(),
|
|
50
|
+
quickResponseSortOrder: z.number(),
|
|
51
|
+
legacyQuickResponseId: z.string().nullable(),
|
|
42
52
|
createdAt: z.number(),
|
|
43
53
|
updatedAt: z.number(),
|
|
44
54
|
});
|
|
@@ -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-Cxh8mHmB.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as K}from"./sessions-
|
|
1
|
+
import{u as K}from"./sessions-Nq5VafSf.js";import{u as Q}from"./commandButtons-CoU3G4zK.js";import{E as j,W as c,_ as X,o as Z,G as ee,l as te,a,c as l,b as f,F as C,r as D,J as O,u as S,t as b,d as se,w as re,f as ne,z as A,g as oe,n as ie,C as R,x as ae}from"./index-C2QFVD7d.js";import{a as x}from"./ApiClient-DfbJwzpz.js";import{S as le}from"./SessionCard-Bw77-KwD.js";import"./SessionLogStream-5NfVr9pF.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"},ve={key:0,class:"skeleton-list"},ye={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"],y=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=A(()=>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=A(()=>{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=A(()=>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 v=[],{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&&!y.value.has(t)));for(const t of e)try{await d.fetchButtons(t),await d.fetchLatestRunsForProject(t),y.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&&!y.value.has(e.projectId)&&(d.fetchButtons(e.projectId),y.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(),v.push(P(H)),v.push(B(G)),v.push(L(W)),v.push(V(Y));const{on:e,off:t}=j();$(e,t,v),N=setInterval(()=>{s.fetchActiveSessions(!1)},3e4)}),ee(()=>{v.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(C,null,D(["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",ve,[(a(),l(C,null,D(3,n=>f("div",{key:n,class:"skeleton card",style:{height:"120px"}})),64))])):S(s).error?(a(),l("div",ye,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(C,null,D(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:
|
|
1
|
+
import{p as q,_ as O,a as r,c as i,b as t,F as k,r as $,t as f,i as _,J as A,z as p,g as W,f as F,x as z,w as J,o as G,G as H,d as w,u as m,n as B}from"./index-C2QFVD7d.js";import{a as L}from"./ApiClient-DfbJwzpz.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"},Bt=["title"],Mt={__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:J(()=>[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,Bt)]))),128))])])])}}},It=O(Mt,[["__scopeId","data-v-20d5856a"]]),Nt={class:"agent-logs"},Et={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"],Jt=["disabled"],Gt={key:0,class:"page-ellipsis"},Ht=["onClick"],Ut=["disabled"],Zt=["disabled"],Qt={__name:"AgentLogsView",setup(s){const e=U(),y=B(!1),h=B(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),M=p(()=>Object.values(e.filters).some(g=>g!=null)),I=p(()=>v.value.total===0?0:v.value.offset+1),N=p(()=>Math.min(v.value.offset+P.value,v.value.total)),E=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 G(()=>{e.fetchLogs(),e.fetchFilterOptions()}),H(()=>{h.value&&clearTimeout(h.value)}),(g,c)=>(r(),i("div",Nt,[w(vt,{filters:a.value,"filter-options":n.value,"has-active-filters":M.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",Et,[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(N.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,Jt),(r(!0),i(k,null,$(E.value,u=>(r(),i(k,{key:u},[u==="..."?(r(),i("span",Gt,"…")):(r(),i("button",{key:1,class:A(["page-btn",{"page-btn-active":u===l.value}]),onClick:T=>m(e).setPage(u)},f(u),11,Ht))],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 j(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 S(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),S(s,n,["name","mode","model","providerId","effortLevel","gitBranch","gitMode","templateId","parentSessionId"]),k(s,n,["thinkingEnabled","startImmediately","autoRescheduleEnabled","rescheduleOnTokenLimit","rescheduleOnServiceError"]),S(s,n,["scheduledAt","rescheduleDelayMinutes","maxRescheduleCount","maxTotalTokens","rescheduleAtTokenCount"]);for(const t of e)s.append("files",t);return s}function A(n){return typeof n.scheduledAt=="number"||n.scheduledAt instanceof Date?{...n,scheduledAt:new Date(n.scheduledAt).toISOString()}:n}function w(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}=A(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 T(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 R(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 D(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}/circus-commands`)},async createCommandButton(e,s){return this._post(`/projects/${e}/circus-commands`,s)},async getCommandButton(e,s){return this._get(`/projects/${e}/circus-commands/${s}`)},async updateCommandButton(e,s,t){return this._patch(`/projects/${e}/circus-commands/${s}`,t)},async deleteCommandButton(e,s){return this._delete(`/projects/${e}/circus-commands/${s}`)},async runCommandButton(e,s){return this._post(`/sessions/${e}/circus-commands/${s}/run`)},async getActiveRuns(e){return this._get(`/sessions/${e}/circus-commands/runs`)},async getCommandRun(e,s){return this._get(`/sessions/${e}/circus-commands/runs/${s}`)},async getLatestRunsForProject(e){return this._get(`/projects/${e}/circus-commands/latest-runs`)},async killCommandRun(e,s){return this._post(`/sessions/${e}/circus-commands/runs/${s}/kill`)},async deleteCommandRun(e,s){return this._delete(`/sessions/${e}/circus-commands/runs/${s}`)},async deleteAllRunsForButton(e,s){return this._delete(`/sessions/${e}/circus-commands/${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 F(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 Q(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 B(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 L(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 M(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()};j(i);w(i);T(i);R(i);D(i);I(i);O(i);F(i);Q(i);B(i);L(i);M(i);const U=new i;export{U as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as B,k as U,l as I,o as O,G as A,a as r,c,b as e,t as p,F as j,r as q,J as z,m as L,y as D,i as h,s as N,j as R,z as k,n as g,x as G,f as E,T as J}from"./index-C2QFVD7d.js";import{u as K}from"./SessionLogStream-5NfVr9pF.js";const P={class:"modal-content",role:"dialog","aria-labelledby":"modal-title"},H={class:"modal-body"},Q={class:"moving-info"},W={class:"moving-session-name"},X={key:0,class:"empty-state"},Y={key:1,class:"lanes-list"},Z={class:"lane-label"},ee=["name","value","disabled","aria-disabled","aria-label"],ae={class:"lane-info"},ne={class:"lane-name"},oe={key:0,class:"lane-current-badge"},te={key:1,class:"lane-automation-icon",title:"Automation enabled"},se={key:2,class:"automation-option"},le={class:"checkbox-label"},ie={class:"modal-footer"},de=["disabled"],re=["disabled","aria-label"],ce=["disabled"],ue={__name:"MoveCardModal",props:{isOpen:Boolean,projectId:{type:String,required:!0},cardId:{type:String,required:!0},currentLaneId:{type:String,required:!0},sessionName:{type:String,default:""}},emits:["update:isOpen","close","moved"],setup(n,{emit:_}){const o=n,u=_,v=K(),f=U(),i=g(null),m=g(!0),b=g(!1),d=g(!1),s=k(()=>{var a;return((a=v.board)==null?void 0:a.lanes)||[]}),C=k(()=>o.sessionName?o.sessionName:o.cardId||"Unnamed session"),x=k(()=>i.value&&s.value.find(a=>a.id===i.value)||null),V=k(()=>x.value?w(x.value):!1),S=k(()=>i.value&&i.value!==o.currentLaneId);function w(a){return a?!!(a.onEnterTemplateId||a.onEnterPrompt):!1}function y(){u("update:isOpen",!1),u("close"),i.value=null,m.value=!0}async function F(){if(!(!S.value||!o.cardId)){b.value=!0;try{await v.moveCard(o.projectId,o.cardId,i.value,{runOnEnterTemplate:m.value}),f.success("Card moved successfully"),u("moved"),y()}catch(a){console.error("Failed to move card:",a),f.error(a.message||"Failed to move card")}finally{b.value=!1}}}async function T(){if(confirm("Remove this session from the board?")){d.value=!0;try{await v.removeCard(o.projectId,o.cardId),f.success("Session removed from board"),u("close")}catch(a){console.error("Failed to remove card:",a),f.error(a.message||"Failed to remove session")}finally{d.value=!1}}}I(i,(a,t)=>{if(a!==t){const l=s.value.find(M=>M.id===a);m.value=w(l)}}),I(()=>o.isOpen,a=>{a&&(i.value=null,m.value=!0)});function $(a){a.key==="Escape"&&o.isOpen&&y()}return O(()=>{document.addEventListener("keydown",$)}),A(()=>{document.removeEventListener("keydown",$)}),(a,t)=>n.isOpen?(r(),c("div",{key:0,class:"modal-backdrop",onClick:R(y,["self"])},[e("div",P,[e("div",{class:"modal-header"},[t[2]||(t[2]=e("h2",{id:"modal-title",class:"modal-title"}," Move to Lane ",-1)),e("button",{class:"close-btn","aria-label":"Close modal",onClick:y}," × ")]),e("div",H,[e("div",Q,[t[3]||(t[3]=e("span",{class:"moving-label"},"Moving:",-1)),e("span",W,p(C.value),1)]),s.value.length===0?(r(),c("div",X,[...t[4]||(t[4]=[e("p",null,"No lanes available",-1)])])):(r(),c("div",Y,[(r(!0),c(j,null,q(s.value,l=>(r(),c("div",{key:l.id,class:z(["lane-row",{"lane-row-current":l.id===n.currentLaneId,"lane-row-disabled":l.id===n.currentLaneId}])},[e("label",Z,[L(e("input",{"onUpdate:modelValue":t[0]||(t[0]=M=>i.value=M),type:"radio",name:`lane-${n.cardId}`,value:l.id,disabled:l.id===n.currentLaneId,"aria-disabled":l.id===n.currentLaneId,"aria-label":`Move to ${l.name}`},null,8,ee),[[D,i.value]]),e("span",ae,[e("span",ne,p(l.name),1),l.id===n.currentLaneId?(r(),c("span",oe,"(current)")):h("",!0),w(l)?(r(),c("span",te,[...t[5]||(t[5]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",fill:"currentColor"},[e("path",{d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1)])])):h("",!0)])])],2))),128))])),V.value?(r(),c("div",se,[e("label",le,[L(e("input",{"onUpdate:modelValue":t[1]||(t[1]=l=>m.value=l),type:"checkbox","aria-label":"Run automation on entry"},null,512),[[N,m.value]]),t[6]||(t[6]=e("span",null,"Run automation on entry",-1))])])):h("",!0)]),e("div",ie,[e("button",{class:"btn btn-secondary",disabled:d.value,onClick:y}," Cancel ",8,de),e("button",{class:"btn btn-danger",disabled:d.value,"aria-label":`Remove ${C.value} from board`,onClick:T},p(d.value?"Removing...":"Remove from Board"),9,re),e("button",{class:"btn btn-primary",disabled:!S.value||b.value||d.value,"aria-label":"Move card to selected lane",onClick:F},p(b.value?"Moving...":"Move"),9,ce)])])])):h("",!0)}},Ie=B(ue,[["__scopeId","data-v-bddc7788"]]),ve={class:"modal-content",role:"dialog","aria-labelledby":"archive-modal-title"},me={class:"modal-header"},be=["disabled"],fe={class:"modal-body"},pe={class:"confirm-message"},he={key:0,class:"cleanup-option"},ye={class:"checkbox-label"},ke={class:"modal-footer"},ge=["disabled"],Ce=["disabled"],_e={__name:"ArchiveConfirmModal",props:{isOpen:{type:Boolean,default:!1},sessionName:{type:String,default:"this session"},hasCleanupScript:{type:Boolean,default:!1},loading:{type:Boolean,default:!1}},emits:["confirm","cancel"],setup(n,{emit:_}){const o=n,u=_,v=g(!0);I(()=>o.isOpen,d=>{d&&(v.value=!0)});function f(){u("confirm",v.value)}function i(){o.loading||u("cancel")}function m(){o.loading||u("cancel")}function b(d){d.key==="Escape"&&o.isOpen&&!o.loading&&u("cancel")}return O(()=>{document.addEventListener("keydown",b)}),A(()=>{document.removeEventListener("keydown",b)}),(d,s)=>(r(),G(J,{to:"body"},[n.isOpen?(r(),c("div",{key:0,class:"modal-backdrop",onClick:R(m,["self"])},[e("div",ve,[e("div",me,[s[1]||(s[1]=e("h2",{id:"archive-modal-title",class:"modal-title"}," Archive Session ",-1)),e("button",{class:"close-btn","aria-label":"Close modal",disabled:n.loading,onClick:i}," × ",8,be)]),e("div",fe,[e("p",pe,[s[2]||(s[2]=E(" Are you sure you want to archive ",-1)),e("strong",null,p(n.sessionName),1),s[3]||(s[3]=E("? ",-1))]),n.hasCleanupScript?(r(),c("div",he,[e("label",ye,[L(e("input",{"onUpdate:modelValue":s[0]||(s[0]=C=>v.value=C),type:"checkbox","aria-label":"Run git worktree cleanup"},null,512),[[N,v.value]]),s[4]||(s[4]=e("span",null,"Run git worktree cleanup",-1))])])):h("",!0)]),e("div",ke,[e("button",{class:"btn btn-secondary",disabled:n.loading,onClick:i}," Cancel ",8,ge),e("button",{class:"btn btn-primary",disabled:n.loading,onClick:f},p(n.loading?"Archiving...":"Archive"),9,Ce)])])])):h("",!0)]))}},Le=B(_e,[["__scopeId","data-v-140e797f"]]);export{Le as A,Ie as M};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.modal-backdrop[data-v-bddc7788]{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:1000}.modal-content[data-v-bddc7788]{background:var(--color-background-secondary, #1f2937);border-radius:.5rem;width:100%;max-width:500px;max-height:90vh;overflow:hidden;display:flex;flex-direction:column;border:1px solid var(--color-border)}.modal-header[data-v-bddc7788]{display:flex;justify-content:space-between;align-items:center;padding:1rem 1.5rem;border-bottom:1px solid var(--color-border)}.modal-title[data-v-bddc7788]{margin:0;font-size:1.25rem;font-weight:600;color:var(--color-text)}.close-btn[data-v-bddc7788]{background:none;border:none;font-size:1.5rem;color:var(--color-text-soft);cursor:pointer;padding:0;line-height:1}.close-btn[data-v-bddc7788]:hover{color:var(--color-text)}.modal-body[data-v-bddc7788]{padding:1.5rem;flex:1;overflow-y:auto}.modal-footer[data-v-bddc7788]{display:flex;justify-content:flex-end;gap:.75rem;padding:1rem 1.5rem;border-top:1px solid var(--color-border)}.moving-info[data-v-bddc7788]{margin-bottom:1.5rem;padding:.75rem;background:var(--color-bg-soft, rgba(255, 255, 255, .05));border-radius:.25rem}.moving-label[data-v-bddc7788]{display:block;font-size:.75rem;color:var(--color-text-soft);margin-bottom:.25rem}.moving-session-name[data-v-bddc7788]{display:block;font-size:.875rem;font-weight:500;color:var(--color-text)}.empty-state[data-v-bddc7788]{display:flex;align-items:center;justify-content:center;padding:2rem;color:var(--color-text-soft)}.lanes-list[data-v-bddc7788]{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1rem}.lane-row[data-v-bddc7788]{border:1px solid var(--color-border);border-radius:.25rem;transition:background-color .15s,border-color .15s}.lane-row[data-v-bddc7788]:not(.lane-row-disabled):hover{background:var(--color-bg-soft);border-color:var(--color-primary)}.lane-row-current[data-v-bddc7788]{opacity:.6}.lane-label[data-v-bddc7788]{display:flex;align-items:center;padding:.75rem;cursor:pointer;gap:.75rem;width:100%}.lane-label input[type=radio][data-v-bddc7788]{flex-shrink:0;width:1rem;height:1rem;cursor:pointer}.lane-label input[type=radio][data-v-bddc7788]:disabled{cursor:not-allowed}.lane-info[data-v-bddc7788]{display:flex;align-items:center;gap:.5rem;flex:1}.lane-name[data-v-bddc7788]{font-size:.875rem;font-weight:500;color:var(--color-text)}.lane-current-badge[data-v-bddc7788]{font-size:.75rem;color:var(--color-text-soft);font-style:italic}.lane-automation-icon[data-v-bddc7788]{color:#f59e0b;flex-shrink:0;display:flex;align-items:center}.automation-option[data-v-bddc7788]{margin-top:1rem;padding-top:1rem;border-top:1px solid var(--color-border)}.checkbox-label[data-v-bddc7788]{display:flex;align-items:center;gap:.5rem;cursor:pointer;font-size:.875rem;color:var(--color-text)}.checkbox-label input[type=checkbox][data-v-bddc7788]{width:1rem;height:1rem;cursor:pointer}.btn[data-v-bddc7788]{padding:.5rem 1rem;border-radius:.25rem;font-weight:500;cursor:pointer;border:none;font-size:.9rem;transition:opacity .2s,background-color .2s}.btn-primary[data-v-bddc7788]{background:var(--color-primary);color:#fff}.btn-primary[data-v-bddc7788]:hover:not(:disabled){opacity:.9}.btn-primary[data-v-bddc7788]:disabled{opacity:.5;cursor:not-allowed}.btn-secondary[data-v-bddc7788]{background:var(--color-background);border:1px solid var(--color-border);color:var(--color-text)}.btn-secondary[data-v-bddc7788]:hover{background:var(--color-background-secondary)}.btn-danger[data-v-bddc7788]{background:#ef4444;color:#fff}.btn-danger[data-v-bddc7788]:hover:not(:disabled){background:#dc2626}.btn-danger[data-v-bddc7788]:disabled{opacity:.5;cursor:not-allowed}.modal-backdrop[data-v-140e797f]{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:1000}.modal-content[data-v-140e797f]{background:var(--color-background-secondary, #1f2937);border-radius:.5rem;width:100%;max-width:450px;overflow:hidden;display:flex;flex-direction:column;border:1px solid var(--color-border)}.modal-header[data-v-140e797f]{display:flex;justify-content:space-between;align-items:center;padding:1rem 1.5rem;border-bottom:1px solid var(--color-border)}.modal-title[data-v-140e797f]{margin:0;font-size:1.25rem;font-weight:600;color:var(--color-text)}.close-btn[data-v-140e797f]{background:none;border:none;font-size:1.5rem;color:var(--color-text-soft);cursor:pointer;padding:0;line-height:1}.close-btn[data-v-140e797f]:hover{color:var(--color-text)}.modal-body[data-v-140e797f]{padding:1.5rem}.confirm-message[data-v-140e797f]{margin:0;font-size:.9rem;color:var(--color-text);line-height:1.5}.cleanup-option[data-v-140e797f]{margin-top:1rem;padding-top:1rem;border-top:1px solid var(--color-border)}.checkbox-label[data-v-140e797f]{display:flex;align-items:center;gap:.5rem;cursor:pointer;font-size:.875rem;color:var(--color-text)}.checkbox-label input[type=checkbox][data-v-140e797f]{width:1rem;height:1rem;cursor:pointer}.modal-footer[data-v-140e797f]{display:flex;justify-content:flex-end;gap:.75rem;padding:1rem 1.5rem;border-top:1px solid var(--color-border)}.btn[data-v-140e797f]{padding:.5rem 1rem;border-radius:.25rem;font-weight:500;cursor:pointer;border:none;font-size:.9rem;transition:opacity .2s,background-color .2s}.btn-primary[data-v-140e797f]{background:var(--color-primary);color:#fff}.btn-primary[data-v-140e797f]:hover{opacity:.9}.btn-secondary[data-v-140e797f]{background:var(--color-background);border:1px solid var(--color-border);color:var(--color-text)}.btn-secondary[data-v-140e797f]:hover{background:var(--color-background-secondary)}.btn[data-v-140e797f]:disabled{opacity:.5;cursor:not-allowed}.close-btn[data-v-140e797f]:disabled{opacity:.5;cursor:not-allowed}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as N,k as U,o as V,a as r,c as u,b as s,f as _,d as j,w as P,u as I,t as i,m as k,v as B,i as v,s as J,j as h,z as M,B as $,n as m,g as A,h as q}from"./index-C2QFVD7d.js";import{u as F}from"./commandButtons-CoU3G4zK.js";import{a as z}from"./ApiClient-DfbJwzpz.js";const p={PROJECT_ID:"projectId",PROJECT_ID_ALT:"id",BUTTON_ID:"buttonId",SESSION_ID:"id",SESSION_TAB:"tab"},W={class:"container command-button-detail"},G={key:0,class:"loading-state"},H={key:1,class:"form-container"},K={class:"form-header"},Q={class:"form-group"},X={key:0,class:"form-error"},Y={class:"form-group"},Z={key:0,class:"form-error"},ee={class:"form-group"},se={key:0,class:"form-error"},te={class:"form-group form-group-checkbox"},oe={for:"showOnList",class:"checkbox-label"},ae={class:"form-actions"},le=["disabled"],ne={key:0,class:"form-error-message"},re={class:"modal-body"},ue={class:"modal-footer"},de=["disabled"],ie={__name:"CommandButtonDetailView",setup(me){const d=$(),w=q(),y=F(),b=U(),D=m(!1),O=m(!1),g=m(!1),f=m(!1),c=m(null),a=m({}),t=m({label:"",command:"",sortOrder:0,showOnList:!1}),C=M(()=>!!d.params.buttonId),S=async o=>{D.value=!0;try{const e=d.params[p.PROJECT_ID];let l=y.getButtonById(o);l||(l=await z.getCommandButton(e,o)),l&&(t.value={label:l.label,command:l.command,sortOrder:l.sortOrder||0,showOnList:l.showOnList||!1})}catch(e){c.value=`Failed to load button: ${e.message}`}finally{D.value=!1}},T=()=>(a.value={},t.value.label.trim()||(a.value.label="Label is required"),t.value.command.trim()||(a.value.command="Command is required"),t.value.sortOrder<0&&(a.value.sortOrder="Sort order must be 0 or greater"),Object.keys(a.value).length===0),L=async()=>{if(c.value=null,!!T()){O.value=!0;try{const o=d.params[p.PROJECT_ID],e={label:t.value.label,command:t.value.command,sortOrder:t.value.sortOrder,showOnList:t.value.showOnList};C.value?(await y.updateButton(o,d.params[p.BUTTON_ID],e),b.success("Circus Command updated")):(await y.createButton(o,e),b.success("Circus Command created")),w.push(`/projects/${o}/sessions`)}catch(o){c.value=o.message,b.error(o.message)}finally{O.value=!1}}},x=()=>{w.back()},E=()=>{f.value=!0},R=async()=>{g.value=!0;try{const o=d.params[p.PROJECT_ID],e=d.params[p.BUTTON_ID];await y.deleteButton(o,e),b.success("Circus Command deleted"),f.value=!1,w.push(`/projects/${o}/sessions`)}catch(o){c.value=o.message,b.error(o.message)}finally{g.value=!1}};return V(async()=>{C.value&&await S(d.params.buttonId)}),(o,e)=>{const l=A("router-link");return r(),u("div",W,[D.value?(r(),u("div",G,[...e[7]||(e[7]=[s("span",{class:"loading-spinner"},null,-1),_(" Loading... ",-1)])])):(r(),u("div",H,[s("div",K,[j(l,{to:`/projects/${I(d).params[I(p).PROJECT_ID]}/sessions`,class:"btn btn-outline-secondary"},{default:P(()=>[...e[8]||(e[8]=[_(" ← Back ",-1)])]),_:1},8,["to"]),s("h2",null,i(C.value?"Edit Circus Command":"New Circus Command"),1)]),s("form",{class:"command-button-form",onSubmit:h(L,["prevent"])},[s("div",Q,[e[9]||(e[9]=s("label",{for:"label"},"Label",-1)),k(s("input",{id:"label","onUpdate:modelValue":e[0]||(e[0]=n=>t.value.label=n),type:"text",class:"form-input",placeholder:"e.g., Run Tests",required:""},null,512),[[B,t.value.label]]),a.value.label?(r(),u("span",X,i(a.value.label),1)):v("",!0)]),s("div",Y,[e[10]||(e[10]=s("label",{for:"command"},"Command",-1)),k(s("textarea",{id:"command","onUpdate:modelValue":e[1]||(e[1]=n=>t.value.command=n),class:"form-input",placeholder:"e.g., npm test",rows:"4",required:""},null,512),[[B,t.value.command]]),a.value.command?(r(),u("span",Z,i(a.value.command),1)):v("",!0)]),s("div",ee,[e[11]||(e[11]=s("label",{for:"sortOrder"},"Sort Order (optional)",-1)),k(s("input",{id:"sortOrder","onUpdate:modelValue":e[2]||(e[2]=n=>t.value.sortOrder=n),type:"number",class:"form-input",placeholder:"0",min:"0"},null,512),[[B,t.value.sortOrder,void 0,{number:!0}]]),a.value.sortOrder?(r(),u("span",se,i(a.value.sortOrder),1)):v("",!0),e[12]||(e[12]=s("span",{class:"form-help"},"Buttons are displayed in ascending order. Leave as 0 for default.",-1))]),s("div",te,[s("label",oe,[k(s("input",{id:"showOnList","onUpdate:modelValue":e[3]||(e[3]=n=>t.value.showOnList=n),type:"checkbox",class:"form-checkbox"},null,512),[[J,t.value.showOnList]]),e[13]||(e[13]=s("span",null,"Show status indicator on session lists",-1))]),e[14]||(e[14]=s("span",{class:"form-help"},"When enabled, the button status will be displayed on session cards",-1))]),s("div",ae,[s("button",{type:"button",class:"btn btn-outline-secondary",onClick:x}," Cancel "),C.value?(r(),u("button",{key:0,type:"button",class:"btn btn-outline-danger",onClick:E}," Delete ")):v("",!0),s("button",{type:"submit",class:"btn btn-primary",disabled:O.value},i(O.value?"Saving...":C.value?"Update":"Create"),9,le)]),c.value?(r(),u("div",ne,i(c.value),1)):v("",!0)],32)])),f.value?(r(),u("div",{key:2,class:"modal-overlay",onClick:e[6]||(e[6]=n=>f.value=!1)},[s("div",{class:"modal-dialog",onClick:e[5]||(e[5]=h(()=>{},["stop"]))},[e[18]||(e[18]=s("div",{class:"modal-header"},[s("h4",null,"Delete Circus Command")],-1)),s("div",re,[s("p",null,[e[15]||(e[15]=_('Are you sure you want to delete "',-1)),s("strong",null,i(t.value.label),1),e[16]||(e[16]=_('"?',-1))]),e[17]||(e[17]=s("p",null,"This action cannot be undone.",-1))]),s("div",ue,[s("button",{class:"btn btn-outline-secondary",onClick:e[4]||(e[4]=n=>f.value=!1)}," Cancel "),s("button",{class:"btn btn-danger",disabled:g.value,onClick:R},i(g.value?"Deleting...":"Delete"),9,de)])])])):v("",!0)])}}},be=N(ie,[["__scopeId","data-v-471675f8"]]);export{be as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.command-button-detail[data-v-471675f8]{max-width:600px;margin:0 auto;padding:2rem 0}.loading-state[data-v-471675f8]{display:flex;align-items:center;justify-content:center;gap:.75rem;padding:3rem;color:var(--color-text-soft)}.form-container[data-v-471675f8]{display:flex;flex-direction:column;gap:2rem}.form-header[data-v-471675f8]{display:flex;align-items:center;gap:1rem}.form-header h2[data-v-471675f8]{margin:0;color:var(--color-text);flex:1}.command-button-form[data-v-471675f8]{display:flex;flex-direction:column;gap:1.5rem;background-color:var(--color-background-soft);border:1px solid var(--color-border);border-radius:var(--border-radius);padding:2rem}.form-group[data-v-471675f8]{display:flex;flex-direction:column;gap:.5rem}.form-group label[data-v-471675f8]{font-weight:500;color:var(--color-text);font-size:.95rem}.form-input[data-v-471675f8]{padding:.75rem;background-color:var(--color-background);border:1px solid var(--color-border);border-radius:var(--border-radius);color:var(--color-text);font-family:inherit;font-size:.95rem;transition:border-color .2s}.form-input[data-v-471675f8]:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 3px #58a6ff1a}.form-input[data-v-471675f8]::placeholder{color:var(--color-text-soft)}textarea.form-input[data-v-471675f8]{font-family:var(--font-mono);font-size:.85rem;resize:vertical;min-height:100px}.form-help[data-v-471675f8]{font-size:.85rem;color:var(--color-text-soft)}.form-error[data-v-471675f8]{font-size:.85rem;color:var(--color-error)}.form-group-checkbox[data-v-471675f8]{gap:.25rem}.checkbox-label[data-v-471675f8]{display:flex;align-items:center;gap:.5rem;font-weight:500;color:var(--color-text);font-size:.95rem;cursor:pointer;-webkit-user-select:none;user-select:none}.form-checkbox[data-v-471675f8]{width:18px;height:18px;cursor:pointer;accent-color:var(--color-primary)}.form-error-message[data-v-471675f8]{padding:.75rem;background-color:#f851491a;border:1px solid var(--color-error);border-radius:var(--border-radius);color:var(--color-error);font-size:.9rem}.form-actions[data-v-471675f8]{display:flex;gap:.75rem;justify-content:flex-end;margin-top:1rem}.form-actions button[data-v-471675f8]:disabled{opacity:.6;cursor:not-allowed}.modal-overlay[data-v-471675f8]{position:fixed;top:0;left:0;right:0;bottom:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.modal-dialog[data-v-471675f8]{background-color:var(--color-background-soft);border:1px solid var(--color-border);border-radius:var(--border-radius);max-width:400px;width:90%;overflow:hidden}.modal-header[data-v-471675f8]{padding:1rem;border-bottom:1px solid var(--color-border)}.modal-header h4[data-v-471675f8]{margin:0;color:var(--color-text)}.modal-body[data-v-471675f8]{padding:1.5rem 1rem;color:var(--color-text-soft)}.modal-body p[data-v-471675f8]{margin:.5rem 0}.modal-footer[data-v-471675f8]{padding:1rem;border-top:1px solid var(--color-border);display:flex;gap:.5rem;justify-content:flex-end}@media (max-width: 640px){.command-button-detail[data-v-471675f8]{padding:1rem}.form-header[data-v-471675f8]{flex-direction:column;align-items:flex-start}.command-button-form[data-v-471675f8]{padding:1.5rem 1rem}.form-actions[data-v-471675f8]{flex-direction:column-reverse}.form-actions button[data-v-471675f8]{width:100%}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{p as f,a6 as g,_ as b,k as E,n as h,l as _,a as p,c as m,b as j,F as I,r as w,t as x,u as k,z as C,U as L}from"./index-C2QFVD7d.js";import{a as r}from"./ApiClient-DfbJwzpz.js";import{u as O}from"./sessions-Nq5VafSf.js";const P=["low","medium","high","max","auto"],H=[{id:"claude-haiku-4-5-20251001",name:"Haiku 4.5",description:"Fast & lightweight"},{id:"claude-sonnet-4-6",name:"Sonnet 4.6",description:"Balanced"},{id:"claude-opus-4-6",name:"Opus 4.6",description:"Previous generation"},{id:"claude-opus-4-7",name:"Opus 4.7",description:"Most capable (default)"}],K="claude-opus-4-7",Q=[{id:"gpt-5.5",name:"GPT-5.5",description:"Flagship coding and professional work",seedId:"openai-gpt-5-5"},{id:"gpt-5.4",name:"GPT-5.4",description:"High capability professional work",seedId:"openai-gpt-5-4"},{id:"gpt-5.4-mini",name:"GPT-5.4 mini",description:"Fast lower-cost coding and subagent work",seedId:"openai-gpt-5-4-mini"},{id:"gpt-5.3-codex",name:"GPT-5.3-Codex",description:"Coding-optimized agentic model",seedId:"openai-gpt-5-3-codex"}],Y=f("templates",{state:()=>({projectTemplates:[],globalTemplates:[],currentProjectId:null,loading:!1,error:null}),getters:{allTemplates:t=>[...t.projectTemplates,...t.globalTemplates],getTemplateById:t=>e=>t.projectTemplates.find(s=>s.id===e)||t.globalTemplates.find(s=>s.id===e),quickResponseTemplates:t=>{const e=s=>s.filter(l=>l.showInQuickResponses).slice().sort((l,o)=>(l.quickResponseSortOrder??0)-(o.quickResponseSortOrder??0)||(l.createdAt??0)-(o.createdAt??0)||l.name.localeCompare(o.name));return{project:e(t.projectTemplates),global:e(t.globalTemplates)}},hasQuickResponseTemplates(){return this.quickResponseTemplates.project.length>0||this.quickResponseTemplates.global.length>0}},actions:{async fetchProjectTemplates(t){this.loading=!0,this.error=null;try{const e=await r.getProjectTemplates(t);this.projectTemplates=e.project||[],this.globalTemplates=e.global||[],this.currentProjectId=t}catch(e){this.error=e.message}finally{this.loading=!1}},async createProjectTemplate(t,e){this.loading=!0,this.error=null;try{const s=await r.createProjectTemplate(t,e);return this.projectTemplates.unshift(s),s}catch(s){throw this.error=s.message,s}finally{this.loading=!1}},async createGlobalTemplate(t){this.loading=!0,this.error=null;try{const e=await r.createGlobalTemplate(t);return this.globalTemplates.unshift(e),e}catch(e){throw this.error=e.message,e}finally{this.loading=!1}},async updateTemplate(t,e){this.loading=!0,this.error=null;try{const s=await r.updateTemplate(t,e);let l=this.projectTemplates.findIndex(o=>o.id===t);return l!==-1?this.projectTemplates[l]=s:(l=this.globalTemplates.findIndex(o=>o.id===t),l!==-1&&(this.globalTemplates[l]=s)),s}catch(s){throw this.error=s.message,s}finally{this.loading=!1}},async deleteTemplate(t){this.loading=!0,this.error=null;try{await r.deleteTemplate(t),this.projectTemplates=this.projectTemplates.filter(e=>e.id!==t),this.globalTemplates=this.globalTemplates.filter(e=>e.id!==t)}catch(e){throw this.error=e.message,e}finally{this.loading=!1}}}}),R=f("todos",{state:()=>({items:[],loading:!1,error:null,expanded:!1,currentConversationId:null}),getters:{hasTodos:t=>t.items.length>0,pendingCount:t=>t.items.filter(e=>e.status==="pending").length,inProgressCount:t=>t.items.filter(e=>e.status==="in_progress").length,completedCount:t=>t.items.filter(e=>e.status==="completed").length},actions:{async fetchTodos(t,e=null){this.loading=!0,this.error=null,this.currentConversationId=e;try{this.items=await r.getSessionTodos(t,e)}catch(s){this.error=s.message}finally{this.loading=!1}},updateTodos(t,e=null){(e===null||this.currentConversationId===null||e===this.currentConversationId)&&(this.items=t)},clearTodos(){this.items=[],this.loading=!1,this.error=null,this.currentConversationId=null,this.expanded=!1},toggleExpanded(){this.expanded=!this.expanded},setExpanded(t){this.expanded=t}}}),F=Symbol("overlay-sessions-store"),D=Symbol("overlay-todos-store");function V(){return g(F,O())}function $(){return g(D,R())}const A={class:"effort-selector"},B=["value","disabled"],G=["value"],q={__name:"EffortLevelSelector",props:{sessionId:{type:String,default:null},modelValue:{type:String,default:null},disabled:{type:Boolean,default:!1}},emits:["update:modelValue"],setup(t,{emit:e}){const s=t,l=e,o=V(),T=E(),d=h(!1),S=["auto",...P.filter(a=>a!=="auto")].map(a=>({value:a,label:`${a.charAt(0).toUpperCase()+a.slice(1)} Effort`})),u=C(()=>{var a;return s.sessionId?((a=o.currentSession)==null?void 0:a.effortLevel)||"auto":s.modelValue||"auto"}),n=h(u.value),y=L(s,"modelValue");_([u,y],([a])=>{n.value=a||"auto"},{flush:"sync"});async function v(a){if(!d.value&&n.value!==a)if(n.value=a,s.sessionId){d.value=!0;try{await o.updateSessionFields(s.sessionId,{effortLevel:a==="auto"?null:a})}catch(c){n.value=u.value,T.error(c.message)}finally{d.value=!1}}else l("update:modelValue",a==="auto"?null:a)}return(a,c)=>(p(),m("div",A,[j("select",{id:"effort-select",value:n.value,disabled:t.disabled||d.value,class:"effort-select","aria-label":"Effort level",onChange:c[0]||(c[0]=i=>v(i.target.value))},[(p(!0),m(I,null,w(k(S),i=>(p(),m("option",{key:i.value,value:i.value},x(i.label),9,G))),128))],40,B)]))}},J=b(q,[["__scopeId","data-v-8bc1fe64"]]);export{H as C,K as D,J as E,Q as O,F as S,D as T,R as a,V as b,$ as c,Y as u};
|
package/packages/web/dist/assets/{GeneralSettingsView-DsHChEhv.js → GeneralSettingsView-sPXkLlLy.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as m,k as _,o as b,l as y,u as S,a as i,c as r,b as s,f as c,m as h,
|
|
1
|
+
import{_ as m,k as _,o as b,l as y,u as S,a as i,c as r,b as s,f as c,m as h,s as k,t as d,i as p,j as x,n as u}from"./index-C2QFVD7d.js";import{u as w}from"./settings-DtpuiyT6.js";import"./ApiClient-DfbJwzpz.js";const V={key:0,class:"loading-state"},G={class:"form-group"},A={class:"checkbox-label"},B={key:0,class:"error-message"},C={class:"form-actions"},D=["disabled"],M={key:0,class:"loading-spinner"},N={__name:"GeneralSettingsView",setup(U){const n=w(),v=_(),l=u(!1),a=u(!1),o=u(null);b(()=>{n.fetchGeneralSettings()}),y(()=>n.generalSettings,t=>{t&&(l.value=t.disableAnalytics)},{immediate:!0});async function f(){a.value=!0,o.value=null;try{await n.updateGeneralSettings({disableAnalytics:l.value}),v.success("General settings saved successfully")}catch(t){o.value=t.message}finally{a.value=!1}}return(t,e)=>S(n).loading?(i(),r("div",V,[...e[1]||(e[1]=[s("span",{class:"loading-spinner"},null,-1),c(" Loading... ",-1)])])):(i(),r("form",{key:1,class:"form card",onSubmit:x(f,["prevent"])},[s("div",G,[s("label",A,[h(s("input",{"onUpdate:modelValue":e[0]||(e[0]=g=>l.value=g),type:"checkbox"},null,512),[[k,l.value]]),e[2]||(e[2]=c(" Disable analytics tracking ",-1))]),e[3]||(e[3]=s("p",{class:"form-help"}," When checked, no usage analytics will be collected. Changes take effect on next page load. ",-1))]),o.value?(i(),r("div",B,d(o.value),1)):p("",!0),s("div",C,[s("button",{type:"submit",class:"btn btn-primary",disabled:a.value},[a.value?(i(),r("span",M)):p("",!0),c(" "+d(a.value?"Saving...":"Save Settings"),1)],8,D)])],32))}},L=m(N,[["__scopeId","data-v-0cd79804"]]);export{L as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as N,n as l,l as $,a as s,c as o,b as t,m as D,v as j,j as F,t as h,f as w,i as f,F as k,r as S}from"./index-C2QFVD7d.js";import{a as T}from"./ApiClient-DfbJwzpz.js";const E={class:"path-chooser"},I={class:"path-input-group"},L={class:"path-browser"},M={class:"browser-header"},U={class:"browser-path"},q={class:"browser-content"},z={key:1,class:"browser-loading"},A={key:2,class:"browser-error"},G=["onClick"],H={key:0,class:"browser-empty"},J={key:1,class:"browser-empty"},K={__name:"PathChooser",props:{modelValue:{type:String,default:""}},emits:["update:modelValue"],setup(g,{emit:C}){const y=g,_=C,r=l(y.modelValue);$(()=>y.modelValue,a=>{a!==r.value&&(r.value=a)});function V(){_("update:modelValue",r.value)}const p=l(!1),i=l(""),c=l(null),d=l([]),b=l(!1),u=l(null);async function B(){p.value=!0,await m(r.value||"")}function v(){p.value=!1}async function m(a){b.value=!0,u.value=null;try{const e=await T.browseDirectory(a);i.value=e.path,c.value=e.parent,d.value=e.entries,e.error&&(u.value=e.error)}catch(e){u.value=e.message||"Failed to browse directory"}finally{b.value=!1}}function P(){r.value=i.value,_("update:modelValue",i.value),v()}function x(a,e){return a==="/"?`/${e}`:`${a}/${e}`}return(a,e)=>(s(),o("div",E,[t("div",I,[D(t("input",{"onUpdate:modelValue":e[0]||(e[0]=n=>r.value=n),type:"text",class:"form-input",placeholder:"/path/to/project",onInput:V},null,544),[[j,r.value]]),t("button",{type:"button",class:"btn",onClick:B}," Browse ")]),p.value?(s(),o("div",{key:0,class:"path-browser-overlay",onClick:F(v,["self"])},[t("div",L,[t("div",M,[t("span",U,h(i.value),1),t("button",{type:"button",class:"browser-close",onClick:v}," × ")]),t("div",q,[c.value?(s(),o("div",{key:0,class:"browser-item parent",onClick:e[1]||(e[1]=n=>m(c.value))},[...e[2]||(e[2]=[t("span",{class:"browser-item-icon"},"←",-1),w(" Parent Directory ",-1)])])):f("",!0),b.value?(s(),o("div",z,[...e[3]||(e[3]=[t("span",{class:"loading-spinner"},null,-1),w(" Loading... ",-1)])])):u.value?(s(),o("div",A,h(u.value),1)):(s(),o(k,{key:3},[(s(!0),o(k,null,S(d.value,n=>(s(),o("div",{key:n.name,class:"browser-item",onClick:O=>m(x(i.value,n.name))},[e[4]||(e[4]=t("span",{class:"browser-item-icon"},"📁",-1)),w(" "+h(n.name),1)],8,G))),128)),d.value.length===0&&!c.value?(s(),o("div",H," No subdirectories ")):d.value.length===0?(s(),o("div",J," No subdirectories in this folder ")):f("",!0)],64))]),t("div",{class:"browser-footer"},[t("button",{type:"button",class:"btn",onClick:v}," Cancel "),t("button",{type:"button",class:"btn btn-primary",onClick:P}," Select ")])])])):f("",!0)]))}},W=N(K,[["__scopeId","data-v-6bb30ba2"]]);export{W as P};
|
package/packages/web/dist/assets/{InputWithButton-cYdrEmTs.css → InputWithButton-D9HMvfR5.css}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
.path-chooser[data-v-
|
|
1
|
+
.path-chooser[data-v-6bb30ba2]{width:100%}.path-input-group[data-v-6bb30ba2]{display:flex;gap:.5rem}.path-input-group .form-input[data-v-6bb30ba2]{flex:1}.path-browser-overlay[data-v-6bb30ba2]{position:fixed;top:0;left:0;right:0;bottom:0;background-color:#000000b3;display:flex;align-items:center;justify-content:center;z-index:1000}.path-browser[data-v-6bb30ba2]{background-color:var(--color-background-soft);border:1px solid var(--color-border);border-radius:var(--border-radius);width:90%;max-width:600px;max-height:80vh;display:flex;flex-direction:column}.browser-header[data-v-6bb30ba2]{display:flex;justify-content:space-between;align-items:center;padding:1rem;border-bottom:1px solid var(--color-border);background-color:var(--color-background-mute);border-radius:var(--border-radius) var(--border-radius) 0 0}.browser-path[data-v-6bb30ba2]{font-family:var(--font-mono);font-size:.875rem;color:var(--color-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;margin-right:1rem}.browser-close[data-v-6bb30ba2]{background:none;border:none;color:var(--color-text-soft);font-size:1.5rem;line-height:1;padding:0;cursor:pointer;width:2rem;height:2rem;display:flex;align-items:center;justify-content:center;border-radius:var(--border-radius)}.browser-close[data-v-6bb30ba2]:hover{background-color:var(--color-background);color:var(--color-text)}.browser-content[data-v-6bb30ba2]{flex:1;overflow-y:auto;padding:.5rem;min-height:200px;max-height:400px}.browser-item[data-v-6bb30ba2]{display:flex;align-items:center;gap:.5rem;padding:.625rem .75rem;cursor:pointer;border-radius:var(--border-radius);color:var(--color-text);font-size:.875rem}.browser-item[data-v-6bb30ba2]:hover{background-color:var(--color-background-mute)}.browser-item.parent[data-v-6bb30ba2]{color:var(--color-primary);border-bottom:1px solid var(--color-border);margin-bottom:.5rem;border-radius:0}.browser-item.parent[data-v-6bb30ba2]:hover{background-color:var(--color-background)}.browser-item-icon[data-v-6bb30ba2]{flex-shrink:0}.browser-loading[data-v-6bb30ba2]{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:2rem;color:var(--color-text-soft)}.browser-error[data-v-6bb30ba2]{padding:1rem;color:var(--color-error);text-align:center}.browser-empty[data-v-6bb30ba2]{padding:2rem;color:var(--color-text-soft);text-align:center}.browser-footer[data-v-6bb30ba2]{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--color-border);background-color:var(--color-background-mute);border-radius:0 0 var(--border-radius) var(--border-radius)}@media (max-width: 480px){.path-input-group[data-v-6bb30ba2]{flex-direction:column}.path-input-group .btn[data-v-6bb30ba2]{width:100%}}.input-with-button{display:flex;gap:.5rem;align-items:stretch}.input-with-button .form-input{flex:1}.input-with-button .btn{flex-shrink:0}
|
package/packages/web/dist/assets/{InterpolationHelp-CIkOSkWX.js → InterpolationHelp-Dxn1li4l.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as t,a,c as n,f as e,b as o}from"./index-
|
|
1
|
+
import{_ as t,a,c as n,f as e,b as o}from"./index-C2QFVD7d.js";const r={class:"form-help"},l={__name:"InterpolationHelp",setup(c){return(p,s)=>(a(),n("p",r,[...s[0]||(s[0]=[e(" Available variables: ",-1),o("code",null,"{{rootSession.id}}",-1),e(", ",-1),o("code",null,"{{rootSession.name}}",-1),e(", ",-1),o("code",null,"{{rootSession.summary}}",-1),e(", ",-1),o("code",null,"{{rootSession.status}}",-1)])]))}},i=t(l,[["__scopeId","data-v-26718cef"]]);export{i as I};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-BjuRttEY.js","assets/index-C2QFVD7d.js","assets/index-uySCcnA_.css","assets/SessionDetailView-B59TEkr-.js","assets/sessions-Nq5VafSf.js","assets/ApiClient-DfbJwzpz.js","assets/projects-C-8PSxKi.js","assets/EffortLevelSelector-D2Hdzc_8.js","assets/EffortLevelSelector-BQaQmU2d.css","assets/SessionLogStream-5NfVr9pF.js","assets/commandButtons-CoU3G4zK.js","assets/SessionLogStream-zPUTiGbe.css","assets/SlashCommandWizard-BQ_rMzn-.js","assets/providers-oXifvvqN.js","assets/SlashCommandWizard-DJzw3LP5.css","assets/useSummaryHelpers-GVg7sMWF.js","assets/ModelSelector-72C7MUH4.js","assets/ModelSelector-BNYKujL-.css","assets/ArchiveConfirmModal-DXZYdzHR.js","assets/ArchiveConfirmModal-DeoCVGXt.css","assets/projectDefaults-B8esIcYq.js","assets/QuickResponsesPanel-BqmnTd-D.js","assets/QuickResponsesPanel-dk-Rj8xx.css","assets/ResizableTextarea-DpWdIAP6.js","assets/ResizableTextarea-BQNw5e0C.css","assets/SessionDetailView-CKVBnR4T.css","assets/style-BTin-zR_.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{n as E,l as u,G as T,a as l,c as y,x as k,w as d,b as m,f as x,d as V,u as h,ac as w,Q as b,R as p}from"./index-C2QFVD7d.js";import{u as A}from"./SessionDetailView-B59TEkr-.js";import"./sessions-Nq5VafSf.js";import"./ApiClient-DfbJwzpz.js";import"./projects-C-8PSxKi.js";import"./EffortLevelSelector-D2Hdzc_8.js";import"./SessionLogStream-5NfVr9pF.js";import"./commandButtons-CoU3G4zK.js";import"./SlashCommandWizard-BQ_rMzn-.js";import"./providers-oXifvvqN.js";import"./useSummaryHelpers-GVg7sMWF.js";import"./ModelSelector-72C7MUH4.js";import"./ArchiveConfirmModal-DXZYdzHR.js";import"./projectDefaults-B8esIcYq.js";import"./QuickResponsesPanel-BqmnTd-D.js";import"./ResizableTextarea-DpWdIAP6.js";const B={class:"canvas-md-editor"},H={__name:"MarkdownEditor",props:{content:{type:String,default:""},sessionId:{type:String,required:!0},filename:{type:String,required:!0},itemId:{type:String,required:!0}},emits:["save"],setup(c,{expose:f,emit:v}){const _=b(()=>p(()=>import("./index-BjuRttEY.js").then(e=>e.w),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25])).then(async e=>(await p(()=>Promise.resolve({}),__vite__mapDeps([26])),e.MdEditor))),r=c,n=v,g=A(),o=E(r.content||"");let t=null,a=r.content||"";u(o,e=>{e!==a&&(t&&clearTimeout(t),t=setTimeout(()=>{a=e,n("save",e)},1e3))});function s(){t&&(clearTimeout(t),t=null),o.value!==a&&n("save",o.value)}return f({flushPendingSave:s}),u(()=>r.content,e=>{e!==o.value&&(t&&(clearTimeout(t),t=null),a=e||"",o.value=e||"")}),T(()=>{s(),g.endEditing(r.filename)}),(e,i)=>(l(),y("div",B,[(l(),k(w,null,{default:d(()=>[V(h(_),{modelValue:o.value,"onUpdate:modelValue":i[0]||(i[0]=S=>o.value=S),theme:"dark",preview:!1,language:"en-US","no-upload-img":!0,"show-code-row-number":!0},null,8,["modelValue"])]),fallback:d(()=>[...i[1]||(i[1]=[m("div",{class:"editor-loading"},[m("span",{class:"loading-spinner"}),x(" Loading editor... ")],-1)])]),_:1}))]))}};export{H as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as G}from"./providers-oXifvvqN.js";import{_ as Q,o as W,n as b,l as M,a as p,c as I,b as X,t as k,i as Y,F as P,r as x,J as Z,z as i,U as $}from"./index-C2QFVD7d.js";const ee=["data-model","data-provider-id"],te=["value","disabled"],le={key:0,value:""},oe=["label","data-agent-type"],de=["value","data-provider-id","data-model-id","data-agent-type"],ne={__name:"ModelSelector",props:{modelValue:{type:String,default:null},disabled:{type:Boolean,default:!1},allowEmpty:{type:Boolean,default:!1},emptyLabel:{type:String,default:"Use system default"},selectClass:{type:String,default:""},providerId:{type:String,default:null},hideBuiltInDuplicates:{type:Boolean,default:!0}},emits:["update:modelValue","model-selected","update:providerId"],setup(y,{emit:E}){const n=y,c=E,a=G(),V=i(()=>a.providers.length>0&&a.providers.some(e=>e.models&&e.models.length>0)),F=i(()=>{const e=new Set;for(const t of h.value)if(t.models)for(const l of t.models)e.add(l.modelId);return e});function w(e){return e&&F.value.has(e)}function f(e){return(e==null?void 0:e.kind)==="openai"?"codex":"claude-code"}function L(e){return f(e)==="codex"?"Codex":"Claude Code"}const D=i(()=>{const e=[...a.providers];return e.sort((t,l)=>{const o=f(t),d=f(l);return o!==d?o==="claude-code"?-1:1:t.isBuiltIn!==l.isBuiltIn?t.isBuiltIn?-1:1:(t.name||"").localeCompare(l.name||"")}),e}),h=i(()=>{const e=new Set;for(const t of a.providers)if(!(t.isBuiltIn||!t.models))for(const l of t.models)e.add(l.modelId);return D.value.map(t=>!n.hideBuiltInDuplicates||!t.isBuiltIn?t:z(t,e)).filter(t=>{var l;return(l=t.models)==null?void 0:l.length})}),K=i(()=>{const e=new Map;for(const t of h.value)for(const l of t.models||[])e.set(l.modelId,(e.get(l.modelId)||0)+1);return new Set([...e.entries()].filter(([,t])=>t>1).map(([t])=>t))});function z(e,t){return{...e,models:(e.models||[]).filter(l=>!t.has(l.modelId))}}const v=i(()=>{var o;const e=a.providers.filter(d=>f(d)==="claude-code");if(e.length===0)return null;const l=e.find(d=>d.isBuiltIn)||e[0];if((o=l==null?void 0:l.models)!=null&&o.length){const d=l.models.find(m=>m.tier==="sonnet");return(d==null?void 0:d.modelId)||l.models[0].modelId}return null}),N=b(!1);W(async()=>{(a.providers.length===0||!V.value)&&await a.fetchProviders(),N.value=!0});function B(e){var l;if(!e)return null;if(e.includes("claude-"))return e;const t=a.providers.find(o=>o.isBuiltIn&&f(o)==="claude-code");if((l=t==null?void 0:t.models)!=null&&l.length){const o=t.models.find(d=>d.tier===e);if(o)return o.modelId}return e}const r=b(B(n.modelValue)),s=b(n.providerId),u=i(()=>n.allowEmpty&&(!r.value||r.value==="")?"":r.value&&w(r.value)?r.value:v.value?v.value:r.value),C=i(()=>{if(!u.value)return null;const e=g(u.value,n.providerId||s.value);return(e==null?void 0:e.provider.id)||null}),O=i(()=>{if(n.allowEmpty&&(!u.value||u.value==="")||!u.value)return"";const e=g(u.value,n.providerId||s.value);return e?_(e.provider.id,e.model.modelId):u.value}),R=$(n,"modelValue");M(R,e=>{r.value=B(e)},{flush:"sync"}),M($(n,"providerId"),e=>{s.value=e},{flush:"sync"}),M(()=>a.providers,T,{deep:!0,immediate:!0});function T(){if(!V.value)return;if(n.allowEmpty&&(!n.modelValue||n.modelValue==="")){r.value="";return}const e=n.modelValue?B(n.modelValue):null;if(e&&w(e)){H(e);return}U()}function H(e){var l;const t=((l=g(e,n.providerId))==null?void 0:l.provider.id)||null;if(r.value===e){s.value!==t&&(s.value=t,c("update:providerId",t));return}r.value=e,s.value=t,e!==n.modelValue&&c("update:modelValue",e),t!==n.providerId&&c("update:providerId",t)}function U(){var e;!v.value||r.value===v.value||(r.value=v.value,s.value=((e=g(v.value))==null?void 0:e.provider.id)||null,c("update:modelValue",v.value))}function J(e){const t=e.target.value,l=t?q(t):null,o=l?{modelId:l.modelId,providerId:l.providerId,kind:j(l.providerId)}:{modelId:"",providerId:null,kind:null},d=o.modelId;u.value===d&&C.value===o.providerId||(r.value=d,s.value=o.providerId,c("update:modelValue",d),c("update:providerId",o.providerId),c("model-selected",o))}function j(e){if(!e)return null;const t=a.providers.find(l=>l.id===e);return(t==null?void 0:t.kind)||"anthropic"}function _(e,t){return`${e}::${t}`}function q(e){const t=e.indexOf("::");return t===-1?null:{providerId:e.slice(0,t),modelId:e.slice(t+2)}}function g(e,t=null){var l,o;if(!e)return null;for(const d of h.value){if(t&&d.id!==t)continue;const m=(l=d.models)==null?void 0:l.find(S=>S.modelId===e);if(m)return{provider:d,model:m}}for(const d of h.value){const m=(o=d.models)==null?void 0:o.find(S=>S.modelId===e);if(m)return{provider:d,model:m}}return null}function A(e,t){const l=e.isBuiltIn?t.displayName:t.modelId;return K.value.has(t.modelId)?`${l} (${e.name})`:l}return(e,t)=>(p(),I("div",{class:"model-selector","data-model":u.value,"data-provider-id":C.value||""},[X("select",{id:"model-select",value:O.value,disabled:y.disabled,class:Z(y.selectClass||"model-select"),onChange:t[0]||(t[0]=l=>J(l))},[y.allowEmpty?(p(),I("option",le,k(y.emptyLabel),1)):Y("",!0),(p(!0),I(P,null,x(h.value,l=>(p(),I("optgroup",{key:l.id,label:`${L(l)} · ${l.name}`,"data-agent-type":f(l)},[(p(!0),I(P,null,x(l.models,o=>(p(),I("option",{key:`${l.id}:${o.id}`,value:_(l.id,o.modelId),"data-provider-id":l.id,"data-model-id":o.modelId,"data-agent-type":f(l)},k(A(l,o)),9,de))),128))],8,oe))),128))],42,te)],8,ee))}},ue=Q(ne,[["__scopeId","data-v-c344ef1a"]]);export{ue as M};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.model-selector[data-v-
|
|
1
|
+
.model-selector[data-v-c344ef1a]{display:flex;align-items:center;gap:.5rem}.model-select[data-v-c344ef1a]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:.375rem 2rem .375rem .5rem;font-size:.75rem;font-weight:500;background-color:var(--color-background);border:1px solid var(--color-border);border-radius:.375rem;color:var(--color-text-soft);cursor:pointer;transition:all .15s;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%239ca3af' d='M1.5 4.5l4.5 4 4.5-4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .5rem center;background-size:12px}.model-select[data-v-c344ef1a]:hover:not(:disabled){border-color:var(--color-border-hover);background-color:var(--color-bg-hover)}.model-select[data-v-c344ef1a]:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 2px #06b6d41a}.model-select[data-v-c344ef1a]:disabled{opacity:.5;cursor:not-allowed}.model-select option[data-v-c344ef1a]{background-color:var(--color-background);color:var(--color-text)}
|