@essentialai/cogent-server 3.4.3 → 3.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/__tests__/services/session-store-contract.d.ts.map +1 -1
  3. package/dist/__tests__/services/session-store-contract.js +41 -0
  4. package/dist/__tests__/services/session-store-contract.js.map +1 -1
  5. package/dist/config.d.ts +2 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +9 -0
  8. package/dist/config.js.map +1 -1
  9. package/dist/routes/control-plane.d.ts.map +1 -1
  10. package/dist/routes/control-plane.js +10 -0
  11. package/dist/routes/control-plane.js.map +1 -1
  12. package/dist/routes/peers.d.ts +9 -0
  13. package/dist/routes/peers.d.ts.map +1 -1
  14. package/dist/routes/peers.js +46 -1
  15. package/dist/routes/peers.js.map +1 -1
  16. package/dist/routes/sessions.d.ts +3 -1
  17. package/dist/routes/sessions.d.ts.map +1 -1
  18. package/dist/routes/sessions.js +37 -2
  19. package/dist/routes/sessions.js.map +1 -1
  20. package/dist/routes/ui.js +1 -1
  21. package/dist/services/session-store-memory.d.ts +2 -1
  22. package/dist/services/session-store-memory.d.ts.map +1 -1
  23. package/dist/services/session-store-memory.js +19 -2
  24. package/dist/services/session-store-memory.js.map +1 -1
  25. package/dist/services/session-store-postgres.d.ts +2 -1
  26. package/dist/services/session-store-postgres.d.ts.map +1 -1
  27. package/dist/services/session-store-postgres.js +24 -6
  28. package/dist/services/session-store-postgres.js.map +1 -1
  29. package/dist/services/session-store.d.ts +33 -0
  30. package/dist/services/session-store.d.ts.map +1 -1
  31. package/dist/services/session-store.js +41 -1
  32. package/dist/services/session-store.js.map +1 -1
  33. package/dist/ui/components/Footer.js +1 -1
  34. package/dist/ui/components/Footer.js.map +1 -1
  35. package/dist/ui/components/Layout.d.ts.map +1 -1
  36. package/dist/ui/components/Layout.js +7 -3
  37. package/dist/ui/components/Layout.js.map +1 -1
  38. package/dist/ui/components/NavBar.js +1 -1
  39. package/dist/ui/components/PlatformLogos.d.ts +11 -0
  40. package/dist/ui/components/PlatformLogos.d.ts.map +1 -0
  41. package/dist/ui/components/PlatformLogos.js +25 -0
  42. package/dist/ui/components/PlatformLogos.js.map +1 -0
  43. package/dist/ui/components/Terminal.js +1 -1
  44. package/dist/ui/components/Terminal.js.map +1 -1
  45. package/dist/ui/pages/FaqPage.js +1 -1
  46. package/dist/ui/pages/FaqPage.js.map +1 -1
  47. package/dist/ui/pages/HowToPage.d.ts.map +1 -1
  48. package/dist/ui/pages/HowToPage.js +1 -1
  49. package/dist/ui/pages/HowToPage.js.map +1 -1
  50. package/dist/ui/pages/LandingPage.d.ts +4 -2
  51. package/dist/ui/pages/LandingPage.d.ts.map +1 -1
  52. package/dist/ui/pages/LandingPage.js +553 -130
  53. package/dist/ui/pages/LandingPage.js.map +1 -1
  54. package/dist/ui/pages/UpdateGuidePage.js +1 -1
  55. package/dist/ui/pages/UpdateGuidePage.js.map +1 -1
  56. package/dist/ui/styles/theme.d.ts +62 -22
  57. package/dist/ui/styles/theme.d.ts.map +1 -1
  58. package/dist/ui/styles/theme.js +157 -28
  59. package/dist/ui/styles/theme.js.map +1 -1
  60. package/package.json +1 -1
@@ -1,171 +1,600 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
2
- import { css } from "hono/css";
2
+ import { css, cx } 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, cursorBlink } from "../styles/theme.js";
7
- // --- Styles ---
6
+ import { PlatLogo } from "../components/PlatformLogos.js";
7
+ import { colors, fonts, grainOverlay, eyebrow, revealUp } from "../styles/theme.js";
8
+ /* ============================================================= *
9
+ * Cogent — "Communicating Agents"
10
+ * Enterprise landing, Engineered-Editorial system (portal parity):
11
+ * deep-ink canvas, citron accent, Fraunces display, Geist Mono for
12
+ * the technical identifiers, a fractal-noise grain, and one
13
+ * orchestrated page-load reveal. Content is benefit-first: put every
14
+ * AI agent into the rooms your team already works.
15
+ * ============================================================= */
16
+ const EASE = "cubic-bezier(0.16, 1, 0.3, 1)";
17
+ const MAX = "1140px";
18
+ // ---- Brand mark: two relay nodes joined by a signal arc (portal glyph) ----
19
+ const BrandMark = ({ size = 26 }) => (_jsxs("svg", { width: size, height: size, viewBox: "0 0 32 32", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: "M9 22.5C4.8 21 3 17.9 3 14.5 3 9.3 7.6 5 13.3 5c4.2 0 7.8 2.3 9.4 5.7", stroke: colors.green, "stroke-width": "2.4", "stroke-linecap": "round" }), _jsx("path", { d: "M23 9.5c4.2 1.5 6 4.6 6 8 0 5.2-4.6 9.5-10.3 9.5-4.2 0-7.8-2.3-9.4-5.7", stroke: colors.green, "stroke-width": "2.4", "stroke-linecap": "round", opacity: "0.45" }), _jsx("circle", { cx: "9", cy: "22.5", r: "3", fill: colors.green }), _jsx("circle", { cx: "23", cy: "9.5", r: "3", fill: colors.green })] }));
20
+ // ---- Nav ----
21
+ const nav = css `
22
+ position: sticky;
23
+ top: 0;
24
+ z-index: 50;
25
+ backdrop-filter: blur(12px);
26
+ background: rgba(10, 12, 15, 0.72);
27
+ border-bottom: 1px solid ${colors.border};
28
+ `;
29
+ const navInner = css `
30
+ max-width: ${MAX};
31
+ margin: 0 auto;
32
+ padding: 0.85rem 1.5rem;
33
+ display: flex;
34
+ align-items: center;
35
+ gap: 1.5rem;
36
+ `;
37
+ const brand = css `
38
+ display: inline-flex;
39
+ align-items: center;
40
+ gap: 0.55rem;
41
+ font-family: ${fonts.display};
42
+ font-weight: 600;
43
+ font-size: 1.05rem;
44
+ color: ${colors.text};
45
+ letter-spacing: -0.01em;
46
+ `;
47
+ const navLinks = css `
48
+ display: flex;
49
+ gap: 1.4rem;
50
+ margin-left: auto;
51
+ align-items: center;
52
+ @media (max-width: 780px) {
53
+ & .nav-hide {
54
+ display: none;
55
+ }
56
+ }
57
+ & a {
58
+ font-size: 0.85rem;
59
+ color: ${colors.textMuted};
60
+ transition: color 0.18s ${EASE};
61
+ }
62
+ & a:hover {
63
+ color: ${colors.text};
64
+ text-decoration: none;
65
+ }
66
+ `;
67
+ const navCta = css `
68
+ background: ${colors.green};
69
+ color: ${colors.textOnAccent} !important;
70
+ font-weight: 600;
71
+ padding: 0.5rem 1rem;
72
+ border-radius: 999px;
73
+ font-size: 0.85rem !important;
74
+ transition: background 0.18s ${EASE}, transform 0.18s ${EASE};
75
+ &:hover {
76
+ background: ${colors.greenHover};
77
+ transform: translateY(-1px);
78
+ text-decoration: none;
79
+ }
80
+ `;
81
+ // ---- Shell / sections ----
8
82
  const container = css `
9
- max-width: 960px;
83
+ max-width: ${MAX};
84
+ margin: 0 auto;
85
+ padding: 0 1.5rem;
86
+ `;
87
+ const section = css `
88
+ max-width: ${MAX};
10
89
  margin: 0 auto;
11
- padding: 2rem 1.5rem;
90
+ padding: 5.5rem 1.5rem;
91
+ @media (max-width: 640px) {
92
+ padding: 4rem 1.5rem;
93
+ }
12
94
  `;
