@castlemilk/omega 0.1.5 → 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.
Files changed (31) hide show
  1. package/dist/cli.js +23 -13
  2. package/dist/server.js +25 -0
  3. package/dist/web/dist/App.d.ts +3 -0
  4. package/dist/web/dist/App.d.ts.map +1 -0
  5. package/dist/web/dist/App.js +39 -0
  6. package/dist/web/dist/App.js.map +1 -0
  7. package/dist/web/dist/components/ProjectSidebar.d.ts +18 -0
  8. package/dist/web/dist/components/ProjectSidebar.d.ts.map +1 -0
  9. package/dist/web/dist/components/ProjectSidebar.js +16 -0
  10. package/dist/web/dist/components/ProjectSidebar.js.map +1 -0
  11. package/dist/web/dist/components/ProviderSettings.d.ts +16 -0
  12. package/dist/web/dist/components/ProviderSettings.d.ts.map +1 -0
  13. package/dist/web/dist/components/ProviderSettings.js +41 -0
  14. package/dist/web/dist/components/ProviderSettings.js.map +1 -0
  15. package/dist/web/dist/components/RouterPanel.d.ts +2 -0
  16. package/dist/web/dist/components/RouterPanel.d.ts.map +1 -0
  17. package/dist/web/dist/components/RouterPanel.js +31 -0
  18. package/dist/web/dist/components/RouterPanel.js.map +1 -0
  19. package/dist/web/dist/components/TaskBoard.d.ts +20 -0
  20. package/dist/web/dist/components/TaskBoard.d.ts.map +1 -0
  21. package/dist/web/dist/components/TaskBoard.js +60 -0
  22. package/dist/web/dist/components/TaskBoard.js.map +1 -0
  23. package/dist/web/dist/lib/api.d.ts +30 -0
  24. package/dist/web/dist/lib/api.d.ts.map +1 -0
  25. package/dist/web/dist/lib/api.js +27 -0
  26. package/dist/web/dist/lib/api.js.map +1 -0
  27. package/dist/web/dist/main.d.ts +2 -0
  28. package/dist/web/dist/main.d.ts.map +1 -0
  29. package/dist/web/dist/main.js +7 -0
  30. package/dist/web/dist/main.js.map +1 -0
  31. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -90,14 +90,18 @@ function startBundledServer() {
90
90
  }
91
91
  return void 0;
92
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
+ }
93
101
  async function waitForApi(maxMs = 15e3) {
94
102
  const deadline = Date.now() + maxMs;
95
103
  while (Date.now() < deadline) {
96
- try {
97
- const res = await fetch(`${API}/projects`);
98
- if (res.ok) return;
99
- } catch {
100
- }
104
+ if (await isApiReady()) return;
101
105
  await new Promise((r) => setTimeout(r, 300));
102
106
  }
103
107
  throw new Error("Server did not become ready in time");
@@ -128,20 +132,26 @@ async function ensureProject() {
128
132
  }
129
133
  }
130
134
  var uiCmd = new Command3("ui").description("Open the harness web UI").action(async () => {
131
- const server = startBundledServer() ?? spawn("pnpm", ["--filter", "@omega/server", "dev"], {
132
- stdio: "inherit",
133
- shell: true
134
- });
135
- server.on("exit", (code) => {
136
- process.exit(code ?? 0);
137
- });
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
+ }
138
148
  try {
139
149
  await waitForApi();
140
150
  await ensureProject();
141
151
  await open(API);
142
152
  } catch (err) {
143
153
  console.error(err);
144
- server.kill();
154
+ server?.kill();
145
155
  process.exit(1);
146
156
  }
147
157
  });
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,3 @@
1
+ declare function App(): import("react").JSX.Element;
2
+ export default App;
3
+ //# sourceMappingURL=App.d.ts.map
@@ -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,2 @@
1
+ export declare function RouterPanel(): import("react").JSX.Element;
2
+ //# sourceMappingURL=RouterPanel.d.ts.map
@@ -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,2 @@
1
+ import './index.css';
2
+ //# sourceMappingURL=main.d.ts.map
@@ -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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@castlemilk/omega",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Omega Harness CLI - installable via npx",
5
5
  "type": "module",
6
6
  "main": "./dist/cli.js",