@essentialai/cogent-server 3.2.1 → 3.4.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.
Files changed (51) hide show
  1. package/README.md +1 -0
  2. package/dist/__tests__/helpers.d.ts.map +1 -1
  3. package/dist/__tests__/helpers.js +7 -4
  4. package/dist/__tests__/helpers.js.map +1 -1
  5. package/dist/app.js +2 -2
  6. package/dist/app.js.map +1 -1
  7. package/dist/index.js +3 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/routes/messages.d.ts +2 -1
  10. package/dist/routes/messages.d.ts.map +1 -1
  11. package/dist/routes/messages.js +6 -2
  12. package/dist/routes/messages.js.map +1 -1
  13. package/dist/routes/peers.d.ts +3 -1
  14. package/dist/routes/peers.d.ts.map +1 -1
  15. package/dist/routes/peers.js +6 -2
  16. package/dist/routes/peers.js.map +1 -1
  17. package/dist/routes/ui.d.ts.map +1 -1
  18. package/dist/routes/ui.js +3 -1
  19. package/dist/routes/ui.js.map +1 -1
  20. package/dist/services/stats-service.d.ts +47 -2
  21. package/dist/services/stats-service.d.ts.map +1 -1
  22. package/dist/services/stats-service.js +126 -4
  23. package/dist/services/stats-service.js.map +1 -1
  24. package/dist/ui/components/PlatformBadge.d.ts +8 -0
  25. package/dist/ui/components/PlatformBadge.d.ts.map +1 -0
  26. package/dist/ui/components/PlatformBadge.js +47 -0
  27. package/dist/ui/components/PlatformBadge.js.map +1 -0
  28. package/dist/ui/pages/AdminDashboard.d.ts +2 -1
  29. package/dist/ui/pages/AdminDashboard.d.ts.map +1 -1
  30. package/dist/ui/pages/AdminDashboard.js +15 -2
  31. package/dist/ui/pages/AdminDashboard.js.map +1 -1
  32. package/dist/ui/pages/FaqPage.d.ts.map +1 -1
  33. package/dist/ui/pages/FaqPage.js +11 -2
  34. package/dist/ui/pages/FaqPage.js.map +1 -1
  35. package/dist/ui/pages/HowToPage.js +2 -2
  36. package/dist/ui/pages/HowToPage.js.map +1 -1
  37. package/dist/ui/pages/LandingPage.d.ts.map +1 -1
  38. package/dist/ui/pages/LandingPage.js +33 -1
  39. package/dist/ui/pages/LandingPage.js.map +1 -1
  40. package/dist/ui/pages/SessionDetail.d.ts.map +1 -1
  41. package/dist/ui/pages/SessionDetail.js +3 -2
  42. package/dist/ui/pages/SessionDetail.js.map +1 -1
  43. package/dist/ui/pages/SessionList.d.ts +2 -0
  44. package/dist/ui/pages/SessionList.d.ts.map +1 -1
  45. package/dist/ui/pages/SessionList.js +16 -2
  46. package/dist/ui/pages/SessionList.js.map +1 -1
  47. package/dist/ui/styles/theme.d.ts +7 -0
  48. package/dist/ui/styles/theme.d.ts.map +1 -1
  49. package/dist/ui/styles/theme.js +8 -0
  50. package/dist/ui/styles/theme.js.map +1 -1
  51. package/package.json +1 -1
@@ -1,39 +1,129 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
1
3
  /**
2
4
  * Cached stats aggregation service.
3
5
  *
4
6
  * Periodically refreshes aggregated counts from SessionStore (disk) and
5
7
  * ConnectionManager (in-memory) so that SSE endpoints and UI pages can
6
8
  * read stats without per-request disk I/O.
9
+ *
10
+ * Cumulative stats (peer registrations + messages sent, by platform) are
11
+ * persisted to <dataDir>/platform-stats.json via atomic writes so they
12
+ * survive server restarts.
7
13
  */