13
- const heroSection = css `
14
- text-align: center;
15
- padding: 3rem 0 2rem;
95
+ const sectionHead = css `
96
+ max-width: 44ch;
97
+ margin-bottom: 2.75rem;
98
+ `;
99
+ const h2 = css `
100
+ font-family: ${fonts.display};
101
+ font-size: clamp(1.8rem, 3.2vw, 2.5rem);
102
+ font-weight: 600;
103
+ line-height: 1.1;
104
+ letter-spacing: -0.02em;
105
+ color: ${colors.text};
106
+ margin: 0.6rem 0 0;
107
+ & em {
108
+ font-style: italic;
109
+ color: ${colors.green};
110
+ }
111
+ `;
112
+ const lede = css `
113
+ color: ${colors.textMuted};
114
+ font-size: 1.05rem;
115
+ line-height: 1.65;
116
+ margin: 1rem 0 0;
117
+ max-width: 52ch;
118
+ `;
119
+ // ---- Hero ----
120
+ const hero = css `
121
+ position: relative;
122
+ overflow: hidden;
123
+ border-bottom: 1px solid ${colors.border};
124
+ background:
125
+ radial-gradient(46rem 40rem at 80% -12%, rgba(201, 242, 78, 0.1), transparent 60%),
126
+ radial-gradient(40rem 40rem at 4% 118%, rgba(116, 228, 216, 0.07), transparent 55%);
127
+ `;
128
+ const heroInner = css `
129
+ position: relative;
130
+ z-index: 1;
131
+ max-width: ${MAX};
132
+ margin: 0 auto;
133
+ padding: 6rem 1.5rem 4.5rem;
134
+ @media (max-width: 640px) {
135
+ padding: 4rem 1.5rem 3rem;
136
+ }
137
+ `;
138
+ const reveal = css `
139
+ animation: ${revealUp} 0.75s ${EASE} both;
16
140
  `;
17
141
  const heroTitle = css `
18
- font-size: 2.5rem;
19
- font-weight: 700;
20
- color: ${colors.green};
21
- margin: 0 0 0.75rem 0;
22
- `;
23
- const asciiLogo = css `
24
- font-size: 0.45rem;
25
- line-height: 1.15;
26
- margin: 0;
27
- color: ${colors.green};
28
- font-family: inherit;
29
- display: inline-block;
30
- text-align: left;
142
+ font-family: ${fonts.display};
143
+ font-optical-sizing: auto;
144
+ font-weight: 500;
145
+ font-size: clamp(2.6rem, 6vw, 4.4rem);
146
+ line-height: 1.02;
147
+ letter-spacing: -0.025em;
148
+ color: ${colors.text};
149
+ margin: 1.2rem 0 0;
150
+ max-width: 16ch;
151
+ & em {
152
+ font-style: italic;
153
+ color: ${colors.green};
154
+ }
31
155
  `;
32
- const heroSubtitle = css `
33
- font-size: 1rem;
156
+ const heroSub = css `
157
+ font-size: 1.2rem;
158
+ line-height: 1.6;
34
159
  color: ${colors.textMuted};
35
- margin: 0;
160
+ margin: 1.6rem 0 0;
161
+ max-width: 54ch;
162
+ `;
163
+ const ctaRow = css `
164
+ display: flex;
165
+ gap: 0.85rem;
166
+ flex-wrap: wrap;
167
+ margin: 2.2rem 0 0;
36
168
  `;
37
- const cursor = css `
38
- display: inline-block;
39
- width: 3px;
40
- height: 2.85rem;
169
+ const ctaPrimary = css `
170
+ display: inline-flex;
171
+ align-items: center;
41
172
  background: ${colors.green};
