@particle-academy/agent-integrations 0.37.0 → 0.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -296,6 +296,23 @@ type AgentActivity = {
296
296
  text: string;
297
297
  /** Optional structured payload, rendered as collapsed JSON. */
298
298
  detail?: unknown;
299
+ /**
300
+ * The call's arguments. Rendered inline next to the tool name so the feed
301
+ * reads as `tool(args) → result` — the point being that the agent's
302
+ * reasoning is legible AS IT HAPPENS, not reconstructable afterwards from a
303
+ * details pane nobody opens.
304
+ */
305
+ args?: unknown;
306
+ /** What the call returned. */
307
+ result?: unknown;
308
+ /** Round-trip time in ms. Rendered as `· 142ms`. */
309
+ durationMs?: number;
310
+ /**
311
+ * Lifecycle. A row can appear as `pending` the moment a call starts and be
312
+ * replaced by the settled row, which is what makes this a STREAM rather than
313
+ * a log. Defaults to `ok`, or `error` when `kind === "error"`.
314
+ */
315
+ status?: "pending" | "ok" | "error";
299
316
  };
300
317
  type AgentPanelProps = {
301
318
  /** The agent's identity (name + color appears in the header). */
package/dist/index.d.ts CHANGED
@@ -296,6 +296,23 @@ type AgentActivity = {
296
296
  text: string;
297
297
  /** Optional structured payload, rendered as collapsed JSON. */
298
298
  detail?: unknown;
299
+ /**
300
+ * The call's arguments. Rendered inline next to the tool name so the feed
301
+ * reads as `tool(args) → result` — the point being that the agent's
302
+ * reasoning is legible AS IT HAPPENS, not reconstructable afterwards from a
303
+ * details pane nobody opens.
304
+ */
305
+ args?: unknown;
306
+ /** What the call returned. */
307
+ result?: unknown;
308
+ /** Round-trip time in ms. Rendered as `· 142ms`. */
309
+ durationMs?: number;
310
+ /**
311
+ * Lifecycle. A row can appear as `pending` the moment a call starts and be
312
+ * replaced by the settled row, which is what makes this a STREAM rather than
313
+ * a log. Defaults to `ok`, or `error` when `kind === "error"`.
314
+ */
315
+ status?: "pending" | "ok" | "error";
299
316
  };
300
317
  type AgentPanelProps = {
301
318
  /** The agent's identity (name + color appears in the header). */
package/dist/index.js CHANGED
@@ -2,8 +2,8 @@ export { useSheetsActivityHighlights, useSheetsAdapter } from './chunk-KHKSQEMC.
2
2
  import { ConnectorButtons } from './chunk-5HNTNIWY.js';
3
3
  export { CLAUDE_CONNECTORS_URL, CONNECTOR_GLYPHS, CONNECTOR_TARGETS, ClaudeMark, ConnectorButtons, CursorMark, DesktopMark, VscodeMark, WrenchMark, buildCursorDeeplink, buildManualConfig, buildManualConfigSnippet, buildVscodeDeeplink, connectorHref, encodeBase64Json, slugifyServerName } from './chunk-5HNTNIWY.js';
4
4
  export { DEFAULT_MCPB_ENTRY_POINT, MCPB_MANIFEST_VERSION, MCPB_MIN_NODE, buildMcpbManifest, buildMcpbProxyStub } from './chunk-GO2Y6H6U.js';
5
- import { ShareControls, AgentActivityHighlight, AgentCursor } from './chunk-ABP2THQV.js';
6
- export { AgentActivityHighlight, AgentCursor, AgentPanel, ShareControls, buildAgentPrompt } from './chunk-ABP2THQV.js';
5
+ import { ShareControls, AgentActivityHighlight, AgentCursor } from './chunk-QYWPCRT2.js';
6
+ export { AgentActivityHighlight, AgentCursor, AgentPanel, ShareControls, buildAgentPrompt } from './chunk-QYWPCRT2.js';
7
7
  import './chunk-IJ6JX5VC.js';
8
8
  import { createSessionDescriptor, attachSseRelay } from './chunk-JDCB2NMM.js';
9
9
  export { SseRelayTransport, attachSseRelay, buildShareConfig, buildShareUrl, createSessionDescriptor, describeSession, readSessionFromUrl } from './chunk-JDCB2NMM.js';
package/dist/styles.css CHANGED
@@ -99,13 +99,47 @@
99
99
  }
100
100
  .fai-row__meta {
101
101
  display: flex;
102
- justify-content: space-between;
102
+ align-items: baseline;
103
+ gap: 4px;
103
104
  opacity: 0.6;
104
105
  font-size: 10px;
105
106
  }
106
107
  .fai-row__source {
107
108
  font-family: ui-monospace, monospace;
108
109
  }
110
+ .fai-row__args {
111
+ font-family: ui-monospace, monospace;
112
+ min-width: 0;
113
+ overflow: hidden;
114
+ text-overflow: ellipsis;
115
+ white-space: nowrap;
116
+ }
117
+ .fai-row__latency {
118
+ font-variant-numeric: tabular-nums;
119
+ white-space: nowrap;
120
+ }
121
+ .fai-row__time {
122
+ margin-left: auto;
123
+ white-space: nowrap;
124
+ }
125
+ .fai-row__result {
126
+ font-family: ui-monospace, monospace;
127
+ font-size: 11px;
128
+ opacity: 0.85;
129
+ margin: 2px 0 0;
130
+ overflow: hidden;
131
+ text-overflow: ellipsis;
132
+ white-space: nowrap;
133
+ }
134
+ .fai-row--pending {
135
+ opacity: 0.7;
136
+ }
137
+ .fai-row--pending .fai-row__source::after {
138
+ content: " \2026";
139
+ }
140
+ .fai-row--error .fai-row__result {
141
+ color: #b91c1c;
142
+ }
109
143
  .fai-row__text {
110
144
  white-space: pre-wrap;
111
145
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/styles.css"],"sourcesContent":["/* @particle-academy/agent-integrations — minimal styles, host app provides tailwind/theme. */\n\n.fai-panel {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: white;\n color: #18181b;\n border-radius: 12px;\n border: 1px solid #e4e4e7;\n font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n overflow: hidden;\n}\n@media (prefers-color-scheme: dark) {\n .fai-panel { background: #18181b; color: #fafafa; border-color: #3f3f46; }\n}\n.fai-panel__header {\n display: flex; align-items: center; gap: 10px;\n padding: 10px 12px; border-bottom: 1px solid #e4e4e7;\n}\n@media (prefers-color-scheme: dark) { .fai-panel__header { border-color: #3f3f46; } }\n.fai-panel__avatar {\n width: 32px; height: 32px; border-radius: 50%;\n display: inline-flex; align-items: center; justify-content: center;\n color: white; font-weight: 600; font-size: 14px;\n}\n.fai-panel__title { display: flex; flex-direction: column; line-height: 1.1; flex: 1; }\n.fai-panel__subtitle { font-size: 11px; opacity: 0.6; }\n.fai-panel__actions { display: flex; gap: 6px; }\n.fai-panel__stream {\n flex: 1; overflow: auto; padding: 8px 12px;\n display: flex; flex-direction: column; gap: 6px;\n}\n.fai-panel__empty { font-size: 12px; opacity: 0.5; margin: auto; }\n.fai-row {\n font-size: 12px;\n border-radius: 6px;\n padding: 6px 8px;\n background: rgba(244, 244, 245, 0.6);\n}\n@media (prefers-color-scheme: dark) { .fai-row { background: rgba(63, 63, 70, 0.4); } }\n.fai-row--tool { border-left: 3px solid #a855f7; }\n.fai-row--message { border-left: 3px solid #3b82f6; }\n.fai-row--info { border-left: 3px solid #71717a; }\n.fai-row--error { border-left: 3px solid #ef4444; background: rgba(254, 226, 226, 0.4); }\n.fai-row__meta { display: flex; justify-content: space-between; opacity: 0.6; font-size: 10px; }\n.fai-row__source { font-family: ui-monospace, monospace; }\n.fai-row__text { white-space: pre-wrap; }\n.fai-row__detail summary { cursor: pointer; opacity: 0.7; font-size: 11px; margin-top: 4px; }\n.fai-row__detail pre {\n font-size: 11px; margin: 4px 0 0; padding: 6px;\n background: rgba(0,0,0,0.06); border-radius: 4px; overflow: auto;\n max-height: 200px;\n}\n.fai-panel__composer {\n display: flex; gap: 6px; padding: 8px;\n border-top: 1px solid #e4e4e7;\n}\n@media (prefers-color-scheme: dark) { .fai-panel__composer { border-color: #3f3f46; } }\n.fai-panel__input {\n flex: 1;\n resize: none;\n border-radius: 6px;\n border: 1px solid #d4d4d8;\n padding: 6px 8px;\n font: inherit;\n background: transparent;\n color: inherit;\n}\n.fai-panel__input:focus { outline: 2px solid #a855f7; outline-offset: -1px; }\n.fai-panel__send {\n align-self: stretch;\n padding: 0 14px;\n border: 0; border-radius: 6px;\n background: #a855f7; color: white;\n cursor: pointer; font-weight: 500;\n}\n.fai-panel__send:disabled { opacity: 0.5; cursor: default; }\n\n/* Cursor */\n.fai-cursor {\n transition: left 500ms cubic-bezier(0.22, 1, 0.36, 1),\n top 500ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n@media (prefers-reduced-motion: reduce) { .fai-cursor { transition: none; } }\n.fai-cursor__tag {\n position: absolute; left: 18px; top: 14px;\n color: white;\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 11px; font-family: system-ui, sans-serif;\n white-space: nowrap;\n}\n.fai-cursor__status { font-style: normal; opacity: 0.85; }\n\n/* Highlight pulse */\n@keyframes fai-pulse {\n 0% { opacity: 0; transform: scale(0.96); }\n 20% { opacity: 1; transform: scale(1.03); }\n 100% { opacity: 0; transform: scale(1); }\n}\n\n/* ShareControls */\n.fai-share {\n border: 1px solid #e4e4e7; border-radius: 12px; padding: 12px;\n background: white; color: #18181b;\n font-family: ui-sans-serif, system-ui, sans-serif; font-size: 13px;\n}\n@media (prefers-color-scheme: dark) { .fai-share { background: #18181b; color: #fafafa; border-color: #3f3f46; } }\n.fai-share--idle { display: flex; flex-direction: column; gap: 6px; }\n.fai-share__start { align-self: flex-start; padding: 8px 14px; border: 0; border-radius: 6px; background: #a855f7; color: white; font-weight: 500; cursor: pointer; }\n.fai-share__hint { margin: 0; opacity: 0.7; font-size: 12px; }\n.fai-share__header { display: flex; justify-content: space-between; align-items: center; gap: 8px; margin-bottom: 8px; }\n.fai-share__id { display: block; opacity: 0.7; font-size: 11px; margin-top: 2px; }\n.fai-share__id code { font-family: ui-monospace, monospace; }\n.fai-share__header-actions { display: flex; gap: 8px; align-items: center; }\n.fai-share__status { font-size: 11px; padding: 2px 8px; border-radius: 999px; background: rgba(34, 197, 94, 0.15); color: #16a34a; }\n.fai-share__stop { border: 1px solid #d4d4d8; background: transparent; border-radius: 6px; padding: 4px 10px; cursor: pointer; font-size: 12px; color: inherit; }\n.fai-share__tabs { display: flex; gap: 4px; margin-bottom: 8px; }\n.fai-share__tab { border: 0; background: transparent; cursor: pointer; padding: 4px 10px; border-radius: 4px; color: inherit; font-size: 12px; }\n.fai-share__tab.is-active { background: rgba(168, 85, 247, 0.12); color: #a855f7; }\n.fai-share__panel-label { font-size: 11px; opacity: 0.7; margin-bottom: 4px; }\n.fai-share__copy { display: flex; gap: 6px; align-items: stretch; }\n.fai-share__pre { flex: 1; margin: 0; padding: 8px 10px; background: rgba(0,0,0,0.05); border-radius: 6px; font-family: ui-monospace, monospace; font-size: 11px; white-space: nowrap; overflow: auto; }\n.fai-share__pre.is-multi { white-space: pre; max-height: 240px; }\n.fai-share__copy-btn { border: 1px solid #d4d4d8; background: transparent; cursor: pointer; border-radius: 6px; padding: 0 12px; color: inherit; font-size: 12px; }\n\n/* === Cross-package agent presence === */\n/*\n * Apply `.agent-focused-element` to any DOM node that's currently being\n * touched by an agent. The CSS variables let hosts override the agent's\n * accent without touching the rule. Bridges typically apply this class\n * via a brief side-effect when their tools fire.\n */\n.agent-focused-element {\n --agent-color: #a855f7;\n position: relative;\n outline: 2px solid var(--agent-color);\n outline-offset: 2px;\n border-radius: 4px;\n animation: agent-focus-pulse 1500ms ease-out forwards;\n}\n@keyframes agent-focus-pulse {\n 0% { box-shadow: 0 0 0 0 var(--agent-color); }\n 40% { box-shadow: 0 0 0 6px rgba(168, 85, 247, 0.18); }\n 100% { box-shadow: 0 0 0 0 rgba(168, 85, 247, 0); outline-color: transparent; }\n}\n@media (prefers-reduced-motion: reduce) {\n .agent-focused-element { animation: none; }\n}\n\n/* Small badge hosts can drop next to an element to label \"Agent active\". */\n.agent-active-badge {\n display: inline-flex; align-items: center; gap: 4px;\n background: var(--agent-color, #a855f7);\n color: white;\n font-family: ui-sans-serif, system-ui, sans-serif;\n font-size: 11px; font-weight: 500;\n padding: 2px 6px; border-radius: 999px;\n vertical-align: middle;\n}\n.agent-active-badge::before {\n content: \"\";\n width: 6px; height: 6px;\n border-radius: 50%;\n background: white;\n animation: agent-active-blink 1.4s ease-in-out infinite;\n}\n@keyframes agent-active-blink {\n 0%, 100% { opacity: 0.4; }\n 50% { opacity: 1; }\n}\n\n/* ── Connector buttons (ConnectorButtons) ─────────────────────────────────── */\n.fai-connect {\n display: flex; flex-wrap: wrap; align-items: center; gap: 8px;\n font-family: ui-sans-serif, system-ui, sans-serif;\n}\n.fai-connect__btn {\n display: inline-flex; align-items: center; gap: 6px;\n border: 1px solid transparent; border-radius: 8px;\n padding: 6px 12px;\n font-size: 12px; font-weight: 500; line-height: 1;\n text-decoration: none; cursor: pointer;\n color: #fff; background: #18181b;\n transition: background 120ms ease, opacity 120ms ease, box-shadow 120ms ease;\n}\n.fai-connect__btn:hover { opacity: 0.92; }\n.fai-connect__btn:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }\n.fai-connect__glyph { width: 14px; height: 14px; flex: 0 0 auto; }\n.fai-connect__btn--claude-web { background: #cc785c; }\n.fai-connect__btn--claude-desktop{ background: #cc785c; }\n.fai-connect__btn--cursor { background: #111827; }\n.fai-connect__btn--vscode { background: #0066b8; }\n.fai-connect__btn--manual { background: #3f3f46; }\n\n.fai-connect__manual-wrap { position: relative; display: inline-flex; }\n.fai-connect__popover {\n position: absolute; top: calc(100% + 6px); left: 0; z-index: 50;\n width: min(420px, 80vw);\n background: #fff; color: #18181b;\n border: 1px solid #e4e4e7; border-radius: 10px;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12);\n padding: 12px;\n}\n.fai-connect__popover-head {\n display: flex; align-items: center; justify-content: space-between;\n font-size: 12px; font-weight: 600; margin-bottom: 6px;\n}\n.fai-connect__popover-close {\n border: none; background: transparent; cursor: pointer;\n font-size: 16px; line-height: 1; color: #71717a; padding: 0 4px;\n}\n.fai-connect__popover-hint { font-size: 11px; color: #52525b; margin: 0 0 8px; }\n.fai-connect__popover-hint code {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n background: #f4f4f5; padding: 1px 4px; border-radius: 4px;\n}\n.fai-connect__snippet {\n margin: 0 0 8px; max-height: 220px; overflow: auto;\n background: #18181b; color: #e4e4e7;\n border-radius: 8px; padding: 10px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px; line-height: 1.5; white-space: pre;\n}\n.fai-connect__copy-btn {\n border: 1px solid #e4e4e7; border-radius: 7px;\n background: #fafafa; color: #18181b; cursor: pointer;\n font-size: 11px; font-weight: 500; padding: 5px 10px;\n}\n.fai-connect__copy-btn:hover { background: #f4f4f5; }\n\n@media (prefers-color-scheme: dark) {\n .fai-connect__popover { background: #18181b; color: #fafafa; border-color: #3f3f46; }\n .fai-connect__popover-hint { color: #a1a1aa; }\n .fai-connect__popover-hint code { background: #27272a; }\n .fai-connect__copy-btn { background: #27272a; color: #fafafa; border-color: #3f3f46; }\n .fai-connect__copy-btn:hover { background: #3f3f46; }\n}\n\n/* Activity log — what the agent is doing, once one has connected. */\n.fai-share__empty { font-size: 12px; opacity: 0.7; margin: 8px 0; }\n.fai-share__activity { list-style: none; margin: 0; padding: 0; max-height: 220px; overflow-y: auto; }\n.fai-share__activity-row {\n display: grid;\n grid-template-columns: auto auto 1fr;\n gap: 8px;\n align-items: baseline;\n padding: 4px 0;\n font-size: 12px;\n border-bottom: 1px solid color-mix(in oklab, currentColor 10%, transparent);\n}\n.fai-share__activity-row:last-child { border-bottom: 0; }\n.fai-share__activity-time { font-variant-numeric: tabular-nums; opacity: 0.55; font-size: 11px; }\n.fai-share__activity-source {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n padding: 1px 5px;\n border-radius: 4px;\n background: color-mix(in oklab, #a855f7 22%, transparent);\n}\n.fai-share__activity-text { overflow-wrap: anywhere; }\n/* An error must not read like a routine step in a fast-scrolling list. */\n.fai-share__activity-row[data-kind=\"error\"] .fai-share__activity-source {\n background: color-mix(in oklab, #ef4444 30%, transparent);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/styles.css"],"sourcesContent":["/* @particle-academy/agent-integrations — minimal styles, host app provides tailwind/theme. */\n\n.fai-panel {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: white;\n color: #18181b;\n border-radius: 12px;\n border: 1px solid #e4e4e7;\n font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n overflow: hidden;\n}\n@media (prefers-color-scheme: dark) {\n .fai-panel { background: #18181b; color: #fafafa; border-color: #3f3f46; }\n}\n.fai-panel__header {\n display: flex; align-items: center; gap: 10px;\n padding: 10px 12px; border-bottom: 1px solid #e4e4e7;\n}\n@media (prefers-color-scheme: dark) { .fai-panel__header { border-color: #3f3f46; } }\n.fai-panel__avatar {\n width: 32px; height: 32px; border-radius: 50%;\n display: inline-flex; align-items: center; justify-content: center;\n color: white; font-weight: 600; font-size: 14px;\n}\n.fai-panel__title { display: flex; flex-direction: column; line-height: 1.1; flex: 1; }\n.fai-panel__subtitle { font-size: 11px; opacity: 0.6; }\n.fai-panel__actions { display: flex; gap: 6px; }\n.fai-panel__stream {\n flex: 1; overflow: auto; padding: 8px 12px;\n display: flex; flex-direction: column; gap: 6px;\n}\n.fai-panel__empty { font-size: 12px; opacity: 0.5; margin: auto; }\n.fai-row {\n font-size: 12px;\n border-radius: 6px;\n padding: 6px 8px;\n background: rgba(244, 244, 245, 0.6);\n}\n@media (prefers-color-scheme: dark) { .fai-row { background: rgba(63, 63, 70, 0.4); } }\n.fai-row--tool { border-left: 3px solid #a855f7; }\n.fai-row--message { border-left: 3px solid #3b82f6; }\n.fai-row--info { border-left: 3px solid #71717a; }\n.fai-row--error { border-left: 3px solid #ef4444; background: rgba(254, 226, 226, 0.4); }\n/* The meta line is now `tool(args) · 142ms 12:04:31`, so the time is\n pushed right with margin rather than by justify-between — with\n space-between, adding args would have scattered the parts across the row. */\n.fai-row__meta { display: flex; align-items: baseline; gap: 4px; opacity: 0.6; font-size: 10px; }\n.fai-row__source { font-family: ui-monospace, monospace; }\n.fai-row__args {\n font-family: ui-monospace, monospace;\n min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n}\n.fai-row__latency { font-variant-numeric: tabular-nums; white-space: nowrap; }\n.fai-row__time { margin-left: auto; white-space: nowrap; }\n.fai-row__result {\n font-family: ui-monospace, monospace; font-size: 11px;\n opacity: 0.85; margin: 2px 0 0;\n overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n}\n/* A call in flight, so a feed reads as a stream rather than as a log that\n only ever shows settled work. */\n.fai-row--pending { opacity: 0.7; }\n.fai-row--pending .fai-row__source::after { content: \" …\"; }\n.fai-row--error .fai-row__result { color: #b91c1c; }\n.fai-row__text { white-space: pre-wrap; }\n.fai-row__detail summary { cursor: pointer; opacity: 0.7; font-size: 11px; margin-top: 4px; }\n.fai-row__detail pre {\n font-size: 11px; margin: 4px 0 0; padding: 6px;\n background: rgba(0,0,0,0.06); border-radius: 4px; overflow: auto;\n max-height: 200px;\n}\n.fai-panel__composer {\n display: flex; gap: 6px; padding: 8px;\n border-top: 1px solid #e4e4e7;\n}\n@media (prefers-color-scheme: dark) { .fai-panel__composer { border-color: #3f3f46; } }\n.fai-panel__input {\n flex: 1;\n resize: none;\n border-radius: 6px;\n border: 1px solid #d4d4d8;\n padding: 6px 8px;\n font: inherit;\n background: transparent;\n color: inherit;\n}\n.fai-panel__input:focus { outline: 2px solid #a855f7; outline-offset: -1px; }\n.fai-panel__send {\n align-self: stretch;\n padding: 0 14px;\n border: 0; border-radius: 6px;\n background: #a855f7; color: white;\n cursor: pointer; font-weight: 500;\n}\n.fai-panel__send:disabled { opacity: 0.5; cursor: default; }\n\n/* Cursor */\n.fai-cursor {\n transition: left 500ms cubic-bezier(0.22, 1, 0.36, 1),\n top 500ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n@media (prefers-reduced-motion: reduce) { .fai-cursor { transition: none; } }\n.fai-cursor__tag {\n position: absolute; left: 18px; top: 14px;\n color: white;\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 11px; font-family: system-ui, sans-serif;\n white-space: nowrap;\n}\n.fai-cursor__status { font-style: normal; opacity: 0.85; }\n\n/* Highlight pulse */\n@keyframes fai-pulse {\n 0% { opacity: 0; transform: scale(0.96); }\n 20% { opacity: 1; transform: scale(1.03); }\n 100% { opacity: 0; transform: scale(1); }\n}\n\n/* ShareControls */\n.fai-share {\n border: 1px solid #e4e4e7; border-radius: 12px; padding: 12px;\n background: white; color: #18181b;\n font-family: ui-sans-serif, system-ui, sans-serif; font-size: 13px;\n}\n@media (prefers-color-scheme: dark) { .fai-share { background: #18181b; color: #fafafa; border-color: #3f3f46; } }\n.fai-share--idle { display: flex; flex-direction: column; gap: 6px; }\n.fai-share__start { align-self: flex-start; padding: 8px 14px; border: 0; border-radius: 6px; background: #a855f7; color: white; font-weight: 500; cursor: pointer; }\n.fai-share__hint { margin: 0; opacity: 0.7; font-size: 12px; }\n.fai-share__header { display: flex; justify-content: space-between; align-items: center; gap: 8px; margin-bottom: 8px; }\n.fai-share__id { display: block; opacity: 0.7; font-size: 11px; margin-top: 2px; }\n.fai-share__id code { font-family: ui-monospace, monospace; }\n.fai-share__header-actions { display: flex; gap: 8px; align-items: center; }\n.fai-share__status { font-size: 11px; padding: 2px 8px; border-radius: 999px; background: rgba(34, 197, 94, 0.15); color: #16a34a; }\n.fai-share__stop { border: 1px solid #d4d4d8; background: transparent; border-radius: 6px; padding: 4px 10px; cursor: pointer; font-size: 12px; color: inherit; }\n.fai-share__tabs { display: flex; gap: 4px; margin-bottom: 8px; }\n.fai-share__tab { border: 0; background: transparent; cursor: pointer; padding: 4px 10px; border-radius: 4px; color: inherit; font-size: 12px; }\n.fai-share__tab.is-active { background: rgba(168, 85, 247, 0.12); color: #a855f7; }\n.fai-share__panel-label { font-size: 11px; opacity: 0.7; margin-bottom: 4px; }\n.fai-share__copy { display: flex; gap: 6px; align-items: stretch; }\n.fai-share__pre { flex: 1; margin: 0; padding: 8px 10px; background: rgba(0,0,0,0.05); border-radius: 6px; font-family: ui-monospace, monospace; font-size: 11px; white-space: nowrap; overflow: auto; }\n.fai-share__pre.is-multi { white-space: pre; max-height: 240px; }\n.fai-share__copy-btn { border: 1px solid #d4d4d8; background: transparent; cursor: pointer; border-radius: 6px; padding: 0 12px; color: inherit; font-size: 12px; }\n\n/* === Cross-package agent presence === */\n/*\n * Apply `.agent-focused-element` to any DOM node that's currently being\n * touched by an agent. The CSS variables let hosts override the agent's\n * accent without touching the rule. Bridges typically apply this class\n * via a brief side-effect when their tools fire.\n */\n.agent-focused-element {\n --agent-color: #a855f7;\n position: relative;\n outline: 2px solid var(--agent-color);\n outline-offset: 2px;\n border-radius: 4px;\n animation: agent-focus-pulse 1500ms ease-out forwards;\n}\n@keyframes agent-focus-pulse {\n 0% { box-shadow: 0 0 0 0 var(--agent-color); }\n 40% { box-shadow: 0 0 0 6px rgba(168, 85, 247, 0.18); }\n 100% { box-shadow: 0 0 0 0 rgba(168, 85, 247, 0); outline-color: transparent; }\n}\n@media (prefers-reduced-motion: reduce) {\n .agent-focused-element { animation: none; }\n}\n\n/* Small badge hosts can drop next to an element to label \"Agent active\". */\n.agent-active-badge {\n display: inline-flex; align-items: center; gap: 4px;\n background: var(--agent-color, #a855f7);\n color: white;\n font-family: ui-sans-serif, system-ui, sans-serif;\n font-size: 11px; font-weight: 500;\n padding: 2px 6px; border-radius: 999px;\n vertical-align: middle;\n}\n.agent-active-badge::before {\n content: \"\";\n width: 6px; height: 6px;\n border-radius: 50%;\n background: white;\n animation: agent-active-blink 1.4s ease-in-out infinite;\n}\n@keyframes agent-active-blink {\n 0%, 100% { opacity: 0.4; }\n 50% { opacity: 1; }\n}\n\n/* ── Connector buttons (ConnectorButtons) ─────────────────────────────────── */\n.fai-connect {\n display: flex; flex-wrap: wrap; align-items: center; gap: 8px;\n font-family: ui-sans-serif, system-ui, sans-serif;\n}\n.fai-connect__btn {\n display: inline-flex; align-items: center; gap: 6px;\n border: 1px solid transparent; border-radius: 8px;\n padding: 6px 12px;\n font-size: 12px; font-weight: 500; line-height: 1;\n text-decoration: none; cursor: pointer;\n color: #fff; background: #18181b;\n transition: background 120ms ease, opacity 120ms ease, box-shadow 120ms ease;\n}\n.fai-connect__btn:hover { opacity: 0.92; }\n.fai-connect__btn:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }\n.fai-connect__glyph { width: 14px; height: 14px; flex: 0 0 auto; }\n.fai-connect__btn--claude-web { background: #cc785c; }\n.fai-connect__btn--claude-desktop{ background: #cc785c; }\n.fai-connect__btn--cursor { background: #111827; }\n.fai-connect__btn--vscode { background: #0066b8; }\n.fai-connect__btn--manual { background: #3f3f46; }\n\n.fai-connect__manual-wrap { position: relative; display: inline-flex; }\n.fai-connect__popover {\n position: absolute; top: calc(100% + 6px); left: 0; z-index: 50;\n width: min(420px, 80vw);\n background: #fff; color: #18181b;\n border: 1px solid #e4e4e7; border-radius: 10px;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12);\n padding: 12px;\n}\n.fai-connect__popover-head {\n display: flex; align-items: center; justify-content: space-between;\n font-size: 12px; font-weight: 600; margin-bottom: 6px;\n}\n.fai-connect__popover-close {\n border: none; background: transparent; cursor: pointer;\n font-size: 16px; line-height: 1; color: #71717a; padding: 0 4px;\n}\n.fai-connect__popover-hint { font-size: 11px; color: #52525b; margin: 0 0 8px; }\n.fai-connect__popover-hint code {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n background: #f4f4f5; padding: 1px 4px; border-radius: 4px;\n}\n.fai-connect__snippet {\n margin: 0 0 8px; max-height: 220px; overflow: auto;\n background: #18181b; color: #e4e4e7;\n border-radius: 8px; padding: 10px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px; line-height: 1.5; white-space: pre;\n}\n.fai-connect__copy-btn {\n border: 1px solid #e4e4e7; border-radius: 7px;\n background: #fafafa; color: #18181b; cursor: pointer;\n font-size: 11px; font-weight: 500; padding: 5px 10px;\n}\n.fai-connect__copy-btn:hover { background: #f4f4f5; }\n\n@media (prefers-color-scheme: dark) {\n .fai-connect__popover { background: #18181b; color: #fafafa; border-color: #3f3f46; }\n .fai-connect__popover-hint { color: #a1a1aa; }\n .fai-connect__popover-hint code { background: #27272a; }\n .fai-connect__copy-btn { background: #27272a; color: #fafafa; border-color: #3f3f46; }\n .fai-connect__copy-btn:hover { background: #3f3f46; }\n}\n\n/* Activity log — what the agent is doing, once one has connected. */\n.fai-share__empty { font-size: 12px; opacity: 0.7; margin: 8px 0; }\n.fai-share__activity { list-style: none; margin: 0; padding: 0; max-height: 220px; overflow-y: auto; }\n.fai-share__activity-row {\n display: grid;\n grid-template-columns: auto auto 1fr;\n gap: 8px;\n align-items: baseline;\n padding: 4px 0;\n font-size: 12px;\n border-bottom: 1px solid color-mix(in oklab, currentColor 10%, transparent);\n}\n.fai-share__activity-row:last-child { border-bottom: 0; }\n.fai-share__activity-time { font-variant-numeric: tabular-nums; opacity: 0.55; font-size: 11px; }\n.fai-share__activity-source {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n padding: 1px 5px;\n border-radius: 4px;\n background: color-mix(in oklab, #a855f7 22%, transparent);\n}\n.fai-share__activity-text { overflow-wrap: anywhere; }\n/* An error must not read like a routine step in a fast-scrolling list. */\n.fai-share__activity-row[data-kind=\"error\"] .fai-share__activity-source {\n background: color-mix(in oklab, #ef4444 30%, transparent);\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@particle-academy/agent-integrations",
3
- "version": "0.37.0",
3
+ "version": "0.38.0",
4
4
  "description": "MCP-driven agent presence in collab sessions: per-session micro-MCP server, pluggable bridges to fancy-* packages, and agent UX components (panel + on-canvas cursor).",
5
5
  "repository": {
6
6
  "type": "git",
@@ -417,22 +417,24 @@
417
417
  "devDependencies": {
418
418
  "@particle-academy/fancy-catalog": "^0.1.0",
419
419
  "@particle-academy/fancy-cf-relay": "^0.1.0",
420
+ "@particle-academy/fancy-cms-ui": "^0.5.1",
420
421
  "@particle-academy/fancy-echarts": "^5.0.0",
421
422
  "@particle-academy/fancy-features": "^0.1.0",
422
423
  "@particle-academy/fancy-flow": "^0.18.0",
424
+ "@particle-academy/fancy-screens": "^0.7.0",
423
425
  "@particle-academy/fancy-sheets": "^0.9.0",
424
426
  "@particle-academy/fancy-slides": "^0.15.0",
425
427
  "@particle-academy/fancy-whiteboard": "^0.2.0",
426
428
  "@testing-library/dom": "^10.4.1",
427
429
  "@testing-library/react": "^16.0.0",
428
430
  "@types/node": "^22.0.0",
429
- "@types/react": "^19.2.0",
430
- "@types/react-dom": "^19.2.0",
431
+ "@types/react": "^19.2.18",
432
+ "@types/react-dom": "^19.2.4",
431
433
  "eslint": "^10.8.0",
432
434
  "eslint-plugin-react-hooks": "^7.1.1",
433
435
  "jsdom": "^25.0.0",
434
- "react": "^19.2.0",
435
- "react-dom": "^19.2.0",
436
+ "react": "^19.2.8",
437
+ "react-dom": "^19.2.8",
436
438
  "tsup": "^8.0.0",
437
439
  "typescript": "^5.7.0",
438
440
  "typescript-eslint": "^8.65.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/AgentPanel/AgentPanel.tsx","../src/components/AgentCursor/AgentCursor.tsx","../src/components/AgentActivityHighlight/AgentActivityHighlight.tsx","../src/components/ShareControls/ShareControls.tsx"],"names":["jsxs","jsx","useEffect","useState","useRef"],"mappings":"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","file":"chunk-ABP2THQV.js","sourcesContent":["import { type CSSProperties, type ReactNode, useEffect, useRef } from \"react\";\n\nexport type AgentActivity = {\n id: string;\n /** Wall-clock timestamp; component formats it. */\n at: number;\n /** \"tool\" for MCP tool invocations, \"message\" for chat, \"info\" for status. */\n kind: \"tool\" | \"message\" | \"info\" | \"error\";\n /** Short label, e.g. \"whiteboard_add_sticky\" or \"Agent\". */\n source: string;\n /** Body text. */\n text: string;\n /** Optional structured payload, rendered as collapsed JSON. */\n detail?: unknown;\n};\n\nexport type AgentPanelProps = {\n /** The agent's identity (name + color appears in the header). */\n agent?: { name?: string; color?: string };\n /** Activity stream. Most recent at the end. */\n activity: AgentActivity[];\n /** Optional chat composer — pass an onSubmit to enable. */\n onSubmit?: (message: string) => void;\n /** Disabled while a request is in flight. */\n busy?: boolean;\n /** Right-rail header actions. */\n actions?: ReactNode;\n className?: string;\n style?: CSSProperties;\n};\n\n/**\n * AgentPanel — sidebar showing the agent's identity, a tool-and-chat log,\n * and an optional input composer. Pure presentational: hosts feed it the\n * activity stream from their own state (typically the MCP transport log).\n */\nexport function AgentPanel({ agent, activity, onSubmit, busy, actions, className, style }: AgentPanelProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n el.scrollTop = el.scrollHeight;\n }, [activity.length]);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n const value = inputRef.current?.value.trim();\n if (!value || !onSubmit) return;\n onSubmit(value);\n if (inputRef.current) inputRef.current.value = \"\";\n };\n\n const color = agent?.color ?? \"#a855f7\";\n const name = agent?.name ?? \"Agent\";\n\n return (\n <div className={[\"fai-panel\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n <header className=\"fai-panel__header\">\n <div\n className=\"fai-panel__avatar\"\n style={{ background: color }}\n aria-hidden\n >\n {name.slice(0, 1)}\n </div>\n <div className=\"fai-panel__title\">\n <strong>{name}</strong>\n <span className=\"fai-panel__subtitle\">\n {busy ? \"Working…\" : `${activity.length} event${activity.length === 1 ? \"\" : \"s\"}`}\n </span>\n </div>\n {actions && <div className=\"fai-panel__actions\">{actions}</div>}\n </header>\n\n <div ref={scrollRef} className=\"fai-panel__stream\">\n {activity.length === 0 ? (\n <p className=\"fai-panel__empty\">No activity yet.</p>\n ) : (\n activity.map((a) => <ActivityRow key={a.id} item={a} />)\n )}\n </div>\n\n {onSubmit && (\n <form className=\"fai-panel__composer\" onSubmit={handleSubmit}>\n <textarea\n ref={inputRef}\n className=\"fai-panel__input\"\n placeholder={busy ? \"Working…\" : \"Ask the agent…\"}\n disabled={busy}\n rows={2}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSubmit(e as unknown as React.FormEvent);\n }\n }}\n />\n <button type=\"submit\" className=\"fai-panel__send\" disabled={busy}>\n Send\n </button>\n </form>\n )}\n </div>\n );\n}\n\nfunction ActivityRow({ item }: { item: AgentActivity }) {\n const time = formatTime(item.at);\n return (\n <div className={`fai-row fai-row--${item.kind}`}>\n <div className=\"fai-row__meta\">\n <span className=\"fai-row__source\">{item.source}</span>\n <span className=\"fai-row__time\">{time}</span>\n </div>\n <div className=\"fai-row__text\">{item.text}</div>\n {item.detail !== undefined && (\n <details className=\"fai-row__detail\">\n <summary>details</summary>\n <pre>{safeJson(item.detail)}</pre>\n </details>\n )}\n </div>\n );\n}\n\nfunction formatTime(at: number): string {\n const d = new Date(at);\n const hh = d.getHours().toString().padStart(2, \"0\");\n const mm = d.getMinutes().toString().padStart(2, \"0\");\n const ss = d.getSeconds().toString().padStart(2, \"0\");\n return `${hh}:${mm}:${ss}`;\n}\n\nfunction safeJson(v: unknown): string {\n try {\n return JSON.stringify(v, null, 2);\n } catch {\n return String(v);\n }\n}\n","import type { CSSProperties } from \"react\";\n\nexport type AgentCursorProps = {\n x: number;\n y: number;\n name?: string;\n color?: string;\n /** Optional caption shown under the name (e.g. current tool). */\n status?: string;\n className?: string;\n style?: CSSProperties;\n};\n\n/**\n * AgentCursor — on-canvas presence marker for the agent. Drop it inside\n * (or alongside) a fancy-whiteboard <Board> at screen coords matching\n * the agent's reported position.\n */\nexport function AgentCursor({ x, y, name, color = \"#a855f7\", status, className, style }: AgentCursorProps) {\n return (\n <div\n className={[\"fai-cursor\", className ?? \"\"].filter(Boolean).join(\" \")}\n style={{\n position: \"absolute\",\n left: x,\n top: y,\n pointerEvents: \"none\",\n transform: \"translate(-2px, -2px)\",\n ...style,\n }}\n >\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" aria-hidden>\n <path\n d=\"M2 2 L2 17 L7 13 L10 19 L12 18 L9 12 L15 12 Z\"\n fill={color}\n stroke=\"white\"\n strokeWidth=\"1.2\"\n />\n </svg>\n {name && (\n <span\n className=\"fai-cursor__tag\"\n style={{ background: color }}\n >\n {name}\n {status ? <em className=\"fai-cursor__status\"> · {status}</em> : null}\n </span>\n )}\n </div>\n );\n}\n","import { type CSSProperties, useEffect, useState } from \"react\";\n\nexport type AgentActivityHighlightProps = {\n /** Bounds of the highlighted item in the parent's coord system. */\n x: number;\n y: number;\n width: number;\n height: number;\n /** Trigger token — change it (e.g. set to Date.now()) to re-fire the pulse. */\n pulseKey?: string | number;\n /** Highlight tint. */\n color?: string;\n /** Pulse duration in ms. Defaults 1200. */\n duration?: number;\n className?: string;\n style?: CSSProperties;\n};\n\n/**\n * AgentActivityHighlight — short pulsing outline that flashes around an\n * item the agent just touched. Position the parent so this can be placed\n * absolutely matching the item's bounds.\n */\nexport function AgentActivityHighlight({\n x,\n y,\n width,\n height,\n pulseKey,\n color = \"#a855f7\",\n duration = 1200,\n className,\n style,\n}: AgentActivityHighlightProps) {\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n if (pulseKey === undefined) return;\n setVisible(true);\n const t = setTimeout(() => setVisible(false), duration);\n return () => clearTimeout(t);\n }, [pulseKey, duration]);\n\n if (!visible) return null;\n\n return (\n <div\n className={[\"fai-highlight\", className ?? \"\"].filter(Boolean).join(\" \")}\n style={{\n position: \"absolute\",\n left: x - 4,\n top: y - 4,\n width: width + 8,\n height: height + 8,\n borderRadius: 8,\n boxShadow: `0 0 0 2px ${color}, 0 0 16px ${color}66`,\n pointerEvents: \"none\",\n animation: `fai-pulse ${duration}ms ease-out forwards`,\n ...style,\n }}\n />\n );\n}\n","import { type CSSProperties, useEffect, useRef, useState } from \"react\";\nimport type { SessionDescriptor } from \"../../sharing/token\";\nimport type { AgentActivity } from \"../AgentPanel\";\nimport { buildShareConfig, buildShareUrl } from \"../../sharing/token\";\n\nexport type ShareControlsProps = {\n /** The active session, or null when not sharing yet. */\n session: SessionDescriptor | null;\n onStart: () => void;\n onStop: () => void;\n /** Optional connection-state badge text. */\n status?: string;\n /**\n * True once an agent has actually connected to the session.\n *\n * Flips the panel from \"here is how to connect\" to \"here is what the agent is\n * doing\" — the paste-this-prompt UI is dead weight the moment it has been\n * pasted, and what the human needs then is visibility.\n */\n agentConnected?: boolean;\n /**\n * What the agent has done, newest last. Reuses `AgentActivity` from\n * `AgentPanel` rather than a second shape, so a host already collecting\n * presence events can pass the same array to both.\n */\n activity?: AgentActivity[];\n /** Override the URL base used in the share URL. */\n shareBaseUrl?: string;\n className?: string;\n style?: CSSProperties;\n};\n\ntype Tab = \"activity\" | \"prompt\" | \"url\" | \"json\" | \"curl\";\n\n/**\n * ShareControls — the host-facing UI for turning sharing on/off and\n * surfacing the resulting connection details (URL / JSON / cURL).\n */\nexport function ShareControls({\n session,\n onStart,\n onStop,\n status,\n agentConnected = false,\n activity,\n shareBaseUrl,\n className,\n style,\n}: ShareControlsProps) {\n const [tab, setTab] = useState<Tab>(\"prompt\");\n\n // Switch to the log the FIRST time an agent connects, then leave the tab\n // alone. Forcing it on every render would fight a human who deliberately went\n // back to copy the URL again — the panel should follow the session, not\n // overrule the person reading it.\n const wasConnected = useRef(false);\n useEffect(() => {\n if (agentConnected && !wasConnected.current) {\n wasConnected.current = true;\n setTab(\"activity\");\n }\n if (!agentConnected) wasConnected.current = false;\n }, [agentConnected]);\n\n if (!session) {\n return (\n <div className={[\"fai-share fai-share--idle\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n <button type=\"button\" className=\"fai-share__start\" onClick={onStart}>\n Start shared session\n </button>\n <p className=\"fai-share__hint\">\n Generates a session id + secret token. Hand the <strong>Agent prompt</strong> to an AI agent, share the URL with humans, or give the JSON config to an MCP-capable client.\n </p>\n </div>\n );\n }\n\n const url = buildShareUrl(session, shareBaseUrl);\n const config = buildShareConfig(session);\n const curl = buildCurlRecipe(session);\n const prompt = buildAgentPrompt(url);\n\n return (\n <div className={[\"fai-share fai-share--active\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n <div className=\"fai-share__header\">\n <div>\n <strong>Sharing</strong>\n <span className=\"fai-share__id\">\n session <code>{session.id}</code> · token <code>{session.display}…</code>\n </span>\n </div>\n <div className=\"fai-share__header-actions\">\n {status && <span className=\"fai-share__status\">{status}</span>}\n <button type=\"button\" className=\"fai-share__stop\" onClick={onStop}>\n Stop\n </button>\n </div>\n </div>\n\n <div className=\"fai-share__tabs\" role=\"tablist\">\n {agentConnected && (\n <TabButton tab=\"activity\" active={tab} setTab={setTab}>\n Activity\n </TabButton>\n )}\n <TabButton tab=\"prompt\" active={tab} setTab={setTab}>Agent prompt</TabButton>\n <TabButton tab=\"url\" active={tab} setTab={setTab}>URL</TabButton>\n <TabButton tab=\"json\" active={tab} setTab={setTab}>JSON</TabButton>\n <TabButton tab=\"curl\" active={tab} setTab={setTab}>cURL recipe</TabButton>\n </div>\n\n <div className=\"fai-share__panel\">\n {tab === \"activity\" && <ActivityLog activity={activity} />}\n {tab === \"prompt\" && (\n <CopyBox\n label=\"Paste this straight into an AI agent — it connects over MCP, no browser\"\n value={prompt}\n multiline\n />\n )}\n {tab === \"url\" && <CopyBox label=\"Open this URL in another tab to join the session\" value={url} />}\n {tab === \"json\" && (\n <CopyBox\n label=\"Paste into Claude Desktop / Cline MCP server config\"\n value={JSON.stringify(config, null, 2)}\n />\n )}\n {tab === \"curl\" && (\n <CopyBox\n label=\"Connect from a terminal (verifies the relay is reachable)\"\n value={curl}\n multiline\n />\n )}\n </div>\n </div>\n );\n}\n\n/**\n * What the agent has actually done, newest first.\n *\n * The panel used to keep showing the paste-this-prompt UI after the agent was\n * already connected and driving — dead weight at exactly the moment the human\n * needs the opposite: visibility. A connected agent with no visible activity is\n * indistinguishable from a broken one, which is precisely how a stalled session\n * goes unnoticed.\n */\nfunction ActivityLog({ activity }: { activity?: AgentActivity[] }) {\n const entries = (activity ?? []).slice().reverse();\n\n if (entries.length === 0) {\n return (\n <p className=\"fai-share__empty\">\n Connected. Nothing yet — actions appear here as the agent takes them.\n </p>\n );\n }\n\n return (\n <ol className=\"fai-share__activity\" aria-live=\"polite\">\n {entries.map((entry) => (\n <li key={entry.id} className=\"fai-share__activity-row\" data-kind={entry.kind}>\n <time className=\"fai-share__activity-time\" dateTime={new Date(entry.at).toISOString()}>\n {new Date(entry.at).toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n })}\n </time>\n <span className=\"fai-share__activity-source\">{entry.source}</span>\n <span className=\"fai-share__activity-text\">{entry.text}</span>\n </li>\n ))}\n </ol>\n );\n}\n\nfunction TabButton({ tab, active, setTab, children }: { tab: Tab; active: Tab; setTab: (t: Tab) => void; children: React.ReactNode }) {\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === active}\n className={`fai-share__tab${tab === active ? \" is-active\" : \"\"}`}\n onClick={() => setTab(tab)}\n >\n {children}\n </button>\n );\n}\n\nfunction CopyBox({ label, value, multiline }: { label: string; value: string; multiline?: boolean }) {\n const [copied, setCopied] = useState(false);\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n } catch {\n // ignore\n }\n };\n return (\n <div>\n <div className=\"fai-share__panel-label\">{label}</div>\n <div className=\"fai-share__copy\">\n <pre className={`fai-share__pre${multiline ? \" is-multi\" : \"\"}`}>{value}</pre>\n <button type=\"button\" className=\"fai-share__copy-btn\" onClick={copy}>\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n </div>\n );\n}\n\n/**\n * Build a copy-paste natural-language prompt to hand directly to an AI agent.\n * Agents handed a bare URL tend to try to *open it in a browser* — this spells\n * out that the link is a live MCP co-browsing session it should drive over MCP\n * tools (via the zero-install relay client), never visit.\n */\nexport function buildAgentPrompt(url: string): string {\n return [\n `You're joining a live Human+ co-browsing session on a web app. This is an MCP`,\n `(Model Context Protocol) session — NOT a website to visit. Do NOT open the URL`,\n `in a browser and do NOT use any browser/Playwright tool. You drive the real,`,\n `running app through MCP tools while a human watches and can take over.`,\n ``,\n `Session link (carries the session id + token — treat it as a secret):`,\n ` ${url}`,\n ``,\n `Connect by running the relay client as an MCP server (zero install):`,\n ` npx -y mcp-relay-client \"${url}\"`,\n ``,\n `That exposes the app's own tools (e.g. page_describe, page_read, nav_visit,`,\n `page_click, page_set_field, page_submit, plus surface tools like whiteboard_*).`,\n `Then:`,\n ` 1. Call page_describe first to see the current page and its interactive handles.`,\n ` 2. Act only on the STABLE HANDLES the tools return — never guess DOM selectors.`,\n ` 3. Navigate with nav_visit, type with page_set_field, click with page_click.`,\n ` Submits and destructive clicks are staged for the human to confirm.`,\n ``,\n `If you can't register an MCP server but can run a shell, drive it directly:`,\n ` curl -O https://raw.githubusercontent.com/Particle-Academy/mcp-relay-client/main/connect.sh`,\n ` bash connect.sh \"${url}\" tools`,\n ` bash connect.sh \"${url}\" call page_describe '{}'`,\n ].join(\"\\n\");\n}\n\n/** Build a copy-paste cURL recipe for connecting an external MCP client. */\nfunction buildCurlRecipe(session: SessionDescriptor): string {\n const base =\n typeof window !== \"undefined\"\n ? `${window.location.protocol}//${window.location.host}`\n : \"http://localhost\";\n const inbox = `${base}/agent-relay/${session.id}/inbox?token=${session.token}`;\n const events = `${base}/agent-relay/${session.id}/events?token=${session.token}`;\n return [\n `# 1) In one terminal, subscribe to server-pushed frames (SSE)`,\n `curl -N \"${events}\"`,\n ``,\n `# 2) In another terminal, send an initialize handshake`,\n `curl -X POST \"${inbox}\" \\\\`,\n ` -H 'content-type: application/json' \\\\`,\n ` -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{}}'`,\n ``,\n `# 3) List the tools the bridge exposes`,\n `curl -X POST \"${inbox}\" \\\\`,\n ` -H 'content-type: application/json' \\\\`,\n ` -d '{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/list\"}'`,\n ``,\n `# 4) Add a sticky note`,\n `curl -X POST \"${inbox}\" \\\\`,\n ` -H 'content-type: application/json' \\\\`,\n ` -d '{\"jsonrpc\":\"2.0\",\"id\":3,\"method\":\"tools/call\",\"params\":{\"name\":\"whiteboard_add_sticky\",\"arguments\":{\"x\":300,\"y\":300,\"text\":\"hello from curl\"}}}'`,\n ].join(\"\\n\");\n}\n"]}