@lovelybunch/api 1.0.75-alpha.1 → 1.0.75-alpha.3
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/dist/lib/storage/file-storage.js +30 -25
- package/dist/lib/terminal/terminal-manager.js +9 -2
- package/dist/routes/api/v1/events/status/route.d.ts +1 -1
- package/dist/routes/api/v1/jobs/[id]/run/route.d.ts +2 -2
- package/dist/routes/api/v1/jobs/[id]/runs/[runId]/route.d.ts +2 -2
- package/dist/routes/api/v1/jobs/status/route.d.ts +1 -1
- package/dist/routes/api/v1/proposals/[id]/route.d.ts +8 -8
- package/dist/server-with-static.js +2 -2
- package/dist/server.js +1 -1
- package/package.json +4 -4
- package/static/assets/{ActivityPage-BYrDJlH6.js → ActivityPage-yYFOuzQj.js} +1 -1
- package/static/assets/{AgentDetailPage-D6yg4CtT.js → AgentDetailPage-DCR5YNVU.js} +1 -1
- package/static/assets/{AgentEditPage-CTnjxjX7.js → AgentEditPage-BGXjFdsw.js} +1 -1
- package/static/assets/{AgentsPage-NdB5OB1C.js → AgentsPage-CaZmNTwQ.js} +1 -1
- package/static/assets/{AgentsSettingsPage-CYXp908g.js → AgentsSettingsPage-DA2tHcvH.js} +1 -1
- package/static/assets/ApiKeysSettingsPage-B6CA2v5l.js +2 -0
- package/static/assets/{ArchitectureEditPage-Bw2d_hmk.js → ArchitectureEditPage-CEX952rR.js} +1 -1
- package/static/assets/{ArchitecturePage-36wO0UD7.js → ArchitecturePage-BxY4P_Xn.js} +1 -1
- package/static/assets/{AuthSettingsPage-CKifiWsx.js → AuthSettingsPage-B-42QxmU.js} +1 -1
- package/static/assets/{CallbackPage-Ck0dddEW.js → CallbackPage-Xtkl5mdQ.js} +1 -1
- package/static/assets/{CodePage-b3JR4eWW.js → CodePage-BNxCMq_6.js} +1 -1
- package/static/assets/{CollapsibleSection-BKY-lfsm.js → CollapsibleSection-4qw69Qp5.js} +1 -1
- package/static/assets/{DashboardPage-Cv2-duAx.js → DashboardPage-B8O0l-he.js} +9 -9
- package/static/assets/{GitPage-BgCxzm-C.js → GitPage-C3c2ooKQ.js} +1 -1
- package/static/assets/{GitSettingsPage-CKIWkAnw.js → GitSettingsPage-BADM0xMN.js} +1 -1
- package/static/assets/{IdentityPage-BsZnszF-.js → IdentityPage-DHUEAJq9.js} +1 -1
- package/static/assets/{ImplementationStepsEditor-iqrCqyOb.js → ImplementationStepsEditor-IxfIwOlC.js} +1 -1
- package/static/assets/{IntegrationsSettingsPage-C1dC_vVy.js → IntegrationsSettingsPage-7iQ0M2_s.js} +1 -1
- package/static/assets/{JobDetailPage-BgGQJkND.js → JobDetailPage-B48lZ009.js} +1 -1
- package/static/assets/{KnowledgeDetailPage-Dzy2V7yT.js → KnowledgeDetailPage-B-6aGk_w.js} +1 -1
- package/static/assets/{KnowledgeEditPage-av1ALt0h.js → KnowledgeEditPage-yo3WtN52.js} +1 -1
- package/static/assets/{KnowledgePage-C_UDfD9X.js → KnowledgePage-ChbES9g4.js} +1 -1
- package/static/assets/{LoginPage-DqbNxfY6.js → LoginPage-BVoYZHnb.js} +1 -1
- package/static/assets/{McpSettingsPage-BqbErEWS.js → McpSettingsPage-_Zh_Qyb6.js} +1 -1
- package/static/assets/{NewAgentPage-UEVIYkt3.js → NewAgentPage-arnp7pqe.js} +1 -1
- package/static/assets/{NewKnowledgePage-CzYXdoDb.js → NewKnowledgePage-9I1FJEeC.js} +1 -1
- package/static/assets/{NewProposalPage-DrU0ihJX.js → NewProposalPage-Cz9LB9L4.js} +1 -1
- package/static/assets/{ProjectEditPage-j4KporiC.js → ProjectEditPage-Dz7yAjOv.js} +1 -1
- package/static/assets/{ProjectPage-BQNa0qA-.js → ProjectPage-D9qnpm4P.js} +1 -1
- package/static/assets/{PromptsSettingsPage-sYphs8Dn.js → PromptsSettingsPage-CAlhDjm4.js} +1 -1
- package/static/assets/ProposalDetailPage-DLOy1zqo.js +1 -0
- package/static/assets/{ProposalEditPage-CkcZqgax.js → ProposalEditPage-C_2kX6mc.js} +1 -1
- package/static/assets/ProposalsPage-DA-bHZ41.js +17 -0
- package/static/assets/{ResourcesPage-DzjwPoyS.js → ResourcesPage-BnbcdKlh.js} +1 -1
- package/static/assets/{RoleEditPage-DhVneoNR.js → RoleEditPage-CzUKSXGz.js} +1 -1
- package/static/assets/{RolePage-BOI2T8QG.js → RolePage-DCeSbr3Q.js} +1 -1
- package/static/assets/{RulesSettingsPage-VsteFA-j.js → RulesSettingsPage-DC4WUqQG.js} +1 -1
- package/static/assets/{SchedulePage-_v4YfdHo.js → SchedulePage-C0TCr4ln.js} +1 -1
- package/static/assets/{SourceInput-BFxoOvqS.js → SourceInput-DSQiXByy.js} +1 -1
- package/static/assets/{TagInput-BWLBdW8h.js → TagInput-CTRVtznt.js} +1 -1
- package/static/assets/{TerminalPage-DtVDWX7G.js → TerminalPage-NA90GXv6.js} +1 -1
- package/static/assets/TerminalSessionPage-lYji3uKH.js +13 -0
- package/static/assets/{UserPreferencesPage-CkXJuogz.js → UserPreferencesPage-ZDNBaYV_.js} +1 -1
- package/static/assets/{UserSettingsPage-Dz-R1ijS.js → UserSettingsPage-S5Cp3lAu.js} +1 -1
- package/static/assets/{UtilitiesPage-CRqQYVsb.js → UtilitiesPage-DHQMIUAT.js} +1 -1
- package/static/assets/{alert-C7sSXJf0.js → alert-DrBQkmi_.js} +1 -1
- package/static/assets/{arrow-down-DNa4SyO2.js → arrow-down--USTBjYI.js} +1 -1
- package/static/assets/{arrow-left-DkoECaEJ.js → arrow-left-FN8jcXkb.js} +1 -1
- package/static/assets/{arrow-up-DQlu6uQE.js → arrow-up-CiCJRdGW.js} +1 -1
- package/static/assets/{badge-2ZOe5ynf.js → badge-DRh3rRQu.js} +1 -1
- package/static/assets/{browser-modal-DUCXGaha.js → browser-modal-qHl2PIdG.js} +1 -1
- package/static/assets/{calendar-tNgwmWmG.js → calendar-CaJejXR8.js} +1 -1
- package/static/assets/{card-By4vbQ_f.js → card-D76uvpWc.js} +1 -1
- package/static/assets/{chevron-left-CJfNRqcH.js → chevron-left-xuZFss_E.js} +1 -1
- package/static/assets/{chevrons-up-DoBrp0tt.js → chevrons-up-D7jd_Ktr.js} +1 -1
- package/static/assets/{circle-alert-B4JJ0jKl.js → circle-alert-TRE_RDZ5.js} +1 -1
- package/static/assets/{circle-check-DC5Ek4MP.js → circle-check-DDmlur4r.js} +1 -1
- package/static/assets/{circle-check-big-Dw4YJZos.js → circle-check-big-DcB3o-ep.js} +1 -1
- package/static/assets/{circle-play-D9VS6Vdc.js → circle-play-DymCP_-b.js} +1 -1
- package/static/assets/{circle-x-BReHgv4g.js → circle-x-DWYSgfOn.js} +1 -1
- package/static/assets/{clipboard-CuF9OlXN.js → clipboard-CSidJDm8.js} +1 -1
- package/static/assets/{clock-CDTi2Cen.js → clock-Djvcm6zD.js} +1 -1
- package/static/assets/{download-DHIAgGlY.js → download-COUif_Db.js} +1 -1
- package/static/assets/droid-Cef-tD7d.js +15 -0
- package/static/assets/{eye-Ch7ecV9Z.js → eye-dXmhy-Xz.js} +1 -1
- package/static/assets/{folder-git-2-BYI_osdA.js → folder-git-2-DIe6Wu6M.js} +1 -1
- package/static/assets/index-BxthLB0X.js +468 -0
- package/static/assets/index-C8_b70Ej.css +2 -0
- package/static/assets/info-CR0AZ8de.js +6 -0
- package/static/assets/{label-BUv8Ltyw.js → label-DfOp08y2.js} +1 -1
- package/static/assets/{markdown-editor-BP8Xkecg.js → markdown-editor-BF59F19G.js} +1 -1
- package/static/assets/{pause-B0clczfE.js → pause-BBJMyVwt.js} +1 -1
- package/static/assets/{play-BHUpJCX1.js → play-BgcqwqoN.js} +1 -1
- package/static/assets/{plus-D0SUNNMH.js → plus-BGVZ9Q6B.js} +1 -1
- package/static/assets/{radio-group-CSBH8ca-.js → radio-group-CwrrMGEK.js} +1 -1
- package/static/assets/{refresh-cw-C-yGwsHL.js → refresh-cw-LsRR5OFh.js} +1 -1
- package/static/assets/{search-DFtqbVgP.js → search-BXJIrj0s.js} +1 -1
- package/static/assets/status-utils-BDOyevaX.js +1 -0
- package/static/assets/{switch-WtOd8h5Z.js → switch-C2fktd0p.js} +1 -1
- package/static/assets/{tabs-D93ZjKR7.js → tabs-D285Glmh.js} +1 -1
- package/static/assets/{tag-EEDDoCc_.js → tag-p9Me66vI.js} +1 -1
- package/static/assets/{terminal-preview-sns5QTN_.js → terminal-preview-B-ZNhh2N.js} +1 -1
- package/static/assets/{use-terminal-BW9XYY8N.js → use-terminal-CPGjZeDg.js} +1 -1
- package/static/assets/{zap-BYFYWzmj.js → zap-DJOf5Vvp.js} +1 -1
- package/static/index.html +2 -2
- package/static/assets/ApiKeysSettingsPage-Jl6vvVmW.js +0 -7
- package/static/assets/ProposalDetailPage-CHR1MmwC.js +0 -1
- package/static/assets/ProposalsPage-CUB_aLXW.js +0 -17
- package/static/assets/TerminalSessionPage-BUHzje8A.js +0 -13
- package/static/assets/droid-BvMEm3eg.js +0 -8
- package/static/assets/index-CCs6x1Au.js +0 -468
- package/static/assets/index-CzjbtPHw.css +0 -2
|
@@ -85,20 +85,28 @@ export class FileStorageAdapter {
|
|
|
85
85
|
role: 'engineer', // Default role
|
|
86
86
|
type: cp.author.type
|
|
87
87
|
},
|
|
88
|
-
//
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
})
|
|
97
|
-
},
|
|
88
|
+
// Steps (top-level for consistency with CLI storage format)
|
|
89
|
+
steps: cp.planSteps.map(step => ({
|
|
90
|
+
id: step.id,
|
|
91
|
+
description: step.description,
|
|
92
|
+
status: step.status,
|
|
93
|
+
...(step.command && { command: step.command }),
|
|
94
|
+
...(step.expectedOutcome && { expectedOutcome: step.expectedOutcome }),
|
|
95
|
+
...(step.output && { output: step.output }),
|
|
96
|
+
...(step.executedAt && { executedAt: step.executedAt instanceof Date ? step.executedAt.toISOString() : step.executedAt }),
|
|
97
|
+
})),
|
|
98
98
|
// Metadata
|
|
99
99
|
tags: cp.metadata.tags || [],
|
|
100
100
|
labels: [],
|
|
101
|
-
|
|
101
|
+
// Comments use consistent field names: id, author, content, createdAt
|
|
102
|
+
comments: (cp.comments || [])
|
|
103
|
+
.filter((c) => c !== undefined)
|
|
104
|
+
.map((c) => ({
|
|
105
|
+
id: c.id,
|
|
106
|
+
author: typeof c.author === 'string' ? c.author : c.author?.name || 'Unknown',
|
|
107
|
+
content: c.content || c.text || '',
|
|
108
|
+
createdAt: c.createdAt || c.timestamp || new Date().toISOString(),
|
|
109
|
+
}))
|
|
102
110
|
});
|
|
103
111
|
const markdown = matter.stringify(content || this.getDefaultContent(cp), frontmatterData);
|
|
104
112
|
const filePath = path.join(this.basePath, 'proposals', `${cp.id}.md`);
|
|
@@ -124,15 +132,13 @@ export class FileStorageAdapter {
|
|
|
124
132
|
throw new Error(`CP ${id} not found`);
|
|
125
133
|
// Never allow id to be updated to prevent overwriting other proposals
|
|
126
134
|
const { id: _, ...safeUpdates } = updates;
|
|
127
|
-
//
|
|
128
|
-
//
|
|
129
|
-
let commentsToStore = existing.
|
|
135
|
+
// Comments live at root level on ChangeProposal (not in metadata).
|
|
136
|
+
// Accept comments from root level or metadata.comments for backward compat.
|
|
137
|
+
let commentsToStore = existing.comments || [];
|
|
130
138
|
if (safeUpdates.comments) {
|
|
131
|
-
// If comments are provided at root level, use them
|
|
132
139
|
commentsToStore = safeUpdates.comments;
|
|
133
140
|
}
|
|
134
141
|
else if (safeUpdates.metadata?.comments) {
|
|
135
|
-
// If comments are provided in metadata, use them
|
|
136
142
|
commentsToStore = safeUpdates.metadata.comments;
|
|
137
143
|
}
|
|
138
144
|
const updated = {
|
|
@@ -142,9 +148,7 @@ export class FileStorageAdapter {
|
|
|
142
148
|
...existing.metadata,
|
|
143
149
|
...safeUpdates.metadata,
|
|
144
150
|
updatedAt: new Date(),
|
|
145
|
-
comments: commentsToStore
|
|
146
151
|
},
|
|
147
|
-
// Store comments at the root level for the file format
|
|
148
152
|
comments: commentsToStore
|
|
149
153
|
};
|
|
150
154
|
await this.createCP(updated);
|
|
@@ -220,14 +224,15 @@ export class FileStorageAdapter {
|
|
|
220
224
|
return fuse.search(query).map(result => result.item);
|
|
221
225
|
}
|
|
222
226
|
frontmatterToCP(data, content) {
|
|
223
|
-
// Handle both old and new format
|
|
224
|
-
const steps = data.
|
|
225
|
-
//
|
|
226
|
-
|
|
227
|
+
// Handle both old format (plan.steps) and new format (top-level steps)
|
|
228
|
+
const steps = data.steps || data.plan?.steps || [];
|
|
229
|
+
// Normalize comments using consistent field names (content/createdAt).
|
|
230
|
+
// Also handle legacy format (text/timestamp) for backward compatibility.
|
|
231
|
+
const normalizedComments = (data.comments || []).map((comment) => ({
|
|
227
232
|
id: comment.id,
|
|
228
|
-
text: comment.content || comment.text || '', // Handle both content and text fields
|
|
229
233
|
author: typeof comment.author === 'string' ? comment.author : comment.author?.name || 'Unknown',
|
|
230
|
-
|
|
234
|
+
content: comment.content || comment.text || '',
|
|
235
|
+
createdAt: comment.createdAt || comment.timestamp || new Date().toISOString(),
|
|
231
236
|
}));
|
|
232
237
|
// Use title as primary, fall back to deprecated intent for backward compatibility
|
|
233
238
|
const titleValue = data.title || data.intent || '';
|
|
@@ -260,6 +265,7 @@ export class FileStorageAdapter {
|
|
|
260
265
|
telemetryContracts: data.telemetryContracts || [],
|
|
261
266
|
releasePlan: data.releasePlan || { strategy: 'immediate' },
|
|
262
267
|
status: data.status || 'draft',
|
|
268
|
+
comments: normalizedComments,
|
|
263
269
|
metadata: {
|
|
264
270
|
createdAt: new Date(data.createdAt || Date.now()),
|
|
265
271
|
updatedAt: new Date(data.updatedAt || Date.now()),
|
|
@@ -267,7 +273,6 @@ export class FileStorageAdapter {
|
|
|
267
273
|
aiInteractions: data.aiInteractions || [],
|
|
268
274
|
tags: data.tags || [],
|
|
269
275
|
priority: data.priority || 'medium',
|
|
270
|
-
comments: transformedComments
|
|
271
276
|
},
|
|
272
277
|
content // Store the markdown content
|
|
273
278
|
};
|
|
@@ -83,12 +83,19 @@ export class TerminalManager {
|
|
|
83
83
|
}
|
|
84
84
|
// Get shell arguments
|
|
85
85
|
const shellArgs = getShellArgs(shellPath, initScriptPath);
|
|
86
|
-
// Prepare environment variables with API keys injected
|
|
86
|
+
// Prepare environment variables with API keys injected.
|
|
87
|
+
// Remove internal dev-server env vars (GAIT_DEV_ROOT, NODE_ENV=development)
|
|
88
|
+
// so that tools like `nut` invoked inside the terminal resolve paths
|
|
89
|
+
// relative to the terminal's cwd (projectRoot) rather than the API package.
|
|
90
|
+
const injected = getInjectedEnv();
|
|
91
|
+
delete injected.GAIT_DEV_ROOT;
|
|
92
|
+
delete injected.NODE_ENV;
|
|
87
93
|
const env = {
|
|
88
|
-
...
|
|
94
|
+
...injected,
|
|
89
95
|
COCONUT_PROPOSAL_ID: proposalId,
|
|
90
96
|
COCONUT_CONTEXT_PATH: path.join(projectRoot, '.nut', 'context'),
|
|
91
97
|
COCONUT_PROPOSAL_PATH: path.join(projectRoot, '.nut', 'proposals', `${proposalId}.md`),
|
|
98
|
+
GAIT_DATA_PATH: projectRoot,
|
|
92
99
|
TERM: 'xterm-256color',
|
|
93
100
|
COLORTERM: 'truecolor',
|
|
94
101
|
};
|
|
@@ -7,9 +7,9 @@ import { Context } from "hono";
|
|
|
7
7
|
* Get logging system status and configuration
|
|
8
8
|
*/
|
|
9
9
|
export declare function GET(c: Context): Promise<(Response & import("hono").TypedResponse<{
|
|
10
|
-
[x: string]: any;
|
|
11
10
|
currentFile: string;
|
|
12
11
|
sizeBytes: number;
|
|
12
|
+
lastSeq: number;
|
|
13
13
|
rotateBytes: number;
|
|
14
14
|
logsDir: string;
|
|
15
15
|
}, import("hono/utils/http-status").ContentfulStatusCode, "json">) | (Response & import("hono").TypedResponse<{
|
|
@@ -12,8 +12,8 @@ export declare function POST(c: Context): Promise<(Response & import("hono").Typ
|
|
|
12
12
|
run: {
|
|
13
13
|
id: string;
|
|
14
14
|
jobId: string;
|
|
15
|
-
trigger: import("@lovelybunch/
|
|
16
|
-
status: import("@lovelybunch/
|
|
15
|
+
trigger: import("@lovelybunch/core").ScheduledJobTrigger;
|
|
16
|
+
status: import("@lovelybunch/core").ScheduledJobRunStatus;
|
|
17
17
|
startedAt: string;
|
|
18
18
|
finishedAt?: string;
|
|
19
19
|
outputPath?: string;
|
|
@@ -10,8 +10,8 @@ export declare function GET(c: Context): Promise<(Response & import("hono").Type
|
|
|
10
10
|
data: {
|
|
11
11
|
id: string;
|
|
12
12
|
jobId: string;
|
|
13
|
-
trigger: import("@lovelybunch/
|
|
14
|
-
status: import("@lovelybunch/
|
|
13
|
+
trigger: import("@lovelybunch/core").ScheduledJobTrigger;
|
|
14
|
+
status: import("@lovelybunch/core").ScheduledJobRunStatus;
|
|
15
15
|
startedAt: string;
|
|
16
16
|
finishedAt?: string;
|
|
17
17
|
outputPath?: string;
|
|
@@ -7,7 +7,7 @@ export declare function GET(c: Context): Promise<(Response & import("hono").Type
|
|
|
7
7
|
runningCount: number;
|
|
8
8
|
jobs: {
|
|
9
9
|
id: string;
|
|
10
|
-
status: import("@lovelybunch/
|
|
10
|
+
status: import("@lovelybunch/core").ScheduledJobStatus;
|
|
11
11
|
nextRunAt?: string;
|
|
12
12
|
lastRunAt?: string;
|
|
13
13
|
timerActive: boolean;
|
|
@@ -13,7 +13,7 @@ export declare function GET(c: Context): Promise<(Response & import("hono").Type
|
|
|
13
13
|
intent?: string;
|
|
14
14
|
content?: string;
|
|
15
15
|
author: {
|
|
16
|
-
type: import("@lovelybunch/
|
|
16
|
+
type: import("@lovelybunch/core").AuthorType;
|
|
17
17
|
id: string;
|
|
18
18
|
name: string;
|
|
19
19
|
email?: string;
|
|
@@ -48,7 +48,7 @@ export declare function GET(c: Context): Promise<(Response & import("hono").Type
|
|
|
48
48
|
version: string;
|
|
49
49
|
name: string;
|
|
50
50
|
description: string;
|
|
51
|
-
type: import("@lovelybunch/
|
|
51
|
+
type: import("@lovelybunch/core").FeatureFlagType;
|
|
52
52
|
defaultValue: any;
|
|
53
53
|
scopes: string[];
|
|
54
54
|
targets: {
|
|
@@ -96,7 +96,7 @@ export declare function GET(c: Context): Promise<(Response & import("hono").Type
|
|
|
96
96
|
minimumSampleSize: number;
|
|
97
97
|
testType: "two-tailed" | "one-tailed";
|
|
98
98
|
};
|
|
99
|
-
status: import("@lovelybunch/
|
|
99
|
+
status: import("@lovelybunch/core").ExperimentStatus;
|
|
100
100
|
startedAt?: string;
|
|
101
101
|
endedAt?: string;
|
|
102
102
|
}[];
|
|
@@ -134,7 +134,7 @@ export declare function GET(c: Context): Promise<(Response & import("hono").Type
|
|
|
134
134
|
schedule?: string;
|
|
135
135
|
rollbackPlan?: string;
|
|
136
136
|
};
|
|
137
|
-
status: import("@lovelybunch/
|
|
137
|
+
status: import("@lovelybunch/core").CPStatus;
|
|
138
138
|
comments?: {
|
|
139
139
|
id: string;
|
|
140
140
|
author: string;
|
|
@@ -177,7 +177,7 @@ export declare function PATCH(c: Context): Promise<(Response & import("hono").Ty
|
|
|
177
177
|
intent?: string;
|
|
178
178
|
content?: string;
|
|
179
179
|
author: {
|
|
180
|
-
type: import("@lovelybunch/
|
|
180
|
+
type: import("@lovelybunch/core").AuthorType;
|
|
181
181
|
id: string;
|
|
182
182
|
name: string;
|
|
183
183
|
email?: string;
|
|
@@ -212,7 +212,7 @@ export declare function PATCH(c: Context): Promise<(Response & import("hono").Ty
|
|
|
212
212
|
version: string;
|
|
213
213
|
name: string;
|
|
214
214
|
description: string;
|
|
215
|
-
type: import("@lovelybunch/
|
|
215
|
+
type: import("@lovelybunch/core").FeatureFlagType;
|
|
216
216
|
defaultValue: any;
|
|
217
217
|
scopes: string[];
|
|
218
218
|
targets: {
|
|
@@ -260,7 +260,7 @@ export declare function PATCH(c: Context): Promise<(Response & import("hono").Ty
|
|
|
260
260
|
minimumSampleSize: number;
|
|
261
261
|
testType: "two-tailed" | "one-tailed";
|
|
262
262
|
};
|
|
263
|
-
status: import("@lovelybunch/
|
|
263
|
+
status: import("@lovelybunch/core").ExperimentStatus;
|
|
264
264
|
startedAt?: string;
|
|
265
265
|
endedAt?: string;
|
|
266
266
|
}[];
|
|
@@ -298,7 +298,7 @@ export declare function PATCH(c: Context): Promise<(Response & import("hono").Ty
|
|
|
298
298
|
schedule?: string;
|
|
299
299
|
rollbackPlan?: string;
|
|
300
300
|
};
|
|
301
|
-
status: import("@lovelybunch/
|
|
301
|
+
status: import("@lovelybunch/core").CPStatus;
|
|
302
302
|
comments?: {
|
|
303
303
|
id: string;
|
|
304
304
|
author: string;
|
|
@@ -90,9 +90,9 @@ catch (error) {
|
|
|
90
90
|
console.error(error);
|
|
91
91
|
}
|
|
92
92
|
const app = new Hono();
|
|
93
|
-
// Enable CORS for
|
|
93
|
+
// Enable CORS for frontend
|
|
94
94
|
app.use('/api/*', cors({
|
|
95
|
-
origin: '
|
|
95
|
+
origin: ['https://app.coconut.dev', 'http://localhost:5173', 'http://localhost:5174', 'http://localhost:3000'],
|
|
96
96
|
credentials: true,
|
|
97
97
|
}));
|
|
98
98
|
// Handle trailing slashes consistently for API routes
|
package/dist/server.js
CHANGED
|
@@ -91,7 +91,7 @@ catch (error) {
|
|
|
91
91
|
const app = new Hono();
|
|
92
92
|
// Enable CORS for frontend
|
|
93
93
|
app.use('*', cors({
|
|
94
|
-
origin: ['http://localhost:5173', 'http://localhost:5174', 'http://localhost:3000'],
|
|
94
|
+
origin: ['https://app.coconut.dev', 'http://localhost:5173', 'http://localhost:5174', 'http://localhost:3000'],
|
|
95
95
|
credentials: true,
|
|
96
96
|
}));
|
|
97
97
|
// Handle trailing slashes consistently for API routes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lovelybunch/api",
|
|
3
|
-
"version": "1.0.75-alpha.
|
|
3
|
+
"version": "1.0.75-alpha.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/server-with-static.js",
|
|
6
6
|
"exports": {
|
|
@@ -36,9 +36,9 @@
|
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@hono/node-server": "^1.13.7",
|
|
38
38
|
"@hono/node-ws": "^1.0.6",
|
|
39
|
-
"@lovelybunch/core": "^1.0.75-alpha.
|
|
40
|
-
"@lovelybunch/mcp": "^1.0.75-alpha.
|
|
41
|
-
"@lovelybunch/types": "^1.0.75-alpha.
|
|
39
|
+
"@lovelybunch/core": "^1.0.75-alpha.3",
|
|
40
|
+
"@lovelybunch/mcp": "^1.0.75-alpha.3",
|
|
41
|
+
"@lovelybunch/types": "^1.0.75-alpha.3",
|
|
42
42
|
"arctic": "^1.9.2",
|
|
43
43
|
"bcrypt": "^5.1.1",
|
|
44
44
|
"cookie": "^0.6.0",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as a,A as p,j as e,J as v,bj as y,B as N,v as w,C as b}from"./index-
|
|
1
|
+
import{r as a,A as p,j as e,J as v,bj as y,B as N,v as w,C as b}from"./index-BxthLB0X.js";import{C as c,a as d,b as k,c as C}from"./card-D76uvpWc.js";import{B as m}from"./badge-DRh3rRQu.js";import{R as E}from"./refresh-cw-LsRR5OFh.js";const A=5e3;function $(){const[n,o]=a.useState([]),[i,x]=a.useState(!0),[h,u]=a.useState(new Set),l=a.useCallback(async()=>{x(!0);try{const s=await fetch(`${p}/api/v1/events?limit=${A}`);if(!s.ok)throw new Error("Failed to load events");const t=await s.json();o(Array.isArray(t.items)?[...t.items].reverse():[])}catch(s){console.error("Failed to load events:",s),o([])}finally{x(!1)}},[]),g=a.useCallback(s=>{u(t=>{const r=new Set(t);return r.has(s)?r.delete(s):r.add(s),r})},[]);a.useEffect(()=>{l()},[l]);const f=s=>{if(!s)return"Unknown time";try{return new Date(s).toLocaleString()}catch{return s}},j=s=>{switch(s?.toLowerCase()){case"error":return"bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200";case"warn":case"warning":return"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200";case"info":return"bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200";case"debug":return"bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200";default:return"bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200"}};return i?e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:"Activity"}),e.jsx("p",{className:"text-muted-foreground",children:"View system activity and events"})]}),e.jsx(c,{children:e.jsx(d,{className:"pt-6",children:e.jsxs("div",{className:"flex items-center justify-center",children:[e.jsx(v,{className:"h-8 w-8 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-2 text-muted-foreground",children:"Loading events..."})]})})})]}):n.length===0?e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:"Activity"}),e.jsx("p",{className:"text-muted-foreground",children:"View system activity and events"})]}),e.jsx(c,{children:e.jsx(d,{className:"pt-6",children:e.jsxs("div",{className:"text-center",children:[e.jsx(y,{className:"mx-auto h-12 w-12 text-muted-foreground"}),e.jsx("h3",{className:"mt-4 text-lg font-semibold",children:"No Events Found"}),e.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:"Activity events will appear here as they occur."})]})})})]}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:"Activity"}),e.jsxs("p",{className:"text-muted-foreground",children:["View system activity and events (",n.length," events)"]})]}),e.jsxs(N,{variant:"outline",size:"sm",onClick:()=>void l(),disabled:i,children:[e.jsx(E,{className:`h-4 w-4 mr-2 ${i?"animate-spin":""}`}),"Refresh"]})]}),e.jsx("div",{className:"space-y-3",children:n.map(s=>{const t=h.has(s.seq);return e.jsxs(c,{className:"transition-colors",children:[e.jsx(k,{className:"py-3 cursor-pointer hover:bg-muted/30",onClick:()=>g(s.seq),children:e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex items-start gap-2 flex-1 min-w-0",children:[t?e.jsx(w,{className:"h-4 w-4 mt-0.5 text-muted-foreground shrink-0"}):e.jsx(b,{className:"h-4 w-4 mt-0.5 text-muted-foreground shrink-0"}),e.jsxs("div",{className:"space-y-1 flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsxs(C,{className:"text-sm font-medium",children:["#",s.seq]}),s.kind&&e.jsx(m,{variant:"outline",className:"text-xs",children:s.kind}),s.level&&e.jsx(m,{className:`text-xs ${j(s.level)}`,children:s.level})]}),s.message&&e.jsx("p",{className:`text-sm text-muted-foreground ${t?"":"truncate"}`,children:s.message})]})]}),e.jsx("span",{className:"text-xs text-muted-foreground whitespace-nowrap",children:f(s.ts)})]})}),t&&e.jsx(d,{className:"pt-0 pb-4",children:e.jsx("pre",{className:"text-xs bg-muted p-3 rounded-md overflow-x-auto",children:JSON.stringify(s,null,2)})})]},s.seq)})})]})}export{$ as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Q as A,u as E,r as h,j as e,B as i,L as d,R as k,W as B,p as S,A as N}from"./index-
|
|
1
|
+
import{Q as A,u as E,r as h,j as e,B as i,L as d,R as k,W as B,p as S,A as N}from"./index-BxthLB0X.js";import{C as l,b as o,a as m,c as f,d as z}from"./card-D76uvpWc.js";import{B as v}from"./badge-DRh3rRQu.js";import{A as u}from"./arrow-left-FN8jcXkb.js";const D=t=>t?Array.isArray(t)?t.filter(r=>typeof r=="string").map(r=>r.trim()).filter(Boolean):typeof t=="string"?t.split(",").map(r=>r.trim()).filter(Boolean):[]:[],c={blue:{bg:"#dbeafe",border:"#2563eb",text:"#1e40af"},green:{bg:"#dcfce7",border:"#16a34a",text:"#166534"},red:{bg:"#fee2e2",border:"#dc2626",text:"#991b1b"},emerald:{bg:"#d1fae5",border:"#10b981",text:"#047857"},purple:{bg:"#f3e8ff",border:"#9333ea",text:"#6b21a8"},orange:{bg:"#fed7aa",border:"#ea580c",text:"#9a3412"},yellow:{bg:"#fef9c3",border:"#eab308",text:"#854d0e"},teal:{bg:"#ccfbf1",border:"#14b8a6",text:"#0f766e"},indigo:{bg:"#e0e7ff",border:"#6366f1",text:"#4338ca"},pink:{bg:"#fce7f3",border:"#ec4899",text:"#9f1239"},cyan:{bg:"#cffafe",border:"#06b6d4",text:"#155e75"},slate:{bg:"#f1f5f9",border:"#475569",text:"#334155"},gray:{bg:"#f3f4f6",border:"#6b7280",text:"#374151"}};function F(){const t=A(),r=E(),[s,y]=h.useState(null),[w,j]=h.useState(!0),[p,x]=h.useState(null);h.useEffect(()=>{async function a(){try{j(!0);const g=await(await fetch(`${N}/api/v1/agents/${t.id}`)).json();g.success?y(g.document):x(g.error||"Failed to fetch agent")}catch(n){x(n instanceof Error?n.message:"Unknown error")}finally{j(!1)}}t.id&&a()},[t.id]);const C=async()=>{if(!(!s||!confirm("Are you sure you want to delete this agent?")))try{const n=await(await fetch(`${N}/api/v1/agents/${s.filename.replace(".md","")}`,{method:"DELETE"})).json();n.success?r("/agents"):x(n.error?.message||"Failed to delete agent")}catch(a){x(a instanceof Error?a.message:"Unknown error")}};if(w)return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"h-8 bg-muted rounded w-64 animate-pulse"}),e.jsx("div",{className:"h-4 bg-muted rounded w-32 animate-pulse mt-2"})]}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(i,{variant:"ghost",size:"sm",asChild:!0,className:"px-2 hover:bg-transparent",children:e.jsx(d,{to:"/agents",className:"flex items-center text-muted-foreground hover:text-foreground transition-colors",children:e.jsx(u,{className:"h-4 w-4"})})})})]}),e.jsx(l,{children:e.jsxs(o,{children:[e.jsx("div",{className:"h-6 bg-muted rounded w-48 animate-pulse"}),e.jsx("div",{className:"h-4 bg-muted rounded w-64 animate-pulse"})]})})]});if(p||!s)return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Agent Not Found"}),e.jsx("p",{className:"text-muted-foreground",children:"The requested agent could not be found"})]}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(i,{variant:"ghost",size:"sm",asChild:!0,className:"px-2 hover:bg-transparent",children:e.jsx(d,{to:"/agents",className:"flex items-center text-muted-foreground hover:text-foreground transition-colors",children:e.jsx(u,{className:"h-4 w-4"})})})})]}),e.jsx(l,{children:e.jsx(m,{className:"pt-6",children:e.jsx("div",{className:"text-center",children:e.jsx("p",{className:"text-destructive",children:p||"Agent not found"})})})})]});const b=D(s.metadata.tools);return e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"space-y-1",children:e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsx("h1",{className:"text-xl sm:text-2xl font-bold tracking-tight",children:s.metadata.name}),e.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[e.jsx(i,{variant:"ghost",size:"sm",asChild:!0,children:e.jsx(d,{to:"/agents",className:"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors",children:e.jsx(u,{className:"h-4 w-4"})})}),e.jsx(i,{variant:"outline",size:"sm",asChild:!0,children:e.jsxs(d,{to:`/agents/${s.filename.replace(".md","")}/edit`,children:[e.jsx(k,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Edit"})]})}),e.jsxs(i,{variant:"destructive",size:"sm",onClick:C,children:[e.jsx(B,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Delete"})]})]})]})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6",children:[e.jsxs("div",{className:"lg:col-span-2 space-y-6",children:[e.jsxs(l,{children:[e.jsx(o,{children:e.jsx(f,{children:"Description"})}),e.jsx(m,{children:e.jsx("p",{children:s.metadata.description})})]}),s.content&&e.jsxs(l,{children:[e.jsxs(o,{children:[e.jsx(f,{children:"Instructions"}),e.jsx(z,{children:"System prompt and behavior instructions for this agent"})]}),e.jsx(m,{children:e.jsx("pre",{className:"whitespace-pre-wrap text-sm bg-muted p-4 rounded-md",children:s.content})})]})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsxs(l,{children:[e.jsx(o,{children:e.jsx(f,{children:"Actions"})}),e.jsx(m,{className:"space-y-2",children:e.jsx(i,{variant:"default",className:"w-full justify-start",asChild:!0,children:e.jsxs(d,{to:`/terminal/ag-${s.filename.replace(".md","")}`,children:[e.jsx(S,{className:"h-4 w-4 mr-2"}),"Start Agent"]})})})]}),e.jsxs(l,{children:[e.jsx(o,{children:e.jsx(f,{children:"Information"})}),e.jsxs(m,{className:"space-y-2",children:[s.metadata.color&&e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium mb-2",children:"Color"}),e.jsx(v,{variant:"outline",className:"capitalize border-2",style:{backgroundColor:c[s.metadata.color]?.bg||c.blue.bg,color:c[s.metadata.color]?.text||c.blue.text,borderColor:c[s.metadata.color]?.border||c.blue.border},children:s.metadata.color})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium",children:"Tools"}),b.length>0?e.jsx("div",{className:"flex flex-wrap gap-2 mt-1",children:b.map(a=>e.jsx(v,{variant:"secondary",children:a},a))}):e.jsx("p",{className:"text-sm text-muted-foreground",children:"No specific tools configured - inherits all tools"})]})]})]})]})]})]})}export{F as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Q as X,u as Y,a as Z,r as n,j as e,B as m,L as v,p as O,I as D,w as ee,ah as te,A as y}from"./index-
|
|
1
|
+
import{Q as X,u as Y,a as Z,r as n,j as e,B as m,L as v,p as O,I as D,w as ee,ah as te,A as y}from"./index-BxthLB0X.js";import{C as N,a as C,b as se,c as ae}from"./card-D76uvpWc.js";import{L as l}from"./label-DfOp08y2.js";import{B as re}from"./badge-DRh3rRQu.js";import{c as ne}from"./clipboard-B9ndUJKl.js";import{A as z}from"./arrow-left-FN8jcXkb.js";import{C as oe,a as ie}from"./clipboard-CSidJDm8.js";function xe(){const{id:i}=X(),U=Y(),{toast:w}=Z(),[q,S]=n.useState(!0),[o,A]=n.useState(!1),[d,c]=n.useState(null),[R,_]=n.useState(""),[u,E]=n.useState(""),[g,F]=n.useState(""),[f,P]=n.useState("blue"),[x,k]=n.useState([]),[h,$]=n.useState(""),[L,p]=n.useState([]),[H,M]=n.useState(!0),[J,T]=n.useState(!1),Q=["blue","green","red","emerald","purple","orange","yellow","teal","indigo","pink","cyan","slate","gray"],G={blue:{bg:"#3b82f6",border:"#1e40af",text:"#ffffff"},green:{bg:"#22c55e",border:"#15803d",text:"#ffffff"},red:{bg:"#ef4444",border:"#b91c1c",text:"#ffffff"},emerald:{bg:"#10b981",border:"#047857",text:"#ffffff"},purple:{bg:"#a855f7",border:"#7e22ce",text:"#ffffff"},orange:{bg:"#f97316",border:"#c2410c",text:"#ffffff"},yellow:{bg:"#eab308",border:"#a16207",text:"#ffffff"},teal:{bg:"#14b8a6",border:"#0f766e",text:"#ffffff"},indigo:{bg:"#6366f1",border:"#4338ca",text:"#ffffff"},pink:{bg:"#ec4899",border:"#be185d",text:"#ffffff"},cyan:{bg:"#06b6d4",border:"#0e7490",text:"#ffffff"},slate:{bg:"#64748b",border:"#475569",text:"#ffffff"},gray:{bg:"#6b7280",border:"#4b5563",text:"#ffffff"}},K=t=>{if(!t)return[];if(Array.isArray(t)){const a=t.filter(s=>typeof s=="string").map(s=>s.trim()).filter(Boolean);return Array.from(new Set(a))}return typeof t=="string"?Array.from(new Set(t.split(",").map(a=>a.trim()).filter(Boolean))):[]};n.useEffect(()=>{async function t(){try{S(!0);const s=await(await fetch(`${y}/api/v1/agents/${i}`)).json();if(!s.success)throw new Error(s.error||"Failed to load agent");const r=s.document;_(r.filename),E(r.metadata.name||""),F(r.metadata.description||""),P(r.metadata.color||"blue"),$(r.content||""),k(K(r.metadata.tools))}catch(a){const s=a instanceof Error?a.message:"Failed to load agent";c(s)}finally{S(!1)}}i&&t()},[i]),n.useEffect(()=>{let t=!0;return(async()=>{M(!0);try{const s=await fetch(`${y}/api/v1/mcp`);if(!s.ok)throw new Error("Failed to fetch MCP servers");const r=await s.json();if(!r?.success||!Array.isArray(r.servers)){t&&p([]);return}const B=r.mcpServers&&typeof r.mcpServers=="object"?r.mcpServers:{},b=r.servers.map(I=>{const j=B[I]??{};return{name:I,enabled:j?.enabled!==!1,description:typeof j?.description=="string"?j.description:void 0}});t&&p(b)}catch(s){console.error("Failed to load MCP servers",s),t&&p([])}finally{t&&M(!1)}})(),()=>{t=!1}},[]);const V=async()=>{const t=".nut/config.json";try{await ne(t),T(!0),w({title:"Copied!",description:`${t} copied to clipboard`}),setTimeout(()=>T(!1),2e3)}catch(a){console.error("Failed to copy config path:",a),w({title:"Error",description:"Failed to copy to clipboard",variant:"destructive"})}},W=async t=>{if(t.preventDefault(),!u.trim()||!g.trim()||!h.trim()){c("Name, description, and agent instructions are required");return}try{A(!0),c(null);const a={name:u.trim(),description:g.trim(),content:h.trim(),metadata:{color:f,tools:x.length?x:void 0}},r=await(await fetch(`${y}/api/v1/agents/${i}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();if(!r.success)throw new Error(r.error||"Failed to update agent");const b=r.document.filename.replace(/\.md$/,"");U(`/agents/${b}`)}catch(a){const s=a instanceof Error?a.message:"Failed to update agent";c(s)}finally{A(!1)}};return q?e.jsx("div",{className:"space-y-6",children:e.jsx(N,{children:e.jsx(C,{className:"pt-6",children:"Loading agent..."})})}):d?e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Edit Agent"}),e.jsx("p",{className:"text-muted-foreground",children:"Unable to load agent"})]}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(m,{variant:"ghost",size:"sm",asChild:!0,children:e.jsx(v,{to:`/agents/${i}`,className:"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors",children:e.jsx(z,{className:"h-4 w-4"})})})})]}),e.jsx(N,{children:e.jsx(C,{className:"pt-6",children:e.jsx("div",{className:"text-destructive",children:d})})})]}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Edit Agent"}),e.jsxs("p",{className:"text-muted-foreground",children:["File: ",R]})]}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(m,{variant:"ghost",size:"sm",asChild:!0,children:e.jsx(v,{to:`/agents/${i}`,className:"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors",children:e.jsx(z,{className:"h-4 w-4"})})})})]}),e.jsxs(N,{children:[e.jsx(se,{children:e.jsxs(ae,{className:"flex items-center gap-2",children:[e.jsx(O,{className:"h-5 w-5"}),"Agent Configuration"]})}),e.jsx(C,{children:e.jsxs("form",{onSubmit:W,className:"space-y-6",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(l,{htmlFor:"name",children:"Name *"}),e.jsx(D,{id:"name",value:u,onChange:t=>E(t.target.value),disabled:o})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(l,{htmlFor:"description",children:"Description *"}),e.jsx(D,{id:"description",value:g,onChange:t=>F(t.target.value),disabled:o})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(l,{children:"Color"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:Q.map(t=>{const a=G[t];return e.jsx("button",{type:"button",onClick:()=>P(t),disabled:o,className:`w-10 h-10 rounded-md border-2 transition-all ${f===t?"ring-2 ring-offset-2 shadow-md":"hover:scale-110 hover:shadow-sm"}`,style:{backgroundColor:a.bg,borderColor:f===t?a.border:"hsl(var(--border))",...f===t&&{"--tw-ring-color":a.border}},title:t,children:e.jsx("span",{className:"sr-only",children:t})},t)})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(l,{htmlFor:"content",children:"Agent Instructions *"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["System prompt or instructions for this agent's behavior."," ","Insert ",e.jsx("code",{className:"text-xs bg-muted px-1.5 py-0.5 rounded font-mono",children:".nut/config.json"})," ",e.jsx("button",{type:"button",onClick:V,className:"inline-flex items-center align-middle text-muted-foreground hover:text-foreground transition-colors",title:"Copy .nut/config.json to clipboard",children:J?e.jsx(oe,{className:"h-3.5 w-3.5 ml-0.5"}):e.jsx(ie,{className:"h-3.5 w-3.5 ml-0.5"})})," ","if you want the agent to be able to access its name, role, or email address."]}),e.jsx(ee,{id:"content",value:h,onChange:t=>$(t.target.value),rows:8,disabled:o,required:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(l,{children:"Tools (Optional)"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Choose which MCP servers this agent should be able to use. Leave empty to inherit all available servers."}),e.jsx("div",{className:"space-y-2",children:H?e.jsx("div",{className:"text-sm text-muted-foreground",children:"Loading MCP servers…"}):L.length===0?e.jsx("div",{className:"text-sm text-muted-foreground border border-dashed rounded-md p-3",children:"No MCP servers configured yet. Configure servers in Settings → MCP."}):L.map(t=>e.jsxs("label",{className:"flex items-start gap-3 rounded-md border border-transparent bg-muted/30 px-3 py-2 hover:border-muted transition-colors",children:[e.jsx(te,{checked:x.includes(t.name),onCheckedChange:a=>{k(s=>a===!0?s.includes(t.name)?s:[...s,t.name]:s.filter(r=>r!==t.name))},disabled:o||!t.enabled}),e.jsxs("div",{className:"flex flex-col",children:[e.jsxs("span",{className:"text-sm font-medium",children:[t.name,!t.enabled&&e.jsx(re,{variant:"secondary",className:"ml-2 text-xs",children:"Disabled"})]}),e.jsx("span",{className:"text-xs text-muted-foreground",children:t.enabled?t.description||"Enabled MCP server":"Enable this server in Settings to allow agents to use it"})]})]},t.name))})]}),d&&e.jsx("div",{className:"text-sm text-destructive bg-destructive/10 p-3 rounded-md",children:d}),e.jsxs("div",{className:"flex gap-2 justify-end",children:[e.jsx(m,{type:"button",variant:"outline",asChild:!0,disabled:o,children:e.jsx(v,{to:`/agents/${i}`,children:"Cancel"})}),e.jsx(m,{type:"submit",disabled:o,children:o?"Saving...":"Save Changes"})]})]})})]})]})}export{xe as default};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{j as e,S as I,a3 as L,r as x,a as O,A as R,J as M,B as b,L as v,p as E,am as $,an as _}from"./index-
|
|
1
|
+
import{j as e,S as I,a3 as L,r as x,a as O,A as R,J as M,B as b,L as v,p as E,am as $,an as _}from"./index-BxthLB0X.js";import{C as N,a as w,b as D,c as U}from"./card-D76uvpWc.js";import{B as y}from"./badge-DRh3rRQu.js";import{c as H}from"./clipboard-B9ndUJKl.js";import{R as J,L as F}from"./browser-modal-qHl2PIdG.js";import{R as Y,f as G}from"./registry-ANRa5WBi.js";import{P as T}from"./plus-BGVZ9Q6B.js";import{T as K}from"./tag-p9Me66vI.js";import"./search-BXJIrj0s.js";const V=["color","tools","createdAt","updatedAt","version","focusAreas","contextPreferences","tags"];function P(s){if(s){if(Array.isArray(s)){const r=s.map(n=>{if(typeof n=="string")return n.trim();if(typeof n=="number")return`${n}`}).filter(n=>typeof n=="string"&&n.length>0);return r.length>0?r:void 0}if(typeof s=="string"){const r=s.split(",").map(n=>n.trim()).filter(n=>n.length>0);return r.length>0?r:void 0}}}function q(s,r){const n=[];if(s.content&&typeof s.content=="object")for(const o of Object.values(s.content))typeof o=="string"&&o.trim().length>0&&n.push(o.trim());const i=[];return i.push(`# ${r}`),s.description?.trim()&&i.push(s.description.trim()),[...i,...n].join(`
|
|
2
2
|
|
|
3
3
|
`).trim()}function z(s,r){const n=s.name||r.name,i=r.description||s.description||"",a={registryId:s.id,registryEndpoint:s.endpoint,registrySource:Y,author:s.author};for(const o of V){const d=r[o];if(d!==void 0)if(o==="tools"||o==="focusAreas"||o==="contextPreferences"||o==="tags"){const f=P(d);f&&(a[o]=f)}else a[o]=d}!a.version&&s.version&&(a.version=s.version),a.color||(a.color="blue"),!a.tags&&s.tags&&(a.tags=P(s.tags));for(const[o,d]of Object.entries(a))d==null&&delete a[o];return{name:n,description:i,content:q(r,n),metadata:Object.keys(a).length>0?a:void 0}}function B({open:s,onOpenChange:r,onImport:n}){return e.jsx(J,{open:s,onOpenChange:r,categoryId:"agents",title:"Coconut Registry – Agents",confirmLabel:"Import Agent",getDetail:i=>G(i.endpoint),renderPreview:(i,a)=>{if(!a)return e.jsx("div",{className:"flex h-full items-center justify-center text-muted-foreground",children:"Select an agent to preview"});const o=z(i,a),d=o.metadata??{},f=typeof d.version=="string"?d.version:void 0,u=Array.isArray(i.tags)?i.tags:[],j=Array.isArray(d.tools)?d.tools.filter(c=>typeof c=="string"):[],p=Array.isArray(d.focusAreas)?d.focusAreas.filter(c=>typeof c=="string"):[];return e.jsx("div",{className:"h-full min-h-0 overflow-hidden rounded-md border",children:e.jsx(I,{className:"h-full",children:e.jsxs("div",{className:"space-y-6 p-4",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-2",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold",children:i.name}),e.jsx("p",{className:"text-sm text-muted-foreground",children:a.description})]}),f&&e.jsxs(y,{variant:"outline",children:["v",f]})]}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:["Registry ID: ",e.jsx("span",{className:"font-mono",children:i.id})]}),u.length>0&&e.jsx("div",{className:"flex flex-wrap gap-2",children:u.map(c=>e.jsx(y,{variant:"secondary",children:c},c))}),j.length>0&&e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[e.jsx("span",{className:"font-medium",children:"Tools:"}),j.map(c=>e.jsx(y,{variant:"outline",children:c},c))]}),p.length>0&&e.jsxs("div",{className:"space-y-1",children:[e.jsx("div",{className:"text-sm font-medium",children:"Focus Areas"}),e.jsx("ul",{className:"list-disc pl-5 text-sm text-muted-foreground",children:p.map(c=>e.jsx("li",{children:c},c))})]})]}),e.jsx(L,{className:"[&_.prose]:max-w-none",children:o.content})]})})})},onConfirm:async(i,a)=>{const o=z(i,a);await n({summary:i,detail:a,payload:o})}})}const Q=s=>s?Array.isArray(s)?s.filter(r=>typeof r=="string").map(r=>r.trim()).filter(Boolean):typeof s=="string"?s.split(",").map(r=>r.trim()).filter(Boolean):[]:[],g={blue:{bg:"#dbeafe",border:"#2563eb",text:"#1e40af"},green:{bg:"#dcfce7",border:"#16a34a",text:"#166534"},red:{bg:"#fee2e2",border:"#dc2626",text:"#991b1b"},emerald:{bg:"#d1fae5",border:"#10b981",text:"#047857"},purple:{bg:"#f3e8ff",border:"#9333ea",text:"#6b21a8"},orange:{bg:"#fed7aa",border:"#ea580c",text:"#9a3412"},yellow:{bg:"#fef9c3",border:"#eab308",text:"#854d0e"},teal:{bg:"#ccfbf1",border:"#14b8a6",text:"#0f766e"},indigo:{bg:"#e0e7ff",border:"#6366f1",text:"#4338ca"},pink:{bg:"#fce7f3",border:"#ec4899",text:"#9f1239"},cyan:{bg:"#cffafe",border:"#06b6d4",text:"#155e75"},slate:{bg:"#f1f5f9",border:"#475569",text:"#334155"},gray:{bg:"#f3f4f6",border:"#6b7280",text:"#374151"}};function ie(){const[s,r]=x.useState([]),[n,i]=x.useState(!0),[a,o]=x.useState({}),[d,f]=x.useState(!1),[u,j]=x.useState(!1),{toast:p}=O(),c=x.useCallback(async()=>{i(!0);try{const t=await fetch(`${R}/api/v1/agents`);if(!t.ok)throw new Error("Failed to load agents");const m=await t.json();r(Array.isArray(m.documents)?m.documents:[])}catch(t){console.error("Failed to load agents:",t),r([])}finally{i(!1)}},[]);x.useEffect(()=>{c()},[c]);const A=async t=>{const m=`.nut/agents/${t}`;try{await H(m),o(l=>({...l,[t]:!0})),setTimeout(()=>{o(l=>({...l,[t]:!1}))},2e3),p({title:"Path copied!",description:`Copied ${m} to clipboard`})}catch(l){console.error("Failed to copy path:",l),p({title:"Failed to copy",description:"Unable to copy path to clipboard",variant:"destructive"})}},C=x.useCallback(async({payload:t})=>{let m=!1;j(!0);try{const l=await fetch(`${R}/api/v1/agents`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t.name,description:t.description,content:t.content,metadata:t.metadata})});let h=null;try{h=await l.json()}catch(k){console.error("Failed to parse registry import response:",k)}if(!(l.ok&&h?.success)){const S=(typeof h?.error=="string"?h.error:h?.error?.message)||l.statusText||"Failed to import agent from registry";throw p({title:"Failed to import agent",description:S,variant:"destructive"}),m=!0,new Error(S)}p({title:"Agent imported",description:`${t.name} is now available in Coconut`}),await c()}catch(l){if(!m){const h=l instanceof Error&&l.message?l.message:"Failed to import agent from registry";p({title:"Failed to import agent",description:h,variant:"destructive"})}throw l}finally{j(!1)}},[c,p]);return n?e.jsx("div",{className:"space-y-6",children:e.jsx(N,{children:e.jsx(w,{className:"pt-6",children:e.jsxs("div",{className:"flex items-center justify-center",children:[e.jsx(M,{className:"h-8 w-8 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-2 text-muted-foreground",children:"Loading skills..."})]})})})}):s.length===0?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"mb-6 flex items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:"Skills"}),e.jsx("p",{className:"text-muted-foreground",children:"Manage skills for your agents"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(b,{variant:"outline",size:"sm",onClick:()=>f(!0),disabled:u,children:[e.jsx(F,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Registry"})]}),e.jsx(b,{size:"sm",asChild:!0,children:e.jsxs(v,{to:"/agents/new",children:[e.jsx(T,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Create New"})]})})]})]}),e.jsx(N,{children:e.jsx(w,{className:"pt-6",children:e.jsxs("div",{className:"text-center",children:[e.jsx(E,{className:"mx-auto h-12 w-12 text-muted-foreground"}),e.jsx("h3",{className:"mt-4 text-lg font-semibold",children:"No Skills Found"}),e.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:"Specialized skills help you automate your development and business workflows."})]})})})]}),e.jsx(B,{open:d,onOpenChange:f,onImport:C})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:"Skills"}),e.jsx("p",{className:"text-muted-foreground",children:"Manage skills for your agents"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(b,{variant:"outline",size:"sm",onClick:()=>f(!0),disabled:u,children:[e.jsx(F,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Registry"})]}),e.jsx(b,{size:"sm",asChild:!0,children:e.jsxs(v,{to:"/agents/new",children:[e.jsx(T,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Create New"})]})})]})]}),e.jsx("div",{className:"grid gap-4",children:s.map(t=>{const m=Q(t.metadata.tools);return e.jsx(v,{to:`/agents/${t.filename.replace(".md","")}`,className:"block",children:e.jsxs(N,{className:"group hover:shadow-md hover:bg-muted/30 transition-all cursor-pointer",children:[e.jsx(D,{children:e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsxs("div",{className:"space-y-1 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(U,{className:"text-lg",children:t.title}),e.jsx(b,{variant:"ghost",size:"sm",onClick:l=>{l.preventDefault(),A(t.filename)},className:"h-6 w-6 p-0 hover:bg-muted opacity-0 group-hover:opacity-100 transition-opacity",title:"Copy file path to clipboard",children:a[t.filename]?e.jsx($,{className:"w-3 h-3 text-green-600"}):e.jsx(_,{className:"w-3 h-3"})})]}),e.jsxs("div",{className:"text-xs text-muted-foreground font-mono bg-muted/50 px-2 py-1 rounded inline-block cursor-pointer hover:bg-muted/70 transition-colors",onClick:l=>{l.preventDefault(),A(t.filename)},title:"Click to copy file path to clipboard",children:[".nut/agents/",t.filename]}),e.jsxs("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(K,{className:"w-3 h-3"}),t.metadata.color||"blue"]}),m.length>0&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(E,{className:"w-3 h-3"}),m.join(", ")]})]})]}),t.metadata.color&&e.jsx(y,{variant:"outline",className:"capitalize border-2",style:{backgroundColor:g[t.metadata.color]?.bg||g.blue.bg,color:g[t.metadata.color]?.text||g.blue.text,borderColor:g[t.metadata.color]?.border||g.blue.border},children:t.metadata.color})]})}),e.jsx(w,{children:e.jsx("div",{className:"space-y-4",children:e.jsx("div",{className:"prose prose-sm max-w-none dark:prose-invert",children:e.jsx("p",{className:"text-sm text-muted-foreground line-clamp-2",children:t.metadata.description})})})})]})},t.filename)})})]}),e.jsx(B,{open:d,onOpenChange:f,onImport:C})]})}export{ie as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as b,j as e,a7 as w,B as t,s as C,W as A,I as r,h as l,i as c,k as d,l as o,m as i}from"./index-
|
|
1
|
+
import{c as b,j as e,a7 as w,B as t,s as C,W as A,I as r,h as l,i as c,k as d,l as o,m as i}from"./index-BxthLB0X.js";import{C as x,b as m,c as u,d as h,a as j}from"./card-D76uvpWc.js";import{L as a}from"./label-DfOp08y2.js";import{B as n}from"./badge-DRh3rRQu.js";import{P as S}from"./plus-BGVZ9Q6B.js";import{P as p}from"./pause-BBJMyVwt.js";import{P as R}from"./play-BgcqwqoN.js";import{Z as k}from"./zap-DJOf5Vvp.js";/**
|
|
2
2
|
* @license lucide-react v0.542.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{H as R,r as t,b6 as y,j as e,B as a,b7 as W,W as X,D as j,b as g,d as v,f,g as A,I as F,a6 as N,an as Y,N as i}from"./index-BxthLB0X.js";import{C as J,b as G,c as Q,d as V,a as Z}from"./card-D76uvpWc.js";import{L as w}from"./label-DfOp08y2.js";import{B as _}from"./badge-DRh3rRQu.js";import{A as I,a as C}from"./alert-DrBQkmi_.js";import{I as L}from"./info-CR0AZ8de.js";import{P as ee}from"./plus-BGVZ9Q6B.js";import{C as se}from"./circle-alert-TRE_RDZ5.js";function de(){const{authEnabled:n}=R(),[P,k]=t.useState([]),[b,K]=t.useState(!0),[O,l]=t.useState(!1),[M,d]=t.useState(!1),[x,D]=t.useState(""),[h,E]=t.useState("never"),[c,S]=t.useState(null),[m,o]=t.useState(null);t.useEffect(()=>{p()},[]);const p=async()=>{K(!0);try{const s=await y("/api/v1/api-keys");s.success&&k(s.data?.apiKeys||[])}catch(s){console.error("Failed to load API keys:",s),k([])}finally{K(!1)}},U=async()=>{if(!x.trim()){i({title:"Error",description:"Please provide a name for the API key",variant:"destructive"});return}try{const s={name:x,scopes:["*"]};h!=="never"&&(s.expiresIn=h);const r=await y("/api/v1/api-keys",{method:"POST",body:JSON.stringify(s)});r.success&&(S(r.data),l(!1),d(!0),D(""),E("never"),await p(),i({title:"API Key Created",description:"Make sure to copy your API key now. You won't be able to see it again!"}))}catch(s){console.error("Failed to create API key:",s),i({title:"Error",description:"Failed to create API key",variant:"destructive"})}},B=async s=>{try{(await y(`/api/v1/api-keys/${s}`,{method:"DELETE"})).success&&(await p(),o(null),i({title:"API Key Deleted",description:"The API key has been permanently deleted"}))}catch(r){console.error("Failed to delete API key:",r),i({title:"Error",description:"Failed to delete API key",variant:"destructive"})}},H=async s=>{try{await navigator.clipboard.writeText(s),i({title:"Copied",description:"API key copied to clipboard"})}catch{i({title:"Error",description:"Failed to copy to clipboard",variant:"destructive"})}},u=s=>new Date(s).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}),$=s=>s?new Date(s)<new Date:!1,q=typeof window<"u"?window.location.origin:"http://localhost:3000",z=c?`curl -H "X-API-Key: ${c.key}" \\
|
|
2
|
+
+ ${q}/api/v1/proposals`:"",T=n?null:e.jsxs(I,{children:[e.jsx(L,{className:"h-4 w-4"}),e.jsxs(C,{children:["Authentication is currently disabled. API keys will only be required once you enable authentication in the ",e.jsx("a",{href:"/settings/authentication",className:"underline",children:"Authentication settings"}),"."]})]});return!n&&b?e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-medium",children:"API Keys"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Manage API keys for programmatic access"})]}),T]}):b?e.jsx("div",{className:"space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-medium",children:"API Keys"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Loading..."})]})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-medium",children:"API Keys"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Manage API keys for programmatic access to your Coconut instance"})]}),T,n&&e.jsxs(I,{children:[e.jsx(L,{className:"h-4 w-4"}),e.jsxs(C,{children:["API keys provide programmatic access to your Coconut instance. Use them in CI/CD pipelines or automation scripts by including the key in the ",e.jsx("code",{className:"bg-muted px-1 py-0.5 rounded",children:"X-API-Key"})," header."]})]}),e.jsxs(J,{children:[e.jsx(G,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(Q,{children:"Active API Keys"}),e.jsx(V,{children:"API keys you've created for programmatic access"})]}),e.jsxs(a,{onClick:()=>l(!0),disabled:!n,children:[e.jsx(ee,{className:"mr-2 h-4 w-4"}),"Create API Key"]})]})}),e.jsx(Z,{children:P.length===0?e.jsxs("div",{className:"text-center py-8 text-muted-foreground",children:[e.jsx(W,{className:"h-12 w-12 mx-auto mb-4 opacity-20"}),e.jsx("p",{children:"No API keys yet"}),e.jsx("p",{className:"text-sm",children:"Create an API key to get started with programmatic access"})]}):e.jsx("div",{className:"space-y-4",children:P.map(s=>e.jsxs("div",{className:"flex items-center justify-between p-4 border rounded-lg",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("p",{className:"font-medium",children:s.name}),$(s.expiresAt)&&e.jsx(_,{variant:"destructive",children:"Expired"})]}),e.jsx("p",{className:"text-sm text-muted-foreground font-mono",children:s.keyPreview}),e.jsxs("div",{className:"flex items-center gap-4 mt-2 text-xs text-muted-foreground",children:[e.jsxs("span",{children:["Created: ",u(s.createdAt)]}),s.expiresAt&&e.jsxs("span",{children:["Expires: ",u(s.expiresAt)]}),s.lastUsedAt&&e.jsxs("span",{children:["Last used: ",u(s.lastUsedAt)]})]})]}),e.jsx(a,{variant:"ghost",size:"icon",onClick:()=>o(s.id),children:e.jsx(X,{className:"h-4 w-4 text-destructive"})})]},s.id))})})]}),e.jsx(j,{open:O,onOpenChange:l,children:e.jsxs(g,{children:[e.jsxs(v,{children:[e.jsx(f,{children:"Create API Key"}),e.jsx(A,{children:"Create a new API key for programmatic access. The key will only be shown once."})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{htmlFor:"keyName",children:"Name"}),e.jsx(F,{id:"keyName",placeholder:"CI/CD Pipeline",value:x,onChange:s=>D(s.target.value)}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"A descriptive name to identify this API key"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{htmlFor:"keyExpiry",children:"Expiration"}),e.jsxs("select",{id:"keyExpiry",className:"w-full rounded-md border border-input bg-background px-3 py-2 text-sm",value:h,onChange:s=>E(s.target.value),children:[e.jsx("option",{value:"never",children:"Never"}),e.jsx("option",{value:"30d",children:"30 days"}),e.jsx("option",{value:"90d",children:"90 days"}),e.jsx("option",{value:"1y",children:"1 year"})]})]})]}),e.jsxs(N,{children:[e.jsx(a,{variant:"outline",onClick:()=>l(!1),children:"Cancel"}),e.jsx(a,{onClick:U,disabled:!n,children:"Create API Key"})]})]})}),e.jsx(j,{open:M,onOpenChange:d,children:e.jsxs(g,{className:"sm:max-w-[600px]",children:[e.jsxs(v,{children:[e.jsx(f,{children:"API Key Created"}),e.jsx(A,{children:"Make sure to copy your API key now. You won't be able to see it again!"})]}),e.jsxs(I,{variant:"destructive",className:"my-4",children:[e.jsx(se,{className:"h-4 w-4"}),e.jsx(C,{children:"This is the only time you will see this key. Store it securely."})]}),c&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"API Key"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(F,{readOnly:!0,value:c.key,className:"font-mono text-sm"}),e.jsx(a,{variant:"outline",size:"icon",onClick:()=>H(c.key),children:e.jsx(Y,{className:"h-4 w-4"})})]})]}),e.jsxs("div",{className:"text-sm text-muted-foreground",children:[e.jsx("p",{className:"mb-2",children:"Usage example:"}),e.jsx("pre",{className:"bg-muted p-3 rounded-md whitespace-pre-wrap break-words",children:e.jsx("code",{className:"font-mono text-xs",children:z})})]})]}),e.jsx(N,{children:e.jsx(a,{onClick:()=>{d(!1),S(null)},children:"I've Saved My Key"})})]})}),e.jsx(j,{open:!!m,onOpenChange:s=>!s&&o(null),children:e.jsxs(g,{children:[e.jsxs(v,{children:[e.jsx(f,{children:"Delete API Key"}),e.jsx(A,{children:"Are you sure you want to delete this API key? This action cannot be undone and any scripts using this key will stop working."})]}),e.jsxs(N,{children:[e.jsx(a,{variant:"outline",onClick:()=>o(null),children:"Cancel"}),e.jsx(a,{variant:"destructive",onClick:()=>m&&B(m),children:"Delete API Key"})]})]})})]})}export{de as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{u as D,a as M,r as l,A as b,j as e,B as S,L as I,a8 as _,I as d,w as B}from"./index-
|
|
1
|
+
import{u as D,a as M,r as l,A as b,j as e,B as S,L as I,a8 as _,I as d,w as B}from"./index-BxthLB0X.js";import{C as u,a as p,b as j,c as v}from"./card-D76uvpWc.js";import{L as o}from"./label-DfOp08y2.js";import{M as P}from"./markdown-editor-BF59F19G.js";import{A as R}from"./arrow-left-FN8jcXkb.js";import{C as $}from"./circle-check-big-DcB3o-ep.js";function Q(){const F=D(),{toast:h}=M(),[n,x]=l.useState({stack:{runtime:"",framework:"",language:"",database:"",deployment:"",repository:""},commands:{}}),[y,f]=l.useState(""),[E,k]=l.useState(""),[L,N]=l.useState(!0),[C,w]=l.useState(!1);l.useEffect(()=>{fetch(`${b}/api/v1/context/architecture`).then(t=>t.json()).then(t=>{if(t.success){const a=t.document,m={stack:{runtime:a.metadata.stack?.runtime||"",framework:a.metadata.stack?.framework||"",language:a.metadata.stack?.language||"",database:a.metadata.stack?.database||"",deployment:a.metadata.stack?.deployment||"",repository:a.metadata.stack?.repository||""},commands:a.metadata.commands||{}};x(m);const s=Object.entries(m.commands).map(([r,c])=>`${r}: ${c}`).join(`
|
|
2
2
|
`);k(s),f(a.content.trim())}N(!1)}).catch(t=>{console.error("Failed to load context:",t),h({title:"Error",description:"Failed to load architecture documentation",variant:"destructive"}),N(!1)})},[h]);const A=async()=>{w(!0);try{const a=await(await fetch(`${b}/api/v1/context/architecture`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:y,metadata:{stack:n.stack,commands:n.commands}})})).json();if(a.success)h({title:"Success",description:"Architecture documentation saved successfully",action:e.jsx($,{className:"h-4 w-4"})}),F("/context/architecture");else throw new Error(a.error||"Failed to save context")}catch(t){console.error("Save error:",t),h({title:"Error",description:"Failed to save architecture documentation",variant:"destructive"})}finally{w(!1)}},i=(t,a)=>{x(m=>{const s={...m},r=t.split(".");let c=s;for(let g=0;g<r.length-1;g++)c=c[r[g]];return c[r[r.length-1]]=a,s})},T=t=>{k(t);const a={};t.split(`
|
|
3
3
|
`).filter(s=>s.trim()).forEach(s=>{const[r,...c]=s.split(":");r&&c.length>0&&(a[r.trim()]=c.join(":").trim())}),x(s=>({...s,commands:a}))};return L?e.jsx("div",{className:"space-y-6",children:e.jsx(u,{children:e.jsx(p,{className:"pt-6",children:e.jsx("div",{className:"text-center",children:e.jsx("p",{children:"Loading..."})})})})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("h1",{className:"text-xl sm:text-2xl font-bold tracking-tight",children:"Edit Architecture"}),e.jsx("p",{className:"text-muted-foreground text-sm hidden sm:block",children:"Edit technical architecture and supporting metadata"})]}),e.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[e.jsx(S,{variant:"ghost",size:"sm",asChild:!0,children:e.jsx(I,{to:"/context/architecture",className:"text-muted-foreground hover:text-foreground transition-colors",children:e.jsx(R,{className:"w-4 h-4"})})}),e.jsxs(S,{onClick:A,disabled:C,size:"sm",children:[e.jsx(_,{className:"w-4 h-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:C?"Saving...":"Save"})]})]})]}),e.jsxs(u,{children:[e.jsx(j,{children:e.jsx(v,{children:"Technology Stack"})}),e.jsxs(p,{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(o,{htmlFor:"runtime",children:"Runtime"}),e.jsx(d,{id:"runtime",value:n.stack.runtime,onChange:t=>i("stack.runtime",t.target.value),placeholder:"node|python|go|etc"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(o,{htmlFor:"framework",children:"Framework"}),e.jsx(d,{id:"framework",value:n.stack.framework,onChange:t=>i("stack.framework",t.target.value),placeholder:"express|fastify|django|gin|etc"})]})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(o,{htmlFor:"language",children:"Language"}),e.jsx(d,{id:"language",value:n.stack.language,onChange:t=>i("stack.language",t.target.value),placeholder:"typescript|javascript|python|go|etc"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(o,{htmlFor:"database",children:"Database"}),e.jsx(d,{id:"database",value:n.stack.database,onChange:t=>i("stack.database",t.target.value),placeholder:"postgresql|mysql|mongodb|sqlite|etc"})]})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(o,{htmlFor:"deployment",children:"Deployment"}),e.jsx(d,{id:"deployment",value:n.stack.deployment,onChange:t=>i("stack.deployment",t.target.value),placeholder:"docker|kubernetes|vercel|aws|etc"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(o,{htmlFor:"repository",children:"Repository"}),e.jsx(d,{id:"repository",value:n.stack.repository,onChange:t=>i("stack.repository",t.target.value),placeholder:"https://github.com/yourorg/yourproject"})]})]})]})]}),e.jsxs(u,{children:[e.jsx(j,{children:e.jsx(v,{children:"Quick Commands"})}),e.jsx(p,{className:"space-y-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx(o,{htmlFor:"commands",children:"Commands (format: command_name: command_to_run)"}),e.jsx(B,{id:"commands",value:E,onChange:t=>T(t.target.value),placeholder:`install: npm install
|
|
4
4
|
dev: npm run dev
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as g,r as n,A as v,j as e,J as y,F as k,B as l,M as b,aC as C,L as w,R as E,az as A}from"./index-
|
|
1
|
+
import{a as g,r as n,A as v,j as e,J as y,F as k,B as l,M as b,aC as C,L as w,R as E,az as A}from"./index-BxthLB0X.js";import{C as a,a as c,b as o,c as m}from"./card-D76uvpWc.js";import{c as D}from"./clipboard-B9ndUJKl.js";function S(){const{toast:h}=g(),[r,x]=n.useState(null),[u,p]=n.useState(!0),[j,i]=n.useState(!1);n.useEffect(()=>{fetch(`${v}/api/v1/context/architecture`).then(t=>{if(t.ok)return t.json();throw new Error("Not found")}).then(t=>{t.success?(x(t.document),i(!0)):i(!1)}).catch(()=>{i(!1)}).finally(()=>{p(!1)})},[]);const N=async()=>{const t=".nut/context/architecture.md";try{await D(t),h({title:"Copied!",description:`Path ${t} copied to clipboard`})}catch(d){console.error("Failed to copy path:",d),h({title:"Error",description:"Failed to copy path to clipboard",variant:"destructive"})}},f=()=>{const t=new CustomEvent("discuss-in-chat",{detail:{type:"context",id:"architecture-md",filename:"architecture.md",name:"architecture.md",path:".nut/context/architecture.md"}});window.dispatchEvent(t)};if(u)return e.jsx("div",{className:"space-y-6",children:e.jsx(a,{children:e.jsx(c,{className:"pt-6",children:e.jsxs("div",{className:"flex items-center justify-center",children:[e.jsx(y,{className:"h-8 w-8 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-2 text-muted-foreground",children:"Loading architecture documentation..."})]})})})});if(!j||!r)return e.jsx("div",{className:"space-y-6",children:e.jsx(a,{children:e.jsx(c,{className:"pt-6",children:e.jsxs("div",{className:"text-center",children:[e.jsx(k,{className:"mx-auto h-12 w-12 text-muted-foreground"}),e.jsx("h3",{className:"mt-4 text-lg font-semibold",children:"No Architecture Documentation Found"}),e.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:"Architecture documentation will appear here once created."})]})})})});const s=r.metadata;return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Technical Architecture"}),e.jsx("p",{className:"text-muted-foreground",children:"System design, components, and technical patterns"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(l,{variant:"outline",size:"sm",onClick:f,children:[e.jsx(b,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Discuss"})]}),e.jsxs(l,{variant:"outline",size:"sm",onClick:N,children:[e.jsx(C,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Copy Path"})]}),e.jsx(l,{size:"sm",asChild:!0,children:e.jsxs(w,{to:"/context/architecture/edit",children:[e.jsx(E,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Edit"})]})})]})]}),s&&e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs(a,{children:[e.jsx(o,{className:"pb-3",children:e.jsx(m,{className:"text-lg font-semibold",children:"Technology Stack"})}),e.jsx(c,{className:"space-y-3",children:s.stack&&e.jsxs("div",{className:"space-y-1 text-sm",children:[s.stack.runtime&&e.jsxs("div",{children:["Runtime: ",s.stack.runtime]}),s.stack.framework&&e.jsxs("div",{children:["Framework: ",s.stack.framework]}),s.stack.language&&e.jsxs("div",{children:["Language: ",s.stack.language]}),s.stack.database&&e.jsxs("div",{children:["Database: ",s.stack.database]}),s.stack.deployment&&e.jsxs("div",{children:["Deployment: ",s.stack.deployment]}),s.stack.repository&&e.jsxs("div",{children:["Repository:"," ",e.jsx("a",{href:s.stack.repository,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",children:s.stack.repository})]})]})})]}),e.jsxs(a,{children:[e.jsx(o,{className:"pb-3",children:e.jsx(m,{className:"text-lg font-semibold",children:"Quick Commands"})}),e.jsx(c,{className:"space-y-3",children:s.commands&&e.jsxs("div",{className:"space-y-1",children:[Object.entries(s.commands).slice(0,5).map(([t,d])=>e.jsxs("div",{className:"text-sm",children:[e.jsxs("span",{className:"font-medium capitalize",children:[t,": "]}),e.jsx("code",{className:"bg-muted px-2 py-1 rounded text-xs",children:d})]},t)),Object.entries(s.commands).length>5&&e.jsxs("div",{className:"text-xs text-muted-foreground",children:["+ ",Object.entries(s.commands).length-5," more commands"]})]})})]})]}),e.jsxs(a,{children:[e.jsx(o,{children:e.jsx(m,{className:"text-lg font-semibold",children:"Architecture Documentation"})}),e.jsx(c,{children:e.jsx("div",{className:"prose prose-sm max-w-none dark:prose-invert",children:e.jsx(A,{children:r.content||"No content available"})})})]})]})}export{S as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as Y,H as le,r as n,b6 as c,j as e,a7 as I,o as ce,D as O,a5 as $,B as l,b as M,d as V,f as H,g as _,I as j,h as J,i as z,k as W,l as q,m as a,a6 as B,U as oe,V as de,W as he,Y as ue,Z as xe,_ as me,$ as ge,a0 as je,a1 as pe,a2 as ve,N as r}from"./index-
|
|
1
|
+
import{c as Y,H as le,r as n,b6 as c,j as e,a7 as I,o as ce,D as O,a5 as $,B as l,b as M,d as V,f as H,g as _,I as j,h as J,i as z,k as W,l as q,m as a,a6 as B,U as oe,V as de,W as he,Y as ue,Z as xe,_ as me,$ as ge,a0 as je,a1 as pe,a2 as ve,N as r}from"./index-BxthLB0X.js";import{C as p,b as v,c as w,d as f,a as y}from"./card-D76uvpWc.js";import{L as o}from"./label-DfOp08y2.js";import{S as U}from"./switch-C2fktd0p.js";import{B as k}from"./badge-DRh3rRQu.js";import{C as we}from"./circle-alert-TRE_RDZ5.js";/**
|
|
2
2
|
* @license lucide-react v0.542.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as m,j as e,J as x,A as f}from"./index-
|
|
1
|
+
import{r as m,j as e,J as x,A as f}from"./index-BxthLB0X.js";import{C as w}from"./circle-check-DDmlur4r.js";import{C as b}from"./circle-x-DWYSgfOn.js";const r="coconut/github-auth-state";function j(s){try{window.opener&&window.opener.postMessage({type:"github-auth",...s},window.location.origin)}catch{}}const v=()=>{const[s,d]=m.useState("pending"),[h,p]=m.useState("Authorizing GitHub…");return m.useEffect(()=>{const a=new URLSearchParams(window.location.search),u=a.get("error"),l=a.get("token"),n=a.get("expires_at")||a.get("expiresAt"),c=a.get("state"),o=t=>{j(t),d(t.success?"success":"error"),p(t.message),setTimeout(()=>{try{window.close()}catch{}},1200)};if(u){localStorage.removeItem(r),o({success:!1,message:decodeURIComponent(u)});return}if(!l||!n||!c){localStorage.removeItem(r),o({success:!1,message:"Missing authorization parameters. Please try again."});return}const g=localStorage.getItem(r);if(!g||g!==c){localStorage.removeItem(r),o({success:!1,message:"Authorization state mismatch. Please start again."});return}(async()=>{try{const t=await fetch(`${f}/api/v1/git/providers/github/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:l,expiresAt:n,state:c})}),i=await t.json();if(!t.ok||!i.success)throw new Error(i?.error?.message||"Failed to store GitHub token");localStorage.removeItem(r),o({success:!0,message:"GitHub connected successfully!",expiresAt:i.data?.expiresAt||n})}catch(t){localStorage.removeItem(r),o({success:!1,message:t?.message||"Failed to store GitHub token. Please try again."})}})()},[]),e.jsx("div",{className:"flex h-screen items-center justify-center bg-background px-6",children:e.jsxs("div",{className:"max-w-sm rounded-lg border bg-card p-6 text-center shadow-sm",children:[e.jsxs("div",{className:"mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted",children:[s==="pending"&&e.jsx(x,{className:"h-6 w-6 animate-spin text-muted-foreground"}),s==="success"&&e.jsx(w,{className:"h-6 w-6 text-green-600"}),s==="error"&&e.jsx(b,{className:"h-6 w-6 text-red-600"})]}),e.jsx("h1",{className:"text-lg font-semibold",children:"GitHub Authorization"}),e.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:h}),s!=="pending"&&e.jsx("p",{className:"mt-4 text-xs text-muted-foreground",children:"You can close this window and return to Coconut."})]})})};export{v as default};
|