@essentialai/cogent-server 3.4.3 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/routes/sessions.d.ts +3 -1
- package/dist/routes/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +37 -2
- package/dist/routes/sessions.js.map +1 -1
- package/dist/ui/components/Layout.d.ts.map +1 -1
- package/dist/ui/components/Layout.js +1 -1
- package/dist/ui/components/Layout.js.map +1 -1
- package/dist/ui/components/Terminal.js +1 -1
- package/dist/ui/components/Terminal.js.map +1 -1
- package/dist/ui/pages/LandingPage.d.ts +2 -2
- package/dist/ui/pages/LandingPage.d.ts.map +1 -1
- package/dist/ui/pages/LandingPage.js +103 -66
- package/dist/ui/pages/LandingPage.js.map +1 -1
- package/dist/ui/styles/theme.d.ts +35 -22
- package/dist/ui/styles/theme.d.ts.map +1 -1
- package/dist/ui/styles/theme.js +57 -28
- package/dist/ui/styles/theme.js.map +1 -1
- package/package.json +1 -1
|
@@ -23,13 +23,15 @@ export declare function clientIp(c: {
|
|
|
23
23
|
*
|
|
24
24
|
* POST / -> Create a new session (maps to /api/sessions via app.route)
|
|
25
25
|
* POST /:sessionId/join -> Join an existing session
|
|
26
|
+
* GET /resolve/:label -> Resolve a PUBLIC label to its session UUID
|
|
27
|
+
* POST /resolve -> Resolve a label to its session UUID (Org_ID-scoped for business)
|
|
26
28
|
*
|
|
27
29
|
* Both endpoints are unauthenticated (they issue tokens, not consume them).
|
|
28
30
|
*
|
|
29
31
|
* @param multiTenant When true, Org_ID (the 3rd join credential) is enforced
|
|
30
32
|
* for channels created with one. When false (free relay),
|
|
31
33
|
* Org_ID is ignored entirely and behavior is unchanged.
|
|
32
|
-
* @param rateLimiter Throttles repeated failed joins (brute-force lockout).
|
|
34
|
+
* @param rateLimiter Throttles repeated failed joins and resolves (brute-force lockout).
|
|
33
35
|
*/
|
|
34
36
|
export declare function createSessionRoutes(sessionStore: SessionStore, authService: AuthService, multiTenant: boolean, rateLimiter: JoinRateLimiter): Hono<ServerEnv>;
|
|
35
37
|
//# sourceMappingURL=sessions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAY5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,KAAK,EAAc,SAAS,EAAE,MAAM,aAAa,CAAC;AAIzD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE;IAAE,GAAG,EAAE;QAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,CAS7F;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,OAAO,EACpB,WAAW,EAAE,eAAe,GAC3B,IAAI,CAAC,SAAS,CAAC,CAmQjB"}
|
package/dist/routes/sessions.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
2
|
import { zValidator } from "@hono/zod-validator";
|
|
3
|
-
import { BridgeError, ErrorCode, CreateSessionRequestSchema, JoinSessionRequestSchema, generateSessionId, generateSessionLabel, isValidSessionLabel, } from "@essentialai/cogent";
|
|
3
|
+
import { BridgeError, ErrorCode, CreateSessionRequestSchema, JoinSessionRequestSchema, ResolveSessionRequestSchema, generateSessionId, generateSessionLabel, isValidSessionLabel, } from "@essentialai/cogent";
|
|
4
4
|
import { JoinRateLimiter } from "../services/join-rate-limiter.js";
|
|
5
5
|
import { validationHook, honoSchema } from "./validation-hook.js";
|
|
6
6
|
import { logOrgEvent } from "../services/obs-log.js";
|
|
@@ -31,13 +31,15 @@ export function clientIp(c) {
|
|
|
31
31
|
*
|
|
32
32
|
* POST / -> Create a new session (maps to /api/sessions via app.route)
|
|
33
33
|
* POST /:sessionId/join -> Join an existing session
|
|
34
|
+
* GET /resolve/:label -> Resolve a PUBLIC label to its session UUID
|
|
35
|
+
* POST /resolve -> Resolve a label to its session UUID (Org_ID-scoped for business)
|
|
34
36
|
*
|
|
35
37
|
* Both endpoints are unauthenticated (they issue tokens, not consume them).
|
|
36
38
|
*
|
|
37
39
|
* @param multiTenant When true, Org_ID (the 3rd join credential) is enforced
|
|
38
40
|
* for channels created with one. When false (free relay),
|
|
39
41
|
* Org_ID is ignored entirely and behavior is unchanged.
|
|
40
|
-
* @param rateLimiter Throttles repeated failed joins (brute-force lockout).
|
|
42
|
+
* @param rateLimiter Throttles repeated failed joins and resolves (brute-force lockout).
|
|
41
43
|
*/
|
|
42
44
|
export function createSessionRoutes(sessionStore, authService, multiTenant, rateLimiter) {
|
|
43
45
|
const sessions = new Hono();
|
|
@@ -118,6 +120,39 @@ export function createSessionRoutes(sessionStore, authService, multiTenant, rate
|
|
|
118
120
|
}
|
|
119
121
|
return c.json({ sessionId, label });
|
|
120
122
|
});
|
|
123
|
+
/**
|
|
124
|
+
* POST /resolve - Org_ID-scoped label → session UUID lookup.
|
|
125
|
+
*
|
|
126
|
+
* The public GET /resolve resolves the public scope only. Business channels'
|
|
127
|
+
* labels live under their org scope and are deliberately invisible there. With
|
|
128
|
+
* the Org_ID supplied here we compute the scope and look up the business label;
|
|
129
|
+
* without it, this resolves the public scope (free channels). The returned
|
|
130
|
+
* sessionId is useless without the channel secret (join still verifies it), so
|
|
131
|
+
* this leaks nothing actionable. A wrong/absent Org_ID yields the SAME generic
|
|
132
|
+
* 404 as a non-existent label (enumeration-safe). The Org_ID is never logged.
|
|
133
|
+
*/
|
|
134
|
+
sessions.post("/resolve", zValidator("json", honoSchema(ResolveSessionRequestSchema), validationHook), async (c) => {
|
|
135
|
+
const { label, orgId } = c.req.valid("json");
|
|
136
|
+
const orgScope = orgId ? authService.hashToken(orgId) : undefined;
|
|
137
|
+
// Brute-force throttle (Business control; free relay path is unchanged).
|
|
138
|
+
// Key on the ORG SCOPE + label so one org's failed resolves can never lock
|
|
139
|
+
// out another org that happens to use the same channel name (per-org
|
|
140
|
+
// isolation, FR6). Free/public lookups (no Org_ID) share the public bucket.
|
|
141
|
+
const rlKey = `resolve:${orgScope ?? "public"}:${label}`;
|
|
142
|
+
const sourceKey = JoinRateLimiter.sourceKey(clientIp(c), rlKey);
|
|
143
|
+
const channelKey = JoinRateLimiter.channelKey(rlKey);
|
|
144
|
+
if (multiTenant)
|
|
145
|
+
rateLimiter.check(sourceKey, channelKey);
|
|
146
|
+
const sessionId = sessionStore.getSessionIdByLabel(label, orgScope);
|
|
147
|
+
if (!sessionId) {
|
|
148
|
+
if (multiTenant)
|
|
149
|
+
rateLimiter.recordFailure(sourceKey, channelKey);
|
|
150
|
+
throw new BridgeError(ErrorCode.SESSION_NOT_FOUND, `No session with label "${label}"`, "Check the channel name and Org_ID");
|
|
151
|
+
}
|
|
152
|
+
if (multiTenant)
|
|
153
|
+
rateLimiter.recordSuccess(sourceKey);
|
|
154
|
+
return c.json({ sessionId, label });
|
|
155
|
+
});
|
|
121
156
|
/**
|
|
122
157
|
* POST /:sessionId/join - Join an existing session.
|
|
123
158
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EACL,WAAW,EACX,SAAS,EACT,0BAA0B,EAC1B,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,UAAU,QAAQ,CAAC,CAA4D;IACnF,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC;IACjD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC5C,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/ui/components/Layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAInC,sCAAsC;AACtC,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC;CACf;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/ui/components/Layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAInC,sCAAsC;AACtC,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC;CACf;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,CAwBlC,CAAC"}
|
|
@@ -5,7 +5,7 @@ import { globalStyles } from "../styles/theme.js";
|
|
|
5
5
|
* Base HTML shell with head, meta tags, Google Fonts, and global styles.
|
|
6
6
|
* Wraps every page with consistent document structure.
|
|
7
7
|
*/
|
|
8
|
-
export const Layout = ({ title, children }) => (_jsxs("html", { lang: "en", children: [_jsxs("head", { children: [_jsx("meta", { charset: "utf-8" }), _jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }), _jsxs("title", { children: [title, "
|
|
8
|
+
export const Layout = ({ title, children }) => (_jsxs("html", { lang: "en", children: [_jsxs("head", { children: [_jsx("meta", { charset: "utf-8" }), _jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }), _jsxs("title", { children: [title, " \u00B7 Cogent"] }), _jsx(Style, {}), _jsx("link", { rel: "preconnect", href: "https://fonts.googleapis.com" }), _jsx("link", { rel: "preconnect", href: "https://fonts.gstatic.com", crossorigin: "" }), _jsx("link", { rel: "stylesheet", href: "https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,500;9..144,600;9..144,700&family=Geist:wght@400;500;600;700&family=Geist+Mono:wght@400;500;600&display=swap" }), _jsx("link", { rel: "icon", href: "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><rect width='16' height='16' rx='3' fill='%230a0c0f'/><circle cx='8' cy='8' r='3.4' fill='%23c9f24e'/></svg>" }), _jsx("script", { async: true, src: "https://www.googletagmanager.com/gtag/js?id=G-6DKTK06CZT" }), _jsx("script", { dangerouslySetInnerHTML: {
|
|
9
9
|
__html: `window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('js',new Date());gtag('config','G-6DKTK06CZT');`
|
|
10
10
|
} })] }), _jsx("body", { class: globalStyles, children: children })] }));
|
|
11
11
|
//# sourceMappingURL=Layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/ui/components/Layout.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAoB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC9D,gBAAM,IAAI,EAAC,IAAI,aACb,2BACE,eAAM,OAAO,EAAC,OAAO,GAAG,EACxB,eAAM,IAAI,EAAC,UAAU,EAAC,OAAO,EAAC,qCAAqC,GAAG,EACtE,4BAAQ,KAAK,
|
|
1
|
+
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/ui/components/Layout.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAoB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC9D,gBAAM,IAAI,EAAC,IAAI,aACb,2BACE,eAAM,OAAO,EAAC,OAAO,GAAG,EACxB,eAAM,IAAI,EAAC,UAAU,EAAC,OAAO,EAAC,qCAAqC,GAAG,EACtE,4BAAQ,KAAK,sBAAkB,EAC/B,KAAC,KAAK,KAAG,EACT,eAAM,GAAG,EAAC,YAAY,EAAC,IAAI,EAAC,8BAA8B,GAAG,EAC7D,eAAM,GAAG,EAAC,YAAY,EAAC,IAAI,EAAC,2BAA2B,EAAC,WAAW,EAAC,EAAE,GAAG,EACzE,eACE,GAAG,EAAC,YAAY,EAChB,IAAI,EAAC,gLAAgL,GACrL,EACF,eACE,GAAG,EAAC,MAAM,EACV,IAAI,EAAC,6LAA6L,GAClM,EACF,iBAAQ,KAAK,QAAC,GAAG,EAAC,0DAA0D,GAAG,EAC/E,iBAAQ,uBAAuB,EAAE;wBAC/B,MAAM,EAAE,uIAAuI;qBAChJ,GAAI,IACA,EACP,eAAM,KAAK,EAAE,YAAY,YAAG,QAAQ,GAAQ,IACvC,CACR,CAAC"}
|
|
@@ -33,5 +33,5 @@ const contentArea = css `
|
|
|
33
33
|
* Terminal-styled container with optional header bar (colored dots + title)
|
|
34
34
|
* and padded content area. Used to wrap code blocks and guide sections.
|
|
35
35
|
*/
|
|
36
|
-
export const Terminal = ({ title, children }) => (_jsxs("div", { class: terminalWrapper, children: [title && (_jsxs("div", { class: headerBar, children: [_jsx("span", { class: dot, style:
|
|
36
|
+
export const Terminal = ({ title, children }) => (_jsxs("div", { class: terminalWrapper, children: [title && (_jsxs("div", { class: headerBar, children: [_jsx("span", { class: dot, style: `background: ${colors.red};` }), _jsx("span", { class: dot, style: `background: ${colors.amber};` }), _jsx("span", { class: dot, style: `background: ${colors.green};` }), _jsx("span", { class: titleText, children: title })] })), _jsx("div", { class: contentArea, children: children })] }));
|
|
37
37
|
//# sourceMappingURL=Terminal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Terminal.js","sourceRoot":"","sources":["../../../src/ui/components/Terminal.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQ5C,MAAM,eAAe,GAA2B,GAAG,CAAA;gBACnC,MAAM,CAAC,UAAU;sBACX,MAAM,CAAC,MAAM;;;CAGlC,CAAC;AAEF,MAAM,SAAS,GAA2B,GAAG,CAAA;;;6BAGhB,MAAM,CAAC,MAAM;;;;CAIzC,CAAC;AAEF,MAAM,GAAG,GAA2B,GAAG,CAAA;;;;;CAKtC,CAAC;AAEF,MAAM,SAAS,GAA2B,GAAG,CAAA;WAClC,MAAM,CAAC,SAAS;;;CAG1B,CAAC;AAEF,MAAM,WAAW,GAA2B,GAAG,CAAA;;CAE9C,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAsB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAClE,eAAK,KAAK,EAAE,eAAe,aACxB,KAAK,IAAI,CACR,eAAK,KAAK,EAAE,SAAS,aACnB,eAAM,KAAK,EAAE,GAAG,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"Terminal.js","sourceRoot":"","sources":["../../../src/ui/components/Terminal.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQ5C,MAAM,eAAe,GAA2B,GAAG,CAAA;gBACnC,MAAM,CAAC,UAAU;sBACX,MAAM,CAAC,MAAM;;;CAGlC,CAAC;AAEF,MAAM,SAAS,GAA2B,GAAG,CAAA;;;6BAGhB,MAAM,CAAC,MAAM;;;;CAIzC,CAAC;AAEF,MAAM,GAAG,GAA2B,GAAG,CAAA;;;;;CAKtC,CAAC;AAEF,MAAM,SAAS,GAA2B,GAAG,CAAA;WAClC,MAAM,CAAC,SAAS;;;CAG1B,CAAC;AAEF,MAAM,WAAW,GAA2B,GAAG,CAAA;;CAE9C,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAsB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAClE,eAAK,KAAK,EAAE,eAAe,aACxB,KAAK,IAAI,CACR,eAAK,KAAK,EAAE,SAAS,aACnB,eAAM,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,MAAM,CAAC,GAAG,GAAG,GAAI,EACzD,eAAM,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,MAAM,CAAC,KAAK,GAAG,GAAI,EAC3D,eAAM,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,MAAM,CAAC,KAAK,GAAG,GAAI,EAC3D,eAAM,KAAK,EAAE,SAAS,YAAG,KAAK,GAAQ,IAClC,CACP,EACD,cAAK,KAAK,EAAE,WAAW,YAAG,QAAQ,GAAO,IACrC,CACP,CAAC"}
|
|
@@ -5,8 +5,8 @@ interface LandingPageProps {
|
|
|
5
5
|
stats: ServerStats;
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
8
|
-
* Full landing page with hero, live stats, installation
|
|
9
|
-
* connection guide, and SSE script for real-time stat updates.
|
|
8
|
+
* Full landing page with editorial hero + CTA, live stats, installation
|
|
9
|
+
* instructions, connection guide, and SSE script for real-time stat updates.
|
|
10
10
|
*/
|
|
11
11
|
export declare const LandingPage: FC<LandingPageProps>;
|
|
12
12
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LandingPage.d.ts","sourceRoot":"","sources":["../../../src/ui/pages/LandingPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAMnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEnE,2CAA2C;AAC3C,UAAU,gBAAgB;IACxB,KAAK,EAAE,WAAW,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"LandingPage.d.ts","sourceRoot":"","sources":["../../../src/ui/pages/LandingPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAMnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEnE,2CAA2C;AAC3C,UAAU,gBAAgB;IACxB,KAAK,EAAE,WAAW,CAAC;CACpB;AAmPD;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAyP5C,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { css } from "hono/css";
|
|
|
3
3
|
import { Layout } from "../components/Layout.js";
|
|
4
4
|
import { StatCard } from "../components/StatCard.js";
|
|
5
5
|
import { Terminal } from "../components/Terminal.js";
|
|
6
|
-
import { colors
|
|
6
|
+
import { colors } from "../styles/theme.js";
|
|
7
7
|
// --- Styles ---
|
|
8
8
|
const container = css `
|
|
9
9
|
max-width: 960px;
|
|
@@ -12,67 +12,119 @@ const container = css `
|
|
|
12
12
|
`;
|
|
13
13
|
const heroSection = css `
|
|
14
14
|
text-align: center;
|
|
15
|
-
padding:
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
font-
|
|
15
|
+
padding: 4rem 0 2.5rem;
|
|
16
|
+
background: radial-gradient(ellipse 60% 60% at 50% 0%, ${colors.accentSoft}, transparent 70%);
|
|
17
|
+
`;
|
|
18
|
+
const kicker = css `
|
|
19
|
+
font-family: ${"'Geist Mono', ui-monospace, monospace"};
|
|
20
|
+
font-size: 0.72rem;
|
|
21
|
+
letter-spacing: 0.18em;
|
|
22
|
+
text-transform: uppercase;
|
|
20
23
|
color: ${colors.green};
|
|
21
|
-
margin: 0 0
|
|
24
|
+
margin: 0 0 1.1rem 0;
|
|
22
25
|
`;
|
|
23
|
-
const
|
|
24
|
-
font-size:
|
|
25
|
-
|
|
26
|
-
margin: 0;
|
|
27
|
-
|
|
28
|
-
font-family: inherit;
|
|
29
|
-
display: inline-block;
|
|
30
|
-
text-align: left;
|
|
26
|
+
const heroTitle = css `
|
|
27
|
+
font-size: clamp(2.3rem, 5.2vw, 3.6rem);
|
|
28
|
+
color: ${colors.text};
|
|
29
|
+
margin: 0 auto 1rem;
|
|
30
|
+
max-width: 18ch;
|
|
31
31
|
`;
|
|
32
32
|
const heroSubtitle = css `
|
|
33
|
-
font-size:
|
|
33
|
+
font-size: 1.05rem;
|
|
34
34
|
color: ${colors.textMuted};
|
|
35
|
-
margin: 0;
|
|
35
|
+
margin: 0 auto;
|
|
36
|
+
max-width: 46ch;
|
|
37
|
+
line-height: 1.6;
|
|
36
38
|
`;
|
|
37
|
-
const
|
|
38
|
-
display:
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
const ctaRow = css `
|
|
40
|
+
display: flex;
|
|
41
|
+
gap: 0.85rem;
|
|
42
|
+
flex-wrap: wrap;
|
|
43
|
+
justify-content: center;
|
|
44
|
+
margin: 2.2rem 0 1.1rem;
|
|
45
|
+
`;
|
|
46
|
+
const ctaPrimary = css `
|
|
47
|
+
display: inline-flex;
|
|
48
|
+
align-items: center;
|
|
41
49
|
background: ${colors.green};
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
50
|
+
color: ${colors.textOnAccent};
|
|
51
|
+
font-weight: 600;
|
|
52
|
+
font-size: 0.95rem;
|
|
53
|
+
padding: 0.8rem 1.6rem;
|
|
54
|
+
border-radius: 999px;
|
|
55
|
+
box-shadow: 0 0 0 1px ${colors.borderGlow}, 0 10px 44px -14px rgba(201, 242, 78, 0.28);
|
|
56
|
+
transition: background 0.2s, transform 0.2s;
|
|
57
|
+
&:hover {
|
|
58
|
+
background: ${colors.greenHover};
|
|
59
|
+
text-decoration: none;
|
|
60
|
+
transform: translateY(-1px);
|
|
61
|
+
}
|
|
62
|
+
`;
|
|
63
|
+
const ctaSecondary = css `
|
|
64
|
+
display: inline-flex;
|
|
65
|
+
align-items: center;
|
|
66
|
+
color: ${colors.text};
|
|
67
|
+
font-weight: 500;
|
|
68
|
+
font-size: 0.95rem;
|
|
69
|
+
padding: 0.8rem 1.5rem;
|
|
70
|
+
border: 1px solid ${colors.border};
|
|
71
|
+
border-radius: 999px;
|
|
72
|
+
transition: border-color 0.2s, color 0.2s;
|
|
73
|
+
&:hover {
|
|
74
|
+
border-color: ${colors.green};
|
|
75
|
+
color: ${colors.text};
|
|
76
|
+
text-decoration: none;
|
|
77
|
+
}
|
|
78
|
+
`;
|
|
79
|
+
const teamUpsell = css `
|
|
80
|
+
margin: 1.4rem 0 0;
|
|
81
|
+
font-size: 0.88rem;
|
|
82
|
+
color: ${colors.textMuted};
|
|
83
|
+
& a {
|
|
84
|
+
color: ${colors.green};
|
|
85
|
+
font-weight: 600;
|
|
86
|
+
}
|
|
87
|
+
`;
|
|
88
|
+
const byline = css `
|
|
89
|
+
margin: 0.6rem 0 0;
|
|
90
|
+
font-size: 0.8rem;
|
|
91
|
+
color: ${colors.textFaint};
|
|
92
|
+
& a {
|
|
93
|
+
color: inherit;
|
|
94
|
+
}
|
|
45
95
|
`;
|
|
46
96
|
const statsRow = css `
|
|
47
97
|
display: flex;
|
|
48
98
|
gap: 1.5rem;
|
|
49
99
|
flex-wrap: wrap;
|
|
50
100
|
justify-content: center;
|
|
51
|
-
margin:
|
|
101
|
+
margin: 1.5rem 0 3.5rem;
|
|
52
102
|
`;
|
|
53
103
|
const section = css `
|
|
54
104
|
margin-bottom: 2.5rem;
|
|
55
105
|
`;
|
|
56
106
|
const sectionTitle = css `
|
|
57
|
-
font-size: 1.
|
|
107
|
+
font-size: 1.4rem;
|
|
58
108
|
color: ${colors.text};
|
|
59
109
|
margin: 0 0 1rem 0;
|
|
60
|
-
font-weight:
|
|
110
|
+
font-weight: 600;
|
|
61
111
|
`;
|
|
62
112
|
const codeBlock = css `
|
|
63
113
|
background: ${colors.bg};
|
|
64
114
|
border: 1px solid ${colors.border};
|
|
65
|
-
border-radius:
|
|
115
|
+
border-radius: 8px;
|
|
66
116
|
padding: 1rem;
|
|
67
117
|
color: ${colors.green};
|
|
68
|
-
font-
|
|
118
|
+
font-family: ${"'Geist Mono', ui-monospace, monospace"};
|
|
119
|
+
font-size: 0.88rem;
|
|
69
120
|
overflow-x: auto;
|
|
70
121
|
white-space: pre;
|
|
71
122
|
margin: 0.75rem 0;
|
|
72
123
|
`;
|
|
73
124
|
const noteText = css `
|
|
74
125
|
color: ${colors.textMuted};
|
|
75
|
-
font-size: 0.
|
|
126
|
+
font-size: 0.9rem;
|
|
127
|
+
line-height: 1.6;
|
|
76
128
|
margin: 0.75rem 0;
|
|
77
129
|
`;
|
|
78
130
|
const stepNumber = css `
|
|
@@ -81,6 +133,7 @@ const stepNumber = css `
|
|
|
81
133
|
`;
|
|
82
134
|
const stepCommand = css `
|
|
83
135
|
color: ${colors.green};
|
|
136
|
+
font-family: ${"'Geist Mono', ui-monospace, monospace"};
|
|
84
137
|
`;
|
|
85
138
|
const stepLine = css `
|
|
86
139
|
margin: 0.75rem 0;
|
|
@@ -88,41 +141,43 @@ const stepLine = css `
|
|
|
88
141
|
`;
|
|
89
142
|
const promptChar = css `
|
|
90
143
|
color: ${colors.textMuted};
|
|
144
|
+
font-family: ${"'Geist Mono', ui-monospace, monospace"};
|
|
91
145
|
margin-right: 0.5rem;
|
|
92
146
|
`;
|
|
93
147
|
const howToLink = css `
|
|
94
148
|
display: block;
|
|
95
149
|
background: ${colors.bgCard};
|
|
96
150
|
border: 1px solid ${colors.border};
|
|
97
|
-
border-radius:
|
|
151
|
+
border-radius: 12px;
|
|
98
152
|
padding: 1.5rem 2rem;
|
|
99
153
|
text-align: center;
|
|
100
154
|
text-decoration: none;
|
|
101
155
|
transition: border-color 0.2s;
|
|
102
|
-
margin-bottom:
|
|
156
|
+
margin-bottom: 1.25rem;
|
|
103
157
|
&:hover {
|
|
104
158
|
border-color: ${colors.green};
|
|
105
159
|
text-decoration: none;
|
|
106
160
|
}
|
|
107
161
|
`;
|
|
108
162
|
const howToTitle = css `
|
|
109
|
-
font-size: 1.
|
|
163
|
+
font-size: 1.05rem;
|
|
110
164
|
color: ${colors.green};
|
|
111
|
-
font-weight:
|
|
165
|
+
font-weight: 600;
|
|
112
166
|
margin: 0 0 0.5rem 0;
|
|
113
167
|
`;
|
|
114
168
|
const howToDesc = css `
|
|
115
|
-
font-size: 0.
|
|
169
|
+
font-size: 0.88rem;
|
|
116
170
|
color: ${colors.textMuted};
|
|
117
171
|
margin: 0;
|
|
172
|
+
line-height: 1.6;
|
|
118
173
|
`;
|
|
119
174
|
const footer = css `
|
|
120
175
|
text-align: center;
|
|
121
|
-
padding:
|
|
122
|
-
color: ${colors.
|
|
123
|
-
font-size: 0.
|
|
176
|
+
padding: 2.5rem 0 2rem;
|
|
177
|
+
color: ${colors.textFaint};
|
|
178
|
+
font-size: 0.82rem;
|
|
124
179
|
border-top: 1px solid ${colors.border};
|
|
125
|
-
margin-top:
|
|
180
|
+
margin-top: 3rem;
|
|
126
181
|
`;
|
|
127
182
|
const platformGrid = css `
|
|
128
183
|
display: grid;
|
|
@@ -133,7 +188,7 @@ const platformGrid = css `
|
|
|
133
188
|
const platformCard = css `
|
|
134
189
|
background: ${colors.bgCard};
|
|
135
190
|
border: 1px solid ${colors.border};
|
|
136
|
-
border-radius:
|
|
191
|
+
border-radius: 12px;
|
|
137
192
|
padding: 1.25rem 1.5rem;
|
|
138
193
|
transition: border-color 0.2s;
|
|
139
194
|
&:hover {
|
|
@@ -141,30 +196,17 @@ const platformCard = css `
|
|
|
141
196
|
}
|
|
142
197
|
& h3 {
|
|
143
198
|
font-size: 1rem;
|
|
144
|
-
font-weight:
|
|
145
|
-
color: ${colors.
|
|
199
|
+
font-weight: 600;
|
|
200
|
+
color: ${colors.text};
|
|
146
201
|
margin: 0 0 0.5rem 0;
|
|
147
|
-
font-family: inherit;
|
|
148
202
|
}
|
|
149
203
|
& p {
|
|
150
|
-
font-size: 0.
|
|
204
|
+
font-size: 0.88rem;
|
|
151
205
|
color: ${colors.textMuted};
|
|
152
206
|
margin: 0;
|
|
153
|
-
line-height: 1.
|
|
207
|
+
line-height: 1.55;
|
|
154
208
|
}
|
|
155
209
|
`;
|
|
156
|
-
// --- JSON config snippet for manual setup ---
|
|
157
|
-
const mcpConfigSnippet = `{
|
|
158
|
-
"mcpServers": {
|
|
159
|
-
"cogent-bridge": {
|
|
160
|
-
"command": "npx",
|
|
161
|
-
"args": ["-y", "@essentialai/cogent-bridge"],
|
|
162
|
-
"env": {
|
|
163
|
-
"COGENT_ENDPOINT": "https://cogent.tools"
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}`;
|
|
168
210
|
// --- SSE inline script ---
|
|
169
211
|
const sseScript = `
|
|
170
212
|
const es = new EventSource('/ui/stats/stream');
|
|
@@ -177,16 +219,11 @@ const sseScript = `
|
|
|
177
219
|
});
|
|
178
220
|
`;
|
|
179
221
|
/**
|
|
180
|
-
* Full landing page with hero, live stats, installation
|
|
181
|
-
* connection guide, and SSE script for real-time stat updates.
|
|
222
|
+
* Full landing page with editorial hero + CTA, live stats, installation
|
|
223
|
+
* instructions, connection guide, and SSE script for real-time stat updates.
|
|
182
224
|
*/
|
|
183
|
-
export const LandingPage = ({ stats }) => (_jsx(Layout, { title: "
|
|
184
|
-
██╔════╝██╔═══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝
|
|
185
|
-
██║ ██║ ██║██║ ███╗█████╗ ██╔██╗ ██║ ██║
|
|
186
|
-
██║ ██║ ██║██║ ██║██╔══╝ ██║╚██╗██║ ██║
|
|
187
|
-
╚██████╗╚██████╔╝╚██████╔╝███████╗██║ ╚████║ ██║
|
|
188
|
-
╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝` }), _jsx("span", { class: cursor })] }), _jsx("p", { class: heroSubtitle, children: "Real-time relay for AI coding agents \u2014 Claude Code, OpenAI Codex, and Slack" }), _jsxs("p", { class: heroSubtitle, style: "margin-top: 0.5rem; font-size: 0.8rem;", children: ["by ", _jsx("a", { href: "https://essentialai.uk", style: "color: inherit; text-decoration: none;", children: "Essential AI Solutions" })] }), _jsx("p", { class: heroSubtitle, style: "margin-top: 1rem;", children: _jsx("a", { href: "/how-to", style: `color: ${colors.green}; font-weight: 700;`, children: "How-To Guide \u2192" }) })] }), _jsxs("div", { class: statsRow, children: [_jsx(StatCard, { id: "stat-sessions", value: stats.activeSessions, label: "Active Sessions" }), _jsx(StatCard, { id: "stat-agents", value: stats.connectedAgents, label: "Connected Agents" }), _jsx(StatCard, { id: "stat-messages", value: stats.totalMessagesRelayed, label: "Messages Relayed" })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Install via Plugin Marketplace (Recommended)" }), _jsxs(Terminal, { title: "Two Commands \u2014 Full Setup", children: [_jsx("p", { class: noteText, children: "Install the plugin with slash commands, auto-discovery, and cloud relay:" }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "claude plugin marketplace add https://github.com/eaisdevelopment/cogent.git" })] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "claude plugin install cogent@cogent" })] }), _jsxs("p", { class: noteText, children: ["Restart Claude Code. Use ", _jsx("span", { class: stepCommand, children: "/cogent:register" }), " to join the bridge \u2014 session discovery, registration, and message protocol are handled automatically."] })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Alternative: Manual MCP Setup" }), _jsxs(Terminal, { title: "MCP Tools Only (No Slash Commands)", children: [_jsx("p", { class: noteText, children: "Or use a single command to register the MCP server directly:" }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "claude mcp add cogent -e COGENT_ENDPOINT=https://cogent.tools -s user -- npx -y @essentialai/cogent-bridge" })] }), _jsxs("p", { class: noteText, children: ["This gives you the six ", _jsx("span", { class: stepCommand, children: "cogent_" }), " MCP tools. For slash commands (", _jsx("span", { class: stepCommand, children: "/cogent:register" }), ", etc.), use the Plugin Marketplace above."] })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "OpenAI Codex" }), _jsxs(Terminal, { title: "Add COGENT to Codex", children: [_jsx("p", { class: noteText, children: "Register the Cogent MCP server (works on all Codex CLI versions):" }), _jsx("pre", { class: codeBlock, children: `codex mcp add cogent \\
|
|
225
|
+
export const LandingPage = ({ stats }) => (_jsx(Layout, { title: "Real-time relay for AI coding agents", children: _jsxs("div", { class: container, children: [_jsxs("div", { class: heroSection, children: [_jsx("p", { class: kicker, children: "Free \u00B7 Open Relay" }), _jsx("h1", { class: heroTitle, children: "Real-time relay for your AI coding agents" }), _jsx("p", { class: heroSubtitle, children: "Claude Code, OpenAI Codex, and Slack \u2014 one shared channel, instant messages. Free and open-source." }), _jsxs("div", { class: ctaRow, children: [_jsx("a", { href: "#install", class: ctaPrimary, children: "Get started \u2014 free \u2192" }), _jsx("a", { href: "/how-to", class: ctaSecondary, children: "Read the How-To" })] }), _jsxs("p", { class: teamUpsell, children: ["Running a team?", " ", _jsx("a", { href: "https://portal.cogent.tools", children: "Cogent Team" }), " adds organizations, SSO & billing \u2192"] }), _jsxs("p", { class: byline, children: ["by ", _jsx("a", { href: "https://essentialai.uk", children: "Essential AI Solutions" })] })] }), _jsxs("div", { class: statsRow, children: [_jsx(StatCard, { id: "stat-sessions", value: stats.activeSessions, label: "Active Sessions" }), _jsx(StatCard, { id: "stat-agents", value: stats.connectedAgents, label: "Connected Agents" }), _jsx(StatCard, { id: "stat-messages", value: stats.totalMessagesRelayed, label: "Messages Relayed" })] }), _jsxs("div", { class: section, id: "install", children: [_jsx("h2", { class: sectionTitle, children: "Install via Plugin Marketplace (Recommended)" }), _jsxs(Terminal, { title: "Two Commands \u2014 Full Setup", children: [_jsx("p", { class: noteText, children: "Install the plugin with slash commands, auto-discovery, and cloud relay:" }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "claude plugin marketplace add https://github.com/eaisdevelopment/cogent.git" })] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "claude plugin install cogent@cogent" })] }), _jsxs("p", { class: noteText, children: ["Restart Claude Code. Use ", _jsx("span", { class: stepCommand, children: "/cogent:register" }), " to join the bridge \u2014 session discovery, registration, and message protocol are handled automatically."] })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Alternative: Manual MCP Setup" }), _jsxs(Terminal, { title: "MCP Tools Only (No Slash Commands)", children: [_jsx("p", { class: noteText, children: "Or use a single command to register the MCP server directly:" }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "claude mcp add cogent -e COGENT_ENDPOINT=https://cogent.tools -s user -- npx -y @essentialai/cogent-bridge" })] }), _jsxs("p", { class: noteText, children: ["This gives you the six ", _jsx("span", { class: stepCommand, children: "cogent_" }), " MCP tools. For slash commands (", _jsx("span", { class: stepCommand, children: "/cogent:register" }), ", etc.), use the Plugin Marketplace above."] })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "OpenAI Codex" }), _jsxs(Terminal, { title: "Add Cogent to Codex", children: [_jsx("p", { class: noteText, children: "Register the Cogent MCP server (works on all Codex CLI versions):" }), _jsx("pre", { class: codeBlock, children: `codex mcp add cogent \\
|
|
189
226
|
--env COGENT_ENDPOINT=https://cogent.tools \\
|
|
190
227
|
--env COGENT_PLATFORM=codex \\
|
|
191
|
-
-- npx -y @essentialai/cogent-bridge` }), _jsxs("p", { class: noteText, children: ["Restart Codex. This gives you the six ", _jsx("span", { class: stepCommand, children: "cogent_" }), " MCP tools. Use ", _jsx("span", { class: stepCommand, children: "cogent_register_peer" }), " to join the bridge."] }), _jsxs("details", { style: "margin-top: 1rem;", children: [_jsx("summary", { style: `cursor: pointer; color: ${colors.textMuted}; font-size: 0.85rem;`, children: "Plugin Marketplace (Codex CLI 0.133.0+)" }), _jsxs("div", { style: "margin-top: 0.75rem;", children: [_jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "codex plugin marketplace add eaisdevelopment/cogent" })] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "codex plugin add cogent@cogent" })] }), _jsx("p", { class: noteText, children: "Adds skills + MCP tools in one step. Requires Codex CLI 0.133.0 or newer." })] })] })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Updating to the Latest Version" }), _jsxs(Terminal, { title: "Stay Up to Date", children: [_jsxs("p", { class: noteText, children: [_jsx("span", { class: stepNumber, children: "Plugin Marketplace:" }), " Re-run the install command to pull the latest version:"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "claude plugin marketplace add https://github.com/eaisdevelopment/cogent.git" })] }), _jsxs("p", { class: noteText, children: [_jsx("span", { class: stepNumber, children: "Manual MCP / Claude Desktop:" }), " If you used ", _jsx("span", { class: stepCommand, children: "npx -y @essentialai/cogent-bridge" }), ", you already get the latest version automatically on each restart. No action needed."] }), _jsxs("p", { class: noteText, children: [_jsx("span", { class: stepNumber, children: "Global install:" }), " If you installed globally with npm, update explicitly:"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "npm update -g @essentialai/cogent-bridge" })] })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Quick Start" }), _jsxs(Terminal, { title: "Quick Start", children: [_jsxs("div", { class: stepLine, children: [_jsx("span", { class: stepNumber, children: "1." }), " Create a channel with a friendly name"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: ">" }), _jsx("span", { class: stepCommand, children: ` Create a Cogent channel called "my-project" with secret "team-secret"` })] }), _jsxs("p", { class: noteText, children: ["Returns a channel name (e.g., ", _jsx("span", { class: stepCommand, children: "my-project" }), ") and a secret to share. Omit the name to auto-generate one (e.g., ", _jsx("span", { class: stepCommand, children: "swift-fox-a3f1" }), ")."] }), _jsxs("div", { class: stepLine, children: [_jsx("span", { class: stepNumber, children: "2." }), " Join from another Claude Code instance using the channel name"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: ">" }), _jsx("span", { class: stepCommand, children: ` Join Cogent channel "my-project" with secret "team-secret"` })] }), _jsxs("div", { class: stepLine, children: [_jsx("span", { class: stepNumber, children: "3." }), " Start communicating"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: ">" }), _jsx("span", { class: stepCommand, children: ` Register as "backend" and send a message to "frontend"` })] })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Supported Platforms" }), _jsxs("div", { class: platformGrid, children: [_jsxs("div", { class: platformCard, children: [_jsx("h3", { children: "\u26A1 Claude Code" }), _jsx("p", { children: "Full auto-relay \u2014 Claude sessions respond automatically to inbound messages." })] }), _jsxs("div", { class: platformCard, children: [_jsx("h3", { children: "\uD83E\uDD16 OpenAI Codex" }), _jsx("p", { children: "Channel messaging \u2014 Codex agents send and receive via MCP tools. Auto-relay via plugin (v3.4+)." })] }), _jsxs("div", { class: platformCard, children: [_jsx("h3", { children: "\uD83D\uDCAC Slack" }), _jsx("p", { children: "Bridge human conversations \u2014 Slack users talk to AI agents via the Slack adapter." })] })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Slack Integration (NEW)" }), _jsxs(Terminal, { title: "Bridge Slack Channels to
|
|
228
|
+
-- npx -y @essentialai/cogent-bridge` }), _jsxs("p", { class: noteText, children: ["Restart Codex. This gives you the six ", _jsx("span", { class: stepCommand, children: "cogent_" }), " MCP tools. Use ", _jsx("span", { class: stepCommand, children: "cogent_register_peer" }), " to join the bridge."] }), _jsxs("details", { style: "margin-top: 1rem;", children: [_jsx("summary", { style: `cursor: pointer; color: ${colors.textMuted}; font-size: 0.85rem;`, children: "Plugin Marketplace (Codex CLI 0.133.0+)" }), _jsxs("div", { style: "margin-top: 0.75rem;", children: [_jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "codex plugin marketplace add eaisdevelopment/cogent" })] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "codex plugin add cogent@cogent" })] }), _jsx("p", { class: noteText, children: "Adds skills + MCP tools in one step. Requires Codex CLI 0.133.0 or newer." })] })] })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Updating to the Latest Version" }), _jsxs(Terminal, { title: "Stay Up to Date", children: [_jsxs("p", { class: noteText, children: [_jsx("span", { class: stepNumber, children: "Plugin Marketplace:" }), " Re-run the install command to pull the latest version:"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "claude plugin marketplace add https://github.com/eaisdevelopment/cogent.git" })] }), _jsxs("p", { class: noteText, children: [_jsx("span", { class: stepNumber, children: "Manual MCP / Claude Desktop:" }), " If you used ", _jsx("span", { class: stepCommand, children: "npx -y @essentialai/cogent-bridge" }), ", you already get the latest version automatically on each restart. No action needed."] }), _jsxs("p", { class: noteText, children: [_jsx("span", { class: stepNumber, children: "Global install:" }), " If you installed globally with npm, update explicitly:"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "npm update -g @essentialai/cogent-bridge" })] })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Quick Start" }), _jsxs(Terminal, { title: "Quick Start", children: [_jsxs("div", { class: stepLine, children: [_jsx("span", { class: stepNumber, children: "1." }), " Create a channel with a friendly name"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: ">" }), _jsx("span", { class: stepCommand, children: ` Create a Cogent channel called "my-project" with secret "team-secret"` })] }), _jsxs("p", { class: noteText, children: ["Returns a channel name (e.g., ", _jsx("span", { class: stepCommand, children: "my-project" }), ") and a secret to share. Omit the name to auto-generate one (e.g., ", _jsx("span", { class: stepCommand, children: "swift-fox-a3f1" }), ")."] }), _jsxs("div", { class: stepLine, children: [_jsx("span", { class: stepNumber, children: "2." }), " Join from another Claude Code instance using the channel name"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: ">" }), _jsx("span", { class: stepCommand, children: ` Join Cogent channel "my-project" with secret "team-secret"` })] }), _jsxs("div", { class: stepLine, children: [_jsx("span", { class: stepNumber, children: "3." }), " Start communicating"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: ">" }), _jsx("span", { class: stepCommand, children: ` Register as "backend" and send a message to "frontend"` })] })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Supported Platforms" }), _jsxs("div", { class: platformGrid, children: [_jsxs("div", { class: platformCard, children: [_jsx("h3", { children: "\u26A1 Claude Code" }), _jsx("p", { children: "Full auto-relay \u2014 Claude sessions respond automatically to inbound messages." })] }), _jsxs("div", { class: platformCard, children: [_jsx("h3", { children: "\uD83E\uDD16 OpenAI Codex" }), _jsx("p", { children: "Channel messaging \u2014 Codex agents send and receive via MCP tools. Auto-relay via plugin (v3.4+)." })] }), _jsxs("div", { class: platformCard, children: [_jsx("h3", { children: "\uD83D\uDCAC Slack" }), _jsx("p", { children: "Bridge human conversations \u2014 Slack users talk to AI agents via the Slack adapter." })] })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Slack Integration (NEW)" }), _jsxs(Terminal, { title: "Bridge Slack Channels to Cogent", children: [_jsx("p", { class: noteText, children: "Connect your Slack workspace to Cogent so humans and AI agents communicate in the same channel." }), _jsxs("div", { class: stepLine, children: [_jsx("span", { class: stepNumber, children: "1." }), " Install the Cogent Bridge Slack app in your workspace"] }), _jsxs("div", { class: stepLine, children: [_jsx("span", { class: stepNumber, children: "2." }), " In any Slack channel, run:"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "/" }), _jsx("span", { class: stepCommand, children: "cogent map <sessionId> <secret>" })] }), _jsxs("div", { class: stepLine, children: [_jsx("span", { class: stepNumber, children: "3." }), " Messages flow bidirectionally \u2014 Slack users and CC agents share the same conversation"] }), _jsxs("p", { class: noteText, children: ["Slash commands: ", _jsx("span", { class: stepCommand, children: "/cogent peers" }), " (list all peers), ", _jsx("span", { class: stepCommand, children: "/cogent send @backend msg" }), " (targeted message), ", _jsx("span", { class: stepCommand, children: "/cogent status" }), " (session health)"] })] })] }), _jsxs("a", { href: "/how-to", class: howToLink, children: [_jsx("div", { class: howToTitle, children: "How Teams Deliver Faster with Cogent \u2192" }), _jsx("p", { class: howToDesc, children: "Real-world use cases, command examples, and best practices for parallel development, cross-team bug fixes, API contract negotiation, and more." })] }), _jsxs("a", { href: "/faq", class: howToLink, children: [_jsx("div", { class: howToTitle, children: "FAQ & Troubleshooting \u2192" }), _jsx("p", { class: howToDesc, children: "Common setup issues, message flow troubleshooting, version compatibility, and solutions for Slack bridge configuration." })] }), _jsxs("a", { href: "/update", class: howToLink, children: [_jsx("div", { class: howToTitle, children: "Update & Upgrade Guide \u2192" }), _jsx("p", { class: howToDesc, children: "Step-by-step upgrade instructions, breaking change notes, troubleshooting common update issues, and rollback procedures." })] }), _jsxs("div", { class: footer, children: ["Cogent \u2014 by ", _jsx("a", { href: "https://essentialai.uk", style: "color: inherit;", children: "Essential AI Solutions Ltd." }), " \u2014 ", _jsx("a", { href: "/", style: "color: inherit;", children: "cogent.tools" })] }), _jsx("script", { dangerouslySetInnerHTML: { __html: sseScript } })] }) }));
|
|
192
229
|
//# sourceMappingURL=LandingPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LandingPage.js","sourceRoot":"","sources":["../../../src/ui/pages/LandingPage.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"LandingPage.js","sourceRoot":"","sources":["../../../src/ui/pages/LandingPage.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQ5C,iBAAiB;AAEjB,MAAM,SAAS,GAA2B,GAAG,CAAA;;;;CAI5C,CAAC;AAEF,MAAM,WAAW,GAA2B,GAAG,CAAA;;;2DAGY,MAAM,CAAC,UAAU;CAC3E,CAAC;AAEF,MAAM,MAAM,GAA2B,GAAG,CAAA;iBACzB,uCAAuC;;;;WAI7C,MAAM,CAAC,KAAK;;CAEtB,CAAC;AAEF,MAAM,SAAS,GAA2B,GAAG,CAAA;;WAElC,MAAM,CAAC,IAAI;;;CAGrB,CAAC;AAEF,MAAM,YAAY,GAA2B,GAAG,CAAA;;WAErC,MAAM,CAAC,SAAS;;;;CAI1B,CAAC;AAEF,MAAM,MAAM,GAA2B,GAAG,CAAA;;;;;;CAMzC,CAAC;AAEF,MAAM,UAAU,GAA2B,GAAG,CAAA;;;gBAG9B,MAAM,CAAC,KAAK;WACjB,MAAM,CAAC,YAAY;;;;;0BAKJ,MAAM,CAAC,UAAU;;;kBAGzB,MAAM,CAAC,UAAU;;;;CAIlC,CAAC;AAEF,MAAM,YAAY,GAA2B,GAAG,CAAA;;;WAGrC,MAAM,CAAC,IAAI;;;;sBAIA,MAAM,CAAC,MAAM;;;;oBAIf,MAAM,CAAC,KAAK;aACnB,MAAM,CAAC,IAAI;;;CAGvB,CAAC;AAEF,MAAM,UAAU,GAA2B,GAAG,CAAA;;;WAGnC,MAAM,CAAC,SAAS;;aAEd,MAAM,CAAC,KAAK;;;CAGxB,CAAC;AAEF,MAAM,MAAM,GAA2B,GAAG,CAAA;;;WAG/B,MAAM,CAAC,SAAS;;;;CAI1B,CAAC;AAEF,MAAM,QAAQ,GAA2B,GAAG,CAAA;;;;;;CAM3C,CAAC;AAEF,MAAM,OAAO,GAA2B,GAAG,CAAA;;CAE1C,CAAC;AAEF,MAAM,YAAY,GAA2B,GAAG,CAAA;;WAErC,MAAM,CAAC,IAAI;;;CAGrB,CAAC;AAEF,MAAM,SAAS,GAA2B,GAAG,CAAA;gBAC7B,MAAM,CAAC,EAAE;sBACH,MAAM,CAAC,MAAM;;;WAGxB,MAAM,CAAC,KAAK;iBACN,uCAAuC;;;;;CAKvD,CAAC;AAEF,MAAM,QAAQ,GAA2B,GAAG,CAAA;WACjC,MAAM,CAAC,SAAS;;;;CAI1B,CAAC;AAEF,MAAM,UAAU,GAA2B,GAAG,CAAA;WACnC,MAAM,CAAC,KAAK;;CAEtB,CAAC;AAEF,MAAM,WAAW,GAA2B,GAAG,CAAA;WACpC,MAAM,CAAC,KAAK;iBACN,uCAAuC;CACvD,CAAC;AAEF,MAAM,QAAQ,GAA2B,GAAG,CAAA;;;CAG3C,CAAC;AAEF,MAAM,UAAU,GAA2B,GAAG,CAAA;WACnC,MAAM,CAAC,SAAS;iBACV,uCAAuC;;CAEvD,CAAC;AAEF,MAAM,SAAS,GAA2B,GAAG,CAAA;;gBAE7B,MAAM,CAAC,MAAM;sBACP,MAAM,CAAC,MAAM;;;;;;;;oBAQf,MAAM,CAAC,KAAK;;;CAG/B,CAAC;AAEF,MAAM,UAAU,GAA2B,GAAG,CAAA;;WAEnC,MAAM,CAAC,KAAK;;;CAGtB,CAAC;AAEF,MAAM,SAAS,GAA2B,GAAG,CAAA;;WAElC,MAAM,CAAC,SAAS;;;CAG1B,CAAC;AAEF,MAAM,MAAM,GAA2B,GAAG,CAAA;;;WAG/B,MAAM,CAAC,SAAS;;0BAED,MAAM,CAAC,MAAM;;CAEtC,CAAC;AAEF,MAAM,YAAY,GAA2B,GAAG,CAAA;;;;;CAK/C,CAAC;AAEF,MAAM,YAAY,GAA2B,GAAG,CAAA;gBAChC,MAAM,CAAC,MAAM;sBACP,MAAM,CAAC,MAAM;;;;;oBAKf,MAAM,CAAC,KAAK;;;;;aAKnB,MAAM,CAAC,IAAI;;;;;aAKX,MAAM,CAAC,SAAS;;;;CAI5B,CAAC;AAEF,4BAA4B;AAC5B,MAAM,SAAS,GAAG;;;;;;;;;CASjB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAyB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAC9D,KAAC,MAAM,IAAC,KAAK,EAAC,sCAAsC,YAClD,eAAK,KAAK,EAAE,SAAS,aAEnB,eAAK,KAAK,EAAE,WAAW,aACrB,YAAG,KAAK,EAAE,MAAM,uCAAuB,EACvC,aAAI,KAAK,EAAE,SAAS,0DAAgD,EACpE,YAAG,KAAK,EAAE,YAAY,wHAGlB,EACJ,eAAK,KAAK,EAAE,MAAM,aAChB,YAAG,IAAI,EAAC,UAAU,EAAC,KAAK,EAAE,UAAU,+CAEhC,EACJ,YAAG,IAAI,EAAC,SAAS,EAAC,KAAK,EAAE,YAAY,gCAEjC,IACA,EACN,aAAG,KAAK,EAAE,UAAU,gCACF,GAAG,EACnB,YAAG,IAAI,EAAC,6BAA6B,4BAAgB,iDACnD,EACJ,aAAG,KAAK,EAAE,MAAM,oBACX,YAAG,IAAI,EAAC,wBAAwB,uCAA2B,IAC5D,IACA,EAGN,eAAK,KAAK,EAAE,QAAQ,aAClB,KAAC,QAAQ,IAAC,EAAE,EAAC,eAAe,EAAC,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,EAAC,iBAAiB,GAAG,EACpF,KAAC,QAAQ,IAAC,EAAE,EAAC,aAAa,EAAC,KAAK,EAAE,KAAK,CAAC,eAAe,EAAE,KAAK,EAAC,kBAAkB,GAAG,EACpF,KAAC,QAAQ,IAAC,EAAE,EAAC,eAAe,EAAC,KAAK,EAAE,KAAK,CAAC,oBAAoB,EAAE,KAAK,EAAC,kBAAkB,GAAG,IACvF,EAGN,eAAK,KAAK,EAAE,OAAO,EAAE,EAAE,EAAC,SAAS,aAC/B,aAAI,KAAK,EAAE,YAAY,6DAAmD,EAC1E,MAAC,QAAQ,IAAC,KAAK,EAAC,gCAA2B,aACzC,YAAG,KAAK,EAAE,QAAQ,yFAA8E,EAChG,eAAK,KAAK,EAAE,SAAS,aACnB,eAAM,KAAK,EAAE,UAAU,kBAAU,EACjC,eAAM,KAAK,EAAE,WAAW,4FAEjB,IACH,EACN,eAAK,KAAK,EAAE,SAAS,aACnB,eAAM,KAAK,EAAE,UAAU,kBAAU,EACjC,eAAM,KAAK,EAAE,WAAW,oDAA4C,IAChE,EACN,aAAG,KAAK,EAAE,QAAQ,0CACS,eAAM,KAAK,EAAE,WAAW,iCAAyB,mHACxE,IACK,IACP,EAGN,eAAK,KAAK,EAAE,OAAO,aACjB,aAAI,KAAK,EAAE,YAAY,8CAAoC,EAC3D,MAAC,QAAQ,IAAC,KAAK,EAAC,oCAAoC,aAClD,YAAG,KAAK,EAAE,QAAQ,6EAAkE,EACpF,eAAK,KAAK,EAAE,SAAS,aACnB,eAAM,KAAK,EAAE,UAAU,kBAAU,EACjC,eAAM,KAAK,EAAE,WAAW,2HAEjB,IACH,EACN,aAAG,KAAK,EAAE,QAAQ,wCACO,eAAM,KAAK,EAAE,WAAW,wBAAgB,sCAAgC,eAAM,KAAK,EAAE,WAAW,iCAAyB,kDAC9I,IACK,IACP,EAGN,eAAK,KAAK,EAAE,OAAO,aACjB,aAAI,KAAK,EAAE,YAAY,6BAAmB,EAC1C,MAAC,QAAQ,IAAC,KAAK,EAAC,qBAAqB,aACnC,YAAG,KAAK,EAAE,QAAQ,kFAAuE,EACzF,cAAK,KAAK,EAAE,SAAS,YAAG;;;uCAGK,GAAO,EACpC,aAAG,KAAK,EAAE,QAAQ,uDACsB,eAAM,KAAK,EAAE,WAAW,wBAAgB,sBAC1E,eAAM,KAAK,EAAE,WAAW,qCAA6B,4BACvD,EACJ,mBAAS,KAAK,EAAC,mBAAmB,aAChC,kBAAS,KAAK,EAAE,2BAA2B,MAAM,CAAC,SAAS,uBAAuB,wDAAmD,EACrI,eAAK,KAAK,EAAC,sBAAsB,aAC/B,eAAK,KAAK,EAAE,SAAS,aACnB,eAAM,KAAK,EAAE,UAAU,kBAAU,EACjC,eAAM,KAAK,EAAE,WAAW,oEAA4D,IAChF,EACN,eAAK,KAAK,EAAE,SAAS,aACnB,eAAM,KAAK,EAAE,UAAU,kBAAU,EACjC,eAAM,KAAK,EAAE,WAAW,+CAAuC,IAC3D,EACN,YAAG,KAAK,EAAE,QAAQ,0FAA+E,IAC7F,IACE,IACD,IACP,EAGN,eAAK,KAAK,EAAE,OAAO,aACjB,aAAI,KAAK,EAAE,YAAY,+CAAqC,EAC5D,MAAC,QAAQ,IAAC,KAAK,EAAC,iBAAiB,aAC/B,aAAG,KAAK,EAAE,QAAQ,aAChB,eAAM,KAAK,EAAE,UAAU,oCAA4B,+DACjD,EACJ,eAAK,KAAK,EAAE,SAAS,aACnB,eAAM,KAAK,EAAE,UAAU,kBAAU,EACjC,eAAM,KAAK,EAAE,WAAW,4FAAoF,IACxG,EACN,aAAG,KAAK,EAAE,QAAQ,aAChB,eAAM,KAAK,EAAE,UAAU,6CAAqC,mBAAa,eAAM,KAAK,EAAE,WAAW,kDAA0C,6FAEzI,EACJ,aAAG,KAAK,EAAE,QAAQ,aAChB,eAAM,KAAK,EAAE,UAAU,gCAAwB,+DAC7C,EACJ,eAAK,KAAK,EAAE,SAAS,aACnB,eAAM,KAAK,EAAE,UAAU,kBAAU,EACjC,eAAM,KAAK,EAAE,WAAW,yDAAiD,IACrE,IACG,IACP,EAGN,eAAK,KAAK,EAAE,OAAO,aACjB,aAAI,KAAK,EAAE,YAAY,4BAAkB,EACzC,MAAC,QAAQ,IAAC,KAAK,EAAC,aAAa,aAC3B,eAAK,KAAK,EAAE,QAAQ,aAClB,eAAM,KAAK,EAAE,UAAU,mBAAW,8CAC9B,EACN,eAAK,KAAK,EAAE,SAAS,aACnB,eAAM,KAAK,EAAE,UAAU,kBAAa,EACpC,eAAM,KAAK,EAAE,WAAW,YACrB,wEAAwE,GACpE,IACH,EACN,aAAG,KAAK,EAAE,QAAQ,+CACc,eAAM,KAAK,EAAE,WAAW,2BAAmB,yEAC/B,eAAM,KAAK,EAAE,WAAW,+BAAuB,UACvF,EAEJ,eAAK,KAAK,EAAE,QAAQ,aAClB,eAAM,KAAK,EAAE,UAAU,mBAAW,sEAC9B,EACN,eAAK,KAAK,EAAE,SAAS,aACnB,eAAM,KAAK,EAAE,UAAU,kBAAa,EACpC,eAAM,KAAK,EAAE,WAAW,YACrB,6DAA6D,GACzD,IACH,EAEN,eAAK,KAAK,EAAE,QAAQ,aAClB,eAAM,KAAK,EAAE,UAAU,mBAAW,4BAC9B,EACN,eAAK,KAAK,EAAE,SAAS,aACnB,eAAM,KAAK,EAAE,UAAU,kBAAa,EACpC,eAAM,KAAK,EAAE,WAAW,YACrB,yDAAyD,GACrD,IACH,IACG,IACP,EAGN,eAAK,KAAK,EAAE,OAAO,aACjB,aAAI,KAAK,EAAE,YAAY,oCAA0B,EACjD,eAAK,KAAK,EAAE,YAAY,aACtB,eAAK,KAAK,EAAE,YAAY,aACtB,8CAAsB,EACtB,4GAAmF,IAC/E,EACN,eAAK,KAAK,EAAE,YAAY,aACtB,qDAAwB,EACxB,+HAAsG,IAClG,EACN,eAAK,KAAK,EAAE,YAAY,aACtB,8CAAiB,EACjB,iHAAwF,IACpF,IACF,IACF,EAGN,eAAK,KAAK,EAAE,OAAO,aACjB,aAAI,KAAK,EAAE,YAAY,wCAA8B,EACrD,MAAC,QAAQ,IAAC,KAAK,EAAC,iCAAiC,aAC/C,YAAG,KAAK,EAAE,QAAQ,gHAEd,EACJ,eAAK,KAAK,EAAE,QAAQ,aAClB,eAAM,KAAK,EAAE,UAAU,mBAAW,8DAC9B,EACN,eAAK,KAAK,EAAE,QAAQ,aAClB,eAAM,KAAK,EAAE,UAAU,mBAAW,mCAC9B,EACN,eAAK,KAAK,EAAE,SAAS,aACnB,eAAM,KAAK,EAAE,UAAU,kBAAU,EACjC,eAAM,KAAK,EAAE,WAAW,gDAAoD,IACxE,EACN,eAAK,KAAK,EAAE,QAAQ,aAClB,eAAM,KAAK,EAAE,UAAU,mBAAW,mGAC9B,EACN,aAAG,KAAK,EAAE,QAAQ,iCACA,eAAM,KAAK,EAAE,WAAW,8BAAsB,yBAAmB,eAAM,KAAK,EAAE,WAAW,0CAAkC,2BAAqB,eAAM,KAAK,EAAE,WAAW,+BAAuB,yBAC7M,IACK,IACP,EAGN,aAAG,IAAI,EAAC,SAAS,EAAC,KAAK,EAAE,SAAS,aAChC,cAAK,KAAK,EAAE,UAAU,4DAAmD,EACzE,YAAG,KAAK,EAAE,SAAS,+JAGf,IACF,EAGJ,aAAG,IAAI,EAAC,MAAM,EAAC,KAAK,EAAE,SAAS,aAC7B,cAAK,KAAK,EAAE,UAAU,6CAAwC,EAC9D,YAAG,KAAK,EAAE,SAAS,wIAGf,IACF,EAGJ,aAAG,IAAI,EAAC,SAAS,EAAC,KAAK,EAAE,SAAS,aAChC,cAAK,KAAK,EAAE,UAAU,8CAAyC,EAC/D,YAAG,KAAK,EAAE,SAAS,yIAGf,IACF,EAGJ,eAAK,KAAK,EAAE,MAAM,kCACE,YAAG,IAAI,EAAC,wBAAwB,EAAC,KAAK,EAAC,iBAAiB,4CAAgC,cAAS,YAAG,IAAI,EAAC,GAAG,EAAC,KAAK,EAAC,iBAAiB,6BAAiB,IACnK,EAGN,iBAAQ,uBAAuB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAI,IACtD,GACC,CACV,CAAC"}
|
|
@@ -1,33 +1,46 @@
|
|
|
1
1
|
import { css, keyframes } from "hono/css";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* "Engineered Editorial" palette — synced with the Cogent portal design tokens
|
|
4
|
+
* (cogent-business/web/src/design/tokens.css): a dark ink canvas, a single sharp
|
|
5
|
+
* citron accent (deliberately NOT purple), warm off-white text, monospace for
|
|
6
|
+
* technical identifiers. Key names are kept stable (e.g. `green`) for backwards
|
|
7
|
+
* compatibility with existing pages; `green` is now the citron accent.
|
|
5
8
|
*/
|
|
6
9
|
export declare const colors: {
|
|
7
|
-
readonly bg: "#
|
|
8
|
-
readonly bgCard: "#
|
|
9
|
-
readonly bgTerminal: "#
|
|
10
|
-
readonly
|
|
11
|
-
readonly
|
|
12
|
-
readonly
|
|
13
|
-
readonly
|
|
14
|
-
readonly
|
|
15
|
-
readonly
|
|
16
|
-
readonly
|
|
17
|
-
readonly
|
|
18
|
-
readonly
|
|
19
|
-
readonly
|
|
10
|
+
readonly bg: "#0a0c0f";
|
|
11
|
+
readonly bgCard: "#14181d";
|
|
12
|
+
readonly bgTerminal: "#07080a";
|
|
13
|
+
readonly bgRaised: "#1d232a";
|
|
14
|
+
readonly text: "#eceae3";
|
|
15
|
+
readonly textMuted: "#a6adb6";
|
|
16
|
+
readonly textFaint: "#828a94";
|
|
17
|
+
readonly green: "#c9f24e";
|
|
18
|
+
readonly greenHover: "#d7ff66";
|
|
19
|
+
readonly greenPress: "#b2db3e";
|
|
20
|
+
readonly accentSoft: "rgba(201, 242, 78, 0.12)";
|
|
21
|
+
readonly textOnAccent: "#0b1300";
|
|
22
|
+
readonly cyan: "#74e4d8";
|
|
23
|
+
readonly amber: "#f2c14e";
|
|
24
|
+
readonly red: "#f76e6e";
|
|
25
|
+
readonly border: "#262d35";
|
|
26
|
+
readonly borderHover: "#455059";
|
|
27
|
+
readonly borderGlow: "rgba(201, 242, 78, 0.32)";
|
|
28
|
+
readonly platformCc: "#74e4d8";
|
|
29
|
+
readonly platformCodex: "#74e3a0";
|
|
20
30
|
readonly platformSlack: "#a371f7";
|
|
21
|
-
readonly platformGchat: "#
|
|
22
|
-
readonly platformWeb: "#
|
|
23
|
-
readonly modeObserver: "#
|
|
24
|
-
readonly modeAgent: "#
|
|
31
|
+
readonly platformGchat: "#74e3a0";
|
|
32
|
+
readonly platformWeb: "#f2c14e";
|
|
33
|
+
readonly modeObserver: "#f2c14e";
|
|
34
|
+
readonly modeAgent: "#74e3a0";
|
|
25
35
|
};
|
|
26
36
|
/**
|
|
27
|
-
*
|
|
37
|
+
* Font stacks synced with the portal: Geist for body/UI, Fraunces for editorial
|
|
38
|
+
* display headings, Geist Mono for technical identifiers and code.
|
|
28
39
|
*/
|
|
29
40
|
export declare const fonts: {
|
|
30
|
-
readonly
|
|
41
|
+
readonly sans: "'Geist', system-ui, -apple-system, sans-serif";
|
|
42
|
+
readonly display: "'Fraunces', Georgia, 'Times New Roman', serif";
|
|
43
|
+
readonly mono: "'Geist Mono', 'JetBrains Mono', ui-monospace, monospace";
|
|
31
44
|
};
|
|
32
45
|
/**
|
|
33
46
|
* Cursor blink keyframe animation -- opacity toggle at 50%.
|
|
@@ -36,7 +49,7 @@ export declare const fonts: {
|
|
|
36
49
|
export declare const cursorBlink: ReturnType<typeof keyframes>;
|
|
37
50
|
/**
|
|
38
51
|
* Global styles using Hono's css helper with :-hono-global selector.
|
|
39
|
-
*
|
|
52
|
+
* Sans body, editorial serif headings, monospace for code, citron links/selection.
|
|
40
53
|
*/
|
|
41
54
|
export declare const globalStyles: ReturnType<typeof css>;
|
|
42
55
|
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/ui/styles/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/ui/styles/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BT,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,KAAK;;;;CAIR,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,UAAU,CAAC,OAAO,SAAS,CAGpD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,UAAU,CAAC,OAAO,GAAG,CA2C/C,CAAC"}
|
package/dist/ui/styles/theme.js
CHANGED
|
@@ -1,34 +1,47 @@
|
|
|
1
1
|
import { css, keyframes } from "hono/css";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* "Engineered Editorial" palette — synced with the Cogent portal design tokens
|
|
4
|
+
* (cogent-business/web/src/design/tokens.css): a dark ink canvas, a single sharp
|
|
5
|
+
* citron accent (deliberately NOT purple), warm off-white text, monospace for
|
|
6
|
+
* technical identifiers. Key names are kept stable (e.g. `green`) for backwards
|
|
7
|
+
* compatibility with existing pages; `green` is now the citron accent.
|
|
5
8
|
*/
|
|
6
9
|
export const colors = {
|
|
7
|
-
bg: "#
|
|
8
|
-
bgCard: "#
|
|
9
|
-
bgTerminal: "#
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
10
|
+
bg: "#0a0c0f", // ink-900 — page background
|
|
11
|
+
bgCard: "#14181d", // ink-800 — surface / card
|
|
12
|
+
bgTerminal: "#07080a", // ink-1000 — code / terminal
|
|
13
|
+
bgRaised: "#1d232a", // ink-700 — raised surface / inputs
|
|
14
|
+
text: "#eceae3", // warm off-white
|
|
15
|
+
textMuted: "#a6adb6",
|
|
16
|
+
textFaint: "#828a94", // ~4.6:1 on bg — clears WCAG AA small text
|
|
17
|
+
green: "#c9f24e", // PRIMARY ACCENT — citron (key kept for compatibility)
|
|
18
|
+
greenHover: "#d7ff66",
|
|
19
|
+
greenPress: "#b2db3e",
|
|
20
|
+
accentSoft: "rgba(201, 242, 78, 0.12)",
|
|
21
|
+
textOnAccent: "#0b1300",
|
|
22
|
+
cyan: "#74e4d8",
|
|
23
|
+
amber: "#f2c14e",
|
|
24
|
+
red: "#f76e6e",
|
|
25
|
+
border: "#262d35", // ink-600
|
|
26
|
+
borderHover: "#455059", // ink-400
|
|
27
|
+
borderGlow: "rgba(201, 242, 78, 0.32)",
|
|
28
|
+
// Platform colors — functional brand identifiers (Slack stays its brand purple).
|
|
29
|
+
platformCc: "#74e4d8", // cyan — Claude Code
|
|
30
|
+
platformCodex: "#74e3a0", // green — OpenAI Codex
|
|
31
|
+
platformSlack: "#a371f7", // purple — Slack (brand badge)
|
|
32
|
+
platformGchat: "#74e3a0", // green-alt — Google Chat
|
|
33
|
+
platformWeb: "#f2c14e", // amber — Web
|
|
34
|
+
modeObserver: "#f2c14e", // amber — observer mode
|
|
35
|
+
modeAgent: "#74e3a0", // green — agent mode
|
|
26
36
|
};
|
|
27
37
|
/**
|
|
28
|
-
*
|
|
38
|
+
* Font stacks synced with the portal: Geist for body/UI, Fraunces for editorial
|
|
39
|
+
* display headings, Geist Mono for technical identifiers and code.
|
|
29
40
|
*/
|
|
30
41
|
export const fonts = {
|
|
31
|
-
|
|
42
|
+
sans: "'Geist', system-ui, -apple-system, sans-serif",
|
|
43
|
+
display: "'Fraunces', Georgia, 'Times New Roman', serif",
|
|
44
|
+
mono: "'Geist Mono', 'JetBrains Mono', ui-monospace, monospace",
|
|
32
45
|
};
|
|
33
46
|
/**
|
|
34
47
|
* Cursor blink keyframe animation -- opacity toggle at 50%.
|
|
@@ -40,7 +53,7 @@ export const cursorBlink = keyframes `
|
|
|
40
53
|
`;
|
|
41
54
|
/**
|
|
42
55
|
* Global styles using Hono's css helper with :-hono-global selector.
|
|
43
|
-
*
|
|
56
|
+
* Sans body, editorial serif headings, monospace for code, citron links/selection.
|
|
44
57
|
*/
|
|
45
58
|
export const globalStyles = css `
|
|
46
59
|
:-hono-global {
|
|
@@ -48,17 +61,33 @@ export const globalStyles = css `
|
|
|
48
61
|
box-sizing: border-box;
|
|
49
62
|
}
|
|
50
63
|
html {
|
|
51
|
-
font-family: ${fonts.
|
|
52
|
-
font-size:
|
|
64
|
+
font-family: ${fonts.sans};
|
|
65
|
+
font-size: 15px;
|
|
53
66
|
background: ${colors.bg};
|
|
54
67
|
color: ${colors.text};
|
|
68
|
+
-webkit-font-smoothing: antialiased;
|
|
69
|
+
text-rendering: optimizeLegibility;
|
|
55
70
|
}
|
|
56
71
|
body {
|
|
57
72
|
margin: 0;
|
|
58
73
|
padding: 0;
|
|
74
|
+
line-height: 1.6;
|
|
75
|
+
}
|
|
76
|
+
h1,
|
|
77
|
+
h2 {
|
|
78
|
+
font-family: ${fonts.display};
|
|
79
|
+
font-weight: 600;
|
|
80
|
+
letter-spacing: -0.02em;
|
|
81
|
+
line-height: 1.08;
|
|
82
|
+
}
|
|
83
|
+
pre,
|
|
84
|
+
code,
|
|
85
|
+
kbd,
|
|
86
|
+
samp {
|
|
87
|
+
font-family: ${fonts.mono};
|
|
59
88
|
}
|
|
60
89
|
a {
|
|
61
|
-
color: ${colors.
|
|
90
|
+
color: ${colors.green};
|
|
62
91
|
text-decoration: none;
|
|
63
92
|
}
|
|
64
93
|
a:hover {
|
|
@@ -66,7 +95,7 @@ export const globalStyles = css `
|
|
|
66
95
|
}
|
|
67
96
|
::selection {
|
|
68
97
|
background: ${colors.green};
|
|
69
|
-
color: ${colors.
|
|
98
|
+
color: ${colors.textOnAccent};
|
|
70
99
|
}
|
|
71
100
|
}
|
|
72
101
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../src/ui/styles/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../src/ui/styles/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,EAAE,EAAE,SAAS,EAAE,4BAA4B;IAC3C,MAAM,EAAE,SAAS,EAAE,2BAA2B;IAC9C,UAAU,EAAE,SAAS,EAAE,6BAA6B;IACpD,QAAQ,EAAE,SAAS,EAAE,oCAAoC;IACzD,IAAI,EAAE,SAAS,EAAE,iBAAiB;IAClC,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS,EAAE,2CAA2C;IACjE,KAAK,EAAE,SAAS,EAAE,uDAAuD;IACzE,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,0BAA0B;IACtC,YAAY,EAAE,SAAS;IACvB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,SAAS,EAAE,UAAU;IAC7B,WAAW,EAAE,SAAS,EAAE,UAAU;IAClC,UAAU,EAAE,0BAA0B;IACtC,iFAAiF;IACjF,UAAU,EAAE,SAAS,EAAE,qBAAqB;IAC5C,aAAa,EAAE,SAAS,EAAE,uBAAuB;IACjD,aAAa,EAAE,SAAS,EAAE,+BAA+B;IACzD,aAAa,EAAE,SAAS,EAAE,0BAA0B;IACpD,WAAW,EAAE,SAAS,EAAE,cAAc;IACtC,YAAY,EAAE,SAAS,EAAE,wBAAwB;IACjD,SAAS,EAAE,SAAS,EAAE,qBAAqB;CACnC,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,+CAA+C;IACrD,OAAO,EAAE,+CAA+C;IACxD,IAAI,EAAE,yDAAyD;CACvD,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAiC,SAAS,CAAA;;;CAGjE,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAA2B,GAAG,CAAA;;;;;;qBAMlC,KAAK,CAAC,IAAI;;oBAEX,MAAM,CAAC,EAAE;eACd,MAAM,CAAC,IAAI;;;;;;;;;;;qBAWL,KAAK,CAAC,OAAO;;;;;;;;;qBASb,KAAK,CAAC,IAAI;;;eAGhB,MAAM,CAAC,KAAK;;;;;;;oBAOP,MAAM,CAAC,KAAK;eACjB,MAAM,CAAC,YAAY;;;CAGjC,CAAC"}
|