42
- margin-left: 4px;
43
- vertical-align: bottom;
44
- animation: ${cursorBlink} 1s step-end infinite;
173
+ color: ${colors.textOnAccent};
174
+ font-weight: 600;
175
+ font-size: 0.98rem;
176
+ padding: 0.85rem 1.7rem;
177
+ border-radius: 999px;
178
+ box-shadow: 0 0 0 1px ${colors.borderGlow}, 0 14px 44px -16px rgba(201, 242, 78, 0.4);
179
+ transition: background 0.2s ${EASE}, transform 0.2s ${EASE};
180
+ &:hover {
181
+ background: ${colors.greenHover};
182
+ text-decoration: none;
183
+ transform: translateY(-2px);
184
+ }
185
+ `;
186
+ const ctaGhost = css `
187
+ display: inline-flex;
188
+ align-items: center;
189
+ color: ${colors.text};
190
+ font-weight: 500;
191
+ font-size: 0.98rem;
192
+ padding: 0.85rem 1.5rem;
193
+ border: 1px solid ${colors.borderHover};
194
+ border-radius: 999px;
195
+ transition: border-color 0.2s ${EASE}, color 0.2s ${EASE};
196
+ &:hover {
197
+ border-color: ${colors.green};
198
+ text-decoration: none;
199
+ }
200
+ `;
201
+ const trustLine = css `
202
+ margin: 1.8rem 0 0;
203
+ font-family: ${fonts.mono};
204
+ font-size: 0.76rem;
205
+ letter-spacing: 0.04em;
206
+ color: ${colors.textMuted};
207
+ & b {
208
+ color: ${colors.text};
209
+ font-weight: 500;
210
+ }
45
211
  `;
46
212
  const statsRow = css `
47
213
  display: flex;
48
- gap: 1.5rem;
214
+ gap: 1rem;
49
215
  flex-wrap: wrap;
50
- justify-content: center;
51
- margin: 2rem 0 3rem;
216
+ margin: 3.2rem 0 0;
52
217
  `;
53
- const section = css `
54
- margin-bottom: 2.5rem;
218
+ // ---- The shift (two-column editorial) ----
219
+ const split = css `
220
+ display: grid;
221
+ grid-template-columns: 1fr 1fr;
222
+ gap: 3rem;
223
+ align-items: start;
224
+ @media (max-width: 780px) {
225
+ grid-template-columns: 1fr;
226
+ gap: 2rem;
227
+ }
55
228
  `;
56
- const sectionTitle = css `
57
- font-size: 1.1rem;
58
- color: ${colors.text};
59
- margin: 0 0 1rem 0;
60
- font-weight: 700;
229
+ const shiftCard = css `
230
+ border-left: 2px solid ${colors.border};
231
+ padding-left: 1.4rem;
232
+ & h3 {
233
+ font-family: ${fonts.display};
234
+ font-size: 1.35rem;
235
+ font-weight: 600;
236
+ color: ${colors.text};
237
+ margin: 0 0 0.6rem;
238
+ }
239
+ & p {
240
+ color: ${colors.textMuted};
241
+ font-size: 0.98rem;
242
+ line-height: 1.65;
243
+ margin: 0;
244
+ }
245
+ &.on {
246
+ border-left-color: ${colors.green};
247
+ }
248
+ &.on h3 {
249
+ color: ${colors.green};
250
+ }
61
251
  `;
62
- const codeBlock = css `
63
- background: ${colors.bg};
252
+ // ---- Channel showcase (the centerpiece) ----
253
+ const showcaseWrap = css `
254
+ position: relative;
255
+ overflow: hidden;
256
+ border-top: 1px solid ${colors.border};
257
+ border-bottom: 1px solid ${colors.border};
258
+ background:
259
+ radial-gradient(50rem 34rem at 92% 0%, rgba(163, 113, 247, 0.08), transparent 60%),
260
+ linear-gradient(180deg, ${colors.bg}, #0c0f14);
261
+ `;
262
+ const chat = css `
263
+ background: ${colors.bgTerminal};
64
264
  border: 1px solid ${colors.border};
65
- border-radius: 4px;
66
- padding: 1rem;
67
- color: ${colors.green};
68
- font-size: 0.9rem;
69
- overflow-x: auto;
70
- white-space: pre;
71
- margin: 0.75rem 0;
265
+ border-radius: 14px;
266
+ overflow: hidden;
267
+ box-shadow: 0 30px 80px -30px rgba(0, 0, 0, 0.8);
268
+ max-width: 720px;
72
269
  `;
73
- const noteText = css `
74
- color: ${colors.textMuted};
270
+ const chatBar = css `
271
+ display: flex;
272
+ align-items: center;
273
+ gap: 0.6rem;
274
+ padding: 0.85rem 1.1rem;
275
+ border-bottom: 1px solid ${colors.border};
276
+ background: #010409;
277
+ `;
278
+ const chatChan = css `
279
+ font-family: ${fonts.mono};
75
280
  font-size: 0.85rem;
76
- margin: 0.75rem 0;
281
+ color: ${colors.text};
282
+ & span {
283
+ color: ${colors.textMuted};
284
+ }
77
285
  `;
78
- const stepNumber = css `
79
- color: ${colors.amber};
80
- font-weight: 700;
286
+ const slackTag = css `
287
+ margin-left: auto;
288
+ font-size: 0.68rem;
289
+ font-family: ${fonts.mono};
290
+ letter-spacing: 0.08em;
291
+ text-transform: uppercase;
292
+ color: ${colors.platformSlack};
293
+ border: 1px solid rgba(163, 113, 247, 0.4);
294
+ border-radius: 999px;
295
+ padding: 0.15rem 0.55rem;
81
296
  `;
82
- const stepCommand = css `
83
- color: ${colors.green};
297
+ const chatBody = css `
298
+ padding: 0.5rem 0.25rem;
84
299
  `;
85
- const stepLine = css `
86
- margin: 0.75rem 0;
87
- line-height: 1.6;
300
+ const msg = css `
301
+ display: grid;
302
+ grid-template-columns: 34px 1fr;
303
+ gap: 0.75rem;
304
+ padding: 0.7rem 1.1rem;
305
+ align-items: start;
306
+ &:hover {
307
+ background: rgba(255, 255, 255, 0.015);
308
+ }
88
309
  `;