8
14
  export class StatsService {
9
15
  cachedStats;
16
+ cumulativeStats;
10
17
  sessionStore;
11
18
  connectionManager;
12
19
  startTime;
20
+ dataDir;
13
21
  refreshHandle = null;
14
- constructor(sessionStore, connectionManager, startTime) {
22
+ constructor(sessionStore, connectionManager, startTime, dataDir) {
15
23
  this.sessionStore = sessionStore;
16
24
  this.connectionManager = connectionManager;
17
25
  this.startTime = startTime;
26
+ this.dataDir = dataDir;
18
27
  this.cachedStats = {
19
28
  activeSessions: 0,
20
29
  connectedAgents: 0,
21
30
  totalMessagesRelayed: 0,
22
31
  uptime: 0,
32
+ agentsByPlatform: {},
33
+ sessionsByPlatform: {},
34
+ };
35
+ this.cumulativeStats = {
36
+ totalPeerRegistrations: {},
37
+ totalMessagesSent: {},
38
+ lastUpdated: new Date().toISOString(),
39
+ };
40
+ }
41
+ /**
42
+ * Load cumulative stats from disk. Called once at startup.
43
+ * Creates the file with zero counters if it does not exist.
44
+ */
45
+ async loadCumulativeStats() {
46
+ const filePath = this._platformStatsPath();
47
+ try {
48
+ const raw = await fs.readFile(filePath, "utf-8");
49
+ this.cumulativeStats = JSON.parse(raw);
50
+ }
51
+ catch (err) {
52
+ const code = err.code;
53
+ if (code === "ENOENT") {
54
+ // First run — persist the zero-state file
55
+ await this._saveCumulativeStats();
56
+ }
57
+ else {
58
+ // Corrupt file — log and continue with zero state
59
+ console.error("StatsService: failed to read platform-stats.json:", err);
60
+ }
61
+ }
62
+ }
63
+ /**
64
+ * Increment the cumulative registration counter for the given platform
65
+ * and atomically persist to disk.
66
+ */
67
+ async incrementPeerRegistration(platform) {
68
+ const p = platform || "cc";
69
+ this.cumulativeStats.totalPeerRegistrations[p] =
70
+ (this.cumulativeStats.totalPeerRegistrations[p] ?? 0) + 1;
71
+ this.cumulativeStats.lastUpdated = new Date().toISOString();
72
+ await this._saveCumulativeStats();
73
+ }
74
+ /**
75
+ * Increment the cumulative messages-sent counter for the originating
76
+ * platform and atomically persist to disk.
77
+ */
78
+ async incrementMessageSent(originPlatform) {
79
+ const p = originPlatform || "cc";
80
+ this.cumulativeStats.totalMessagesSent[p] =
81
+ (this.cumulativeStats.totalMessagesSent[p] ?? 0) + 1;
82
+ this.cumulativeStats.lastUpdated = new Date().toISOString();
83
+ await this._saveCumulativeStats();
84
+ }
85
+ /**
86
+ * Return a shallow copy of the current cumulative stats.
87
+ */
88
+ getCumulativeStats() {
89
+ return {
90
+ totalPeerRegistrations: { ...this.cumulativeStats.totalPeerRegistrations },
91
+ totalMessagesSent: { ...this.cumulativeStats.totalMessagesSent },
92
+ lastUpdated: this.cumulativeStats.lastUpdated,
23
93
  };
24
94
  }
25
95
  /**
26
96
  * Refresh cached stats from disk (sessions, messages) and memory (connections).
97
+ * Also derives live platform breakdown by iterating all sessions and their peers.
27
98
  * Called periodically by start() and can be called manually.
28
99
  */
29
100
  async refresh() {
30
101
  const sessionIds = await this.sessionStore.listSessions();
31
102
  const totalMessages = await this.sessionStore.getGlobalMessageCount();
103
+ // Derive live platform breakdown from session peers
104
+ const agentsByPlatform = {};
105
+ const sessionsByPlatform = {};
106
+ for (const sid of sessionIds) {
107
+ const session = await this.sessionStore.getSession(sid);
108
+ if (!session)
109
+ continue;
110
+ const seen = new Set();
111
+ for (const peer of Object.values(session.peers)) {
112
+ const p = peer.platform ?? "cc";
113
+ agentsByPlatform[p] = (agentsByPlatform[p] ?? 0) + 1;
114
+ seen.add(p);
115
+ }
116
+ for (const p of seen) {
117
+ sessionsByPlatform[p] = (sessionsByPlatform[p] ?? 0) + 1;
118
+ }
119
+ }
32
120
  this.cachedStats = {
33
121
  activeSessions: sessionIds.length,
34
122
  connectedAgents: this.connectionManager.getTotalConnectedPeers(),
35
123
  totalMessagesRelayed: totalMessages,
36
124
  uptime: (Date.now() - this.startTime) / 1000,
125
+ agentsByPlatform,
126
+ sessionsByPlatform,
37
127
  };
38
128
  }
39
129
  /**
@@ -43,17 +133,22 @@ export class StatsService {
43
133
  getStats() {
44
134
  return {
45
135
  ...this.cachedStats,
136
+ agentsByPlatform: { ...this.cachedStats.agentsByPlatform },
137
+ sessionsByPlatform: { ...this.cachedStats.sessionsByPlatform },
46
138
  uptime: (Date.now() - this.startTime) / 1000,
47
139
  };
48
140
  }
49
141
  /**
50
142
  * Start periodic stats refresh.
51
- * Calls refresh() immediately, then sets up an interval.
143
+ * Loads cumulative stats from disk, calls refresh() immediately,
144
+ * then sets up an interval.
52
145
  * The interval handle is unref'd so it does not block process exit.
53
146
  */
54
147
  start(intervalMs = 5000) {
55
- // Initial refresh (fire and forget -- errors logged to stderr)
56
- this.refresh().catch(console.error);
148
+ // Load cumulative stats from disk, then do initial refresh
149
+ this.loadCumulativeStats()
150
+ .then(() => this.refresh())
151
+ .catch(console.error);
57
152
  this.refreshHandle = setInterval(() => {
58
153
  this.refresh().catch(console.error);
59
154
  }, intervalMs);
@@ -68,5 +163,32 @@ export class StatsService {
68
163
  this.refreshHandle = null;
69
164
  }
70
165
  }
166
+ // ---------------------------------------------------------------------------
167
+ // Private helpers
168
+ // ---------------------------------------------------------------------------
169
+ _platformStatsPath() {
170
+ return path.join(this.dataDir, "platform-stats.json");
171
+ }
172
+ /**
173
+ * Atomically write cumulative stats to disk.
174
+ * Writes a temp file then renames so readers never see a partial write.
175
+ */
176
+ async _saveCumulativeStats() {
177
+ const filePath = this._platformStatsPath();
178
+ const tmpPath = `${filePath}.tmp`;
179
+ try {
180
+ await fs.mkdir(this.dataDir, { recursive: true });
181
+ await fs.writeFile(tmpPath, JSON.stringify(this.cumulativeStats, null, 2), "utf-8");
182
+ await fs.rename(tmpPath, filePath);
183
+ }
184
+ catch (err) {
185
+ console.error("StatsService: failed to persist platform-stats.json:", err);
186
+ // Best-effort — don't crash the server over a stats write failure
187
+ try {
188
+ await fs.unlink(tmpPath);
189
+ }
190
+ catch { /* ignore */ }
191
+ }
192
+ }
71
193
  }
72
194
  //# sourceMappingURL=stats-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stats-service.js","sourceRoot":"","sources":["../../src/services/stats-service.ts"],"names":[],"mappings":"AAcA;;;;;;GAMG;AACH,MAAM,OAAO,YAAY;IACf,WAAW,CAAc;IAChB,YAAY,CAAe;IAC3B,iBAAiB,CAAoB;IACrC,SAAS,CAAS;IAC3B,aAAa,GAA0C,IAAI,CAAC;IAEpE,YACE,YAA0B,EAC1B,iBAAoC,EACpC,SAAiB;QAEjB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG;YACjB,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;YAClB,oBAAoB,EAAE,CAAC;YACvB,MAAM,EAAE,CAAC;SACV,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;QAC1D,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,EAAE,CAAC;QAEtE,IAAI,CAAC,WAAW,GAAG;YACjB,cAAc,EAAE,UAAU,CAAC,MAAM;YACjC,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAAE;YAChE,oBAAoB,EAAE,aAAa;YACnC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI;SAC7C,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,OAAO;YACL,GAAG,IAAI,CAAC,WAAW;YACnB,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI;SAC7C,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAqB,IAAI;QAC7B,+DAA+D;QAC/D,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEpC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;YACpC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,EAAE,UAAU,CAAC,CAAC;QACf,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"stats-service.js","sourceRoot":"","sources":["../../src/services/stats-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare const platformLabels: Record<string, string>;
2
+ export declare function PlatformBadge({ platform }: {
3
+ platform?: string;
4
+ }): import("hono/jsx/jsx-dev-runtime").JSX.Element;
5
+ export declare function ModeBadge({ mode }: {
6
+ mode?: string;
7
+ }): import("hono/jsx/jsx-dev-runtime").JSX.Element;
8
+ //# sourceMappingURL=PlatformBadge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlatformBadge.d.ts","sourceRoot":"","sources":["../../../src/ui/components/PlatformBadge.tsx"],"names":[],"mappings":"AAWA,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMjD,CAAC;AAsBF,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,kDAKhE;AAED,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,kDAIpD"}
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx } from "hono/jsx/jsx-runtime";
2
+ import { css } from "hono/css";
3
+ import { colors, fonts } from "../styles/theme.js";
4
+ const platformColors = {
5
+ cc: colors.platformCc,
6
+ codex: colors.platformCodex,
7
+ slack: colors.platformSlack,
8
+ gchat: colors.platformGchat,
9
+ web: colors.platformWeb,
10
+ };
11
+ export const platformLabels = {
12
+ cc: "Claude Code",
13
+ codex: "Codex",
14
+ slack: "Slack",
15
+ gchat: "GChat",
16
+ web: "Web",
17
+ };
18
+ const modeColors = {
19
+ agent: colors.modeAgent,
20
+ observer: colors.modeObserver,
21
+ };
22
+ function badgeStyle(color) {
23
+ return css `
24
+ display: inline-block;
25
+ padding: 2px 8px;
26
+ border-radius: 3px;
27
+ font-size: 0.75rem;
28
+ font-family: ${fonts.mono};
29
+ font-weight: 600;
30
+ color: ${colors.bg};
31
+ background: ${color};
32
+ text-transform: uppercase;
33
+ letter-spacing: 0.5px;
34
+ `;
35
+ }
36
+ export function PlatformBadge({ platform }) {
37
+ const p = platform ?? "cc";
38
+ const color = platformColors[p] ?? colors.textMuted;
39
+ const label = platformLabels[p] ?? p;
40
+ return _jsx("span", { class: badgeStyle(color), children: label });
41
+ }
42
+ export function ModeBadge({ mode }) {
43
+ const m = mode ?? "agent";
44
+ const color = modeColors[m] ?? colors.textMuted;
45
+ return _jsx("span", { class: badgeStyle(color), children: m });
46
+ }
47
+ //# sourceMappingURL=PlatformBadge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlatformBadge.js","sourceRoot":"","sources":["../../../src/ui/components/PlatformBadge.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,cAAc,GAA2B;IAC7C,EAAE,EAAE,MAAM,CAAC,UAAU;IACrB,KAAK,EAAE,MAAM,CAAC,aAAa;IAC3B,KAAK,EAAE,MAAM,CAAC,aAAa;IAC3B,KAAK,EAAE,MAAM,CAAC,aAAa;IAC3B,GAAG,EAAE,MAAM,CAAC,WAAW;CACxB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,UAAU,GAA2B;IACzC,KAAK,EAAE,MAAM,CAAC,SAAS;IACvB,QAAQ,EAAE,MAAM,CAAC,YAAY;CAC9B,CAAC;AAEF,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,GAAG,CAAA;;;;;mBAKO,KAAK,CAAC,IAAI;;aAEhB,MAAM,CAAC,EAAE;kBACJ,KAAK;;;GAGpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAyB;IAC/D,MAAM,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC;IAC3B,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC;IACpD,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,eAAM,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,YAAG,KAAK,GAAQ,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAE,IAAI,EAAqB;IACnD,MAAM,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;IAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC;IAChD,OAAO,eAAM,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,YAAG,CAAC,GAAQ,CAAC;AACpD,CAAC"}
@@ -1,8 +1,9 @@
1
1
  import type { FC } from "hono/jsx";
2
- import type { ServerStats } from "../../services/stats-service.js";
2
+ import type { ServerStats, CumulativeStats } from "../../services/stats-service.js";
3
3
  /** Props for the AdminDashboard page. */
