@agent-relay/dashboard 2.0.80 → 2.0.82

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 (244) hide show
  1. package/out/404.html +1 -1
  2. package/out/_next/static/chunks/{118-4c8241b0218335de.js → 118-ae2b650136a5a5fc.js} +1 -1
  3. package/out/_next/static/chunks/407-0c82986cf79c8ecb.js +1 -0
  4. package/out/_next/static/chunks/app/app/[[...slug]]/{page-1e81c047cff17212.js → page-f7eca1b66fb4249b.js} +1 -1
  5. package/out/_next/static/chunks/app/{page-6892fe2dd07fb48b.js → page-0ee604f7070d14c0.js} +1 -1
  6. package/out/_next/static/css/8968d98ed4c4d33f.css +1 -0
  7. package/out/about.html +2 -2
  8. package/out/about.txt +1 -1
  9. package/out/app/onboarding.html +1 -1
  10. package/out/app/onboarding.txt +1 -1
  11. package/out/app.html +1 -1
  12. package/out/app.txt +2 -2
  13. package/out/blog/go-to-bed-wake-up-to-a-finished-product.html +2 -2
  14. package/out/blog/go-to-bed-wake-up-to-a-finished-product.txt +1 -1
  15. package/out/blog/let-them-cook-multi-agent-orchestration.html +2 -2
  16. package/out/blog/let-them-cook-multi-agent-orchestration.txt +2 -2
  17. package/out/blog.html +2 -2
  18. package/out/blog.txt +1 -1
  19. package/out/careers.html +2 -2
  20. package/out/careers.txt +1 -1
  21. package/out/changelog.html +2 -2
  22. package/out/changelog.txt +1 -1
  23. package/out/cloud/link.html +1 -1
  24. package/out/cloud/link.txt +2 -2
  25. package/out/complete-profile.html +2 -2
  26. package/out/complete-profile.txt +1 -1
  27. package/out/connect-repos.html +1 -1
  28. package/out/connect-repos.txt +1 -1
  29. package/out/contact.html +2 -2
  30. package/out/contact.txt +1 -1
  31. package/out/docs.html +2 -2
  32. package/out/docs.txt +1 -1
  33. package/out/history.html +1 -1
  34. package/out/history.txt +2 -2
  35. package/out/index.html +1 -1
  36. package/out/index.txt +2 -2
  37. package/out/login.html +2 -2
  38. package/out/login.txt +1 -1
  39. package/out/metrics.html +1 -1
  40. package/out/metrics.txt +2 -2
  41. package/out/pricing.html +2 -2
  42. package/out/pricing.txt +1 -1
  43. package/out/privacy.html +2 -2
  44. package/out/privacy.txt +1 -1
  45. package/out/providers/setup/claude.html +1 -1
  46. package/out/providers/setup/claude.txt +1 -1
  47. package/out/providers/setup/codex.html +1 -1
  48. package/out/providers/setup/codex.txt +1 -1
  49. package/out/providers/setup/cursor.html +1 -1
  50. package/out/providers/setup/cursor.txt +1 -1
  51. package/out/providers.html +1 -1
  52. package/out/providers.txt +1 -1
  53. package/out/security.html +2 -2
  54. package/out/security.txt +1 -1
  55. package/out/signup.html +2 -2
  56. package/out/signup.txt +1 -1
  57. package/out/terms.html +2 -2
  58. package/out/terms.txt +1 -1
  59. package/package.json +7 -1
  60. package/src/app/about/page.tsx +7 -0
  61. package/src/app/app/[[...slug]]/DashboardPageClient.tsx +853 -0
  62. package/src/app/app/[[...slug]]/page.tsx +23 -0
  63. package/src/app/app/onboarding/page.tsx +394 -0
  64. package/src/app/apple-icon.png +0 -0
  65. package/src/app/blog/go-to-bed-wake-up-to-a-finished-product/page.tsx +88 -0
  66. package/src/app/blog/let-them-cook-multi-agent-orchestration/page.tsx +93 -0
  67. package/src/app/blog/page.tsx +15 -0
  68. package/src/app/careers/page.tsx +7 -0
  69. package/src/app/changelog/page.tsx +7 -0
  70. package/src/app/cloud/link/page.tsx +464 -0
  71. package/src/app/complete-profile/page.tsx +204 -0
  72. package/src/app/connect-repos/page.tsx +410 -0
  73. package/src/app/contact/page.tsx +7 -0
  74. package/src/app/docs/page.tsx +7 -0
  75. package/src/app/favicon.png +0 -0
  76. package/src/app/globals.css +200 -0
  77. package/src/app/history/page.tsx +658 -0
  78. package/src/app/layout.tsx +25 -0
  79. package/src/app/login/page.tsx +424 -0
  80. package/src/app/metrics/page.tsx +781 -0
  81. package/src/app/page.tsx +59 -0
  82. package/src/app/pricing/page.tsx +7 -0
  83. package/src/app/privacy/page.tsx +7 -0
  84. package/src/app/providers/page.tsx +193 -0
  85. package/src/app/providers/setup/[provider]/ProviderSetupClient.tsx +197 -0
  86. package/src/app/providers/setup/[provider]/constants.ts +35 -0
  87. package/src/app/providers/setup/[provider]/page.tsx +42 -0
  88. package/src/app/security/page.tsx +7 -0
  89. package/src/app/signup/page.tsx +533 -0
  90. package/src/app/terms/page.tsx +7 -0
  91. package/src/components/ActivityFeed.tsx +216 -0
  92. package/src/components/AddWorkspaceModal.tsx +170 -0
  93. package/src/components/AgentCard.test.tsx +134 -0
  94. package/src/components/AgentCard.tsx +585 -0
  95. package/src/components/AgentList.test.tsx +147 -0
  96. package/src/components/AgentList.tsx +419 -0
  97. package/src/components/AgentLogPreview.tsx +173 -0
  98. package/src/components/AgentProfilePanel.tsx +569 -0
  99. package/src/components/App.tsx +3424 -0
  100. package/src/components/BillingPanel.tsx +922 -0
  101. package/src/components/BillingResult.tsx +447 -0
  102. package/src/components/BroadcastComposer.tsx +690 -0
  103. package/src/components/ChannelAdminPanel.tsx +773 -0
  104. package/src/components/ChannelBrowser.tsx +385 -0
  105. package/src/components/ChannelChat.tsx +261 -0
  106. package/src/components/ChannelSidebar.tsx +399 -0
  107. package/src/components/CloudSessionProvider.tsx +130 -0
  108. package/src/components/CommandPalette.tsx +815 -0
  109. package/src/components/ConfirmationDialog.tsx +133 -0
  110. package/src/components/ConversationHistory.tsx +518 -0
  111. package/src/components/CoordinatorPanel.tsx +956 -0
  112. package/src/components/DecisionQueue.tsx +717 -0
  113. package/src/components/DirectMessageView.tsx +164 -0
  114. package/src/components/FileAutocomplete.tsx +368 -0
  115. package/src/components/FleetOverview.tsx +278 -0
  116. package/src/components/LogViewer.tsx +310 -0
  117. package/src/components/LogViewerPanel.tsx +482 -0
  118. package/src/components/Logo.tsx +284 -0
  119. package/src/components/MentionAutocomplete.tsx +384 -0
  120. package/src/components/MessageComposer.tsx +473 -0
  121. package/src/components/MessageList.tsx +725 -0
  122. package/src/components/MessageSenderName.tsx +91 -0
  123. package/src/components/MessageStatusIndicator.tsx +142 -0
  124. package/src/components/NewConversationModal.tsx +400 -0
  125. package/src/components/NotificationToast.tsx +488 -0
  126. package/src/components/OnlineUsersIndicator.tsx +164 -0
  127. package/src/components/Pagination.tsx +124 -0
  128. package/src/components/PricingPlans.tsx +386 -0
  129. package/src/components/ProjectList.tsx +711 -0
  130. package/src/components/ProviderAuthFlow.tsx +343 -0
  131. package/src/components/ProviderConnectionList.tsx +375 -0
  132. package/src/components/ProvisioningProgress.tsx +730 -0
  133. package/src/components/ReactionChips.tsx +70 -0
  134. package/src/components/ReactionPicker.tsx +121 -0
  135. package/src/components/RepoAccessPanel.tsx +787 -0
  136. package/src/components/RepositoriesPanel.tsx +901 -0
  137. package/src/components/ServerCard.tsx +202 -0
  138. package/src/components/SessionExpiredModal.tsx +128 -0
  139. package/src/components/SpawnModal.test.tsx +190 -0
  140. package/src/components/SpawnModal.tsx +1001 -0
  141. package/src/components/TaskAssignmentUI.tsx +375 -0
  142. package/src/components/TerminalProviderSetup.tsx +517 -0
  143. package/src/components/ThemeProvider.tsx +159 -0
  144. package/src/components/ThinkingIndicator.tsx +231 -0
  145. package/src/components/ThreadList.tsx +198 -0
  146. package/src/components/ThreadPanel.tsx +405 -0
  147. package/src/components/TrajectoryViewer.tsx +698 -0
  148. package/src/components/TypingIndicator.tsx +69 -0
  149. package/src/components/UsageBanner.tsx +231 -0
  150. package/src/components/UserProfilePanel.tsx +233 -0
  151. package/src/components/WorkspaceContext.tsx +95 -0
  152. package/src/components/WorkspaceSelector.tsx +234 -0
  153. package/src/components/WorkspaceStatusIndicator.tsx +396 -0
  154. package/src/components/XTermInteractive.tsx +516 -0
  155. package/src/components/XTermLogViewer.tsx +719 -0
  156. package/src/components/channels/ChannelDialogs.tsx +1411 -0
  157. package/src/components/channels/ChannelHeader.tsx +317 -0
  158. package/src/components/channels/ChannelMessageList.tsx +463 -0
  159. package/src/components/channels/ChannelViewV1.tsx +146 -0
  160. package/src/components/channels/MessageInput.tsx +302 -0
  161. package/src/components/channels/SearchInput.tsx +172 -0
  162. package/src/components/channels/SearchResults.tsx +336 -0
  163. package/src/components/channels/api.test.ts +1527 -0
  164. package/src/components/channels/api.ts +703 -0
  165. package/src/components/channels/index.ts +76 -0
  166. package/src/components/channels/mockApi.ts +344 -0
  167. package/src/components/channels/types.ts +566 -0
  168. package/src/components/hooks/index.ts +58 -0
  169. package/src/components/hooks/useAgentLogs.ts +504 -0
  170. package/src/components/hooks/useAgents.ts +127 -0
  171. package/src/components/hooks/useBroadcastDedup.test.ts +371 -0
  172. package/src/components/hooks/useBroadcastDedup.ts +86 -0
  173. package/src/components/hooks/useChannelAdmin.ts +329 -0
  174. package/src/components/hooks/useChannelBrowser.ts +239 -0
  175. package/src/components/hooks/useChannelCommands.ts +138 -0
  176. package/src/components/hooks/useChannels.ts +367 -0
  177. package/src/components/hooks/useDebounce.ts +29 -0
  178. package/src/components/hooks/useDirectMessage.test.ts +952 -0
  179. package/src/components/hooks/useDirectMessage.ts +141 -0
  180. package/src/components/hooks/useMessages.ts +310 -0
  181. package/src/components/hooks/useOrchestrator.test.ts +165 -0
  182. package/src/components/hooks/useOrchestrator.ts +424 -0
  183. package/src/components/hooks/usePinnedAgents.test.ts +356 -0
  184. package/src/components/hooks/usePinnedAgents.ts +140 -0
  185. package/src/components/hooks/usePresence.test.ts +245 -0
  186. package/src/components/hooks/usePresence.ts +377 -0
  187. package/src/components/hooks/useRecentRepos.ts +130 -0
  188. package/src/components/hooks/useSession.ts +209 -0
  189. package/src/components/hooks/useThread.ts +138 -0
  190. package/src/components/hooks/useTrajectory.ts +265 -0
  191. package/src/components/hooks/useWebSocket.ts +290 -0
  192. package/src/components/hooks/useWorkspaceMembers.ts +132 -0
  193. package/src/components/hooks/useWorkspaceRepos.ts +73 -0
  194. package/src/components/hooks/useWorkspaceStatus.ts +237 -0
  195. package/src/components/index.ts +81 -0
  196. package/src/components/layout/Header.tsx +311 -0
  197. package/src/components/layout/RepoContextHeader.tsx +361 -0
  198. package/src/components/layout/Sidebar.archive.test.tsx +126 -0
  199. package/src/components/layout/Sidebar.test.tsx +691 -0
  200. package/src/components/layout/Sidebar.tsx +900 -0
  201. package/src/components/layout/index.ts +7 -0
  202. package/src/components/settings/BillingSettingsPanel.tsx +564 -0
  203. package/src/components/settings/SettingsPage.tsx +683 -0
  204. package/src/components/settings/TeamSettingsPanel.tsx +560 -0
  205. package/src/components/settings/WorkspaceSettingsPanel.tsx +1368 -0
  206. package/src/components/settings/index.ts +11 -0
  207. package/src/components/settings/types.ts +79 -0
  208. package/src/components/utils/messageFormatting.test.tsx +331 -0
  209. package/src/components/utils/messageFormatting.tsx +597 -0
  210. package/src/index.ts +63 -0
  211. package/src/landing/AboutPage.tsx +77 -0
  212. package/src/landing/BlogContent.tsx +187 -0
  213. package/src/landing/BlogPage.tsx +47 -0
  214. package/src/landing/CareersPage.tsx +53 -0
  215. package/src/landing/ChangelogPage.tsx +33 -0
  216. package/src/landing/ContactPage.tsx +41 -0
  217. package/src/landing/DocsPage.tsx +43 -0
  218. package/src/landing/LandingPage.tsx +702 -0
  219. package/src/landing/PricingPage.tsx +549 -0
  220. package/src/landing/PrivacyPage.tsx +117 -0
  221. package/src/landing/SecurityPage.tsx +42 -0
  222. package/src/landing/StaticPage.tsx +165 -0
  223. package/src/landing/TermsPage.tsx +125 -0
  224. package/src/landing/blogData.ts +312 -0
  225. package/src/landing/index.ts +18 -0
  226. package/src/landing/styles.css +3673 -0
  227. package/src/lib/agent-merge.test.ts +43 -0
  228. package/src/lib/agent-merge.ts +35 -0
  229. package/src/lib/api.ts +1294 -0
  230. package/src/lib/cloudApi.ts +893 -0
  231. package/src/lib/colors.test.ts +175 -0
  232. package/src/lib/colors.ts +218 -0
  233. package/src/lib/config.ts +109 -0
  234. package/src/lib/hierarchy.ts +242 -0
  235. package/src/lib/stuckDetection.ts +142 -0
  236. package/src/lib/useUrlRouting.ts +190 -0
  237. package/src/types/index.ts +317 -0
  238. package/src/types/threading.ts +7 -0
  239. package/out/_next/static/chunks/285-dc644487a8d6500d.js +0 -1
  240. package/out/_next/static/css/4c58d9cf493aa626.css +0 -1
  241. /package/out/_next/static/{AqelRhy1vr2nBUcU0Iqcp → IxfA6RZu4trcsEMYlkQra}/_buildManifest.js +0 -0
  242. /package/out/_next/static/{AqelRhy1vr2nBUcU0Iqcp → IxfA6RZu4trcsEMYlkQra}/_ssgManifest.js +0 -0
  243. /package/out/_next/static/chunks/{528-d375bc8b46912d2c.js → 528-f5f676996d613c25.js} +0 -0
  244. /package/out/_next/static/chunks/app/blog/let-them-cook-multi-agent-orchestration/{page-a58308f43557b908.js → page-b194f207fbd91862.js} +0 -0
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Agent Relay Cloud - About Page
3
+ */
4
+
5
+ import React from 'react';
6
+ import { StaticPage } from './StaticPage';
7
+
8
+ export function AboutPage() {
9
+ return (
10
+ <StaticPage
11
+ title="About Agent Relay"
12
+ subtitle="Building the future of AI-powered software development."
13
+ >
14
+ <h2>Our Mission</h2>
15
+ <p>
16
+ We believe that AI agents working together can accomplish far more than any single agent or human developer alone. Agent Relay exists to make multi-agent orchestration accessible, reliable, and delightful for every developer and team.
17
+ </p>
18
+
19
+ <h2>The Problem We're Solving</h2>
20
+ <p>
21
+ AI coding assistants are transforming software development, but they work in isolation. Developers juggle multiple AI tools, copy-paste context between them, and manually coordinate their outputs. This fragmented workflow limits what AI can actually accomplish.
22
+ </p>
23
+ <p>
24
+ Agent Relay changes that. We provide the infrastructure for AI agents to communicate, collaborate, and complete complex tasks together&mdash;like a well-coordinated development team that never sleeps.
25
+ </p>
26
+
27
+ <h2>The Team</h2>
28
+ <p>
29
+ Agent Relay was founded by two engineers passionate about developer tools and AI.
30
+ </p>
31
+ <div className="team-grid">
32
+ <a href="https://github.com/khaliqgant" target="_blank" rel="noopener noreferrer" className="team-member">
33
+ <div className="team-avatar">K</div>
34
+ <h4>Khaliq Gant</h4>
35
+ <p>Co-founder</p>
36
+ </a>
37
+ <a href="https://github.com/willwashburn" target="_blank" rel="noopener noreferrer" className="team-member">
38
+ <div className="team-avatar">W</div>
39
+ <h4>Will Washburn</h4>
40
+ <p>Co-founder</p>
41
+ </a>
42
+ </div>
43
+
44
+ <h2>Our Values</h2>
45
+ <div className="values-grid">
46
+ <div className="value-card">
47
+ <h4>Developer-First</h4>
48
+ <p>Every decision we make starts with: "Does this make developers' lives better?"</p>
49
+ </div>
50
+ <div className="value-card">
51
+ <h4>Trust & Security</h4>
52
+ <p>Your code is sacred. We treat security as a feature, not an afterthought.</p>
53
+ </div>
54
+ <div className="value-card">
55
+ <h4>Open Ecosystem</h4>
56
+ <p>We integrate with the tools you already use. No vendor lock-in, ever.</p>
57
+ </div>
58
+ <div className="value-card">
59
+ <h4>Ship Fast, Learn Faster</h4>
60
+ <p>We iterate quickly based on real feedback from real developers.</p>
61
+ </div>
62
+ </div>
63
+
64
+ <h2>Get in Touch</h2>
65
+ <p>
66
+ Have questions or want to learn more? We'd love to hear from you.
67
+ </p>
68
+ <ul>
69
+ <li>General inquiries: <a href="mailto:hello@agent-relay.com">hello@agent-relay.com</a></li>
70
+ <li>Support: <a href="mailto:support@agent-relay.com">support@agent-relay.com</a></li>
71
+ <li>Careers: <a href="mailto:hiring@agent-relay.com">hiring@agent-relay.com</a></li>
72
+ </ul>
73
+ </StaticPage>
74
+ );
75
+ }
76
+
77
+ export default AboutPage;
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Agent Relay Cloud - Blog Content Renderer
3
+ * Server-side compatible markdown rendering
4
+ */
5
+
6
+ import React from 'react';
7
+
8
+ function parseInlineMarkdown(text: string): string {
9
+ // Links: [text](url)
10
+ text = text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>');
11
+ // Bold: **text**
12
+ text = text.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
13
+ // Italic: *text* (single asterisks, but not inside words)
14
+ text = text.replace(/(?<!\w)\*([^*]+)\*(?!\w)/g, '<em>$1</em>');
15
+ // Inline code: `text`
16
+ text = text.replace(/`([^`]+)`/g, '<code>$1</code>');
17
+ return text;
18
+ }
19
+
20
+ export function renderBlogContent(content: string): React.ReactNode[] {
21
+ const lines = content.trim().split('\n');
22
+ const elements: React.ReactNode[] = [];
23
+ let currentParagraph: string[] = [];
24
+ let inCodeBlock = false;
25
+ let codeBlockContent: string[] = [];
26
+ let codeBlockLang = '';
27
+ let inTable = false;
28
+ let tableRows: string[] = [];
29
+ let key = 0;
30
+
31
+ const flushParagraph = () => {
32
+ if (currentParagraph.length > 0) {
33
+ const text = currentParagraph.join(' ').trim();
34
+ if (text) {
35
+ elements.push(
36
+ <p key={key++} dangerouslySetInnerHTML={{ __html: parseInlineMarkdown(text) }} />
37
+ );
38
+ }
39
+ currentParagraph = [];
40
+ }
41
+ };
42
+
43
+ const flushTable = () => {
44
+ if (tableRows.length >= 2) {
45
+ const parseRow = (row: string) =>
46
+ row.split('|').slice(1, -1).map(cell => cell.trim());
47
+
48
+ const headerCells = parseRow(tableRows[0]);
49
+ const dataRows = tableRows.slice(2); // Skip header and separator
50
+
51
+ elements.push(
52
+ <div key={key++} style={{ overflowX: 'auto', margin: '24px 0' }}>
53
+ <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: '15px' }}>
54
+ <thead>
55
+ <tr>
56
+ {headerCells.map((cell, i) => (
57
+ <th key={i} style={{
58
+ padding: '12px 16px',
59
+ textAlign: 'left',
60
+ borderBottom: '2px solid var(--border-subtle)',
61
+ fontWeight: 600
62
+ }} dangerouslySetInnerHTML={{ __html: parseInlineMarkdown(cell) }} />
63
+ ))}
64
+ </tr>
65
+ </thead>
66
+ <tbody>
67
+ {dataRows.map((row, i) => (
68
+ <tr key={i}>
69
+ {parseRow(row).map((cell, j) => (
70
+ <td key={j} style={{
71
+ padding: '10px 16px',
72
+ borderBottom: '1px solid var(--border-subtle)'
73
+ }} dangerouslySetInnerHTML={{ __html: parseInlineMarkdown(cell) }} />
74
+ ))}
75
+ </tr>
76
+ ))}
77
+ </tbody>
78
+ </table>
79
+ </div>
80
+ );
81
+ }
82
+ tableRows = [];
83
+ inTable = false;
84
+ };
85
+
86
+ for (const line of lines) {
87
+ // Code block start/end
88
+ if (line.startsWith('```')) {
89
+ if (!inCodeBlock) {
90
+ flushParagraph();
91
+ inCodeBlock = true;
92
+ codeBlockLang = line.slice(3).trim();
93
+ codeBlockContent = [];
94
+ } else {
95
+ elements.push(
96
+ <pre key={key++} className="code-block" data-lang={codeBlockLang}>
97
+ <code>{codeBlockContent.join('\n')}</code>
98
+ </pre>
99
+ );
100
+ inCodeBlock = false;
101
+ codeBlockContent = [];
102
+ codeBlockLang = '';
103
+ }
104
+ continue;
105
+ }
106
+
107
+ if (inCodeBlock) {
108
+ codeBlockContent.push(line);
109
+ continue;
110
+ }
111
+
112
+ // Headers
113
+ if (line.startsWith('## ')) {
114
+ flushParagraph();
115
+ elements.push(<h2 key={key++}>{line.slice(3)}</h2>);
116
+ continue;
117
+ }
118
+ if (line.startsWith('### ')) {
119
+ flushParagraph();
120
+ elements.push(<h3 key={key++}>{line.slice(4)}</h3>);
121
+ continue;
122
+ }
123
+
124
+ // Empty line = paragraph break
125
+ if (line.trim() === '') {
126
+ flushParagraph();
127
+ if (inTable) flushTable();
128
+ continue;
129
+ }
130
+
131
+ // Table rows: | col1 | col2 |
132
+ if (line.trim().startsWith('|') && line.trim().endsWith('|')) {
133
+ flushParagraph();
134
+ inTable = true;
135
+ tableRows.push(line.trim());
136
+ continue;
137
+ } else if (inTable) {
138
+ flushTable();
139
+ }
140
+
141
+ // List items
142
+ if (line.trim().startsWith('- ')) {
143
+ flushParagraph();
144
+ elements.push(
145
+ <ul key={key++}>
146
+ <li dangerouslySetInnerHTML={{ __html: parseInlineMarkdown(line.trim().slice(2)) }} />
147
+ </ul>
148
+ );
149
+ continue;
150
+ }
151
+
152
+ // Images: ![alt](src)
153
+ const imageMatch = line.trim().match(/^!\[([^\]]*)\]\(([^)]+)\)$/);
154
+ if (imageMatch) {
155
+ flushParagraph();
156
+ elements.push(
157
+ <figure key={key++} className="blog-image" style={{ margin: '32px 0' }}>
158
+ <img src={imageMatch[2]} alt={imageMatch[1]} style={{ width: '100%', borderRadius: '8px' }} />
159
+ {imageMatch[1] && <figcaption style={{ textAlign: 'center', color: 'var(--text-secondary)', marginTop: '12px', fontSize: '14px', fontStyle: 'italic' }}>{imageMatch[1]}</figcaption>}
160
+ </figure>
161
+ );
162
+ continue;
163
+ }
164
+
165
+ // Twitter embed: {{tweet:TWEET_URL}}
166
+ const tweetMatch = line.trim().match(/^\{\{tweet:(.+)\}\}$/);
167
+ if (tweetMatch) {
168
+ flushParagraph();
169
+ const tweetUrl = tweetMatch[1];
170
+ elements.push(
171
+ <div key={key++} className="tweet-embed" style={{ margin: '24px 0', display: 'flex', justifyContent: 'center' }}>
172
+ <blockquote className="twitter-tweet" data-theme="dark">
173
+ <a href={tweetUrl}>View tweet</a>
174
+ </blockquote>
175
+ </div>
176
+ );
177
+ continue;
178
+ }
179
+
180
+ // Regular text
181
+ currentParagraph.push(line);
182
+ }
183
+
184
+ flushParagraph();
185
+ if (inTable) flushTable();
186
+ return elements;
187
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Agent Relay Cloud - Blog Listing Page
3
+ */
4
+
5
+ import React from 'react';
6
+ import { StaticPage } from './StaticPage';
7
+ import { blogPosts } from './blogData';
8
+
9
+ export function BlogPage() {
10
+ return (
11
+ <StaticPage
12
+ title="Blog"
13
+ subtitle="News, tutorials, and insights from the Agent Relay team."
14
+ >
15
+ <div className="blog-list">
16
+ {blogPosts.map((post) => (
17
+ <a
18
+ key={post.id}
19
+ href={`/blog/${post.id}`}
20
+ className="blog-card"
21
+ style={{ textDecoration: 'none', color: 'inherit' }}
22
+ >
23
+ <article>
24
+ <div className="blog-meta">
25
+ <span className="blog-category">{post.category}</span>
26
+ <span>{post.date}</span>
27
+ <span className="blog-author">by {post.author}</span>
28
+ </div>
29
+ <h3>{post.title}</h3>
30
+ <p>{post.excerpt}</p>
31
+ <span className="blog-read-more">Read more →</span>
32
+ </article>
33
+ </a>
34
+ ))}
35
+ </div>
36
+
37
+ <hr style={{ border: 'none', borderTop: '1px solid var(--border-subtle)', margin: '48px 0' }} />
38
+
39
+ <h2>Stay Updated</h2>
40
+ <p>
41
+ Follow us on <a href="https://twitter.com/agent_relay" target="_blank" rel="noopener noreferrer">Twitter</a> for the latest updates and more content.
42
+ </p>
43
+ </StaticPage>
44
+ );
45
+ }
46
+
47
+ export default BlogPage;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Agent Relay Cloud - Careers Page
3
+ */
4
+
5
+ import React from 'react';
6
+ import { StaticPage } from './StaticPage';
7
+
8
+ export function CareersPage() {
9
+ return (
10
+ <StaticPage
11
+ title="Careers"
12
+ subtitle="Help us build the future of AI-powered development."
13
+ >
14
+ <h2>Join Us</h2>
15
+ <p>
16
+ We're building something that will fundamentally change how software gets built. AI agents working together as coordinated teams is the next evolution of developer tools, and we're at the forefront of making it happen.
17
+ </p>
18
+
19
+ <p>
20
+ If you think you'd be a great fit, send us an email at{' '}
21
+ <a href="mailto:hiring@agent-relay.com">hiring@agent-relay.com</a> with a bit about yourself and what you're interested in working on.
22
+ </p>
23
+
24
+ <h2>What We Value</h2>
25
+ <div className="values-grid">
26
+ <div className="value-card">
27
+ <h4>Curiosity</h4>
28
+ <p>We love people who ask questions and dig deep to understand how things work.</p>
29
+ </div>
30
+ <div className="value-card">
31
+ <h4>Ownership</h4>
32
+ <p>Take initiative, see things through, and take pride in your work.</p>
33
+ </div>
34
+ <div className="value-card">
35
+ <h4>Collaboration</h4>
36
+ <p>Great products are built by teams that communicate well and support each other.</p>
37
+ </div>
38
+ <div className="value-card">
39
+ <h4>Impact</h4>
40
+ <p>We focus on work that moves the needle for developers using our platform.</p>
41
+ </div>
42
+ </div>
43
+
44
+ <h2>Contact</h2>
45
+ <p>
46
+ Interested in joining us? Reach out at{' '}
47
+ <a href="mailto:hiring@agent-relay.com">hiring@agent-relay.com</a>.
48
+ </p>
49
+ </StaticPage>
50
+ );
51
+ }
52
+
53
+ export default CareersPage;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Agent Relay Cloud - Changelog Page
3
+ *
4
+ * Redirects to GitHub changelog
5
+ */
6
+
7
+ import React, { useEffect } from 'react';
8
+ import { StaticPage } from './StaticPage';
9
+
10
+ const CHANGELOG_URL = 'https://github.com/AgentWorkforce/relay/blob/main/CHANGELOG.md';
11
+
12
+ export function ChangelogPage() {
13
+ useEffect(() => {
14
+ window.location.href = CHANGELOG_URL;
15
+ }, []);
16
+
17
+ return (
18
+ <StaticPage
19
+ title="Changelog"
20
+ subtitle="Redirecting to GitHub..."
21
+ >
22
+ <p style={{ textAlign: 'center', marginTop: '32px' }}>
23
+ You are being redirected to our changelog on GitHub.
24
+ </p>
25
+ <p style={{ textAlign: 'center' }}>
26
+ If you are not redirected automatically, please click{' '}
27
+ <a href={CHANGELOG_URL}>here</a>.
28
+ </p>
29
+ </StaticPage>
30
+ );
31
+ }
32
+
33
+ export default ChangelogPage;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Agent Relay Cloud - Contact Page
3
+ */
4
+
5
+ import { StaticPage } from './StaticPage';
6
+
7
+ export function ContactPage() {
8
+ return (
9
+ <StaticPage
10
+ title="Contact Us"
11
+ subtitle="Have questions? We'd love to hear from you."
12
+ >
13
+ <h2>Get in Touch</h2>
14
+ <p>
15
+ Whether you have a question about features, pricing, need a demo, or anything else, our team is ready to answer all your questions.
16
+ </p>
17
+
18
+ <div className="value-card" style={{ marginTop: '32px', marginBottom: '32px' }}>
19
+ <h3 style={{ marginBottom: '16px' }}>Email</h3>
20
+ <p style={{ marginBottom: '24px' }}>
21
+ <a href="mailto:hello@agent-relay.com" style={{ fontSize: '1.1em' }}>hello@agent-relay.com</a>
22
+ </p>
23
+
24
+ <h3 style={{ marginBottom: '16px' }}>Twitter / X</h3>
25
+ <p style={{ marginBottom: 0 }}>
26
+ <a href="https://twitter.com/agent_relay" target="_blank" rel="noopener noreferrer" style={{ fontSize: '1.1em' }}>@agent_relay</a>
27
+ </p>
28
+ </div>
29
+
30
+ <h2>Open Source</h2>
31
+ <p>
32
+ Agent Relay is open source. You can find us on GitHub at{' '}
33
+ <a href="https://github.com/AgentWorkforce/relay" target="_blank" rel="noopener noreferrer">
34
+ github.com/AgentWorkforce/relay
35
+ </a>.
36
+ </p>
37
+ </StaticPage>
38
+ );
39
+ }
40
+
41
+ export default ContactPage;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Agent Relay Cloud - Documentation Page
3
+ *
4
+ * Redirects to external docs site at docs.agent-relay.com
5
+ */
6
+
7
+ import React, { useEffect } from 'react';
8
+ import { StaticPage } from './StaticPage';
9
+
10
+ export function DocsPage() {
11
+ useEffect(() => {
12
+ // Redirect to external docs
13
+ window.location.href = 'https://docs.agent-relay.com/';
14
+ }, []);
15
+
16
+ return (
17
+ <StaticPage
18
+ title="Documentation"
19
+ subtitle="Redirecting to docs.agent-relay.com..."
20
+ >
21
+ <p style={{ textAlign: 'center', marginTop: '32px' }}>
22
+ You are being redirected to our documentation site.
23
+ </p>
24
+ <p style={{ textAlign: 'center' }}>
25
+ If you are not redirected automatically, please click{' '}
26
+ <a href="https://docs.agent-relay.com/">here</a>.
27
+ </p>
28
+
29
+ <div className="docs-nav" style={{ marginTop: '48px' }}>
30
+ <a href="https://docs.agent-relay.com/quickstart" className="docs-nav-card">
31
+ <h3>Quickstart Guide</h3>
32
+ <p>Get up and running with Agent Relay in minutes.</p>
33
+ </a>
34
+ <a href="https://docs.agent-relay.com/concepts" className="docs-nav-card">
35
+ <h3>Core Concepts</h3>
36
+ <p>Learn about agents, workspaces, and messaging.</p>
37
+ </a>
38
+ </div>
39
+ </StaticPage>
40
+ );
41
+ }
42
+
43
+ export default DocsPage;