89
- const promptChar = css `
90
- color: ${colors.textMuted};
91
- margin-right: 0.5rem;
310
+ const avatar = css `
311
+ width: 34px;
312
+ height: 34px;
313
+ border-radius: 8px;
314
+ display: grid;
315
+ place-items: center;
316
+ font-family: ${fonts.mono};
317
+ font-size: 0.85rem;
318
+ font-weight: 600;
92
319
  `;
93
- const howToLink = css `
94
- display: block;
320
+ const msgHead = css `
321
+ display: flex;
322
+ align-items: center;
323
+ gap: 0.5rem;
324
+ flex-wrap: wrap;
325
+ margin-bottom: 0.15rem;
326
+ `;
327
+ const msgName = css `
328
+ font-size: 0.88rem;
329
+ font-weight: 600;
330
+ color: ${colors.text};
331
+ `;
332
+ const roleTag = css `
333
+ font-size: 0.62rem;
334
+ font-family: ${fonts.mono};
335
+ letter-spacing: 0.06em;
336
+ text-transform: uppercase;
337
+ padding: 0.08rem 0.4rem;
338
+ border-radius: 4px;
339
+ `;
340
+ const ts = css `
341
+ font-size: 0.7rem;
342
+ color: ${colors.textFaint};
343
+ `;
344
+ const msgText = css `
345
+ font-size: 0.92rem;
346
+ line-height: 1.55;
347
+ color: ${colors.text};
348
+ margin: 0;
349
+ & code {
350
+ font-family: ${fonts.mono};
351
+ font-size: 0.82em;
352
+ color: ${colors.green};
353
+ background: ${colors.accentSoft};
354
+ padding: 0.05em 0.35em;
355
+ border-radius: 4px;
356
+ }
357
+ & b {
358
+ color: ${colors.cyan};
359
+ font-weight: 500;
360
+ }
361
+ `;
362
+ /** A single showcase message row. */
363
+ const Msg = ({ initials, avatarBg, avatarColor, name, role, roleColor, roleBg, time, children }) => (_jsxs("div", { class: msg, children: [_jsx("div", { class: avatar, style: `background:${avatarBg};color:${avatarColor};`, children: initials }), _jsxs("div", { children: [_jsxs("div", { class: msgHead, children: [_jsx("span", { class: msgName, children: name }), _jsx("span", { class: roleTag, style: `color:${roleColor};background:${roleBg};`, children: role }), _jsx("span", { class: ts, children: time })] }), _jsx("p", { class: msgText, children: children })] })] }));
364
+ // ---- Use cases ----
365
+ const cardGrid = css `
366
+ display: grid;
367
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
368
+ gap: 1.1rem;
369
+ `;
370
+ const useCard = css `
371
+ position: relative;
95
372
  background: ${colors.bgCard};
96
373
  border: 1px solid ${colors.border};
97
- border-radius: 8px;
98
- padding: 1.5rem 2rem;
99
- text-align: center;
100
- text-decoration: none;
101
- transition: border-color 0.2s;
102
- margin-bottom: 2.5rem;
374
+ border-radius: 14px;
375
+ padding: 1.6rem;
376
+ transition: border-color 0.22s ${EASE}, transform 0.22s ${EASE};
103
377
  &:hover {
104
- border-color: ${colors.green};
105
- text-decoration: none;
378
+ border-color: ${colors.borderGlow};
379
+ transform: translateY(-3px);
380
+ }
381
+ & .ico {
382
+ font-size: 1.4rem;
383
+ margin-bottom: 0.9rem;
384
+ }
385
+ & h3 {
386
+ font-family: ${fonts.display};
387
+ font-size: 1.2rem;
388
+ font-weight: 600;
389
+ color: ${colors.text};
390
+ margin: 0 0 0.5rem;
391
+ }
392
+ & p {
393
+ color: ${colors.textMuted};
394
+ font-size: 0.92rem;
395
+ line-height: 1.6;
396
+ margin: 0;
397
+ }
398
+ & .out {
399
+ margin-top: 1rem;
400
+ padding-top: 0.9rem;
401
+ border-top: 1px dashed ${colors.border};
402
+ font-size: 0.82rem;
403
+ color: ${colors.text};
404
+ font-weight: 500;
405
+ }
406
+ & .out b {
407
+ color: ${colors.green};
408
+ font-weight: 600;
106
409
  }
107
410
  `;
108
- const howToTitle = css `
109
- font-size: 1.1rem;
110
- color: ${colors.green};
111
- font-weight: 700;
112
- margin: 0 0 0.5rem 0;
411
+ // ---- Platforms ----
412
+ const platGrid = css `
413
+ display: grid;
414
+ grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
415
+ gap: 1rem;
113
416
  `;
114
- const howToDesc = css `
115
- font-size: 0.85rem;
116
- color: ${colors.textMuted};
117
- margin: 0;
417
+ const platCard = css `
418
+ background: ${colors.bgCard};
419
+ border: 1px solid ${colors.border};
420
+ border-radius: 12px;
421
+ padding: 1.3rem 1.4rem;
422
+ display: flex;
423
+ flex-direction: column;
424
+ gap: 0.5rem;
425
+ & .top {
426
+ display: flex;
427
+ align-items: center;
428
+ justify-content: space-between;
429
+ }
430
+ & .name {
431
+ display: inline-flex;
432
+ align-items: center;
433
+ gap: 0.55rem;
434
+ font-weight: 600;
435
+ color: ${colors.text};
436
+ font-size: 1rem;
437
+ }
438
+ & .name svg {
439
+ flex: none;
440
+ }
441
+ & p {
442
+ font-size: 0.86rem;
443
+ color: ${colors.textMuted};
444
+ line-height: 1.55;
445
+ margin: 0;
446
+ }
118
447
  `;
119
- const footer = css `
120
- text-align: center;
121
- padding: 2rem 0;
122
- color: ${colors.textMuted};
123
- font-size: 0.8rem;
448
+ const badge = css `
449
+ font-family: ${fonts.mono};
450
+ font-size: 0.62rem;
451
+ letter-spacing: 0.08em;
452
+ text-transform: uppercase;
453
+ padding: 0.15rem 0.5rem;
454
+ border-radius: 999px;
455
+ `;
456
+ // ---- Security ----
457
+ const secGrid = css `
458
+ display: grid;
459
+ grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
460
+ gap: 1.6rem 2rem;
461
+ `;
462
+ const secItem = css `
463
+ & h3 {
464
+ font-size: 0.98rem;
465
+ font-weight: 600;
466
+ color: ${colors.text};
467
+ margin: 0 0 0.35rem;
468
+ display: flex;
469
+ align-items: center;
470
+ gap: 0.5rem;
471
+ }
472
+ & h3::before {
473
+ content: "";
474
+ width: 6px;
475
+ height: 6px;
476
+ border-radius: 999px;
477
+ background: ${colors.green};
478
+ box-shadow: 0 0 8px ${colors.green};
479
+ }
480
+ & p {
481
+ color: ${colors.textMuted};
482
+ font-size: 0.88rem;
483
+ line-height: 1.6;
484
+ margin: 0;
485
+ padding-left: 1rem;
486
+ }
487
+ `;
488
+ // ---- Get started (two lanes) ----
489
+ const startWrap = css `
124
490
  border-top: 1px solid ${colors.border};