4
4
  interface AdminDashboardProps {
5
5
  stats: ServerStats;
6
+ cumulative: CumulativeStats;
6
7
  }
7
8
  /**
8
9
  * Admin overview page with summary stats and quick-action links.
@@ -1 +1 @@
1
- {"version":3,"file":"AdminDashboard.d.ts","sourceRoot":"","sources":["../../../src/ui/pages/AdminDashboard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAOnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEnE,yCAAyC;AACzC,UAAU,mBAAmB;IAC3B,KAAK,EAAE,WAAW,CAAC;CACpB;AAuDD;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAuClD,CAAC"}
1
+ {"version":3,"file":"AdminDashboard.d.ts","sourceRoot":"","sources":["../../../src/ui/pages/AdminDashboard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAQnC,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEpF,yCAAyC;AACzC,UAAU,mBAAmB;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,eAAe,CAAC;CAC7B;AAqED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAqElD,CAAC"}
@@ -1,8 +1,9 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "hono/jsx/jsx-runtime";
2
2
  import { css } from "hono/css";
3
3
  import { Layout } from "../components/Layout.js";
4
4
  import { NavBar } from "../components/NavBar.js";
5
5
  import { StatCard } from "../components/StatCard.js";
6
+ import { PlatformBadge, platformLabels } from "../components/PlatformBadge.js";
6
7
  import { Footer } from "../components/Footer.js";
7
8
  import { colors } from "../styles/theme.js";
8
9
  const container = css `
@@ -22,6 +23,18 @@ const statsRow = css `
22
23
  flex-wrap: wrap;
23
24
  margin-bottom: 3rem;
24
25
  `;
26
+ const sectionTitle = css `
27
+ font-size: 1rem;
28
+ font-weight: 700;
29
+ color: ${colors.text};
30
+ margin: 0 0 1rem 0;
31
+ `;
32
+ const statsGrid = css `
33
+ display: flex;
34
+ gap: 1.5rem;
35
+ flex-wrap: wrap;
36
+ margin-bottom: 3rem;
37
+ `;
25
38
  const quickLinksSection = css `
26
39
  margin-top: 1rem;
27
40
  `;
@@ -55,5 +68,5 @@ const actionLink = css `
55
68
  * Admin overview page with summary stats and quick-action links.
56
69
  * Renders Layout with NavBar, three stat cards, and navigation buttons.
57
70
  */
58
- export const AdminDashboard = ({ stats }) => (_jsxs(Layout, { title: "Admin Dashboard", children: [_jsx(NavBar, { active: "dashboard" }), _jsxs("div", { class: container, children: [_jsx("h1", { class: pageTitle, children: "Dashboard" }), _jsxs("div", { class: statsRow, children: [_jsx(StatCard, { id: "admin-sessions", value: stats.activeSessions, label: "Active Sessions" }), _jsx(StatCard, { id: "admin-agents", value: stats.connectedAgents, label: "Connected Agents" }), _jsx(StatCard, { id: "admin-messages", value: stats.totalMessagesRelayed, label: "Total Messages" })] }), _jsxs("div", { class: quickLinksSection, children: [_jsx("h2", { class: quickLinksTitle, children: "Quick Actions" }), _jsxs("div", { class: linkRow, children: [_jsx("a", { href: "/admin/sessions", class: actionLink, children: "Manage Sessions" }), _jsx("a", { href: "/admin/messages", class: actionLink, children: "View Messages" })] })] }), _jsx(Footer, {})] })] }));
71
+ export const AdminDashboard = ({ stats, cumulative }) => (_jsxs(Layout, { title: "Admin Dashboard", children: [_jsx(NavBar, { active: "dashboard" }), _jsxs("div", { class: container, children: [_jsx("h1", { class: pageTitle, children: "Dashboard" }), _jsxs("div", { class: statsRow, children: [_jsx(StatCard, { id: "admin-sessions", value: stats.activeSessions, label: "Active Sessions" }), _jsx(StatCard, { id: "admin-agents", value: stats.connectedAgents, label: "Connected Agents" }), _jsx(StatCard, { id: "admin-messages", value: stats.totalMessagesRelayed, label: "Total Messages" })] }), Object.keys(stats.agentsByPlatform).length > 0 && (_jsxs(_Fragment, { children: [_jsx("h2", { class: sectionTitle, children: "Agents by Platform" }), _jsx("div", { class: statsGrid, children: Object.entries(stats.agentsByPlatform).map(([platform, count]) => (_jsx(StatCard, { id: `platform-live-${platform}`, value: count, label: platformLabels[platform] ?? platform }))) })] })), Object.keys(cumulative.totalPeerRegistrations).length > 0 && (_jsxs(_Fragment, { children: [_jsx("h2", { class: sectionTitle, children: "Cumulative Totals" }), _jsx("div", { class: statsGrid, children: Object.entries(cumulative.totalPeerRegistrations).map(([platform, count]) => (_jsx(StatCard, { id: `platform-cumulative-${platform}`, value: count, label: `Total ${platformLabels[platform] ?? platform} sessions` }))) })] })), _jsxs("div", { class: quickLinksSection, children: [_jsx("h2", { class: quickLinksTitle, children: "Quick Actions" }), _jsxs("div", { class: linkRow, children: [_jsx("a", { href: "/admin/sessions", class: actionLink, children: "Manage Sessions" }), _jsx("a", { href: "/admin/messages", class: actionLink, children: "View Messages" })] })] }), _jsx(Footer, {})] })] }));
59
72
  //# sourceMappingURL=AdminDashboard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminDashboard.js","sourceRoot":"","sources":["../../../src/ui/pages/AdminDashboard.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQ5C,MAAM,SAAS,GAA2B,GAAG,CAAA;;;;CAI5C,CAAC;AAEF,MAAM,SAAS,GAA2B,GAAG,CAAA;;;WAGlC,MAAM,CAAC,IAAI;;CAErB,CAAC;AAEF,MAAM,QAAQ,GAA2B,GAAG,CAAA;;;;;CAK3C,CAAC;AAEF,MAAM,iBAAiB,GAA2B,GAAG,CAAA;;CAEpD,CAAC;AAEF,MAAM,eAAe,GAA2B,GAAG,CAAA;;;WAGxC,MAAM,CAAC,IAAI;;CAErB,CAAC;AAEF,MAAM,OAAO,GAA2B,GAAG,CAAA;;;;CAI1C,CAAC;AAEF,MAAM,UAAU,GAA2B,GAAG,CAAA;;;gBAG9B,MAAM,CAAC,MAAM;sBACP,MAAM,CAAC,MAAM;;WAExB,MAAM,CAAC,IAAI;;;;;oBAKF,MAAM,CAAC,IAAI;;;CAG9B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAA4B,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CACpE,MAAC,MAAM,IAAC,KAAK,EAAC,iBAAiB,aAC7B,KAAC,MAAM,IAAC,MAAM,EAAC,WAAW,GAAG,EAC7B,eAAK,KAAK,EAAE,SAAS,aACnB,aAAI,KAAK,EAAE,SAAS,0BAAgB,EAEpC,eAAK,KAAK,EAAE,QAAQ,aAClB,KAAC,QAAQ,IACP,EAAE,EAAC,gBAAgB,EACnB,KAAK,EAAE,KAAK,CAAC,cAAc,EAC3B,KAAK,EAAC,iBAAiB,GACvB,EACF,KAAC,QAAQ,IACP,EAAE,EAAC,cAAc,EACjB,KAAK,EAAE,KAAK,CAAC,eAAe,EAC5B,KAAK,EAAC,kBAAkB,GACxB,EACF,KAAC,QAAQ,IACP,EAAE,EAAC,gBAAgB,EACnB,KAAK,EAAE,KAAK,CAAC,oBAAoB,EACjC,KAAK,EAAC,gBAAgB,GACtB,IACE,EAEN,eAAK,KAAK,EAAE,iBAAiB,aAC3B,aAAI,KAAK,EAAE,eAAe,8BAAoB,EAC9C,eAAK,KAAK,EAAE,OAAO,aACjB,YAAG,IAAI,EAAC,iBAAiB,EAAC,KAAK,EAAE,UAAU,gCAEvC,EACJ,YAAG,IAAI,EAAC,iBAAiB,EAAC,KAAK,EAAE,UAAU,8BAEvC,IACA,IACF,EAEN,KAAC,MAAM,KAAG,IACN,IACC,CACV,CAAC"}
