@castlemilk/omega 0.1.4 → 0.1.6
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/cli.js +64 -10
- package/dist/server.js +25 -0
- package/dist/web/dist/App.d.ts +3 -0
- package/dist/web/dist/App.d.ts.map +1 -0
- package/dist/web/dist/App.js +39 -0
- package/dist/web/dist/App.js.map +1 -0
- package/dist/web/dist/components/ProjectSidebar.d.ts +18 -0
- package/dist/web/dist/components/ProjectSidebar.d.ts.map +1 -0
- package/dist/web/dist/components/ProjectSidebar.js +16 -0
- package/dist/web/dist/components/ProjectSidebar.js.map +1 -0
- package/dist/web/dist/components/ProviderSettings.d.ts +16 -0
- package/dist/web/dist/components/ProviderSettings.d.ts.map +1 -0
- package/dist/web/dist/components/ProviderSettings.js +41 -0
- package/dist/web/dist/components/ProviderSettings.js.map +1 -0
- package/dist/web/dist/components/RouterPanel.d.ts +2 -0
- package/dist/web/dist/components/RouterPanel.d.ts.map +1 -0
- package/dist/web/dist/components/RouterPanel.js +31 -0
- package/dist/web/dist/components/RouterPanel.js.map +1 -0
- package/dist/web/dist/components/TaskBoard.d.ts +20 -0
- package/dist/web/dist/components/TaskBoard.d.ts.map +1 -0
- package/dist/web/dist/components/TaskBoard.js +60 -0
- package/dist/web/dist/components/TaskBoard.js.map +1 -0
- package/dist/web/dist/lib/api.d.ts +30 -0
- package/dist/web/dist/lib/api.d.ts.map +1 -0
- package/dist/web/dist/lib/api.js +27 -0
- package/dist/web/dist/lib/api.js.map +1 -0
- package/dist/web/dist/main.d.ts +2 -0
- package/dist/web/dist/main.d.ts.map +1 -0
- package/dist/web/dist/main.js +7 -0
- package/dist/web/dist/main.js.map +1 -0
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -82,6 +82,7 @@ import { fileURLToPath } from "url";
|
|
|
82
82
|
import open from "open";
|
|
83
83
|
var __filename = fileURLToPath(import.meta.url);
|
|
84
84
|
var __dirname = path.dirname(__filename);
|
|
85
|
+
var API = process.env.HARNESS_API_URL || "http://localhost:4000";
|
|
85
86
|
function startBundledServer() {
|
|
86
87
|
const serverPath = path.resolve(__dirname, "server.js");
|
|
87
88
|
if (existsSync(serverPath)) {
|
|
@@ -89,17 +90,70 @@ function startBundledServer() {
|
|
|
89
90
|
}
|
|
90
91
|
return void 0;
|
|
91
92
|
}
|
|
93
|
+
async function isApiReady() {
|
|
94
|
+
try {
|
|
95
|
+
const res = await fetch(`${API}/projects`);
|
|
96
|
+
return res.ok;
|
|
97
|
+
} catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function waitForApi(maxMs = 15e3) {
|
|
102
|
+
const deadline = Date.now() + maxMs;
|
|
103
|
+
while (Date.now() < deadline) {
|
|
104
|
+
if (await isApiReady()) return;
|
|
105
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
106
|
+
}
|
|
107
|
+
throw new Error("Server did not become ready in time");
|
|
108
|
+
}
|
|
109
|
+
async function ensureProject() {
|
|
110
|
+
const cwd = process.cwd();
|
|
111
|
+
const name = path.basename(cwd);
|
|
112
|
+
try {
|
|
113
|
+
const listRes = await fetch(`${API}/projects`);
|
|
114
|
+
const projects = await listRes.json();
|
|
115
|
+
const existing = projects.find((p) => p.path === cwd);
|
|
116
|
+
if (existing) {
|
|
117
|
+
console.log(`Using existing project: ${name}`);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const createRes = await fetch(`${API}/projects`, {
|
|
121
|
+
method: "POST",
|
|
122
|
+
headers: { "Content-Type": "application/json" },
|
|
123
|
+
body: JSON.stringify({ name, path: cwd })
|
|
124
|
+
});
|
|
125
|
+
if (createRes.ok) {
|
|
126
|
+
console.log(`Added project: ${name}`);
|
|
127
|
+
} else {
|
|
128
|
+
console.warn("Could not auto-add project:", await createRes.text());
|
|
129
|
+
}
|
|
130
|
+
} catch (err) {
|
|
131
|
+
console.warn("Could not auto-detect project:", err);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
92
134
|
var uiCmd = new Command3("ui").description("Open the harness web UI").action(async () => {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
135
|
+
let server = void 0;
|
|
136
|
+
const alreadyRunning = await isApiReady();
|
|
137
|
+
if (!alreadyRunning) {
|
|
138
|
+
server = startBundledServer() ?? spawn("pnpm", ["--filter", "@omega/server", "dev"], {
|
|
139
|
+
stdio: "inherit",
|
|
140
|
+
shell: true
|
|
141
|
+
});
|
|
142
|
+
server.on("exit", (code) => {
|
|
143
|
+
process.exit(code ?? 0);
|
|
144
|
+
});
|
|
145
|
+
} else {
|
|
146
|
+
console.log("Using existing harness server on port 4000");
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
await waitForApi();
|
|
150
|
+
await ensureProject();
|
|
151
|
+
await open(API);
|
|
152
|
+
} catch (err) {
|
|
153
|
+
console.error(err);
|
|
154
|
+
server?.kill();
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
103
157
|
});
|
|
104
158
|
|
|
105
159
|
// ../../apps/cli/src/commands/skill.ts
|
package/dist/server.js
CHANGED
|
@@ -181,6 +181,17 @@ var GeminiProvider = class {
|
|
|
181
181
|
}
|
|
182
182
|
};
|
|
183
183
|
|
|
184
|
+
// ../providers/src/kimi.ts
|
|
185
|
+
var KimiProvider = class extends OpenAIProvider {
|
|
186
|
+
constructor(config) {
|
|
187
|
+
super({
|
|
188
|
+
...config,
|
|
189
|
+
baseUrl: config.baseUrl || "https://api.moonshot.ai/v1"
|
|
190
|
+
});
|
|
191
|
+
this.config = config;
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
|
|
184
195
|
// ../providers/src/generic.ts
|
|
185
196
|
var GenericProvider = class extends OpenAIProvider {
|
|
186
197
|
};
|
|
@@ -196,6 +207,8 @@ function createProvider(config) {
|
|
|
196
207
|
return new OllamaProvider(config);
|
|
197
208
|
case "gemini":
|
|
198
209
|
return new GeminiProvider(config);
|
|
210
|
+
case "kimi":
|
|
211
|
+
return new KimiProvider(config);
|
|
199
212
|
case "generic":
|
|
200
213
|
return new GenericProvider(config);
|
|
201
214
|
default:
|
|
@@ -278,6 +291,18 @@ var providerConfigs = [
|
|
|
278
291
|
enabled: true
|
|
279
292
|
}
|
|
280
293
|
];
|
|
294
|
+
if (process.env.KIMI_API_KEY) {
|
|
295
|
+
providerConfigs.push({
|
|
296
|
+
id: "default-kimi",
|
|
297
|
+
name: "kimi",
|
|
298
|
+
kind: "kimi",
|
|
299
|
+
baseUrl: "https://api.moonshot.cn/v1",
|
|
300
|
+
apiKey: process.env.KIMI_API_KEY,
|
|
301
|
+
defaultModel: "moonshot-v1-8k",
|
|
302
|
+
capabilities: [{ name: "moonshot-v1-8k", level: "advanced" }],
|
|
303
|
+
enabled: true
|
|
304
|
+
});
|
|
305
|
+
}
|
|
281
306
|
var rules = [];
|
|
282
307
|
function newId() {
|
|
283
308
|
return `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AAOA,iBAAS,GAAG,gCAoDX;AAED,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { api } from './lib/api.js';
|
|
4
|
+
import { ProjectSidebar } from './components/ProjectSidebar.js';
|
|
5
|
+
import { TaskBoard } from './components/TaskBoard.js';
|
|
6
|
+
import { ProviderSettings } from './components/ProviderSettings.js';
|
|
7
|
+
import { RouterPanel } from './components/RouterPanel.js';
|
|
8
|
+
function App() {
|
|
9
|
+
const [projects, setProjects] = useState([]);
|
|
10
|
+
const [providers, setProviders] = useState([]);
|
|
11
|
+
const [selectedProjectId, setSelectedProjectId] = useState();
|
|
12
|
+
const [error, setError] = useState('');
|
|
13
|
+
async function loadProjects() {
|
|
14
|
+
try {
|
|
15
|
+
const data = await api.getProjects();
|
|
16
|
+
setProjects(data);
|
|
17
|
+
setError('');
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async function loadProviders() {
|
|
24
|
+
try {
|
|
25
|
+
const data = await api.getProviders();
|
|
26
|
+
setProviders(data);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
loadProjects();
|
|
34
|
+
loadProviders();
|
|
35
|
+
}, []);
|
|
36
|
+
return (_jsxs("div", { className: "flex h-screen w-screen overflow-hidden", children: [_jsx(ProjectSidebar, { projects: projects, selectedId: selectedProjectId, onSelect: setSelectedProjectId, onChange: loadProjects }), _jsx(TaskBoard, { projectId: selectedProjectId }), _jsxs("aside", { className: "w-80 bg-white border-l border-gray-200 h-screen overflow-y-auto", children: [error && (_jsx("div", { className: "p-3 bg-red-50 text-red-700 text-xs border-b border-red-100", children: error })), _jsx(ProviderSettings, { providers: providers, onChange: loadProviders }), _jsx(RouterPanel, {})] })] }));
|
|
37
|
+
}
|
|
38
|
+
export default App;
|
|
39
|
+
//# sourceMappingURL=App.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,cAAc,EAAgB,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAiB,MAAM,kCAAkC,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,SAAS,GAAG;IACV,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAY,EAAE,CAAC,CAAC;IACxD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAa,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,EAAU,CAAC;IACrE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,KAAK,UAAU,YAAY;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YACrC,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,QAAQ,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,KAAK,UAAU,aAAa;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC;YACtC,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,EAAE,CAAC;QACf,aAAa,EAAE,CAAC;IAClB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,eAAK,SAAS,EAAC,wCAAwC,aACrD,KAAC,cAAc,IACb,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,iBAAiB,EAC7B,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,YAAY,GACtB,EAEF,KAAC,SAAS,IAAC,SAAS,EAAE,iBAAiB,GAAI,EAE3C,iBAAO,SAAS,EAAC,iEAAiE,aAC/E,KAAK,IAAI,CACR,cAAK,SAAS,EAAC,4DAA4D,YACxE,KAAK,GACF,CACP,EACD,KAAC,gBAAgB,IAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAI,EACnE,KAAC,WAAW,KAAG,IACT,IACJ,CACP,CAAC;AACJ,CAAC;AAED,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface Project {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
path: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
_count?: {
|
|
7
|
+
tasks: number;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
interface Props {
|
|
11
|
+
projects: Project[];
|
|
12
|
+
selectedId?: string;
|
|
13
|
+
onSelect: (id: string) => void;
|
|
14
|
+
onChange: () => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function ProjectSidebar({ projects, selectedId, onSelect, onChange }: Props): import("react").JSX.Element;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=ProjectSidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectSidebar.d.ts","sourceRoot":"","sources":["../../src/components/ProjectSidebar.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5B;AAED,UAAU,KAAK;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,+BAoFjF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { api } from '../lib/api.js';
|
|
4
|
+
export function ProjectSidebar({ projects, selectedId, onSelect, onChange }) {
|
|
5
|
+
const [form, setForm] = useState({ name: '', path: '', repoUrl: '', description: '' });
|
|
6
|
+
const [open, setOpen] = useState(false);
|
|
7
|
+
async function handleSubmit(e) {
|
|
8
|
+
e.preventDefault();
|
|
9
|
+
await api.createProject(form);
|
|
10
|
+
setForm({ name: '', path: '', repoUrl: '', description: '' });
|
|
11
|
+
setOpen(false);
|
|
12
|
+
onChange();
|
|
13
|
+
}
|
|
14
|
+
return (_jsxs("aside", { className: "w-72 bg-white border-r border-gray-200 h-screen flex flex-col", children: [_jsxs("div", { className: "p-4 border-b border-gray-200", children: [_jsx("h1", { className: "text-lg font-bold", children: "Omega Harness" }), _jsx("p", { className: "text-xs text-gray-500", children: "Projects" })] }), _jsx("div", { className: "flex-1 overflow-y-auto p-2 space-y-1", children: projects.map((p) => (_jsxs("button", { onClick: () => onSelect(p.id), className: `w-full text-left px-3 py-2 rounded-md text-sm ${selectedId === p.id ? 'bg-blue-50 text-blue-700 font-medium' : 'hover:bg-gray-100'}`, children: [_jsxs("div", { className: "flex justify-between items-center", children: [_jsx("span", { className: "truncate", children: p.name }), _jsx("span", { className: "text-xs text-gray-400", children: p._count?.tasks ?? 0 })] }), _jsx("div", { className: "text-xs text-gray-400 truncate", children: p.path })] }, p.id))) }), _jsx("div", { className: "p-3 border-t border-gray-200", children: !open ? (_jsx("button", { onClick: () => setOpen(true), className: "w-full px-3 py-2 bg-blue-600 text-white rounded-md text-sm hover:bg-blue-700", children: "+ Add project" })) : (_jsxs("form", { onSubmit: handleSubmit, className: "space-y-2", children: [_jsx("input", { className: "w-full border rounded px-2 py-1 text-sm", placeholder: "Name", value: form.name, onChange: (e) => setForm({ ...form, name: e.target.value }), required: true }), _jsx("input", { className: "w-full border rounded px-2 py-1 text-sm", placeholder: "Path", value: form.path, onChange: (e) => setForm({ ...form, path: e.target.value }), required: true }), _jsx("input", { className: "w-full border rounded px-2 py-1 text-sm", placeholder: "Repo URL (optional)", value: form.repoUrl, onChange: (e) => setForm({ ...form, repoUrl: e.target.value }) }), _jsxs("div", { className: "flex gap-2", children: [_jsx("button", { type: "submit", className: "flex-1 px-3 py-1 bg-blue-600 text-white rounded text-sm", children: "Save" }), _jsx("button", { type: "button", onClick: () => setOpen(false), className: "flex-1 px-3 py-1 bg-gray-200 rounded text-sm", children: "Cancel" })] })] })) })] }));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=ProjectSidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectSidebar.js","sourceRoot":"","sources":["../../src/components/ProjectSidebar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface Provider {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
kind: string;
|
|
5
|
+
baseUrl?: string;
|
|
6
|
+
defaultModel: string;
|
|
7
|
+
capabilities: string;
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface Props {
|
|
11
|
+
providers: Provider[];
|
|
12
|
+
onChange: () => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function ProviderSettings({ providers, onChange }: Props): import("react").JSX.Element;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=ProviderSettings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderSettings.d.ts","sourceRoot":"","sources":["../../src/components/ProviderSettings.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,KAAK;IACb,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,KAAK,+BA+H9D"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { api } from '../lib/api.js';
|
|
4
|
+
export function ProviderSettings({ providers, onChange }) {
|
|
5
|
+
const [open, setOpen] = useState(false);
|
|
6
|
+
const [form, setForm] = useState({
|
|
7
|
+
name: '',
|
|
8
|
+
kind: 'generic',
|
|
9
|
+
baseUrl: '',
|
|
10
|
+
apiKey: '',
|
|
11
|
+
defaultModel: '',
|
|
12
|
+
capabilities: '[{"name":"model","level":"capable"}]',
|
|
13
|
+
});
|
|
14
|
+
async function handleToggle(id) {
|
|
15
|
+
await api.toggleProvider(id);
|
|
16
|
+
onChange();
|
|
17
|
+
}
|
|
18
|
+
async function handleDelete(id) {
|
|
19
|
+
await api.deleteProvider(id);
|
|
20
|
+
onChange();
|
|
21
|
+
}
|
|
22
|
+
async function handleSubmit(e) {
|
|
23
|
+
e.preventDefault();
|
|
24
|
+
await api.createProvider({
|
|
25
|
+
...form,
|
|
26
|
+
capabilities: form.capabilities,
|
|
27
|
+
});
|
|
28
|
+
setForm({
|
|
29
|
+
name: '',
|
|
30
|
+
kind: 'generic',
|
|
31
|
+
baseUrl: '',
|
|
32
|
+
apiKey: '',
|
|
33
|
+
defaultModel: '',
|
|
34
|
+
capabilities: '[{"name":"model","level":"capable"}]',
|
|
35
|
+
});
|
|
36
|
+
setOpen(false);
|
|
37
|
+
onChange();
|
|
38
|
+
}
|
|
39
|
+
return (_jsxs("div", { className: "p-4 border-b border-gray-200", children: [_jsxs("div", { className: "flex items-center justify-between mb-3", children: [_jsx("h3", { className: "font-semibold text-sm", children: "Providers" }), _jsx("button", { onClick: () => setOpen(!open), className: "text-xs px-2 py-1 bg-gray-200 rounded hover:bg-gray-300", children: open ? 'Cancel' : '+ Add' })] }), open && (_jsxs("form", { onSubmit: handleSubmit, className: "space-y-2 mb-3", children: [_jsx("input", { className: "w-full border rounded px-2 py-1 text-xs", placeholder: "Name", value: form.name, onChange: (e) => setForm({ ...form, name: e.target.value }), required: true }), _jsxs("select", { className: "w-full border rounded px-2 py-1 text-xs", value: form.kind, onChange: (e) => setForm({ ...form, kind: e.target.value }), children: [_jsx("option", { value: "openai", children: "OpenAI" }), _jsx("option", { value: "anthropic", children: "Anthropic" }), _jsx("option", { value: "ollama", children: "Ollama" }), _jsx("option", { value: "gemini", children: "Gemini" }), _jsx("option", { value: "generic", children: "Generic" })] }), _jsx("input", { className: "w-full border rounded px-2 py-1 text-xs", placeholder: "Base URL", value: form.baseUrl, onChange: (e) => setForm({ ...form, baseUrl: e.target.value }) }), _jsx("input", { className: "w-full border rounded px-2 py-1 text-xs", placeholder: "API key", value: form.apiKey, onChange: (e) => setForm({ ...form, apiKey: e.target.value }) }), _jsx("input", { className: "w-full border rounded px-2 py-1 text-xs", placeholder: "Default model", value: form.defaultModel, onChange: (e) => setForm({ ...form, defaultModel: e.target.value }), required: true }), _jsx("input", { className: "w-full border rounded px-2 py-1 text-xs", placeholder: "Capabilities JSON", value: form.capabilities, onChange: (e) => setForm({ ...form, capabilities: e.target.value }) }), _jsx("button", { type: "submit", className: "w-full px-2 py-1 bg-blue-600 text-white rounded text-xs", children: "Save provider" })] })), _jsx("div", { className: "space-y-2", children: providers.map((p) => (_jsxs("div", { className: "flex items-center justify-between text-xs bg-gray-50 p-2 rounded", children: [_jsxs("div", { children: [_jsx("div", { className: "font-medium", children: p.name }), _jsxs("div", { className: "text-gray-400", children: [p.kind, " \u2022 ", p.defaultModel] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { onClick: () => handleToggle(p.id), className: `px-2 py-1 rounded ${p.enabled ? 'bg-green-100 text-green-700' : 'bg-gray-200 text-gray-500'}`, children: p.enabled ? 'On' : 'Off' }), _jsx("button", { onClick: () => handleDelete(p.id), className: "text-red-500 hover:text-red-700", children: "\u00D7" })] })] }, p.id))) })] }));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=ProviderSettings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderSettings.js","sourceRoot":"","sources":["../../src/components/ProviderSettings.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouterPanel.d.ts","sourceRoot":"","sources":["../../src/components/RouterPanel.tsx"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,gCAuE1B"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { api } from '../lib/api.js';
|
|
4
|
+
export function RouterPanel() {
|
|
5
|
+
const [form, setForm] = useState({ title: '', complexity: 'simple', tags: '' });
|
|
6
|
+
const [result, setResult] = useState(null);
|
|
7
|
+
const [error, setError] = useState('');
|
|
8
|
+
const [loading, setLoading] = useState(false);
|
|
9
|
+
async function handleSubmit(e) {
|
|
10
|
+
e.preventDefault();
|
|
11
|
+
setLoading(true);
|
|
12
|
+
setError('');
|
|
13
|
+
setResult(null);
|
|
14
|
+
try {
|
|
15
|
+
const data = await api.selectProvider({
|
|
16
|
+
title: form.title,
|
|
17
|
+
complexity: form.complexity,
|
|
18
|
+
tags: form.tags.split(',').map((t) => t.trim()).filter(Boolean),
|
|
19
|
+
});
|
|
20
|
+
setResult(data);
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
setLoading(false);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return (_jsxs("div", { className: "p-4", children: [_jsx("h3", { className: "font-semibold text-sm mb-3", children: "Route preview" }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-2", children: [_jsx("input", { className: "w-full border rounded px-2 py-1 text-xs", placeholder: "Task title", value: form.title, onChange: (e) => setForm({ ...form, title: e.target.value }), required: true }), _jsxs("select", { className: "w-full border rounded px-2 py-1 text-xs", value: form.complexity, onChange: (e) => setForm({ ...form, complexity: e.target.value }), children: [_jsx("option", { value: "simple", children: "Simple" }), _jsx("option", { value: "medium", children: "Medium" }), _jsx("option", { value: "complex", children: "Complex" })] }), _jsx("input", { className: "w-full border rounded px-2 py-1 text-xs", placeholder: "Tags (comma separated)", value: form.tags, onChange: (e) => setForm({ ...form, tags: e.target.value }) }), _jsx("button", { type: "submit", disabled: loading, className: "w-full px-2 py-1 bg-purple-600 text-white rounded text-xs hover:bg-purple-700 disabled:opacity-50", children: loading ? 'Routing…' : 'Select provider' })] }), result && (_jsxs("div", { className: "mt-3 p-2 bg-purple-50 rounded text-xs", children: [_jsx("div", { className: "font-medium text-purple-800", children: "Selected" }), _jsxs("div", { children: [result.provider, " / ", result.model] })] })), error && _jsx("div", { className: "mt-3 text-xs text-red-600", children: error })] }));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=RouterPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouterPanel.js","sourceRoot":"","sources":["../../src/components/RouterPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface Task {
|
|
2
|
+
id: string;
|
|
3
|
+
projectId: string;
|
|
4
|
+
title: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
status: string;
|
|
7
|
+
complexity: string;
|
|
8
|
+
tags?: string;
|
|
9
|
+
provider?: string | null;
|
|
10
|
+
model?: string | null;
|
|
11
|
+
result?: string | null;
|
|
12
|
+
error?: string | null;
|
|
13
|
+
createdAt: string;
|
|
14
|
+
}
|
|
15
|
+
interface Props {
|
|
16
|
+
projectId?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function TaskBoard({ projectId }: Props): import("react").JSX.Element;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=TaskBoard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskBoard.d.ts","sourceRoot":"","sources":["../../src/components/TaskBoard.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,KAAK;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,+BA4J7C"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { api } from '../lib/api.js';
|
|
4
|
+
const statuses = ['todo', 'in_progress', 'done', 'failed'];
|
|
5
|
+
export function TaskBoard({ projectId }) {
|
|
6
|
+
const [tasks, setTasks] = useState([]);
|
|
7
|
+
const [loading, setLoading] = useState(false);
|
|
8
|
+
const [form, setForm] = useState({
|
|
9
|
+
title: '',
|
|
10
|
+
description: '',
|
|
11
|
+
complexity: 'simple',
|
|
12
|
+
tags: '',
|
|
13
|
+
});
|
|
14
|
+
async function load() {
|
|
15
|
+
if (!projectId)
|
|
16
|
+
return;
|
|
17
|
+
setLoading(true);
|
|
18
|
+
const data = await api.getTasks(projectId);
|
|
19
|
+
setTasks(data);
|
|
20
|
+
setLoading(false);
|
|
21
|
+
}
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
load();
|
|
24
|
+
}, [projectId]);
|
|
25
|
+
async function handleCreate(e) {
|
|
26
|
+
e.preventDefault();
|
|
27
|
+
if (!projectId)
|
|
28
|
+
return;
|
|
29
|
+
await api.createTask({
|
|
30
|
+
projectId,
|
|
31
|
+
title: form.title,
|
|
32
|
+
description: form.description,
|
|
33
|
+
complexity: form.complexity,
|
|
34
|
+
tags: form.tags.split(',').map((t) => t.trim()).filter(Boolean),
|
|
35
|
+
});
|
|
36
|
+
setForm({ title: '', description: '', complexity: 'simple', tags: '' });
|
|
37
|
+
await load();
|
|
38
|
+
}
|
|
39
|
+
async function handleRun(id) {
|
|
40
|
+
await api.runTask(id);
|
|
41
|
+
await load();
|
|
42
|
+
}
|
|
43
|
+
function tagsList(t) {
|
|
44
|
+
if (!t.tags)
|
|
45
|
+
return [];
|
|
46
|
+
try {
|
|
47
|
+
return JSON.parse(t.tags);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (!projectId) {
|
|
54
|
+
return (_jsx("div", { className: "flex-1 flex items-center justify-center text-gray-400", children: "Select a project to view tasks" }));
|
|
55
|
+
}
|
|
56
|
+
return (_jsxs("main", { className: "flex-1 flex flex-col h-screen overflow-hidden", children: [_jsx("header", { className: "px-6 py-4 border-b border-gray-200 bg-white", children: _jsx("h2", { className: "text-xl font-semibold", children: "Tasks" }) }), _jsx("div", { className: "p-4 bg-gray-50 border-b border-gray-200", children: _jsxs("form", { onSubmit: handleCreate, className: "flex flex-wrap gap-2 items-end", children: [_jsx("input", { className: "border rounded px-3 py-1.5 text-sm flex-1 min-w-[200px]", placeholder: "Task title", value: form.title, onChange: (e) => setForm({ ...form, title: e.target.value }), required: true }), _jsx("input", { className: "border rounded px-3 py-1.5 text-sm flex-1 min-w-[200px]", placeholder: "Description", value: form.description, onChange: (e) => setForm({ ...form, description: e.target.value }) }), _jsxs("select", { className: "border rounded px-3 py-1.5 text-sm", value: form.complexity, onChange: (e) => setForm({ ...form, complexity: e.target.value }), children: [_jsx("option", { value: "simple", children: "Simple" }), _jsx("option", { value: "medium", children: "Medium" }), _jsx("option", { value: "complex", children: "Complex" })] }), _jsx("input", { className: "border rounded px-3 py-1.5 text-sm w-32", placeholder: "Tags", value: form.tags, onChange: (e) => setForm({ ...form, tags: e.target.value }) }), _jsx("button", { type: "submit", className: "px-4 py-1.5 bg-blue-600 text-white rounded text-sm hover:bg-blue-700", children: "Add task" })] }) }), _jsx("div", { className: "flex-1 overflow-x-auto p-4", children: loading ? (_jsx("div", { className: "text-sm text-gray-500", children: "Loading tasks\u2026" })) : (_jsx("div", { className: "grid grid-cols-4 gap-4 min-w-[800px]", children: statuses.map((status) => (_jsxs("div", { className: "bg-gray-100 rounded-lg p-3", children: [_jsx("h3", { className: "text-xs font-bold uppercase tracking-wide text-gray-500 mb-3", children: status.replace('_', ' ') }), _jsx("div", { className: "space-y-2", children: tasks
|
|
57
|
+
.filter((t) => t.status === status)
|
|
58
|
+
.map((t) => (_jsxs("div", { className: "bg-white rounded-md p-3 shadow-sm text-sm", children: [_jsx("div", { className: "font-medium mb-1", children: t.title }), t.description && (_jsx("div", { className: "text-gray-500 text-xs mb-2 line-clamp-2", children: t.description })), _jsxs("div", { className: "flex flex-wrap gap-1 mb-2", children: [_jsx("span", { className: "px-1.5 py-0.5 bg-gray-200 rounded text-xs", children: t.complexity }), tagsList(t).map((tag) => (_jsx("span", { className: "px-1.5 py-0.5 bg-blue-100 text-blue-700 rounded text-xs", children: tag }, tag)))] }), t.provider && (_jsxs("div", { className: "text-xs text-gray-400 mb-2", children: [t.provider, "/", t.model] })), t.error && _jsx("div", { className: "text-xs text-red-600 mb-2", children: t.error }), t.result && (_jsx("div", { className: "text-xs text-gray-700 bg-gray-50 p-2 rounded mb-2 max-h-32 overflow-auto", children: t.result })), status !== 'in_progress' && (_jsx("button", { onClick: () => handleRun(t.id), className: "w-full px-2 py-1 bg-green-600 text-white rounded text-xs hover:bg-green-700", children: "Run" }))] }, t.id))) })] }, status))) })) })] }));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=TaskBoard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskBoard.js","sourceRoot":"","sources":["../../src/components/TaskBoard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const api: {
|
|
2
|
+
getProjects: () => Promise<any>;
|
|
3
|
+
createProject: (body: {
|
|
4
|
+
name: string;
|
|
5
|
+
path: string;
|
|
6
|
+
repoUrl?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
}) => Promise<any>;
|
|
9
|
+
deleteProject: (id: string) => Promise<any>;
|
|
10
|
+
getTasks: (projectId?: string) => Promise<any>;
|
|
11
|
+
createTask: (body: {
|
|
12
|
+
projectId: string;
|
|
13
|
+
title: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
complexity?: string;
|
|
16
|
+
tags?: string[];
|
|
17
|
+
}) => Promise<any>;
|
|
18
|
+
runTask: (id: string) => Promise<any>;
|
|
19
|
+
updateTask: (id: string, body: any) => Promise<any>;
|
|
20
|
+
getProviders: () => Promise<any>;
|
|
21
|
+
createProvider: (body: any) => Promise<any>;
|
|
22
|
+
toggleProvider: (id: string) => Promise<any>;
|
|
23
|
+
deleteProvider: (id: string) => Promise<any>;
|
|
24
|
+
selectProvider: (body: {
|
|
25
|
+
title: string;
|
|
26
|
+
complexity: string;
|
|
27
|
+
tags: string[];
|
|
28
|
+
}) => Promise<any>;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,GAAG;;0BAEQ;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;wBAExE,MAAM;2BAEH,MAAM;uBAEV;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB;kBACa,MAAM;qBACH,MAAM,QAAQ,GAAG;;2BAGX,GAAG;yBACL,MAAM;yBACN,MAAM;2BAEJ;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;CAE7E,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const API = import.meta.env.VITE_API_URL || 'http://localhost:4000';
|
|
2
|
+
async function request(path, init) {
|
|
3
|
+
const res = await fetch(`${API}${path}`, {
|
|
4
|
+
headers: { 'Content-Type': 'application/json' },
|
|
5
|
+
...init,
|
|
6
|
+
});
|
|
7
|
+
const data = await res.json().catch(() => null);
|
|
8
|
+
if (!res.ok) {
|
|
9
|
+
throw new Error(data?.error || `HTTP ${res.status}`);
|
|
10
|
+
}
|
|
11
|
+
return data;
|
|
12
|
+
}
|
|
13
|
+
export const api = {
|
|
14
|
+
getProjects: () => request('/projects'),
|
|
15
|
+
createProject: (body) => request('/projects', { method: 'POST', body: JSON.stringify(body) }),
|
|
16
|
+
deleteProject: (id) => request(`/projects/${id}`, { method: 'DELETE' }),
|
|
17
|
+
getTasks: (projectId) => request(`/tasks${projectId ? `?projectId=${projectId}` : ''}`),
|
|
18
|
+
createTask: (body) => request('/tasks', { method: 'POST', body: JSON.stringify(body) }),
|
|
19
|
+
runTask: (id) => request(`/tasks/${id}/run`, { method: 'POST' }),
|
|
20
|
+
updateTask: (id, body) => request(`/tasks/${id}`, { method: 'PATCH', body: JSON.stringify(body) }),
|
|
21
|
+
getProviders: () => request('/providers'),
|
|
22
|
+
createProvider: (body) => request('/providers', { method: 'POST', body: JSON.stringify(body) }),
|
|
23
|
+
toggleProvider: (id) => request(`/providers/${id}/toggle`, { method: 'PATCH' }),
|
|
24
|
+
deleteProvider: (id) => request(`/providers/${id}`, { method: 'DELETE' }),
|
|
25
|
+
selectProvider: (body) => request('/router/select', { method: 'POST', body: JSON.stringify(body) }),
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,uBAAuB,CAAC;AAEpE,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,IAAkB;IACrD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,EAAE,EAAE;QACvC,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,GAAG,IAAI;KACR,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IACvC,aAAa,EAAE,CAAC,IAA4E,EAAE,EAAE,CAC9F,OAAO,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IACtE,aAAa,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAE/E,QAAQ,EAAE,CAAC,SAAkB,EAAE,EAAE,CAC/B,OAAO,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAChE,UAAU,EAAE,CAAC,IAMZ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IACvE,OAAO,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACxE,UAAU,EAAE,CAAC,EAAU,EAAE,IAAS,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IAE/G,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;IACzC,cAAc,EAAE,CAAC,IAAS,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IACpG,cAAc,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACvF,cAAc,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAEjF,cAAc,EAAE,CAAC,IAA2D,EAAE,EAAE,CAC9E,OAAO,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;CAC5E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.tsx"],"names":[],"mappings":"AAGA,OAAO,aAAa,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import ReactDOM from 'react-dom/client';
|
|
4
|
+
import App from './App.js';
|
|
5
|
+
import './index.css';
|
|
6
|
+
ReactDOM.createRoot(document.getElementById('root')).render(_jsx(React.StrictMode, { children: _jsx(App, {}) }));
|
|
7
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,kBAAkB,CAAC;AACxC,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,aAAa,CAAC;AAErB,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAE,CAAC,CAAC,MAAM,CAC1D,KAAC,KAAK,CAAC,UAAU,cACf,KAAC,GAAG,KAAG,GACU,CACpB,CAAC"}
|