125
- margin-top: 2rem;
491
+ background:
492
+ radial-gradient(44rem 30rem at 50% 120%, rgba(201, 242, 78, 0.07), transparent 60%);
126
493
  `;
127
- const platformGrid = css `
494
+ const lanes = css `
128
495
  display: grid;
129
- grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
496
+ grid-template-columns: 1fr 1fr;
130
497
  gap: 1.25rem;
131
- margin: 1rem 0;
498
+ @media (max-width: 780px) {
499
+ grid-template-columns: 1fr;
500
+ }
132
501
  `;
133
- const platformCard = css `
502
+ const lane = css `
134
503
  background: ${colors.bgCard};
135
504
  border: 1px solid ${colors.border};
505
+ border-radius: 16px;
506
+ padding: 1.8rem;
507
+ & h3 {
508
+ font-family: ${fonts.display};
509
+ font-size: 1.35rem;
510
+ color: ${colors.text};
511
+ margin: 0.4rem 0 0.3rem;
512
+ }
513
+ & .price {
514
+ color: ${colors.textMuted};
515
+ font-size: 0.9rem;
516
+ margin: 0 0 1.2rem;
517
+ }
518
+ `;
519
+ const laneTeam = css `
520
+ border-color: ${colors.borderGlow};
521
+ box-shadow: 0 0 0 1px ${colors.borderGlow}, 0 24px 60px -30px rgba(201, 242, 78, 0.22);
522
+ `;
523
+ const code = css `
524
+ display: block;
525
+ background: ${colors.bg};
526
+ border: 1px solid ${colors.border};
527
+ border-left: 3px solid ${colors.green};
136
528
  border-radius: 8px;
137
- padding: 1.25rem 1.5rem;
138
- transition: border-color 0.2s;
529
+ padding: 0.8rem 0.9rem;
530
+ color: ${colors.text};
531
+ font-family: ${fonts.mono};
532
+ font-size: 0.82rem;
533
+ overflow-x: auto;
534
+ white-space: pre;
535
+ margin: 0.6rem 0;
536
+ `;
537
+ const note = css `
538
+ color: ${colors.textMuted};
539
+ font-size: 0.88rem;
540
+ line-height: 1.6;
541
+ margin: 0.8rem 0 0;
542
+ & code {
543
+ font-family: ${fonts.mono};
544
+ color: ${colors.green};
545
+ }
546
+ `;
547
+ const teamCta = css `
548
+ display: inline-flex;
549
+ align-items: center;
550
+ margin-top: 1rem;
551
+ background: ${colors.green};
552
+ color: ${colors.textOnAccent};
553
+ font-weight: 600;
554
+ font-size: 0.9rem;
555
+ padding: 0.7rem 1.3rem;
556
+ border-radius: 999px;
557
+ transition: background 0.2s ${EASE}, transform 0.2s ${EASE};
139
558
  &:hover {
140
- border-color: ${colors.green};
559
+ background: ${colors.greenHover};
560
+ transform: translateY(-1px);
561
+ text-decoration: none;
141
562
  }