1
+ {"version":3,"file":"AdminDashboard.js","sourceRoot":"","sources":["../../../src/ui/pages/AdminDashboard.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAS5C,MAAM,SAAS,GAA2B,GAAG,CAAA;;;;CAI5C,CAAC;AAEF,MAAM,SAAS,GAA2B,GAAG,CAAA;;;WAGlC,MAAM,CAAC,IAAI;;CAErB,CAAC;AAEF,MAAM,QAAQ,GAA2B,GAAG,CAAA;;;;;CAK3C,CAAC;AAEF,MAAM,YAAY,GAA2B,GAAG,CAAA;;;WAGrC,MAAM,CAAC,IAAI;;CAErB,CAAC;AAEF,MAAM,SAAS,GAA2B,GAAG,CAAA;;;;;CAK5C,CAAC;AAEF,MAAM,iBAAiB,GAA2B,GAAG,CAAA;;CAEpD,CAAC;AAEF,MAAM,eAAe,GAA2B,GAAG,CAAA;;;WAGxC,MAAM,CAAC,IAAI;;CAErB,CAAC;AAEF,MAAM,OAAO,GAA2B,GAAG,CAAA;;;;CAI1C,CAAC;AAEF,MAAM,UAAU,GAA2B,GAAG,CAAA;;;gBAG9B,MAAM,CAAC,MAAM;sBACP,MAAM,CAAC,MAAM;;WAExB,MAAM,CAAC,IAAI;;;;;oBAKF,MAAM,CAAC,IAAI;;;CAG9B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAA4B,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAChF,MAAC,MAAM,IAAC,KAAK,EAAC,iBAAiB,aAC7B,KAAC,MAAM,IAAC,MAAM,EAAC,WAAW,GAAG,EAC7B,eAAK,KAAK,EAAE,SAAS,aACnB,aAAI,KAAK,EAAE,SAAS,0BAAgB,EAEpC,eAAK,KAAK,EAAE,QAAQ,aAClB,KAAC,QAAQ,IACP,EAAE,EAAC,gBAAgB,EACnB,KAAK,EAAE,KAAK,CAAC,cAAc,EAC3B,KAAK,EAAC,iBAAiB,GACvB,EACF,KAAC,QAAQ,IACP,EAAE,EAAC,cAAc,EACjB,KAAK,EAAE,KAAK,CAAC,eAAe,EAC5B,KAAK,EAAC,kBAAkB,GACxB,EACF,KAAC,QAAQ,IACP,EAAE,EAAC,gBAAgB,EACnB,KAAK,EAAE,KAAK,CAAC,oBAAoB,EACjC,KAAK,EAAC,gBAAgB,GACtB,IACE,EAEL,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CACjD,8BACE,aAAI,KAAK,EAAE,YAAY,mCAAyB,EAChD,cAAK,KAAK,EAAE,SAAS,YAClB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CACjE,KAAC,QAAQ,IACP,EAAE,EAAE,iBAAiB,QAAQ,EAAE,EAC/B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAC3C,CACH,CAAC,GACE,IACL,CACJ,EAEA,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAC5D,8BACE,aAAI,KAAK,EAAE,YAAY,kCAAwB,EAC/C,cAAK,KAAK,EAAE,SAAS,YAClB,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAC5E,KAAC,QAAQ,IACP,EAAE,EAAE,uBAAuB,QAAQ,EAAE,EACrC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,SAAS,cAAc,CAAC,QAAQ,CAAC,IAAI,QAAQ,WAAW,GAC/D,CACH,CAAC,GACE,IACL,CACJ,EAED,eAAK,KAAK,EAAE,iBAAiB,aAC3B,aAAI,KAAK,EAAE,eAAe,8BAAoB,EAC9C,eAAK,KAAK,EAAE,OAAO,aACjB,YAAG,IAAI,EAAC,iBAAiB,EAAC,KAAK,EAAE,UAAU,gCAEvC,EACJ,YAAG,IAAI,EAAC,iBAAiB,EAAC,KAAK,EAAE,UAAU,8BAEvC,IACA,IACF,EAEN,KAAC,MAAM,KAAG,IACN,IACC,CACV,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"FaqPage.d.ts","sourceRoot":"","sources":["../../../src/ui/pages/FaqPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AA2KnC,eAAO,MAAM,OAAO,EAAE,EA6TrB,CAAC"}
1
+ {"version":3,"file":"FaqPage.d.ts","sourceRoot":"","sources":["../../../src/ui/pages/FaqPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AA2KnC,eAAO,MAAM,OAAO,EAAE,EAmerB,CAAC"}
@@ -149,7 +149,11 @@ const footer = css `
149
149
  margin-top: 2rem;
150
150
  `;
151
151
  // --- Component ---
152
- export const FaqPage = () => (_jsx(Layout, { title: "FAQ", children: _jsxs("div", { class: container, children: [_jsx("a", { href: "/", class: backLink, children: "\u2190 Back to Home" }), _jsxs("div", { class: heroSection, children: [_jsx("h1", { class: heroTitle, children: "Frequently Asked Questions" }), _jsx("p", { class: heroSubtitle, children: "Slack bridge setup, message flow troubleshooting, peer identity, server deployment, and version compatibility." })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Setup Issues" }), _jsxs("details", { class: detailsStyle, children: [_jsxs("summary", { class: summaryStyle, children: [_jsx("code", { class: inlineCode, children: "/cogent map" }), " shows as plain text instead of a slash command"] }), _jsxs("div", { class: answerBody, children: [_jsxs("p", { class: paragraph, children: ["Slack must recognize ", _jsx("code", { class: inlineCode, children: "/cogent" }), " as a registered slash command. When you type ", _jsx("code", { class: inlineCode, children: "/cogent" }), " in the message box, you should see an autocomplete popup showing \"Cogent Bridge\". If not:"] }), _jsxs("ul", { class: bulletList, children: [_jsx("li", { children: "Verify the Slack App has a slash command configured: go to api.slack.com/apps > your app > Slash Commands" }), _jsxs("li", { children: ["The command name must be exactly ", _jsx("code", { class: inlineCode, children: "/cogent" })] }), _jsx("li", { children: "The Cogent Bridge app must be installed in your workspace" }), _jsx("li", { children: "Try restarting your Slack client" })] })] })] }), _jsxs("details", { class: detailsStyle, children: [_jsxs("summary", { class: summaryStyle, children: [_jsx("code", { class: inlineCode, children: "/cogent map" }), " returns \"invalid session or secret\""] }), _jsxs("div", { class: answerBody, children: [_jsx("p", { class: paragraph, children: "This means either:" }), _jsxs("ul", { class: bulletList, children: [_jsxs("li", { children: ["The session ID doesn't exist on the relay \u2014 create it first with ", _jsx("code", { class: inlineCode, children: "cogent_create_session" }), " in Claude Code"] }), _jsx("li", { children: "The secret doesn't match \u2014 double-check the exact secret you used when creating the session" }), _jsx("li", { children: "The relay server is unreachable \u2014 check with:" })] }), _jsx("div", { class: codeBlock, children: "curl https://cogent.tools/api/health" })] })] }), _jsxs("details", { class: detailsStyle, children: [_jsxs("summary", { class: summaryStyle, children: [_jsx("code", { class: inlineCode, children: "cogent_register_peer" }), " fails with \"Unrecognized keys: platform, type, transport\""] }), _jsxs("div", { class: answerBody, children: [_jsxs("p", { class: paragraph, children: ["The relay server has an old version of ", _jsx("code", { class: inlineCode, children: "@essentialai/cogent" }), " that doesn't recognize the new platform fields. SSH to the server and update:"] }), _jsx("div", { class: codeBlock, children: `cd /path/to/cogent/server && npm install @essentialai/cogent@3.0.0
152
+ export const FaqPage = () => (_jsx(Layout, { title: "FAQ", children: _jsxs("div", { class: container, children: [_jsx("a", { href: "/", class: backLink, children: "\u2190 Back to Home" }), _jsxs("div", { class: heroSection, children: [_jsx("h1", { class: heroTitle, children: "Frequently Asked Questions" }), _jsx("p", { class: heroSubtitle, children: "Slack bridge setup, message flow troubleshooting, peer identity, server deployment, and version compatibility." })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Installation" }), _jsxs("details", { class: detailsStyle, children: [_jsxs("summary", { class: summaryStyle, children: [_jsx("code", { class: inlineCode, children: "claude plugin marketplace add" }), " fails with \"Host key verification failed\" / \"No ED25519 host key is known for github.com\""] }), _jsxs("div", { class: answerBody, children: [_jsxs("p", { class: paragraph, children: ["The bare ", _jsx("code", { class: inlineCode, children: "eaisdevelopment/cogent" }), " shorthand resolves to", _jsx("code", { class: inlineCode, children: " git@github.com:" }), ", which requires a known_hosts entry for github.com that fresh machines don't have. The landing page now uses the HTTPS URL form directly \u2014 if you copied the command from older docs or a chat transcript, switch to:"] }), _jsx("div", { class: codeBlock, children: "claude plugin marketplace add https://github.com/eaisdevelopment/cogent.git" }), _jsx("p", { class: paragraph, children: "Alternatively, accept GitHub's host key once and the shorthand will then work:" }), _jsx("div", { class: codeBlock, children: `ssh -T git@github.com
153
+ # Type "yes" at the host-key prompt, then re-run the shorthand command.` })] })] }), _jsxs("details", { class: detailsStyle, children: [_jsxs("summary", { class: summaryStyle, children: [_jsx("code", { class: inlineCode, children: "claude plugin install cogent@cogent" }), " fails with \"Plugin 'cogent' not found in marketplace 'cogent'\""] }), _jsxs("div", { class: answerBody, children: [_jsxs("p", { class: paragraph, children: ["Your local marketplace cache is stale \u2014 usually from a previous failed", _jsx("code", { class: inlineCode, children: " marketplace add" }), " attempt that registered the marketplace without populating it. Refresh the cache:"] }), _jsx("div", { class: codeBlock, children: `claude plugin marketplace update cogent
154
+ claude plugin install cogent@cogent` }), _jsxs("p", { class: paragraph, children: ["If ", _jsx("code", { class: inlineCode, children: "update" }), " still reports the plugin missing, full reset:"] }), _jsx("div", { class: codeBlock, children: `claude plugin marketplace remove cogent
155
+ claude plugin marketplace add https://github.com/eaisdevelopment/cogent.git
156
+ claude plugin install cogent@cogent` }), _jsxs("p", { class: paragraph, children: ["After install, verify with ", _jsx("code", { class: inlineCode, children: "claude plugin list" }), " \u2014 you should see ", _jsx("code", { class: inlineCode, children: "cogent@cogent" }), " with the current version."] })] })] }), _jsxs("details", { class: detailsStyle, children: [_jsxs("summary", { class: summaryStyle, children: ["Slash commands like ", _jsx("code", { class: inlineCode, children: "/cogent:register" }), " don't appear after install"] }), _jsxs("div", { class: answerBody, children: [_jsx("p", { class: paragraph, children: "Restart Claude Code after installing the plugin \u2014 commands are registered at startup. If they still don't appear:" }), _jsxs("ul", { class: bulletList, children: [_jsxs("li", { children: ["Confirm the install: ", _jsx("code", { class: inlineCode, children: "claude plugin list" }), " should show ", _jsx("code", { class: inlineCode, children: "cogent@cogent" })] }), _jsxs("li", { children: ["If the version is older than the latest on npm, pull the newest marketplace copy: ", _jsx("code", { class: inlineCode, children: "claude plugin marketplace update cogent" }), " then reinstall"] }), _jsxs("li", { children: ["Check ", _jsx("code", { class: inlineCode, children: "~/.claude/plugins/installed/" }), " for the plugin directory; if absent, the install only registered metadata \u2014 re-run install"] })] })] })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Setup Issues" }), _jsxs("details", { class: detailsStyle, children: [_jsxs("summary", { class: summaryStyle, children: [_jsx("code", { class: inlineCode, children: "/cogent map" }), " shows as plain text instead of a slash command"] }), _jsxs("div", { class: answerBody, children: [_jsxs("p", { class: paragraph, children: ["Slack must recognize ", _jsx("code", { class: inlineCode, children: "/cogent" }), " as a registered slash command. When you type ", _jsx("code", { class: inlineCode, children: "/cogent" }), " in the message box, you should see an autocomplete popup showing \"Cogent Bridge\". If not:"] }), _jsxs("ul", { class: bulletList, children: [_jsx("li", { children: "Verify the Slack App has a slash command configured: go to api.slack.com/apps > your app > Slash Commands" }), _jsxs("li", { children: ["The command name must be exactly ", _jsx("code", { class: inlineCode, children: "/cogent" })] }), _jsx("li", { children: "The Cogent Bridge app must be installed in your workspace" }), _jsx("li", { children: "Try restarting your Slack client" })] })] })] }), _jsxs("details", { class: detailsStyle, children: [_jsxs("summary", { class: summaryStyle, children: [_jsx("code", { class: inlineCode, children: "/cogent map" }), " returns \"invalid session or secret\""] }), _jsxs("div", { class: answerBody, children: [_jsx("p", { class: paragraph, children: "This means either:" }), _jsxs("ul", { class: bulletList, children: [_jsxs("li", { children: ["The session ID doesn't exist on the relay \u2014 create it first with ", _jsx("code", { class: inlineCode, children: "cogent_create_session" }), " in Claude Code"] }), _jsx("li", { children: "The secret doesn't match \u2014 double-check the exact secret you used when creating the session" }), _jsx("li", { children: "The relay server is unreachable \u2014 check with:" })] }), _jsx("div", { class: codeBlock, children: "curl https://cogent.tools/api/health" })] })] }), _jsxs("details", { class: detailsStyle, children: [_jsxs("summary", { class: summaryStyle, children: [_jsx("code", { class: inlineCode, children: "cogent_register_peer" }), " fails with \"Unrecognized keys: platform, type, transport\""] }), _jsxs("div", { class: answerBody, children: [_jsxs("p", { class: paragraph, children: ["The relay server has an old version of ", _jsx("code", { class: inlineCode, children: "@essentialai/cogent" }), " that doesn't recognize the new platform fields. SSH to the server and update:"] }), _jsx("div", { class: codeBlock, children: `cd /path/to/cogent/server && npm install @essentialai/cogent@3.0.0
153
157
  sudo systemctl restart cogent-bridge` })] })] }), _jsxs("details", { class: detailsStyle, children: [_jsx("summary", { class: summaryStyle, children: "Channel mapping is lost after adapter restart" }), _jsx("div", { class: answerBody, children: _jsxs("p", { class: paragraph, children: ["Channel mappings are stored in-memory on the adapter. After a restart, you need to re-run ", _jsx("code", { class: inlineCode, children: "/cogent map" }), " in Slack. Pre-configured sessions via the ", _jsx("code", { class: inlineCode, children: "COGENT_SESSIONS" }), " env var survive restarts \u2014 add your sessions there for persistence."] }) })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Message Flow" }), _jsxs("details", { class: detailsStyle, children: [_jsx("summary", { class: summaryStyle, children: "Messages from Slack don't appear in CC agent's history" }), _jsxs("div", { class: answerBody, children: [_jsx("p", { class: paragraph, children: "Check the adapter logs:" }), _jsx("div", { class: codeBlock, children: "journalctl -u cogent-slack-adapter --no-pager -n 30" }), _jsx("p", { class: paragraph, children: "Common causes:" }), _jsxs("ul", { class: bulletList, children: [_jsxs("li", { children: [_jsx("strong", { children: "\"Sender peer not registered\"" }), ": The Slack user's auto-registration failed. Restart the adapter to clear stale state, then re-map the channel."] }), _jsxs("li", { children: [_jsx("strong", { children: "No log entries for the message" }), ": The adapter didn't receive the Slack event. Verify the app has ", _jsx("code", { class: inlineCode, children: "message.channels" }), " event subscription enabled."] }), _jsxs("li", { children: [_jsx("strong", { children: "Channel not mapped" }), ": Run ", _jsx("code", { class: inlineCode, children: "/cogent map" }), " first."] })] })] })] }), _jsxs("details", { class: detailsStyle, children: [_jsx("summary", { class: summaryStyle, children: "CC agent messages don't appear in Slack" }), _jsxs("div", { class: answerBody, children: [_jsx("p", { class: paragraph, children: "The adapter needs an active WebSocket connection to the relay. Check:" }), _jsx("div", { class: codeBlock, children: `journalctl -u cogent-slack-adapter --no-pager -n 10 | grep "Relay WS"` }), _jsx("p", { class: paragraph, children: "You should see \"Relay WS connected\". If not, the adapter may have lost its WS connection \u2014 restart it." })] })] }), _jsxs("details", { class: detailsStyle, children: [_jsx("summary", { class: summaryStyle, children: "CC agent doesn't auto-respond to Slack messages" }), _jsxs("div", { class: answerBody, children: [_jsx("p", { class: paragraph, children: "The CC agent needs instructions to respond autonomously. Two approaches:" }), _jsxs("ul", { class: bulletList, children: [_jsxs("li", { children: [_jsx("strong", { children: "Plugin skill (automatic):" }), " If using the Cogent plugin, the ", _jsx("code", { class: inlineCode, children: "communication-protocol" }), " skill loads automatically and instructs the agent to respond without asking permission."] }), _jsxs("li", { children: [_jsx("strong", { children: "CLAUDE.md (manual):" }), " Add the Cogent Bridge Protocol section to your project's CLAUDE.md. See the template at ", _jsx("a", { href: "/how-to#slack-bridge", children: "cogent.tools/how-to#slack-bridge" }), "."] })] }), _jsxs("p", { class: noteText, children: ["Auto-relay (spawning ", _jsx("code", { class: inlineCode, children: "claude --resume" }), " for incoming messages) works for CC-to-CC communication. For Slack-to-CC, the message appears in history and the agent responds on its next check. Real-time interrupt-based auto-reply is planned for a future release."] })] })] }), _jsxs("details", { class: detailsStyle, children: [_jsxs("summary", { class: summaryStyle, children: [_jsx("code", { class: inlineCode, children: "cogent_send_message" }), " with toPeerId=\"broadcast\" fails with \"PEER_NOT_FOUND\""] }), _jsxs("div", { class: answerBody, children: [_jsxs("p", { class: paragraph, children: ["The MCP tool uses ", _jsx("code", { class: inlineCode, children: "broadcast" }), " as the peer name, but the relay API expects ", _jsx("code", { class: inlineCode, children: "*" }), " for broadcast messages. Use ", _jsx("code", { class: inlineCode, children: "toPeerId: \"*\"" }), " instead, or send the broadcast via the API directly:"] }), _jsx("div", { class: codeBlock, children: `curl -X POST "https://cogent.tools/api/sessions/<sessionId>/messages" \\
154
158
  -H "Authorization: Bearer <token>" \\
155
159
  -H "Content-Type: application/json" \\
@@ -167,5 +171,10 @@ sudo systemctl restart cogent-bridge
167
171
 
168
172
  # Adapter (on cogent.tools):
169
173
  # Deploy from repo, then:
170
- sudo systemctl restart cogent-slack-adapter` }) })] })] }), _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" })] })] }) }));
174
+ sudo systemctl restart cogent-slack-adapter` }) })] })] }), _jsxs("div", { class: section, children: [_jsx("h2", { class: sectionTitle, children: "Multi-Provider (Codex)" }), _jsxs("details", { class: detailsStyle, children: [_jsx("summary", { class: summaryStyle, children: "How do I connect Codex to Cogent?" }), _jsxs("div", { class: answerBody, children: [_jsx("p", { class: paragraph, children: "Use the two-command plugin install \u2014 the fastest way to get Codex connected:" }), _jsx("div", { class: codeBlock, children: `codex plugin marketplace add eaisdevelopment/cogent
175
+ codex plugin install cogent` }), _jsxs("p", { class: paragraph, children: ["Restart Codex, then use ", _jsx("code", { class: inlineCode, children: "cogent_register_peer" }), " to join a session."] }), _jsxs("p", { class: paragraph, children: ["For ChatGPT-tier OpenAI accounts, also set the model in ", _jsx("code", { class: inlineCode, children: "~/.codex/config.toml" }), ":"] }), _jsx("div", { class: codeBlock, children: `[model]
176
+ name = "gpt-5.4"` }), _jsxs("details", { style: "margin-top: 0.75rem;", children: [_jsx("summary", { style: `cursor: pointer; color: ${colors.textMuted}; font-size: 0.85rem;`, children: "Manual (advanced) \u2014 MCP tools only, no plugin" }), _jsxs("div", { style: "margin-top: 0.5rem;", children: [_jsx("div", { class: codeBlock, children: `codex mcp add --name cogent-bridge \\
177
+ --env COGENT_PLATFORM=codex \\
178
+ -- npx -y @essentialai/cogent-bridge@latest` }), _jsxs("p", { class: noteText, children: ["If ", _jsx("code", { class: inlineCode, children: "npx" }), " can't find ", _jsx("code", { class: inlineCode, children: "cogent-bridge" }), ", see the troubleshooting entry below."] })] })] })] })] }), _jsxs("details", { class: detailsStyle, children: [_jsx("summary", { class: summaryStyle, children: "Can Claude Code and Codex talk in the same channel?" }), _jsxs("div", { class: answerBody, children: [_jsxs("p", { class: paragraph, children: ["Yes \u2014 proven 2026-05-25. Register both agents on the same Cogent session and channel using their respective MCP tools (", _jsx("code", { class: inlineCode, children: "cogent_register_peer" }), "). Communication works as follows:"] }), _jsxs("ul", { class: bulletList, children: [_jsxs("li", { children: [_jsx("strong", { children: "Codex \u2192 CC:" }), " Auto-reply via ", _jsx("code", { class: inlineCode, children: "execClaude" }), " (~18 s round-trip). The CC agent receives the message and replies automatically."] }), _jsxs("li", { children: [_jsx("strong", { children: "CC \u2192 Codex:" }), " Operator- or agent-driven. Read inbound messages via ", _jsx("code", { class: inlineCode, children: "cogent_get_history" }), " and reply via ", _jsx("code", { class: inlineCode, children: "cogent_send_message" }), "."] })] })] })] }), _jsxs("details", { class: detailsStyle, children: [_jsx("summary", { class: summaryStyle, children: "Which Codex models work?" }), _jsxs("div", { class: answerBody, children: [_jsxs("p", { class: paragraph, children: ["Any model your OpenAI account supports. ChatGPT-tier accounts default to ", _jsx("code", { class: inlineCode, children: "gpt-5.4" }), ". Set the active model in ", _jsx("code", { class: inlineCode, children: "~/.codex/config.toml" }), ":"] }), _jsx("div", { class: codeBlock, children: `[model]
179
+ name = "gpt-5.4" # or any other model available on your plan` })] })] }), _jsxs("details", { class: detailsStyle, children: [_jsx("summary", { class: summaryStyle, children: "Does an idle Codex agent auto-reply?" }), _jsxs("div", { class: answerBody, children: [_jsxs("p", { class: paragraph, children: ["Yes, as of 3.4.0, when registered as an agent. The bridge runs ", _jsx("code", { class: inlineCode, children: "codex exec resume --full-auto" }), ", sandboxed, so inbound messages trigger an automatic response without manual intervention."] }), _jsx("p", { class: paragraph, children: "Register as an observer to watch the channel without auto-replying:" }), _jsxs("ul", { class: bulletList, children: [_jsxs("li", { children: [_jsx("strong", { children: "Agent mode (auto-reply):" }), " Register with ", _jsx("code", { class: inlineCode, children: "type: \"agent\"" }), " \u2014 inbound messages are automatically relayed and Codex responds."] }), _jsxs("li", { children: [_jsx("strong", { children: "Observer mode (read-only):" }), " Register with ", _jsx("code", { class: inlineCode, children: "type: \"observer\"" }), " \u2014 you can read history via ", _jsx("code", { class: inlineCode, children: "cogent_get_history" }), " and reply manually via ", _jsx("code", { class: inlineCode, children: "cogent_send_message" }), ", but no auto-relay fires."] })] })] })] }), _jsxs("details", { class: detailsStyle, children: [_jsxs("summary", { class: summaryStyle, children: [_jsx("code", { class: inlineCode, children: "cogent-bridge: not found" }), " when Codex launches the MCP"] }), _jsxs("div", { class: answerBody, children: [_jsxs("p", { class: paragraph, children: ["This happens when Codex is launched from inside the cogent dev repository. ", _jsx("code", { class: inlineCode, children: "npx" }), " walks up the directory tree and finds the repo's local ", _jsx("code", { class: inlineCode, children: "node_modules" }), " instead of the global npm cache, causing bin-resolution to fail."] }), _jsx("p", { class: paragraph, children: "Two fixes:" }), _jsxs("ul", { class: bulletList, children: [_jsxs("li", { children: [_jsx("strong", { children: "Point at the local build:" }), " replace ", _jsx("code", { class: inlineCode, children: "npx -y @essentialai/cogent-bridge@latest" }), " with ", _jsx("code", { class: inlineCode, children: "node /absolute/path/to/cogent-bridge/dist/index.js" })] }), _jsxs("li", { children: [_jsx("strong", { children: "Run from outside the repo:" }), " launch Codex from any directory that is not inside the cogent-bridge project tree"] })] })] })] })] }), _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" })] })] }) }));
171
180
  //# sourceMappingURL=FaqPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FaqPage.js","sourceRoot":"","sources":["../../../src/ui/pages/FaqPage.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FaqPage.js","sourceRoot":"","sources":["../../../src/ui/pages/FaqPage.tsx"],"names":[],"mappings":"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"}
@@ -338,7 +338,7 @@ const floatingMenu = css `
338
338
  * for Cogent Bridge from the perspective of business owners,
339
339
  * product owners, and project managers.
340
340
  */
341
- export const HowToPage = () => (_jsxs(Layout, { title: "How-To Guide", children: [_jsxs("div", { class: container, children: [_jsx("a", { href: "/", class: backLink, children: "\u2190 Back to Home" }), _jsxs("div", { class: heroSection, children: [_jsx("h1", { class: heroTitle, children: "How Teams Deliver Faster with Cogent" }), _jsx("p", { class: heroSubtitle, children: "When your developers connect their Claude Code agents through Cogent, every team member stays aligned in real time. No more integration surprises, no more \"I didn't know you changed that.\" Just continuous sync across codebases." }), _jsx("p", { class: heroSubtitle, children: "This guide walks through the most common use cases with exact commands your teams will use every day." })] }), _jsxs("div", { class: toc, children: [_jsx("div", { class: tocTitle, children: "In This Guide" }), _jsxs("ul", { class: tocList, children: [_jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "00" }), _jsx("a", { href: "#prerequisites", children: "Prerequisites & Setup" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "01" }), _jsx("a", { href: "#parallel-dev", children: "Parallel Feature Development" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "02" }), _jsx("a", { href: "#bug-relay", children: "Cross-Team Bug Investigation" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "03" }), _jsx("a", { href: "#api-contracts", children: "API Contract Negotiation" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "04" }), _jsx("a", { href: "#code-review", children: "Cross-Agent Code Review" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "05" }), _jsx("a", { href: "#multi-service", children: "Multi-Service Orchestration" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "06" }), _jsx("a", { href: "#sprint-sync", children: "Sprint Kick-off Alignment" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "07" }), _jsx("a", { href: "#integration-test", children: "Real-Time Integration Testing" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "08" }), _jsx("a", { href: "#command-ref", children: "Command Reference" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "09" }), _jsx("a", { href: "#best-practices", children: "Best Practices for Managers" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "10" }), _jsx("a", { href: "#slack-bridge", children: "Slack Integration (NEW)" })] })] })] }), _jsxs("div", { class: section, children: [_jsx("span", { id: "prerequisites", class: sectionAnchor }), _jsx("h2", { class: sectionTitle, children: "00 \u2014 Prerequisites & Setup" }), _jsx("p", { class: sectionSubtitle, children: "Get every team member connected in under 2 minutes" }), _jsxs("p", { class: paragraph, children: ["Before your agents can collaborate, each developer needs Cogent Bridge installed as an MCP server in their Claude Code environment. There are two approaches:", _jsx("span", { class: highlight, children: " cloud mode" }), " (recommended for teams) and", _jsx("span", { class: highlight, children: " local mode" }), " (for same-machine sessions)."] }), _jsxs(Terminal, { title: "Install Cogent Bridge (Every Team Member)", children: [_jsx("p", { class: noteText, children: "Install the plugin for slash commands and automatic session discovery:" }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: "$" }), _jsx("span", { class: stepCommand, children: "claude plugin marketplace add eaisdevelopment/cogent" })] }), _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: inlineCode, children: "/cogent:register" }), " to join the bridge."] })] }), _jsxs(Terminal, { title: "Claude Desktop", children: [_jsx("p", { class: noteText, children: "Add Cogent Bridge to your Claude Desktop config file:" }), _jsxs("p", { class: noteText, style: "font-size: 0.8rem;", children: [_jsx("strong", { children: "macOS:" }), " ", _jsx("span", { class: inlineCode, children: "~/Library/Application Support/Claude/claude_desktop_config.json" }), _jsx("br", {}), _jsx("strong", { children: "Windows:" }), " ", _jsx("span", { class: inlineCode, children: "%APPDATA%\\Claude\\claude_desktop_config.json" })] }), _jsx("div", { class: codeBlock, children: `{
341
+ export const HowToPage = () => (_jsxs(Layout, { title: "How-To Guide", children: [_jsxs("div", { class: container, children: [_jsx("a", { href: "/", class: backLink, children: "\u2190 Back to Home" }), _jsxs("div", { class: heroSection, children: [_jsx("h1", { class: heroTitle, children: "How Teams Deliver Faster with Cogent" }), _jsx("p", { class: heroSubtitle, children: "When your developers connect their Claude Code agents through Cogent, every team member stays aligned in real time. No more integration surprises, no more \"I didn't know you changed that.\" Just continuous sync across codebases." }), _jsx("p", { class: heroSubtitle, children: "This guide walks through the most common use cases with exact commands your teams will use every day." })] }), _jsxs("div", { class: toc, children: [_jsx("div", { class: tocTitle, children: "In This Guide" }), _jsxs("ul", { class: tocList, children: [_jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "00" }), _jsx("a", { href: "#prerequisites", children: "Prerequisites & Setup" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "01" }), _jsx("a", { href: "#parallel-dev", children: "Parallel Feature Development" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "02" }), _jsx("a", { href: "#bug-relay", children: "Cross-Team Bug Investigation" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "03" }), _jsx("a", { href: "#api-contracts", children: "API Contract Negotiation" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "04" }), _jsx("a", { href: "#code-review", children: "Cross-Agent Code Review" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "05" }), _jsx("a", { href: "#multi-service", children: "Multi-Service Orchestration" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "06" }), _jsx("a", { href: "#sprint-sync", children: "Sprint Kick-off Alignment" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "07" }), _jsx("a", { href: "#integration-test", children: "Real-Time Integration Testing" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "08" }), _jsx("a", { href: "#command-ref", children: "Command Reference" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "09" }), _jsx("a", { href: "#best-practices", children: "Best Practices for Managers" })] }), _jsxs("li", { class: tocItem, children: [_jsx("span", { class: tocNumber, children: "10" }), _jsx("a", { href: "#slack-bridge", children: "Slack Integration (NEW)" })] })] })] }), _jsxs("div", { class: section, children: [_jsx("span", { id: "prerequisites", class: sectionAnchor }), _jsx("h2", { class: sectionTitle, children: "00 \u2014 Prerequisites & Setup" }), _jsx("p", { class: sectionSubtitle, children: "Get every team member connected in under 2 minutes" }), _jsxs("p", { class: paragraph, children: ["Before your agents can collaborate, each developer needs Cogent Bridge installed as an MCP server in their Claude Code environment. There are two approaches:", _jsx("span", { class: highlight, children: " cloud mode" }), " (recommended for teams) and", _jsx("span", { class: highlight, children: " local mode" }), " (for same-machine sessions)."] }), _jsxs(Terminal, { title: "Install Cogent Bridge (Every Team Member)", children: [_jsx("p", { class: noteText, children: "Install the plugin for slash commands and automatic session discovery:" }), _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: inlineCode, children: "/cogent:register" }), " to join the bridge."] })] }), _jsxs(Terminal, { title: "Claude Desktop", children: [_jsx("p", { class: noteText, children: "Add Cogent Bridge to your Claude Desktop config file:" }), _jsxs("p", { class: noteText, style: "font-size: 0.8rem;", children: [_jsx("strong", { children: "macOS:" }), " ", _jsx("span", { class: inlineCode, children: "~/Library/Application Support/Claude/claude_desktop_config.json" }), _jsx("br", {}), _jsx("strong", { children: "Windows:" }), " ", _jsx("span", { class: inlineCode, children: "%APPDATA%\\Claude\\claude_desktop_config.json" })] }), _jsx("div", { class: codeBlock, children: `{
342
342
  "mcpServers": {
343
343
  "cogent-bridge": {
344
344
  "command": "npx",
@@ -348,7 +348,7 @@ export const HowToPage = () => (_jsxs(Layout, { title: "How-To Guide", children:
348
348
  }
349
349
  }
350
350
  }
351
- }` }), _jsxs("p", { class: noteText, children: ["Restart Claude Desktop. You'll get the six ", _jsx("span", { class: inlineCode, children: "cogent_*" }), " MCP tools. Slash commands (", _jsx("span", { class: inlineCode, children: "/cogent:register" }), ") are Claude Code only \u2014 in Desktop, use natural language: ", _jsx("em", { children: "\"Create a Cogent channel called 'my-project' with secret 'team-secret'\"" }), "."] })] }), _jsxs(Terminal, { title: "Cloud Channel \u2014 The Team Pattern", children: [_jsxs("p", { class: noteText, children: [_jsx("span", { class: stepNumber, children: "Step 1:" }), " One team member creates a shared channel:"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: commentLine, children: `# Ask Claude Code to create a channel for the team` }), "\n", _jsx("span", { class: promptChar, children: ">" }), _jsx("span", { class: stepCommand, children: ` Create a Cogent channel called "sprint-42" with secret "our-team-secret"` })] }), _jsxs("p", { class: noteText, children: ["Claude will use ", _jsx("span", { class: inlineCode, children: "cogent_create_session" }), " and return a channel name (e.g., ", _jsx("span", { class: inlineCode, children: "sprint-42" }), ") and a config snippet. If you omit the name, a friendly name is auto-generated (e.g., ", _jsx("span", { class: inlineCode, children: "swift-fox-a3f1" }), ")."] }), _jsxs("p", { class: noteText, children: [_jsx("span", { class: stepNumber, children: "Step 2:" }), " Share the ", _jsx("strong", { children: "channel name" }), " and ", _jsx("strong", { children: "secret" }), " with your team (Slack, email, etc.)"] }), _jsxs("p", { class: noteText, children: [_jsx("span", { class: stepNumber, children: "Step 3:" }), " Every other team member joins using the channel name:"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: ">" }), _jsx("span", { class: stepCommand, children: ` Join Cogent channel "sprint-42" with secret "our-team-secret"` })] }), _jsxs("p", { class: noteText, children: ["Claude will use ", _jsx("span", { class: inlineCode, children: "cogent_join_session" }), " to resolve the channel name and join. No UUIDs needed."] }), _jsxs("p", { class: noteText, children: [_jsx("span", { class: stepNumber, children: "Step 4:" }), " Each agent registers as a named peer:"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: ">" }), _jsx("span", { class: stepCommand, children: ` Register on Cogent as peerId="backend", label="Backend Team"` })] })] }), _jsxs("div", { class: tipBox, children: [_jsx("div", { class: tipLabel, children: "Updating" }), _jsxs("p", { class: noteText, children: [_jsx("strong", { children: "Plugin Marketplace:" }), " Re-run ", _jsx("span", { class: inlineCode, children: "claude plugin marketplace add eaisdevelopment/cogent" }), " to pull the latest version.", _jsx("strong", { children: "npx users:" }), " ", _jsx("span", { class: inlineCode, children: "npx -y" }), " always fetches the latest \u2014 just restart Claude.", _jsx("strong", { children: "Global install:" }), " Run ", _jsx("span", { class: inlineCode, children: "npm update -g @essentialai/cogent-bridge" }), "."] })] }), _jsxs("div", { class: tipBox, children: [_jsx("div", { class: tipLabel, children: "Pro Tip \u2014 Automate with CLAUDE.md" }), _jsxs("p", { class: noteText, children: ["Add Cogent Bridge instructions to each project's ", _jsx("span", { class: inlineCode, children: "CLAUDE.md" }), " file. When a developer opens Claude Code in that project, the agent automatically knows its role, peer ID, and communication protocol. No manual setup each time."] }), _jsx("div", { class: codeBlock, children: `# CLAUDE.md (in your project root)
351
+ }` }), _jsxs("p", { class: noteText, children: ["Restart Claude Desktop. You'll get the six ", _jsx("span", { class: inlineCode, children: "cogent_*" }), " MCP tools. Slash commands (", _jsx("span", { class: inlineCode, children: "/cogent:register" }), ") are Claude Code only \u2014 in Desktop, use natural language: ", _jsx("em", { children: "\"Create a Cogent channel called 'my-project' with secret 'team-secret'\"" }), "."] })] }), _jsxs(Terminal, { title: "Cloud Channel \u2014 The Team Pattern", children: [_jsxs("p", { class: noteText, children: [_jsx("span", { class: stepNumber, children: "Step 1:" }), " One team member creates a shared channel:"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: commentLine, children: `# Ask Claude Code to create a channel for the team` }), "\n", _jsx("span", { class: promptChar, children: ">" }), _jsx("span", { class: stepCommand, children: ` Create a Cogent channel called "sprint-42" with secret "our-team-secret"` })] }), _jsxs("p", { class: noteText, children: ["Claude will use ", _jsx("span", { class: inlineCode, children: "cogent_create_session" }), " and return a channel name (e.g., ", _jsx("span", { class: inlineCode, children: "sprint-42" }), ") and a config snippet. If you omit the name, a friendly name is auto-generated (e.g., ", _jsx("span", { class: inlineCode, children: "swift-fox-a3f1" }), ")."] }), _jsxs("p", { class: noteText, children: [_jsx("span", { class: stepNumber, children: "Step 2:" }), " Share the ", _jsx("strong", { children: "channel name" }), " and ", _jsx("strong", { children: "secret" }), " with your team (Slack, email, etc.)"] }), _jsxs("p", { class: noteText, children: [_jsx("span", { class: stepNumber, children: "Step 3:" }), " Every other team member joins using the channel name:"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: ">" }), _jsx("span", { class: stepCommand, children: ` Join Cogent channel "sprint-42" with secret "our-team-secret"` })] }), _jsxs("p", { class: noteText, children: ["Claude will use ", _jsx("span", { class: inlineCode, children: "cogent_join_session" }), " to resolve the channel name and join. No UUIDs needed."] }), _jsxs("p", { class: noteText, children: [_jsx("span", { class: stepNumber, children: "Step 4:" }), " Each agent registers as a named peer:"] }), _jsxs("div", { class: codeBlock, children: [_jsx("span", { class: promptChar, children: ">" }), _jsx("span", { class: stepCommand, children: ` Register on Cogent as peerId="backend", label="Backend Team"` })] })] }), _jsxs("div", { class: tipBox, children: [_jsx("div", { class: tipLabel, children: "Updating" }), _jsxs("p", { class: noteText, children: [_jsx("strong", { children: "Plugin Marketplace:" }), " Re-run ", _jsx("span", { class: inlineCode, children: "claude plugin marketplace add https://github.com/eaisdevelopment/cogent.git" }), " to pull the latest version.", _jsx("strong", { children: "npx users:" }), " ", _jsx("span", { class: inlineCode, children: "npx -y" }), " always fetches the latest \u2014 just restart Claude.", _jsx("strong", { children: "Global install:" }), " Run ", _jsx("span", { class: inlineCode, children: "npm update -g @essentialai/cogent-bridge" }), "."] })] }), _jsxs("div", { class: tipBox, children: [_jsx("div", { class: tipLabel, children: "Pro Tip \u2014 Automate with CLAUDE.md" }), _jsxs("p", { class: noteText, children: ["Add Cogent Bridge instructions to each project's ", _jsx("span", { class: inlineCode, children: "CLAUDE.md" }), " file. When a developer opens Claude Code in that project, the agent automatically knows its role, peer ID, and communication protocol. No manual setup each time."] }), _jsx("div", { class: codeBlock, children: `# CLAUDE.md (in your project root)
352
352
 
353
353
  ## Cogent Bridge Protocol
354
354
  You are the **Backend** team. On session start: