diff --git a/index.html b/index.html
index 734fa7f..d733291 100644
--- a/index.html
+++ b/index.html
@@ -4,7 +4,7 @@
-
+
diff --git a/package.json b/package.json
index 836cb1d..d4e2982 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "amerc-site",
- "version": "0.54.0-discover",
+ "version": "0.55.0-broker",
"private": true,
"type": "module",
"scripts": {
diff --git a/src/AgentPlatform.jsx b/src/AgentPlatform.jsx
index 061e49c..6b802c9 100644
--- a/src/AgentPlatform.jsx
+++ b/src/AgentPlatform.jsx
@@ -308,17 +308,27 @@ export function BoothDashboard({ auth, setRoute }) {
- {newInst && (
-
setNewInst(null)}>
-
e.stopPropagation()}>
-
Instance #{newInst.id} created setNewInst(null)}>✕
-
Run your broker against this instance, then it shows online. The accesskey is the relay token.
-
accesskey copyToast(newInst.accesskey)}>{newInst.accesskey} ⧉
-
broker WS copyToast(newInst.relayWs)}>{newInst.relayWs} ⧉
-
heartbeatPOST /api/agents/instances/{newInst.id}/heartbeat {'{'}accesskey,broker,tui{'}'}
+ {newInst && (() => {
+ const hb = `while true; do curl -s -XPOST https://amerc.ai/api/agents/instances/${newInst.id}/heartbeat -H 'content-type: application/json' -d '{"accesskey":"${newInst.accesskey}","status":"online","broker":"my-broker"}' >/dev/null; sleep 10; done`;
+ return (
+
setNewInst(null)}>
+
e.stopPropagation()}>
+
Instance #{newInst.id} — bring it online setNewInst(null)}>✕
+
Registered, but offline until a broker checks in. Two steps bring it to life:
+
+ Heartbeat — keeps it marked online (check in every <30s). Paste this anywhere with curl:
+ {hb} copyToast(hb, 'Heartbeat loop copied')}>copy
+
+ Relay — bridge your agent so live sessions reach it, over the broker WebSocket:
+ copyToast(newInst.relayWs)}>{newInst.relayWs} ⧉
+ The amerc webagent broker speaks this relay for you — point it at the accesskey below.
+
+
+
accesskey · your broker's secret copyToast(newInst.accesskey)}>{newInst.accesskey} ⧉
+
-
- )}
+ );
+ })()}
);
}
diff --git a/src/Scene2D.jsx b/src/Scene2D.jsx
index 828c29d..37c7ce3 100644
--- a/src/Scene2D.jsx
+++ b/src/Scene2D.jsx
@@ -7,7 +7,7 @@ import Account from './Account.jsx';
import TavernGame from './TavernGame.jsx';
import { api } from './api.js';
-const RELEASE = '0.54.0-discover';
+const RELEASE = '0.55.0-broker';
const NAV = [
{ id: 'home', label: 'Tavern' },
diff --git a/src/styles.css b/src/styles.css
index 75767c6..435e310 100644
--- a/src/styles.css
+++ b/src/styles.css
@@ -1393,3 +1393,12 @@ button {
.px-ver:hover { color: var(--cyan); }
.ft-status { font-family: inherit; cursor: pointer; transition: border-color .15s, transform .15s; }
.ft-status:hover { transform: translateY(-1px); border-color: rgba(54,240,176,0.6); }
+
+/* booth "bring it online" instance modal (0.55) */
+.ap-steps { margin: 4px 0 14px; padding-left: 20px; display: flex; flex-direction: column; gap: 13px; }
+.ap-steps li { color: #d6ccec; font-size: 13px; line-height: 1.6; }
+.ap-steps li b { color: #fff; }
+.ap-steps li > code { background: #07060c; color: #7fe9ff; padding: 1px 5px; border-radius: 4px; font-size: 11.5px; }
+.ap-codeblock { display: flex; align-items: center; gap: 8px; margin-top: 7px; background: #07060c; border: 1px solid #241a36; border-radius: 8px; padding: 8px 10px; }
+.ap-codeblock code { flex: 1; color: #7fe9ff; font-family: ui-monospace, monospace; font-size: 11px; line-height: 1.5; word-break: break-all; white-space: pre-wrap; background: none; padding: 0; }
+.ap-codeblock .px-action { flex: 0 0 auto; }