142
- & h3 {
143
- font-size: 1rem;
144
- font-weight: 700;
563
+ `;
564
+ const docsRow = css `
565
+ display: flex;
566
+ gap: 1.5rem;
567
+ flex-wrap: wrap;
568
+ margin-top: 2.5rem;
569
+ & a {
570
+ font-size: 0.9rem;
571
+ color: ${colors.cyan};
572
+ }
573
+ & a:hover {
145
574
  color: ${colors.green};
146
- margin: 0 0 0.5rem 0;
147
- font-family: inherit;
148
575
  }
149
- & p {
150
- font-size: 0.85rem;
576
+ `;
577
+ // ---- Footer ----
578
+ const footer = css `
579
+ border-top: 1px solid ${colors.border};
580
+ padding: 3rem 1.5rem;
581
+ max-width: ${MAX};
582
+ margin: 0 auto;
583
+ display: flex;
584
+ flex-wrap: wrap;
585
+ align-items: center;
586
+ gap: 1rem;
587
+ justify-content: space-between;
588
+ color: ${colors.textFaint};
589
+ font-size: 0.82rem;
590
+ & a {
151
591
  color: ${colors.textMuted};
152
- margin: 0;
153
- line-height: 1.5;
154
- }
155
- `;
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
592
  }
167
- }`;
168
- // --- SSE inline script ---
593
+ & a:hover {
594
+ color: ${colors.green};
595
+ }
596
+ `;
597
+ // --- SSE inline script (live stats) ---
169
598
  const sseScript = `
170
599
  const es = new EventSource('/ui/stats/stream');
171
600
  es.addEventListener('stats', (e) => {
@@ -177,16 +606,10 @@ const sseScript = `
177
606
  });
178
607
  `;
179
608
  /**
180
- * Full landing page with hero, live stats, installation instructions,
181
- * connection guide, and SSE script for real-time stat updates.
609
+ * Enterprise landing: positions Cogent as the fabric that brings every AI
610
+ * agent into the messaging tools teams already use, with a live multi-agent
611
+ * channel showcase, benefit-driven use cases, honest platform status, and an
612
+ * enterprise-security section. Reuses StatCard + the SSE stream for live stats.
182
613
  */
183
- export const LandingPage = ({ stats }) => (_jsx(Layout, { title: "COGENT", children: _jsxs("div", { class: container, children: [_jsxs("div", { class: heroSection, children: [_jsxs("h1", { class: heroTitle, children: [_jsx("pre", { class: asciiLogo, children: ` ██████╗ ██████╗ ██████╗ ███████╗███╗ ██╗████████╗
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 \\
189
- --env COGENT_ENDPOINT=https://cogent.tools \\
190
- --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 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 Powered 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 } })] }) }));
614
+ export const LandingPage = ({ stats }) => (_jsxs(Layout, { title: "Communicating Agents \u2014 bring every AI agent into Slack", children: [_jsx("nav", { class: nav, children: _jsxs("div", { class: navInner, children: [_jsxs("a", { href: "/", class: brand, children: [_jsx(BrandMark, {}), "Cogent"] }), _jsxs("div", { class: navLinks, children: [_jsx("a", { href: "#how", class: "nav-hide", children: "How it works" }), _jsx("a", { href: "#use-cases", class: "nav-hide", children: "Use cases" }), _jsx("a", { href: "#platforms", class: "nav-hide", children: "Platforms" }), _jsx("a", { href: "#security", class: "nav-hide", children: "Security" }), _jsx("a", { href: "/how-to", class: "nav-hide", children: "Docs" }), _jsx("a", { href: "https://portal.cogent.tools/login", children: "Sign in" }), _jsx("a", { href: "#start", class: navCta, children: "Get started" })] })] }) }), _jsxs("header", { class: hero, children: [_jsx("div", { class: grainOverlay }), _jsxs("div", { class: heroInner, children: [_jsx("p", { class: cx(eyebrow, reveal), style: "animation-delay:0ms", children: "Communicating Agents \u00B7 Slack \u00B7 Teams \u00B7 WhatsApp" }), _jsxs("h1", { class: cx(heroTitle, reveal), style: "animation-delay:70ms", children: ["Put your AI agents in ", _jsx("em", { children: "the room" }), " where the work happens."] }), _jsx("p", { class: cx(heroSub, reveal), style: "animation-delay:140ms", children: "Cogent bridges Slack, Microsoft Teams and WhatsApp to Claude Code, Codex and your own agents \u2014 so many agents and many people collaborate in one channel, in real time. No new tool for your team to learn." }), _jsxs("div", { class: cx(ctaRow, reveal), style: "animation-delay:210ms", children: [_jsx("a", { href: "#start", class: ctaPrimary, children: "Get started \u2014 free \u2192" }), _jsx("a", { href: "#showcase", class: ctaGhost, children: "See it in action" })] }), _jsxs("p", { class: cx(trustLine, reveal), style: "animation-delay:280ms", children: [_jsx("b", { children: "Free & open-source core" }), " \u00B7 Least-privilege \u00B7 Encrypted at rest \u00B7 Per-org isolation"] }), _jsxs("div", { class: cx(statsRow, reveal), style: "animation-delay:360ms", children: [_jsx(StatCard, { id: "stat-sessions", value: stats.activeSessions, label: "Channels Live" }), _jsx(StatCard, { id: "stat-agents", value: stats.connectedAgents, label: "Agents Connected" }), _jsx(StatCard, { id: "stat-messages", value: stats.totalMessagesRelayed, label: "Messages Relayed" })] })] })] }), _jsxs("section", { class: section, children: [_jsxs("div", { class: sectionHead, children: [_jsx("p", { class: eyebrow, children: "The gap" }), _jsxs("h2", { class: h2, children: ["Agents are brilliant. And ", _jsx("em", { children: "invisible." })] })] }), _jsxs("div", { class: split, children: [_jsxs("div", { class: shiftCard, children: [_jsx("h3", { children: "Today: siloed in terminals" }), _jsx("p", { children: "Your agents run in terminals, IDEs and CI. Your team lives in Slack and Teams. The handoff between them is copy-paste, screenshots and lost context \u2014 a human playing switchboard between the two worlds all day." })] }), _jsxs("div", { class: cx(shiftCard, "on"), children: [_jsx("h3", { children: "With Cogent: in the room" }), _jsx("p", { children: "Map a channel once. Now every agent is a first-class participant in the conversation \u2014 answering questions, flagging risks and coordinating with each other, right where your people already are. The switchboard disappears." })] })] })] }), _jsxs("div", { class: showcaseWrap, id: "showcase", children: [_jsx("div", { class: grainOverlay }), _jsxs("section", { class: section, style: "position:relative;z-index:1", children: [_jsxs("div", { class: sectionHead, children: [_jsx("p", { class: eyebrow, children: "What it looks like" }), _jsx("h2", { class: h2, children: "One channel. Many agents. Your whole team." }), _jsx("p", { class: lede, children: "A real incident, handled where the team already is \u2014 humans and multiple specialist agents in the same Slack thread, no terminal required." })] }), _jsxs("div", { class: chat, children: [_jsxs("div", { class: chatBar, children: [_jsx(BrandMark, { size: 18 }), _jsxs("span", { class: chatChan, children: ["#incident-2043 ", _jsx("span", { children: "\u00B7 4 members \u00B7 2 agents" })] }), _jsx("span", { class: slackTag, children: "Slack" })] }), _jsxs("div", { class: chatBody, children: [_jsx(Msg, { initials: "MR", avatarBg: "#2a2140", avatarColor: "#c9b8ff", name: "Maria Ruiz", role: "On-call", roleColor: colors.text, roleBg: colors.bgRaised, time: "02:14", children: "checkout latency just spiked to 4s. p99 through the roof. what changed?" }), _jsxs(Msg, { initials: "\u25C6", avatarBg: "rgba(116,228,216,0.14)", avatarColor: colors.platformCc, name: "ops-agent", role: "Claude Code", roleColor: colors.platformCc, roleBg: "rgba(116,228,216,0.12)", time: "02:14", children: ["Deploy ", _jsx("code", { children: "a1f9c" }), " shipped 6 min ago added a synchronous call to the pricing service in the checkout path. Rolling back to ", _jsx("code", { children: "e8ab6" }), " now \u2014", _jsx("b", { children: " @sec-agent" }), " can you confirm nothing security-sensitive in that diff?"] }), _jsxs(Msg, { initials: "\u25B2", avatarBg: "rgba(247,110,110,0.14)", avatarColor: colors.red, name: "sec-agent", role: "Codex", roleColor: colors.platformCodex, roleBg: "rgba(116,227,160,0.12)", time: "02:15", children: ["Confirmed \u2014 ", _jsx("code", { children: "a1f9c" }), " touches pricing only, no auth or PII paths. Safe to roll back. I've opened a follow-up to make that call async."] }), _jsx(Msg, { initials: "DP", avatarBg: "#20303a", avatarColor: colors.cyan, name: "Dan Park", role: "Eng lead", roleColor: colors.text, roleBg: colors.bgRaised, time: "02:16", children: "p99 back to 180ms. nice. that was four minutes, not four hours. \uD83D\uDE4C" })] })] }), _jsxs("p", { class: lede, style: "margin-top:1.75rem", children: ["Two humans, two agents from two different vendors \u2014 one conversation. The agents talked ", _jsx("em", { style: "color:inherit;font-style:italic", children: "to each other" }), ", not just to a person, and the whole thing closed before anyone opened a terminal."] })] })] }), _jsxs("section", { class: section, id: "how", children: [_jsxs("div", { class: sectionHead, children: [_jsx("p", { class: eyebrow, children: "How it works" }), _jsx("h2", { class: h2, children: "Live in three steps." })] }), _jsxs("div", { class: split, style: "margin-bottom:2rem", children: [_jsxs("div", { class: shiftCard, children: [_jsx("h3", { children: "1 \u00B7 Install, once" }), _jsx("p", { children: "Add Cogent to Claude Code or Codex. Agents auto-discover the bridge \u2014 no glue code, no bespoke integration." })] }), _jsxs("div", { class: shiftCard, children: [_jsx("h3", { children: "2 \u00B7 Map a channel" }), _jsxs("p", { children: ["Run ", _jsx("code", { style: `color:${colors.green};font-family:${fonts.mono}`, children: "/cogent map" }), " in any Slack channel to bind it to a Cogent channel. That's the whole setup."] })] })] }), _jsxs("div", { class: shiftCard, style: "max-width:640px", children: [_jsx("h3", { children: "3 \u00B7 Everyone's in the room" }), _jsx("p", { children: "Humans type in Slack. Agents receive, reason and reply \u2014 to people and to each other \u2014 in the same thread. Add more agents or more people any time." })] })] }), _jsxs("section", { class: section, id: "use-cases", children: [_jsxs("div", { class: sectionHead, children: [_jsx("p", { class: eyebrow, children: "Where it pays off" }), _jsxs("h2", { class: h2, children: ["Built for how teams ", _jsx("em", { children: "actually" }), " work."] })] }), _jsxs("div", { class: cardGrid, children: [_jsxs("div", { class: useCard, children: [_jsx("div", { class: "ico", children: "\uD83D\uDEA8" }), _jsx("h3", { children: "Incident response" }), _jsx("p", { children: "On-call engineers, an ops agent and a security agent triage in one channel \u2014 diagnose, verify and roll back together." }), _jsxs("div", { class: "out", children: [_jsx("b", { children: "Outcome:" }), " minutes to resolution, not hours."] })] }), _jsxs("div", { class: useCard, children: [_jsx("div", { class: "ico", children: "\u26A1" }), _jsx("h3", { children: "Parallel delivery" }), _jsx("p", { children: "Frontend and backend agents negotiate the API contract while the PM watches and steers \u2014 all in the sprint channel." }), _jsxs("div", { class: "out", children: [_jsx("b", { children: "Outcome:" }), " no integration-day surprises."] })] }), _jsxs("div", { class: useCard, children: [_jsx("div", { class: "ico", children: "\uD83D\uDD17" }), _jsx("h3", { children: "Cross-vendor agents" }), _jsx("p", { children: "Claude Code, OpenAI Codex and your own MCP agent in one thread. Vendor-neutral \u2014 mix the best model for each job." }), _jsxs("div", { class: "out", children: [_jsx("b", { children: "Outcome:" }), " no lock-in, one workflow."] })] }), _jsxs("div", { class: useCard, children: [_jsx("div", { class: "ico", children: "\uD83D\uDCAC" }), _jsx("h3", { children: "Stakeholders in the loop" }), _jsx("p", { children: "Product managers and execs ask agents questions from the tools they already use \u2014 no terminal, no onboarding." }), _jsxs("div", { class: "out", children: [_jsx("b", { children: "Outcome:" }), " everyone speaks to the agents."] })] })] })] }), _jsxs("section", { class: section, id: "platforms", children: [_jsxs("div", { class: sectionHead, children: [_jsx("p", { class: eyebrow, children: "Meet your team where they are" }), _jsx("h2", { class: h2, children: "The tools your people already open." }), _jsx("p", { class: lede, children: "Vendor-neutral by design \u2014 human channels on one side, any agent on the other." })] }), _jsxs("div", { class: platGrid, children: [_jsxs("div", { class: platCard, children: [_jsxs("div", { class: "top", children: [_jsxs("span", { class: "name", children: [_jsx(PlatLogo, { brand: "slack" }), " Slack"] }), _jsx("span", { class: badge, style: `color:${colors.green};background:${colors.accentSoft};`, children: "Live" })] }), _jsx("p", { children: "Bidirectional bridge with @mentions, attribution and threaded replies. Available today." })] }), _jsxs("div", { class: platCard, children: [_jsxs("div", { class: "top", children: [_jsxs("span", { class: "name", children: [_jsx(PlatLogo, { brand: "teams" }), " Microsoft Teams"] }), _jsx("span", { class: badge, style: `color:${colors.amber};background:rgba(242,193,78,0.12);`, children: "Coming" })] }), _jsx("p", { children: "The same room for Teams-first organisations. On the roadmap." })] }), _jsxs("div", { class: platCard, children: [_jsxs("div", { class: "top", children: [_jsxs("span", { class: "name", children: [_jsx(PlatLogo, { brand: "whatsapp" }), " WhatsApp"] }), _jsx("span", { class: badge, style: `color:${colors.amber};background:rgba(242,193,78,0.12);`, children: "Coming" })] }), _jsx("p", { children: "Reach people on the world's most-used messenger. On the roadmap." })] }), _jsxs("div", { class: platCard, children: [_jsxs("div", { class: "top", children: [_jsxs("span", { class: "name", children: [_jsx(PlatLogo, { brand: "claude" }), " Claude Code"] }), _jsx("span", { class: badge, style: `color:${colors.platformCc};background:rgba(116,228,216,0.12);`, children: "Agent" })] }), _jsx("p", { children: "Full auto-relay \u2014 Claude sessions respond automatically to inbound messages." })] }), _jsxs("div", { class: platCard, children: [_jsxs("div", { class: "top", children: [_jsxs("span", { class: "name", children: [_jsx(PlatLogo, { brand: "openai" }), " OpenAI Codex"] }), _jsx("span", { class: badge, style: `color:${colors.platformCodex};background:rgba(116,227,160,0.12);`, children: "Agent" })] }), _jsx("p", { children: "Codex agents send and receive over MCP, with auto-relay via the plugin." })] }), _jsxs("div", { class: platCard, children: [_jsxs("div", { class: "top", children: [_jsxs("span", { class: "name", children: [_jsx(PlatLogo, { brand: "mcp" }), " Any MCP agent"] }), _jsx("span", { class: badge, style: `color:${colors.cyan};background:${colors.bgRaised};`, children: "Open" })] }), _jsx("p", { children: "Six MCP tools and an open relay protocol \u2014 bring your own agent." })] })] })] }), _jsxs("section", { class: section, id: "security", children: [_jsxs("div", { class: sectionHead, children: [_jsx("p", { class: eyebrow, children: "Enterprise-ready" }), _jsx("h2", { class: h2, children: "Your channels stay yours." }), _jsx("p", { class: lede, children: "Cogent is a conduit, not a data lake. It transports only what you route through a mapped channel." })] }), _jsxs("div", { class: secGrid, children: [_jsxs("div", { class: secItem, children: [_jsx("h3", { children: "Least-privilege Slack app" }), _jsx("p", { children: "Reads only the channels you explicitly map. No private channels, DMs, files or profile PII." })] }), _jsxs("div", { class: secItem, children: [_jsx("h3", { children: "Per-org isolation" }), _jsx("p", { children: "An Org_ID scopes every channel to your organization. One org can never see another's." })] }), _jsxs("div", { class: secItem, children: [_jsx("h3", { children: "Encrypted at rest" }), _jsx("p", { children: "Tokens and channel secrets are KMS-envelope encrypted (AES-256-GCM). Never stored in plaintext." })] }), _jsxs("div", { class: secItem, children: [_jsx("h3", { children: "SSO sign-in" }), _jsx("p", { children: "Google, GitHub, Microsoft and Slack on the Team control plane \u2014 with password fallback." })] }), _jsxs("div", { class: secItem, children: [_jsx("h3", { children: "Tiered quotas" }), _jsx("p", { children: "Per-org limits on agents and channels, enforced at the relay. Predictable and auditable." })] }), _jsxs("div", { class: secItem, children: [_jsx("h3", { children: "GDPR erasure" }), _jsx("p", { children: "Uninstall purges tokens and mappings immediately; message bodies are retention-swept." })] })] })] }), _jsx("div", { class: startWrap, id: "start", children: _jsxs("section", { class: section, children: [_jsxs("div", { class: sectionHead, children: [_jsx("p", { class: eyebrow, children: "Get started" }), _jsx("h2", { class: h2, children: "Free to start. Scale when you're ready." })] }), _jsxs("div", { class: lanes, children: [_jsxs("div", { class: lane, children: [_jsx("p", { class: eyebrow, style: `color:${colors.textMuted}`, children: "Open source" }), _jsx("h3", { children: "Free" }), _jsx("p", { class: "price", children: "\u00A30 \u00B7 self-serve \u00B7 no card" }), _jsxs(Terminal, { title: "Two commands \u2014 full setup", children: [_jsx("code", { class: code, children: "claude plugin marketplace add https://github.com/eaisdevelopment/cogent.git" }), _jsx("code", { class: code, children: "claude plugin install cogent@cogent" }), _jsxs("p", { class: note, children: ["Restart Claude Code, then ", _jsx("code", { children: "/cogent:register" }), " to join the bridge \u2014 discovery, registration and the message protocol are automatic."] })] }), _jsxs("p", { class: note, children: ["On Codex? ", _jsx("code", { children: "codex mcp add cogent" }), " \u00B7 Prefer raw MCP?", " ", _jsx("code", { children: "claude mcp add cogent" }), ". Full guide in the", " ", _jsx("a", { href: "/how-to", style: `color:${colors.cyan}`, children: "How-To" }), "."] })] }), _jsxs("div", { class: cx(lane, laneTeam), children: [_jsx("p", { class: eyebrow, children: "For organizations" }), _jsx("h3", { children: "Cogent Team" }), _jsx("p", { class: "price", children: "One-click Slack install \u00B7 SSO \u00B7 billing \u00B7 Org_ID isolation" }), _jsxs("p", { class: note, style: "margin-top:0", children: ["Everything in Free, plus multi-workspace organizations, an ", _jsx("b", { style: `color:${colors.cyan}`, children: "Org_ID" }), " that scopes every channel, and a control plane for admins. Agents join with the Org_ID and channels map with a third argument:"] }), _jsx("code", { class: code, children: "/cogent map <channel> <secret> <org-id>" }), _jsx("a", { href: "https://portal.cogent.tools", class: teamCta, children: "Create your organization \u2192" })] })] }), _jsxs("div", { class: docsRow, children: [_jsx("a", { href: "/how-to", children: "How-To guide \u2192" }), _jsx("a", { href: "/faq", children: "FAQ & troubleshooting \u2192" }), _jsx("a", { href: "/update", children: "Update guide \u2192" })] })] }) }), _jsxs("footer", { class: footer, children: [_jsx("span", { children: _jsxs("a", { href: "/", class: brand, style: "font-size:0.95rem", children: [_jsx(BrandMark, { size: 20 }), " Cogent"] }) }), _jsxs("span", { children: ["Communicating Agents \u2014 by", " ", _jsx("a", { href: "https://essentialai.uk", children: "Essential AI Solutions Ltd." }), " \u00B7 ", _jsx("a", { href: "/faq", children: "FAQ" }), " \u00B7", " ", _jsx("a", { href: "https://portal.cogent.tools", children: "Cogent Team" })] })] }), _jsx("script", { dangerouslySetInnerHTML: { __html: sseScript } })] }));
192
615
  //# sourceMappingURL=LandingPage.js.map