ikanban-web 0.1.1
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/README.md +65 -0
- package/bin/cli.js +1055 -0
- package/dist/apple-touch-icon-120x120.png +0 -0
- package/dist/apple-touch-icon-152x152.png +0 -0
- package/dist/apple-touch-icon-167x167.png +0 -0
- package/dist/apple-touch-icon-180x180.png +0 -0
- package/dist/apple-touch-icon.png +0 -0
- package/dist/apple-touch-icon.svg +16 -0
- package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/assets/ToolOutputDialog-BgFj3J4u.js +5 -0
- package/dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist/assets/index-BQJPAP5f.css +1 -0
- package/dist/assets/index-MBuF9PXk.js +2 -0
- package/dist/assets/main-C1GggQif.css +1 -0
- package/dist/assets/main-Dyy8WvPJ.js +311 -0
- package/dist/assets/vendor--DEobTDja.css +1 -0
- package/dist/assets/vendor-.bun-KwPUu5oc.js +4594 -0
- package/dist/assets/wasm-CG6Dc4jp.js +1 -0
- package/dist/assets/worker-suRQxAtO.js +155 -0
- package/dist/favicon-16.png +0 -0
- package/dist/favicon-32.png +0 -0
- package/dist/favicon.png +0 -0
- package/dist/favicon.svg +15 -0
- package/dist/index.html +325 -0
- package/dist/logo-dark-192x192.png +0 -0
- package/dist/logo-dark-512x512.svg +16 -0
- package/dist/logo-light-192x192.png +0 -0
- package/dist/logo-light-512x512.svg +16 -0
- package/dist/pwa-192.png +0 -0
- package/dist/pwa-512.png +0 -0
- package/dist/pwa-maskable-192.png +0 -0
- package/dist/pwa-maskable-512.png +0 -0
- package/dist/site.webmanifest +22 -0
- package/dist/sw.js +1 -0
- package/package.json +102 -0
- package/public/apple-touch-icon-120x120.png +0 -0
- package/public/apple-touch-icon-152x152.png +0 -0
- package/public/apple-touch-icon-167x167.png +0 -0
- package/public/apple-touch-icon-180x180.png +0 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/apple-touch-icon.svg +16 -0
- package/public/favicon-16.png +0 -0
- package/public/favicon-32.png +0 -0
- package/public/favicon.png +0 -0
- package/public/favicon.svg +15 -0
- package/public/logo-dark-192x192.png +0 -0
- package/public/logo-dark-512x512.svg +16 -0
- package/public/logo-light-192x192.png +0 -0
- package/public/logo-light-512x512.svg +16 -0
- package/public/pwa-192.png +0 -0
- package/public/pwa-512.png +0 -0
- package/public/pwa-maskable-192.png +0 -0
- package/public/pwa-maskable-512.png +0 -0
- package/public/site.webmanifest +22 -0
- package/server/TERMINAL_INPUT_WS_PROTOCOL.md +44 -0
- package/server/index.d.ts +28 -0
- package/server/index.js +11181 -0
- package/server/lib/cloudflare-tunnel.js +196 -0
- package/server/lib/git-credentials.js +74 -0
- package/server/lib/git-identity-storage.js +110 -0
- package/server/lib/git-service.js +2690 -0
- package/server/lib/github-auth.js +307 -0
- package/server/lib/github-device-flow.js +50 -0
- package/server/lib/github-octokit.js +10 -0
- package/server/lib/github-repo.js +55 -0
- package/server/lib/notification-message.js +49 -0
- package/server/lib/notification-message.test.js +59 -0
- package/server/lib/opencode-auth.js +81 -0
- package/server/lib/opencode-config.js +1840 -0
- package/server/lib/opencode-config.js.d.ts +12 -0
- package/server/lib/package-manager.js +255 -0
- package/server/lib/quota/DOCUMENTATION.md +52 -0
- package/server/lib/quota/index.js +21 -0
- package/server/lib/quota/providers/claude.js +107 -0
- package/server/lib/quota/providers/codex.js +111 -0
- package/server/lib/quota/providers/copilot.js +165 -0
- package/server/lib/quota/providers/google/api.js +92 -0
- package/server/lib/quota/providers/google/auth.js +108 -0
- package/server/lib/quota/providers/google/index.js +124 -0
- package/server/lib/quota/providers/google/transforms.js +109 -0
- package/server/lib/quota/providers/index.js +128 -0
- package/server/lib/quota/providers/interface.js +55 -0
- package/server/lib/quota/providers/kimi.js +108 -0
- package/server/lib/quota/providers/nanogpt.js +124 -0
- package/server/lib/quota/providers/openai.js +91 -0
- package/server/lib/quota/providers/openrouter.js +92 -0
- package/server/lib/quota/providers/zai.js +91 -0
- package/server/lib/quota/utils/auth.js +46 -0
- package/server/lib/quota/utils/formatters.js +76 -0
- package/server/lib/quota/utils/index.js +10 -0
- package/server/lib/quota/utils/transformers.js +55 -0
- package/server/lib/skills-catalog/cache.js +29 -0
- package/server/lib/skills-catalog/clawdhub/api.js +158 -0
- package/server/lib/skills-catalog/clawdhub/index.js +30 -0
- package/server/lib/skills-catalog/clawdhub/install.js +223 -0
- package/server/lib/skills-catalog/clawdhub/scan.js +113 -0
- package/server/lib/skills-catalog/curated-sources.js +21 -0
- package/server/lib/skills-catalog/git.js +76 -0
- package/server/lib/skills-catalog/install.js +280 -0
- package/server/lib/skills-catalog/scan.js +221 -0
- package/server/lib/skills-catalog/source.js +85 -0
- package/server/lib/summarization-service.js +171 -0
- package/server/lib/terminal-input-ws-protocol.js +66 -0
- package/server/lib/terminal-input-ws-protocol.test.js +138 -0
- package/server/lib/tts-service.js +162 -0
- package/server/lib/ui-auth.js +518 -0
|
Binary file
|
|
Binary file
|
package/dist/favicon.png
ADDED
|
Binary file
|
package/dist/favicon.svg
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<!-- OpenChamber logo - simplified for favicon -->
|
|
3
|
+
<g transform="translate(16, 16) scale(0.48)">
|
|
4
|
+
<!-- Left face - with fill -->
|
|
5
|
+
<path d="M0 0 L-26 -15 L-26 15 L0 30 Z" fill="white" fill-opacity="0.25" stroke="white" stroke-width="4" stroke-linejoin="round"/>
|
|
6
|
+
<!-- Right face - with fill -->
|
|
7
|
+
<path d="M0 0 L26 -15 L26 15 L0 30 Z" fill="white" fill-opacity="0.4" stroke="white" stroke-width="4" stroke-linejoin="round"/>
|
|
8
|
+
<!-- Top face - open -->
|
|
9
|
+
<path d="M0 -30 L-26 -15 L0 0 L26 -15 Z" fill="none" stroke="white" stroke-width="4" stroke-linejoin="round"/>
|
|
10
|
+
<!-- O logo - hollow rectangle frame on top face with gray fill inside -->
|
|
11
|
+
<g transform="matrix(0.866, 0.5, -0.866, 0.5, 0, -15) scale(0.55)">
|
|
12
|
+
<rect x="-12" y="-14" width="24" height="28" fill="white" fill-opacity="0.4" stroke="white" stroke-width="8"/>
|
|
13
|
+
</g>
|
|
14
|
+
</g>
|
|
15
|
+
</svg>
|
package/dist/index.html
ADDED
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en" class="h-full">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
|
|
6
|
+
|
|
7
|
+
<!-- Favicon -->
|
|
8
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
9
|
+
<link rel="icon" type="image/png" href="/favicon-32.png" sizes="32x32" />
|
|
10
|
+
<link rel="icon" type="image/png" href="/favicon-16.png" sizes="16x16" />
|
|
11
|
+
<link rel="mask-icon" href="/favicon.svg" color="#edb449" />
|
|
12
|
+
|
|
13
|
+
<!-- Apple touch icon - PNG format required for iOS PWA support -->
|
|
14
|
+
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png" />
|
|
15
|
+
<link rel="apple-touch-icon" sizes="167x167" href="/apple-touch-icon-167x167.png" />
|
|
16
|
+
<link rel="apple-touch-icon" sizes="152x152" href="/apple-touch-icon-152x152.png" />
|
|
17
|
+
|
|
18
|
+
<!-- Preload Nerd Fonts for terminal icon display -->
|
|
19
|
+
<link rel="preload" href="https://cdn.jsdelivr.net/gh/mshaugh/nerdfont-webfonts@v3.3.0/build/fonts/JetBrainsMonoNerdFont-Regular.woff2"
|
|
20
|
+
as="font" type="font/woff2" crossorigin="anonymous">
|
|
21
|
+
<link rel="preload" href="https://cdn.jsdelivr.net/gh/mshaugh/nerdfont-webfonts@v3.3.0/build/fonts/FiraCodeNerdFont-Regular.woff2"
|
|
22
|
+
as="font" type="font/woff2" crossorigin="anonymous">
|
|
23
|
+
|
|
24
|
+
<!-- Web app manifest (data URL to avoid nginx auth issues) -->
|
|
25
|
+
<script>
|
|
26
|
+
const baseUrl = location.origin;
|
|
27
|
+
const manifest = {
|
|
28
|
+
"name": "IKanban - AI Coding Assistant",
|
|
29
|
+
"short_name": "IKanban",
|
|
30
|
+
"description": "Web interface companion for OpenCode AI coding agent",
|
|
31
|
+
"start_url": baseUrl + "/",
|
|
32
|
+
"display": "standalone",
|
|
33
|
+
"background_color": "#151313",
|
|
34
|
+
"theme_color": "#edb449",
|
|
35
|
+
"orientation": "any",
|
|
36
|
+
"icons": [
|
|
37
|
+
{ "src": baseUrl + "/pwa-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" },
|
|
38
|
+
{ "src": baseUrl + "/pwa-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" },
|
|
39
|
+
{ "src": baseUrl + "/pwa-maskable-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any maskable" },
|
|
40
|
+
{ "src": baseUrl + "/pwa-maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any maskable" },
|
|
41
|
+
{ "src": baseUrl + "/apple-touch-icon-180x180.png", "sizes": "180x180", "type": "image/png", "purpose": "any" },
|
|
42
|
+
{ "src": baseUrl + "/apple-touch-icon-152x152.png", "sizes": "152x152", "type": "image/png", "purpose": "any" },
|
|
43
|
+
{ "src": baseUrl + "/favicon-32.png", "sizes": "32x32", "type": "image/png" },
|
|
44
|
+
{ "src": baseUrl + "/favicon-16.png", "sizes": "16x16", "type": "image/png" }
|
|
45
|
+
],
|
|
46
|
+
"categories": ["developer", "tools", "productivity"],
|
|
47
|
+
"lang": "en"
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const manifestBlob = new Blob([JSON.stringify(manifest)], {type: 'application/manifest+json'});
|
|
51
|
+
const manifestURL = URL.createObjectURL(manifestBlob);
|
|
52
|
+
|
|
53
|
+
const link = document.createElement('link');
|
|
54
|
+
link.rel = 'manifest';
|
|
55
|
+
link.href = manifestURL;
|
|
56
|
+
document.head.appendChild(link);
|
|
57
|
+
</script>
|
|
58
|
+
|
|
59
|
+
<script>
|
|
60
|
+
// Blocking script to detect and apply theme before first paint
|
|
61
|
+
(function() {
|
|
62
|
+
try {
|
|
63
|
+
var themeMode = localStorage.getItem('themeMode');
|
|
64
|
+
var variant = localStorage.getItem('selectedThemeVariant');
|
|
65
|
+
var useSystem = localStorage.getItem('useSystemTheme');
|
|
66
|
+
var isDark;
|
|
67
|
+
|
|
68
|
+
// Check themeMode first (new storage key)
|
|
69
|
+
if (themeMode === 'dark') {
|
|
70
|
+
isDark = true;
|
|
71
|
+
} else if (themeMode === 'light') {
|
|
72
|
+
isDark = false;
|
|
73
|
+
} else if (themeMode === 'system' || useSystem === null || useSystem === 'true') {
|
|
74
|
+
// System preference
|
|
75
|
+
isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
76
|
+
} else if (variant === 'light' || variant === 'dark') {
|
|
77
|
+
// Legacy storage key fallback
|
|
78
|
+
isDark = variant === 'dark';
|
|
79
|
+
} else {
|
|
80
|
+
// Default to system
|
|
81
|
+
isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Apply theme class and data attribute
|
|
85
|
+
document.documentElement.classList.add(isDark ? 'dark' : 'light');
|
|
86
|
+
document.documentElement.setAttribute('data-splash-variant', isDark ? 'dark' : 'light');
|
|
87
|
+
document.documentElement.style.setProperty('color-scheme', isDark ? 'dark' : 'light');
|
|
88
|
+
|
|
89
|
+
// Splash colors persisted by the app theme system
|
|
90
|
+
var splashBgLight = localStorage.getItem('splashBgLight');
|
|
91
|
+
var splashFgLight = localStorage.getItem('splashFgLight');
|
|
92
|
+
var splashBgDark = localStorage.getItem('splashBgDark');
|
|
93
|
+
var splashFgDark = localStorage.getItem('splashFgDark');
|
|
94
|
+
|
|
95
|
+
if (splashBgLight) document.documentElement.style.setProperty('--splash-background-light', splashBgLight);
|
|
96
|
+
if (splashFgLight) document.documentElement.style.setProperty('--splash-stroke-light', splashFgLight);
|
|
97
|
+
if (splashBgDark) document.documentElement.style.setProperty('--splash-background-dark', splashBgDark);
|
|
98
|
+
if (splashFgDark) document.documentElement.style.setProperty('--splash-stroke-dark', splashFgDark);
|
|
99
|
+
} catch (error) {
|
|
100
|
+
console.warn('Failed to apply theme:', error);
|
|
101
|
+
}
|
|
102
|
+
})();
|
|
103
|
+
</script>
|
|
104
|
+
|
|
105
|
+
<!-- Theme color - Safari iOS 26+ prioritizes CSS background-color over this, but keep as fallback -->
|
|
106
|
+
<meta name="theme-color" content="#151313" />
|
|
107
|
+
<meta name="theme-color" content="#151313" media="(prefers-color-scheme: dark)" />
|
|
108
|
+
|
|
109
|
+
<!-- iOS Safari PWA styling -->
|
|
110
|
+
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
111
|
+
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
|
112
|
+
<meta name="apple-mobile-web-app-title" content="IKanban" />
|
|
113
|
+
|
|
114
|
+
<title>IKanban - AI Coding Assistant</title>
|
|
115
|
+
<meta name="description" content="Web interface companion for OpenCode AI coding agent" />
|
|
116
|
+
<meta name="application-name" content="IKanban" />
|
|
117
|
+
<meta name="apple-mobile-web-app-title" content="IKanban" />
|
|
118
|
+
|
|
119
|
+
<!-- Inline CSS for loading screen and Nerd Fonts (before Tailwind loads) -->
|
|
120
|
+
<style>
|
|
121
|
+
/* Nerd Font @font-face declarations for terminal icon support */
|
|
122
|
+
@font-face {
|
|
123
|
+
font-family: 'JetBrainsMono Nerd Font';
|
|
124
|
+
src:
|
|
125
|
+
local('JetBrainsMono Nerd Font'),
|
|
126
|
+
url('https://cdn.jsdelivr.net/gh/mshaugh/nerdfont-webfonts@v3.3.0/build/fonts/JetBrainsMonoNerdFont-Regular.woff2') format('woff2'),
|
|
127
|
+
url('https://cdn.jsdelivr.net/gh/mshaugh/nerdfont-webfonts@v3.3.0/build/fonts/JetBrainsMonoNerdFont-Regular.woff') format('woff');
|
|
128
|
+
font-weight: normal;
|
|
129
|
+
font-style: normal;
|
|
130
|
+
font-display: swap;
|
|
131
|
+
unicode-range: U+E000-F8FF, U+F0000-FFFFF;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
@font-face {
|
|
135
|
+
font-family: 'FiraCode Nerd Font';
|
|
136
|
+
src:
|
|
137
|
+
local('FiraCode Nerd Font'),
|
|
138
|
+
url('https://cdn.jsdelivr.net/gh/mshaugh/nerdfont-webfonts@v3.3.0/build/fonts/FiraCodeNerdFont-Regular.woff2') format('woff2'),
|
|
139
|
+
url('https://cdn.jsdelivr.net/gh/mshaugh/nerdfont-webfonts@v3.3.0/build/fonts/FiraCodeNerdFont-Regular.woff') format('woff');
|
|
140
|
+
font-weight: normal;
|
|
141
|
+
font-style: normal;
|
|
142
|
+
font-display: swap;
|
|
143
|
+
unicode-range: U+E000-F8FF, U+F0000-FFFFF;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
:root {
|
|
147
|
+
--splash-background-dark: #151313;
|
|
148
|
+
--splash-stroke-dark: white;
|
|
149
|
+
--splash-background-light: #F6F4EF;
|
|
150
|
+
--splash-stroke-light: black;
|
|
151
|
+
|
|
152
|
+
--splash-background: var(--splash-background-dark);
|
|
153
|
+
--splash-stroke: var(--splash-stroke-dark);
|
|
154
|
+
|
|
155
|
+
/* Fallback fills (overridden below when supported) */
|
|
156
|
+
--splash-face-fill: rgba(255, 255, 255, 0.15);
|
|
157
|
+
--splash-cell-fill: rgba(255, 255, 255, 0.35);
|
|
158
|
+
--splash-logo-fill: var(--splash-stroke);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
html[data-splash-variant='light'] {
|
|
162
|
+
--splash-background: var(--splash-background-light);
|
|
163
|
+
--splash-stroke: var(--splash-stroke-light);
|
|
164
|
+
--splash-face-fill: rgba(0, 0, 0, 0.15);
|
|
165
|
+
--splash-cell-fill: rgba(0, 0, 0, 0.4);
|
|
166
|
+
--splash-logo-fill: var(--splash-stroke);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
html[data-splash-variant='dark'] {
|
|
170
|
+
--splash-background: var(--splash-background-dark);
|
|
171
|
+
--splash-stroke: var(--splash-stroke-dark);
|
|
172
|
+
--splash-logo-fill: var(--splash-stroke);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
@supports (color: color-mix(in srgb, white 50%, transparent)) {
|
|
176
|
+
:root {
|
|
177
|
+
--splash-face-fill: color-mix(in srgb, var(--splash-stroke) 15%, transparent);
|
|
178
|
+
--splash-cell-fill: color-mix(in srgb, var(--splash-stroke) 35%, transparent);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
@keyframes logo-pulse {
|
|
182
|
+
0%, 100% { opacity: 1; }
|
|
183
|
+
50% { opacity: 0.4; }
|
|
184
|
+
}
|
|
185
|
+
.logo-pulse {
|
|
186
|
+
animation: logo-pulse 3s ease-in-out infinite;
|
|
187
|
+
}
|
|
188
|
+
#initial-loading {
|
|
189
|
+
background-color: var(--splash-background);
|
|
190
|
+
color: var(--splash-foreground);
|
|
191
|
+
display: flex;
|
|
192
|
+
align-items: center;
|
|
193
|
+
justify-content: center;
|
|
194
|
+
height: 100vh;
|
|
195
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
196
|
+
transition: opacity 0.3s ease-out;
|
|
197
|
+
position: absolute;
|
|
198
|
+
width: 100%;
|
|
199
|
+
z-index: 9999;
|
|
200
|
+
}
|
|
201
|
+
#initial-loading.fade-out {
|
|
202
|
+
opacity: 0;
|
|
203
|
+
pointer-events: none;
|
|
204
|
+
}
|
|
205
|
+
</style>
|
|
206
|
+
<script type="module" crossorigin src="/assets/index-MBuF9PXk.js"></script>
|
|
207
|
+
<link rel="modulepreload" crossorigin href="/assets/vendor-.bun-KwPUu5oc.js">
|
|
208
|
+
<link rel="stylesheet" crossorigin href="/assets/vendor--DEobTDja.css">
|
|
209
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BQJPAP5f.css">
|
|
210
|
+
</head>
|
|
211
|
+
<body class="h-full bg-background text-foreground">
|
|
212
|
+
<div id="root" class="h-full">
|
|
213
|
+
<!-- Loading fallback while React initializes -->
|
|
214
|
+
<div id="initial-loading">
|
|
215
|
+
<div style="display: flex; align-items: center; justify-content: center;">
|
|
216
|
+
<svg width="120" height="120" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="IKanban loading icon">
|
|
217
|
+
<!-- Isometric cube: edge=48, centerY=50 -->
|
|
218
|
+
<!-- Points: top(50,2), left(8.432,26), right(91.568,26), center(50,50), bottomLeft(8.432,74), bottomRight(91.568,74), bottom(50,98) -->
|
|
219
|
+
|
|
220
|
+
<!-- Left face - base fill with stroke -->
|
|
221
|
+
<path d="M50 50 L8.432 26 L8.432 74 L50 98 Z" fill="var(--splash-face-fill)" stroke="var(--splash-stroke)" stroke-width="2" stroke-linejoin="round"/>
|
|
222
|
+
|
|
223
|
+
<!-- Left face grid cells (4x4) with varying opacity -->
|
|
224
|
+
<path d="M50 50 L39.608 44 L39.608 56 L50 62 Z" fill="var(--splash-cell-fill)" opacity="0.2"/>
|
|
225
|
+
<path d="M39.608 44 L29.216 38 L29.216 50 L39.608 56 Z" fill="var(--splash-cell-fill)" opacity="0.45"/>
|
|
226
|
+
<path d="M29.216 38 L18.824 32 L18.824 44 L29.216 50 Z" fill="var(--splash-cell-fill)" opacity="0.15"/>
|
|
227
|
+
<path d="M18.824 32 L8.432 26 L8.432 38 L18.824 44 Z" fill="var(--splash-cell-fill)" opacity="0.55"/>
|
|
228
|
+
<path d="M50 62 L39.608 56 L39.608 68 L50 74 Z" fill="var(--splash-cell-fill)" opacity="0.35"/>
|
|
229
|
+
<path d="M39.608 56 L29.216 50 L29.216 62 L39.608 68 Z" fill="var(--splash-cell-fill)" opacity="0.1"/>
|
|
230
|
+
<path d="M29.216 50 L18.824 44 L18.824 56 L29.216 62 Z" fill="var(--splash-cell-fill)" opacity="0.5"/>
|
|
231
|
+
<path d="M18.824 44 L8.432 38 L8.432 50 L18.824 56 Z" fill="var(--splash-cell-fill)" opacity="0.25"/>
|
|
232
|
+
<path d="M50 74 L39.608 68 L39.608 80 L50 86 Z" fill="var(--splash-cell-fill)" opacity="0.4"/>
|
|
233
|
+
<path d="M39.608 68 L29.216 62 L29.216 74 L39.608 80 Z" fill="var(--splash-cell-fill)" opacity="0.3"/>
|
|
234
|
+
<path d="M29.216 62 L18.824 56 L18.824 68 L29.216 74 Z" fill="var(--splash-cell-fill)" opacity="0.45"/>
|
|
235
|
+
<path d="M18.824 56 L8.432 50 L8.432 62 L18.824 68 Z" fill="var(--splash-cell-fill)" opacity="0.15"/>
|
|
236
|
+
<path d="M50 86 L39.608 80 L39.608 92 L50 98 Z" fill="var(--splash-cell-fill)" opacity="0.55"/>
|
|
237
|
+
<path d="M39.608 80 L29.216 74 L29.216 86 L39.608 92 Z" fill="var(--splash-cell-fill)" opacity="0.2"/>
|
|
238
|
+
<path d="M29.216 74 L18.824 68 L18.824 80 L29.216 86 Z" fill="var(--splash-cell-fill)" opacity="0.35"/>
|
|
239
|
+
<path d="M18.824 68 L8.432 62 L8.432 74 L18.824 80 Z" fill="var(--splash-cell-fill)" opacity="0.1"/>
|
|
240
|
+
|
|
241
|
+
<!-- Right face - base fill with stroke -->
|
|
242
|
+
<path d="M50 50 L91.568 26 L91.568 74 L50 98 Z" fill="var(--splash-face-fill)" stroke="var(--splash-stroke)" stroke-width="2" stroke-linejoin="round"/>
|
|
243
|
+
|
|
244
|
+
<!-- Right face grid cells (4x4) with varying opacity -->
|
|
245
|
+
<path d="M50 50 L60.392 44 L60.392 56 L50 62 Z" fill="var(--splash-cell-fill)" opacity="0.3"/>
|
|
246
|
+
<path d="M60.392 44 L70.784 38 L70.784 50 L60.392 56 Z" fill="var(--splash-cell-fill)" opacity="0.15"/>
|
|
247
|
+
<path d="M70.784 38 L81.176 32 L81.176 44 L70.784 50 Z" fill="var(--splash-cell-fill)" opacity="0.45"/>
|
|
248
|
+
<path d="M81.176 32 L91.568 26 L91.568 38 L81.176 44 Z" fill="var(--splash-cell-fill)" opacity="0.25"/>
|
|
249
|
+
<path d="M50 62 L60.392 56 L60.392 68 L50 74 Z" fill="var(--splash-cell-fill)" opacity="0.5"/>
|
|
250
|
+
<path d="M60.392 56 L70.784 50 L70.784 62 L60.392 68 Z" fill="var(--splash-cell-fill)" opacity="0.35"/>
|
|
251
|
+
<path d="M70.784 50 L81.176 44 L81.176 56 L70.784 62 Z" fill="var(--splash-cell-fill)" opacity="0.1"/>
|
|
252
|
+
<path d="M81.176 44 L91.568 38 L91.568 50 L81.176 56 Z" fill="var(--splash-cell-fill)" opacity="0.4"/>
|
|
253
|
+
<path d="M50 74 L60.392 68 L60.392 80 L50 86 Z" fill="var(--splash-cell-fill)" opacity="0.2"/>
|
|
254
|
+
<path d="M60.392 68 L70.784 62 L70.784 74 L60.392 80 Z" fill="var(--splash-cell-fill)" opacity="0.55"/>
|
|
255
|
+
<path d="M70.784 62 L81.176 56 L81.176 68 L70.784 74 Z" fill="var(--splash-cell-fill)" opacity="0.3"/>
|
|
256
|
+
<path d="M81.176 56 L91.568 50 L91.568 62 L81.176 68 Z" fill="var(--splash-cell-fill)" opacity="0.15"/>
|
|
257
|
+
<path d="M50 86 L60.392 80 L60.392 92 L50 98 Z" fill="var(--splash-cell-fill)" opacity="0.45"/>
|
|
258
|
+
<path d="M60.392 80 L70.784 74 L70.784 86 L60.392 92 Z" fill="var(--splash-cell-fill)" opacity="0.25"/>
|
|
259
|
+
<path d="M70.784 74 L81.176 68 L81.176 80 L70.784 86 Z" fill="var(--splash-cell-fill)" opacity="0.4"/>
|
|
260
|
+
<path d="M81.176 68 L91.568 62 L91.568 74 L81.176 80 Z" fill="var(--splash-cell-fill)" opacity="0.2"/>
|
|
261
|
+
|
|
262
|
+
<!-- Top face - open (no fill), only stroke -->
|
|
263
|
+
<path d="M50 2 L8.432 26 L50 50 L91.568 26 Z" fill="none" stroke="var(--splash-stroke)" stroke-width="2" stroke-linejoin="round"/>
|
|
264
|
+
|
|
265
|
+
<!-- OpenCode logo on top face -->
|
|
266
|
+
<g class="logo-pulse" transform="matrix(0.866, 0.5, -0.866, 0.5, 50, 26) scale(0.75)">
|
|
267
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M-16 -20 L16 -20 L16 20 L-16 20 Z M-8 -12 L-8 12 L8 12 L8 -12 Z" fill="var(--splash-logo-fill)"/>
|
|
268
|
+
<path d="M-8 -4 L8 -4 L8 12 L-8 12 Z" fill="var(--splash-logo-fill)" fill-opacity="0.4"/>
|
|
269
|
+
</g>
|
|
270
|
+
</svg>
|
|
271
|
+
</div>
|
|
272
|
+
</div>
|
|
273
|
+
</div>
|
|
274
|
+
|
|
275
|
+
<script>
|
|
276
|
+
// Fallback: hide loading screen after 10 seconds if React fails to load
|
|
277
|
+
setTimeout(function() {
|
|
278
|
+
const loading = document.getElementById('initial-loading');
|
|
279
|
+
if (loading) {
|
|
280
|
+
console.warn('Loading screen timeout - forcing hide after 10s');
|
|
281
|
+
loading.classList.add('fade-out');
|
|
282
|
+
setTimeout(function() {
|
|
283
|
+
loading.remove();
|
|
284
|
+
}, 300);
|
|
285
|
+
}
|
|
286
|
+
}, 10000);
|
|
287
|
+
</script>
|
|
288
|
+
|
|
289
|
+
<!-- CSS Font Loading API for reliable Nerd Font loading -->
|
|
290
|
+
<script>
|
|
291
|
+
(function() {
|
|
292
|
+
const fonts = [
|
|
293
|
+
{
|
|
294
|
+
name: 'JetBrainsMono Nerd Font',
|
|
295
|
+
url: 'https://cdn.jsdelivr.net/gh/mshaugh/nerdfont-webfonts@v3.3.0/build/fonts/JetBrainsMonoNerdFont-Regular.woff2'
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
name: 'FiraCode Nerd Font',
|
|
299
|
+
url: 'https://cdn.jsdelivr.net/gh/mshaugh/nerdfont-webfonts@v3.3.0/build/fonts/FiraCodeNerdFont-Regular.woff2'
|
|
300
|
+
}
|
|
301
|
+
];
|
|
302
|
+
|
|
303
|
+
const fontPromises = fonts.map(font => {
|
|
304
|
+
const fontFace = new FontFace(font.name, `url(${font.url}) format('woff2')`);
|
|
305
|
+
document.fonts.add(fontFace);
|
|
306
|
+
return fontFace.load().catch(err => {
|
|
307
|
+
console.warn(`Failed to load font: ${font.name}`, err);
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
Promise.allSettled(fontPromises).then(() => {
|
|
312
|
+
document.documentElement.classList.add('fonts-loaded');
|
|
313
|
+
});
|
|
314
|
+
})();
|
|
315
|
+
</script>
|
|
316
|
+
|
|
317
|
+
<!-- Polyfill for process before loading React -->
|
|
318
|
+
<script>
|
|
319
|
+
if (typeof process === 'undefined') {
|
|
320
|
+
window.process = { env: {} };
|
|
321
|
+
}
|
|
322
|
+
</script>
|
|
323
|
+
|
|
324
|
+
</body>
|
|
325
|
+
</html>
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<svg width="512" height="512" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<!-- OpenChamber logo - simplified, no background (for dark backgrounds) -->
|
|
3
|
+
<g transform="translate(256, 256) scale(4)">
|
|
4
|
+
<!-- Left face - simplified, no grid cells -->
|
|
5
|
+
<path d="M0 0 L-41.568 -24 L-41.568 24 L0 48 Z" fill="white" fill-opacity="0.2" stroke="white" stroke-width="3" stroke-linejoin="round"/>
|
|
6
|
+
<!-- Right face - simplified, no grid cells -->
|
|
7
|
+
<path d="M0 0 L41.568 -24 L41.568 24 L0 48 Z" fill="white" fill-opacity="0.35" stroke="white" stroke-width="3" stroke-linejoin="round"/>
|
|
8
|
+
<!-- Top face - open -->
|
|
9
|
+
<path d="M0 -48 L-41.568 -24 L0 0 L41.568 -24 Z" fill="none" stroke="white" stroke-width="3" stroke-linejoin="round"/>
|
|
10
|
+
<!-- OpenCode logo on top face -->
|
|
11
|
+
<g transform="matrix(0.866, 0.5, -0.866, 0.5, 0, -24) scale(0.75)">
|
|
12
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M-16 -20 L16 -20 L16 20 L-16 20 Z M-8 -12 L-8 12 L8 12 L8 -12 Z" fill="white"/>
|
|
13
|
+
<path d="M-8 -4 L8 -4 L8 12 L-8 12 Z" fill="white" fill-opacity="0.4"/>
|
|
14
|
+
</g>
|
|
15
|
+
</g>
|
|
16
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<svg width="512" height="512" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<!-- OpenChamber logo - simplified, no background (for light backgrounds) -->
|
|
3
|
+
<g transform="translate(256, 256) scale(4)">
|
|
4
|
+
<!-- Left face - simplified, no grid cells -->
|
|
5
|
+
<path d="M0 0 L-41.568 -24 L-41.568 24 L0 48 Z" fill="black" fill-opacity="0.2" stroke="black" stroke-width="3" stroke-linejoin="round"/>
|
|
6
|
+
<!-- Right face - simplified, no grid cells -->
|
|
7
|
+
<path d="M0 0 L41.568 -24 L41.568 24 L0 48 Z" fill="black" fill-opacity="0.35" stroke="black" stroke-width="3" stroke-linejoin="round"/>
|
|
8
|
+
<!-- Top face - open -->
|
|
9
|
+
<path d="M0 -48 L-41.568 -24 L0 0 L41.568 -24 Z" fill="none" stroke="black" stroke-width="3" stroke-linejoin="round"/>
|
|
10
|
+
<!-- OpenCode logo on top face -->
|
|
11
|
+
<g transform="matrix(0.866, 0.5, -0.866, 0.5, 0, -24) scale(0.75)">
|
|
12
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M-16 -20 L16 -20 L16 20 L-16 20 Z M-8 -12 L-8 12 L8 12 L8 -12 Z" fill="black"/>
|
|
13
|
+
<path d="M-8 -4 L8 -4 L8 12 L-8 12 Z" fill="black" fill-opacity="0.4"/>
|
|
14
|
+
</g>
|
|
15
|
+
</g>
|
|
16
|
+
</svg>
|
package/dist/pwa-192.png
ADDED
|
Binary file
|
package/dist/pwa-512.png
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "OpenChamber - AI Coding Companion",
|
|
3
|
+
"short_name": "OpenChamber",
|
|
4
|
+
"description": "OpenChamber desktop companion for the OpenCode AI coding agent",
|
|
5
|
+
"start_url": "/",
|
|
6
|
+
"display": "standalone",
|
|
7
|
+
"background_color": "#151313",
|
|
8
|
+
"theme_color": "#edb449",
|
|
9
|
+
"orientation": "portrait-primary",
|
|
10
|
+
"icons": [
|
|
11
|
+
{ "src": "/pwa-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" },
|
|
12
|
+
{ "src": "/pwa-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" },
|
|
13
|
+
{ "src": "/pwa-maskable-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any maskable" },
|
|
14
|
+
{ "src": "/pwa-maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any maskable" },
|
|
15
|
+
{ "src": "/apple-touch-icon-180x180.png", "sizes": "180x180", "type": "image/png", "purpose": "any" },
|
|
16
|
+
{ "src": "/apple-touch-icon-152x152.png", "sizes": "152x152", "type": "image/png", "purpose": "any" },
|
|
17
|
+
{ "src": "/favicon-32.png", "sizes": "32x32", "type": "image/png" },
|
|
18
|
+
{ "src": "/favicon-16.png", "sizes": "16x16", "type": "image/png" }
|
|
19
|
+
],
|
|
20
|
+
"categories": ["developer", "tools", "productivity"],
|
|
21
|
+
"lang": "en"
|
|
22
|
+
}
|
package/dist/sw.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(){"use strict";self.addEventListener("install",t=>{t.waitUntil(self.skipWaiting())}),self.addEventListener("activate",t=>{t.waitUntil(self.clients.claim())}),self.addEventListener("push",t=>{t.waitUntil((async()=>{const i=t.data?.json()??null;if(!i||(await self.clients.matchAll({type:"window",includeUncontrolled:!0})).some(a=>a.visibilityState==="visible"||a.focused))return;const s=i.title||"IKanban",e=i.body??"",l=i.icon??"/apple-touch-icon-180x180.png",o=i.badge??"/favicon-32.png";await self.registration.showNotification(s,{body:e,icon:l,badge:o,tag:i.tag,data:i.data})})())}),self.addEventListener("notificationclick",t=>{t.notification.close();const n=(t.notification.data??null)?.url??"/";t.waitUntil(self.clients.openWindow(n))})})();
|
package/package.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ikanban-web",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./server/index.js",
|
|
7
|
+
"types": "./server/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"ikanban": "./bin/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"dev": "bun run build:watch",
|
|
16
|
+
"dev:server": "bun server/index.js --port ${IKANBAN_PORT:-3001}",
|
|
17
|
+
"dev:server:watch": "nodemon --watch server --ext js --exec \"bun server/index.js --port ${IKANBAN_PORT:-3001}\"",
|
|
18
|
+
"build": "vite build",
|
|
19
|
+
"build:watch": "vite build --watch",
|
|
20
|
+
"type-check": "tsc --noEmit",
|
|
21
|
+
"lint": "eslint \"./src/**/*.{ts,tsx}\" --config ../../eslint.config.js",
|
|
22
|
+
"start": "node bin/cli.js serve"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@fontsource/ibm-plex-mono": "^5.2.7",
|
|
26
|
+
"@fontsource/ibm-plex-sans": "^5.1.1",
|
|
27
|
+
"@ibm/plex": "^6.4.1",
|
|
28
|
+
"@octokit/rest": "^22.0.1",
|
|
29
|
+
"@opencode-ai/sdk": "^1.1.65",
|
|
30
|
+
"@radix-ui/react-collapsible": "^1.1.12",
|
|
31
|
+
"@radix-ui/react-dialog": "^1.1.15",
|
|
32
|
+
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
33
|
+
"@radix-ui/react-scroll-area": "^1.2.10",
|
|
34
|
+
"@radix-ui/react-select": "^2.2.6",
|
|
35
|
+
"@radix-ui/react-separator": "^1.1.7",
|
|
36
|
+
"@radix-ui/react-slot": "^1.2.3",
|
|
37
|
+
"@radix-ui/react-toggle": "^1.1.10",
|
|
38
|
+
"@radix-ui/react-tooltip": "^1.2.8",
|
|
39
|
+
"@remixicon/react": "^4.7.0",
|
|
40
|
+
"@types/react-syntax-highlighter": "^15.5.13",
|
|
41
|
+
"adm-zip": "^0.5.16",
|
|
42
|
+
"bun-pty": "^0.4.5",
|
|
43
|
+
"class-variance-authority": "^0.7.1",
|
|
44
|
+
"clsx": "^2.1.1",
|
|
45
|
+
"cmdk": "^1.1.1",
|
|
46
|
+
"express": "^5.1.0",
|
|
47
|
+
"ghostty-web": "0.3.0",
|
|
48
|
+
"http-proxy-middleware": "^3.0.5",
|
|
49
|
+
"jsonc-parser": "^3.3.1",
|
|
50
|
+
"next-themes": "^0.4.6",
|
|
51
|
+
"node-pty": "^1.1.0",
|
|
52
|
+
"openai": "^4.79.0",
|
|
53
|
+
"qrcode-terminal": "^0.12.0",
|
|
54
|
+
"react": "^19.1.1",
|
|
55
|
+
"react-dom": "^19.1.1",
|
|
56
|
+
"react-markdown": "^10.1.0",
|
|
57
|
+
"react-syntax-highlighter": "^15.6.6",
|
|
58
|
+
"remark-gfm": "^4.0.1",
|
|
59
|
+
"simple-git": "^3.28.0",
|
|
60
|
+
"sonner": "^2.0.7",
|
|
61
|
+
"strip-json-comments": "^5.0.3",
|
|
62
|
+
"tailwind-merge": "^3.3.1",
|
|
63
|
+
"web-push": "^3.6.7",
|
|
64
|
+
"ws": "^8.18.3",
|
|
65
|
+
"yaml": "^2.8.1",
|
|
66
|
+
"zustand": "^5.0.8"
|
|
67
|
+
},
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@eslint/js": "^9.33.0",
|
|
70
|
+
"@tailwindcss/postcss": "^4.0.0",
|
|
71
|
+
"@types/adm-zip": "^0.5.7",
|
|
72
|
+
"@types/node": "^24.3.1",
|
|
73
|
+
"@types/react": "^19.1.10",
|
|
74
|
+
"@types/react-dom": "^19.1.7",
|
|
75
|
+
"@vitejs/plugin-react": "^5.0.0",
|
|
76
|
+
"autoprefixer": "^10.4.21",
|
|
77
|
+
"concurrently": "^9.2.1",
|
|
78
|
+
"cors": "^2.8.5",
|
|
79
|
+
"cross-env": "^7.0.3",
|
|
80
|
+
"eslint": "^9.33.0",
|
|
81
|
+
"eslint-plugin-react-hooks": "^5.2.0",
|
|
82
|
+
"eslint-plugin-react-refresh": "^0.4.20",
|
|
83
|
+
"globals": "^16.3.0",
|
|
84
|
+
"nodemon": "^3.1.7",
|
|
85
|
+
"tailwindcss": "^4.0.0",
|
|
86
|
+
"tsx": "^4.20.6",
|
|
87
|
+
"tw-animate-css": "^1.3.8",
|
|
88
|
+
"typescript": "~5.8.3",
|
|
89
|
+
"typescript-eslint": "^8.39.1",
|
|
90
|
+
"vite": "^7.1.2",
|
|
91
|
+
"vite-plugin-pwa": "^1.0.3",
|
|
92
|
+
"workbox-window": "^7.4.0"
|
|
93
|
+
},
|
|
94
|
+
"files": [
|
|
95
|
+
"dist",
|
|
96
|
+
"server",
|
|
97
|
+
"bin",
|
|
98
|
+
"public",
|
|
99
|
+
"package.json",
|
|
100
|
+
"README.md"
|
|
101
|
+
]
|
|
102
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<svg width="180" height="180" viewBox="0 0 180 180" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<!-- OpenChamber logo - simplified, no background (for iOS) -->
|
|
3
|
+
<g transform="translate(90, 90) scale(1.4)">
|
|
4
|
+
<!-- Left face - simplified, no grid cells -->
|
|
5
|
+
<path d="M0 0 L-41.568 -24 L-41.568 24 L0 48 Z" fill="white" fill-opacity="0.2" stroke="white" stroke-width="3" stroke-linejoin="round"/>
|
|
6
|
+
<!-- Right face - simplified, no grid cells -->
|
|
7
|
+
<path d="M0 0 L41.568 -24 L41.568 24 L0 48 Z" fill="white" fill-opacity="0.35" stroke="white" stroke-width="3" stroke-linejoin="round"/>
|
|
8
|
+
<!-- Top face - open -->
|
|
9
|
+
<path d="M0 -48 L-41.568 -24 L0 0 L41.568 -24 Z" fill="none" stroke="white" stroke-width="3" stroke-linejoin="round"/>
|
|
10
|
+
<!-- OpenCode logo on top face -->
|
|
11
|
+
<g transform="matrix(0.866, 0.5, -0.866, 0.5, 0, -24) scale(0.75)">
|
|
12
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M-16 -20 L16 -20 L16 20 L-16 20 Z M-8 -12 L-8 12 L8 12 L8 -12 Z" fill="white"/>
|
|
13
|
+
<path d="M-8 -4 L8 -4 L8 12 L-8 12 Z" fill="white" fill-opacity="0.4"/>
|
|
14
|
+
</g>
|
|
15
|
+
</g>
|
|
16
|
+
</svg>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<!-- OpenChamber logo - simplified for favicon -->
|
|
3
|
+
<g transform="translate(16, 16) scale(0.48)">
|
|
4
|
+
<!-- Left face - with fill -->
|
|
5
|
+
<path d="M0 0 L-26 -15 L-26 15 L0 30 Z" fill="white" fill-opacity="0.25" stroke="white" stroke-width="4" stroke-linejoin="round"/>
|
|
6
|
+
<!-- Right face - with fill -->
|
|
7
|
+
<path d="M0 0 L26 -15 L26 15 L0 30 Z" fill="white" fill-opacity="0.4" stroke="white" stroke-width="4" stroke-linejoin="round"/>
|
|
8
|
+
<!-- Top face - open -->
|
|
9
|
+
<path d="M0 -30 L-26 -15 L0 0 L26 -15 Z" fill="none" stroke="white" stroke-width="4" stroke-linejoin="round"/>
|
|
10
|
+
<!-- O logo - hollow rectangle frame on top face with gray fill inside -->
|
|
11
|
+
<g transform="matrix(0.866, 0.5, -0.866, 0.5, 0, -15) scale(0.55)">
|
|
12
|
+
<rect x="-12" y="-14" width="24" height="28" fill="white" fill-opacity="0.4" stroke="white" stroke-width="8"/>
|
|
13
|
+
</g>
|
|
14
|
+
</g>
|
|
15
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<svg width="512" height="512" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<!-- OpenChamber logo - simplified, no background (for dark backgrounds) -->
|
|
3
|
+
<g transform="translate(256, 256) scale(4)">
|
|
4
|
+
<!-- Left face - simplified, no grid cells -->
|
|
5
|
+
<path d="M0 0 L-41.568 -24 L-41.568 24 L0 48 Z" fill="white" fill-opacity="0.2" stroke="white" stroke-width="3" stroke-linejoin="round"/>
|
|
6
|
+
<!-- Right face - simplified, no grid cells -->
|
|
7
|
+
<path d="M0 0 L41.568 -24 L41.568 24 L0 48 Z" fill="white" fill-opacity="0.35" stroke="white" stroke-width="3" stroke-linejoin="round"/>
|
|
8
|
+
<!-- Top face - open -->
|
|
9
|
+
<path d="M0 -48 L-41.568 -24 L0 0 L41.568 -24 Z" fill="none" stroke="white" stroke-width="3" stroke-linejoin="round"/>
|
|
10
|
+
<!-- OpenCode logo on top face -->
|
|
11
|
+
<g transform="matrix(0.866, 0.5, -0.866, 0.5, 0, -24) scale(0.75)">
|
|
12
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M-16 -20 L16 -20 L16 20 L-16 20 Z M-8 -12 L-8 12 L8 12 L8 -12 Z" fill="white"/>
|
|
13
|
+
<path d="M-8 -4 L8 -4 L8 12 L-8 12 Z" fill="white" fill-opacity="0.4"/>
|
|
14
|
+
</g>
|
|
15
|
+
</g>
|
|
16
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<svg width="512" height="512" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<!-- OpenChamber logo - simplified, no background (for light backgrounds) -->
|
|
3
|
+
<g transform="translate(256, 256) scale(4)">
|
|
4
|
+
<!-- Left face - simplified, no grid cells -->
|
|
5
|
+
<path d="M0 0 L-41.568 -24 L-41.568 24 L0 48 Z" fill="black" fill-opacity="0.2" stroke="black" stroke-width="3" stroke-linejoin="round"/>
|
|
6
|
+
<!-- Right face - simplified, no grid cells -->
|
|
7
|
+
<path d="M0 0 L41.568 -24 L41.568 24 L0 48 Z" fill="black" fill-opacity="0.35" stroke="black" stroke-width="3" stroke-linejoin="round"/>
|
|
8
|
+
<!-- Top face - open -->
|
|
9
|
+
<path d="M0 -48 L-41.568 -24 L0 0 L41.568 -24 Z" fill="none" stroke="black" stroke-width="3" stroke-linejoin="round"/>
|
|
10
|
+
<!-- OpenCode logo on top face -->
|
|
11
|
+
<g transform="matrix(0.866, 0.5, -0.866, 0.5, 0, -24) scale(0.75)">
|
|
12
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M-16 -20 L16 -20 L16 20 L-16 20 Z M-8 -12 L-8 12 L8 12 L8 -12 Z" fill="black"/>
|
|
13
|
+
<path d="M-8 -4 L8 -4 L8 12 L-8 12 Z" fill="black" fill-opacity="0.4"/>
|
|
14
|
+
</g>
|
|
15
|
+
</g>
|
|
16
|
+
</svg>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|