@rubytech/create-realagent 1.0.660 → 1.0.662
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/package.json +1 -1
- package/payload/platform/neo4j/schema.cypher +18 -0
- package/payload/platform/plugins/docs/references/memory-guide.md +4 -2
- package/payload/platform/plugins/docs/references/platform.md +4 -0
- package/payload/platform/plugins/docs/references/troubleshooting.md +20 -4
- package/payload/server/public/assets/{admin-BFIYSS4u.js → admin-C9qoVb2l.js} +63 -63
- package/payload/server/public/assets/{data-BmeeI1Ix.js → data-C-WE3FGr.js} +1 -1
- package/payload/server/public/assets/{file-D4Qulqz_.js → file-lmzx24EO.js} +1 -1
- package/payload/server/public/assets/{graph-MoIys9Ub.js → graph-Bcao42cE.js} +17 -17
- package/payload/server/public/assets/{house-B0Hukxjp.js → house-ClhI06TA.js} +1 -1
- package/payload/server/public/assets/{jsx-runtime-C6owBiFB.css → jsx-runtime-CLCFnMYD.css} +1 -1
- package/payload/server/public/assets/{public-LvjJTLGn.js → public-Dz33-dIE.js} +1 -1
- package/payload/server/public/assets/{share-2-BafZBLp9.js → share-2-MZ4MqbjS.js} +1 -1
- package/payload/server/public/assets/{useVoiceRecorder-dLOpmcYJ.js → useVoiceRecorder-Cm0G51D_.js} +1 -1
- package/payload/server/public/assets/{x-BOZIeV0f.js → x-CLhtM_Mh.js} +1 -1
- package/payload/server/public/data.html +6 -6
- package/payload/server/public/graph.html +6 -6
- package/payload/server/public/index.html +7 -7
- package/payload/server/public/public.html +4 -4
- package/payload/server/server.js +277 -72
- /package/payload/server/public/assets/{jsx-runtime-CmCvZzVE.js → jsx-runtime-ImbU973I.js} +0 -0
package/package.json
CHANGED
|
@@ -597,6 +597,24 @@ FOR (ag:AccessGrant) ON (ag.status);
|
|
|
597
597
|
CREATE CONSTRAINT admin_user_id_unique IF NOT EXISTS
|
|
598
598
|
FOR (au:AdminUser) REQUIRE au.userId IS UNIQUE;
|
|
599
599
|
|
|
600
|
+
// ----------------------------------------------------------
|
|
601
|
+
// GraphPreference — per-(accountId, userId) UI metadata for /graph
|
|
602
|
+
//
|
|
603
|
+
// Carries the operator's persisted default filter view (labels +
|
|
604
|
+
// includeTrashed) so the /graph page opens with the chosen filter
|
|
605
|
+
// applied on next pageload. Never a user-facing node type — hidden
|
|
606
|
+
// from filter chips via HIDDEN_BY_DEFAULT_LABELS.
|
|
607
|
+
//
|
|
608
|
+
// MERGE-keyed on the composite (accountId, userId). No UNIQUE
|
|
609
|
+
// constraint — the composite MERGE keys are idempotent and the
|
|
610
|
+
// preference is UI metadata, not load-bearing data. A constraint
|
|
611
|
+
// would require both keys in a single composite, which Neo4j
|
|
612
|
+
// supports but adds schema surface for no behavioural benefit.
|
|
613
|
+
// ----------------------------------------------------------
|
|
614
|
+
|
|
615
|
+
CREATE INDEX graph_preference_account_user IF NOT EXISTS
|
|
616
|
+
FOR (p:GraphPreference) ON (p.accountId, p.userId);
|
|
617
|
+
|
|
600
618
|
// ----------------------------------------------------------
|
|
601
619
|
// ToolCall — durable audit trail for agent tool invocations
|
|
602
620
|
//
|
|
@@ -84,9 +84,11 @@ Ask naturally:
|
|
|
84
84
|
|
|
85
85
|
Maxy answers relational questions — "list all my people", "how many tasks do I have", "find the person with email X", "show me the 20 most recently created nodes" — via direct read-only Cypher against your Neo4j. This is faster and more precise than semantic search when the question is "the exact set where", not "things similar to".
|
|
86
86
|
|
|
87
|
-
You can also open a visual view of your graph at any time from the burger menu → **Graph**.
|
|
87
|
+
You can also open a visual view of your graph at any time from the burger menu → **Graph**. Click the **Filter** button in the toolbar to open the filter menu — it lists only the node types that actually exist in your graph (so you won't see chips for types you've never written). Active chips render a force-directed map, coloured by label (Person, Service, KnowledgeDocument, Task, …). Click a node to see its properties; type in the search box to highlight matches.
|
|
88
88
|
|
|
89
|
-
**
|
|
89
|
+
**Save a default view:** once you have the chips you want, click **Set default view** in the filter menu. Next time you open **Graph**, those chips are pre-selected and your data renders immediately. The default is per-admin, per-account — each admin on each account has their own.
|
|
90
|
+
|
|
91
|
+
**Delete a node:** drag it to the trash icon top-right of the canvas. No confirmation — deletes are reversible for 30 days. To restore, toggle **Show trashed** inside the filter menu and click **Restore** on the node, or ask Maxy in chat ("restore the <label> I just deleted").
|
|
90
92
|
|
|
91
93
|
The page reads only your own brand's Neo4j — a Maxy device and a Real Agent device share no graph state even when on the same laptop. No credentials are required; the view inherits your admin session.
|
|
92
94
|
|
|
@@ -70,6 +70,10 @@ The tmux session outlives admin-server restarts — running an upgrade inside th
|
|
|
70
70
|
|
|
71
71
|
The Software Update window mounts the terminal lazily: neither the terminal, its WebSocket, nor its black-backgrounded container render until you click Upgrade. Pre-click, the window shows a small "Ready to upgrade — click Upgrade to begin." line and no network traffic flows. On click, the window mounts the terminal and sends the npx command via `RemoteTerminal.onReady`; the terminal output is the only upgrade observability surface. A background version poll flips to the success row when `installed === latest` and reloads the page. The upgrade command is dispatched the moment the WebSocket opens — you won't see "terminal not ready" warnings on a healthy device. If the admin server cannot reach `ttyd`, the window renders an inline "Admin terminal not available" message with the exact re-install command and a Try again button. Closing the window does not kill the upgrade — the tmux session keeps running upstream — but the window itself starts fresh on every reopen: if you reopen during an in-flight upgrade, click Upgrade again and the scrollback shows the in-progress output.
|
|
72
72
|
|
|
73
|
+
Because the terminal is the only surface, it narrates its own state when something goes wrong. The moment you click Upgrade, the terminal echoes a timestamped `[upgrade] starting at <UTC> — shell+ws+tmux+xterm chain OK` line before the `npx` invocation begins — that single line confirms the WebSocket, tmux session, shell, and xterm renderer are all working end-to-end. If 5 seconds then pass with no output from `npx`, the terminal itself writes a `[terminal] no bytes from upstream in 5s — ws.readyState=…, bytesReceived=…, attempt=…` diagnostic into its own buffer, and repeats that narration every 30 seconds of continued silence. If even that narration never appears within ~10 seconds of click, the xterm renderer or its WebSocket is broken and reloading the admin UI is the fix. On the server side, `~/.maxy/logs/terminal.log` carries a `terminal-proxy-flow` heartbeat every 5 seconds while bytes are moving and every ~30 seconds while idle, with `clientBytes`, `upstreamBytes`, and `idleMs` fields — so a stuck upstream presents as `upstreamBytes` frozen and `idleMs` climbing, directly visible in a `tail -f` without any client-side evidence needed.
|
|
74
|
+
|
|
75
|
+
The terminal also opens as a standalone header-menu surface. The burger menu in the admin chat includes a **Terminal** entry next to **Browser**; clicking it mounts a fullscreen overlay that attaches to the same `maxy-pty` tmux session. This surface is pure attach — no upgrade command is sent — so you can run arbitrary shell work without touching the Software Update flow. Closing the overlay (Escape or the `×` button) detaches from tmux; the session on the Pi keeps running, and re-opening re-attaches with full scrollback intact. Both surfaces can be open simultaneously and show the same session via tmux's native multi-attach. Authorisation is identical to the upgrade surface: the same `canAccessAdmin()` gate + same-origin check + public-host rejection the WebSocket proxy enforces for every client. If `ttyd` is unreachable, the overlay renders the same inline "Remote terminal not available" message with a Try again button; server-side you discriminate surfaces via `grep corrId=header-overlay ~/.maxy/logs/terminal.log` (the upgrade modal uses `corrId=upgrade-modal`).
|
|
76
|
+
|
|
73
77
|
## AI Content Provenance
|
|
74
78
|
|
|
75
79
|
When your public agent sends a message to someone — via email, WhatsApp, Telegram, or SMS — the platform automatically includes a brief disclosure that the content was generated by AI. This is transparent and cannot be turned off.
|
|
@@ -127,17 +127,33 @@ Then return to the upgrade window and click **Try again**. The window re-probes
|
|
|
127
127
|
|
|
128
128
|
## Upgrade terminal stays blank after clicking Upgrade
|
|
129
129
|
|
|
130
|
-
**Symptom:** You clicked **Upgrade**, the terminal area mounted, but the terminal
|
|
130
|
+
**Symptom:** You clicked **Upgrade**, the terminal area mounted, but the terminal looks empty.
|
|
131
131
|
|
|
132
|
-
**What
|
|
132
|
+
**What you should see — the terminal narrates itself.** Within a few hundred milliseconds of click, the terminal echoes a line like `[upgrade] starting at 2026-04-21T11:48:33Z — shell+ws+tmux+xterm chain OK`. That single line confirms the WebSocket, tmux session, shell, and xterm renderer are all working. Within ~2 seconds on a warm npx cache, the installer's own first line arrives on top of that.
|
|
133
133
|
|
|
134
|
-
**
|
|
134
|
+
**If the terminal is silent for more than 5 seconds:** the terminal itself writes a yellow diagnostic like `[terminal] no bytes from upstream in 5s — ws.readyState=1, bytesReceived=0, attempt=1` into its own buffer, and repeats that narration every 30 seconds of continued silence. If those lines appear, the WebSocket and renderer are fine — the problem is upstream. SSH to the device and check `ttyd`:
|
|
135
135
|
|
|
136
136
|
```bash
|
|
137
137
|
sudo systemctl --user status maxy-ttyd
|
|
138
|
+
sudo tail -f ~/.maxy/logs/terminal.log
|
|
138
139
|
```
|
|
139
140
|
|
|
140
|
-
|
|
141
|
+
In `terminal.log`, look for `terminal-proxy-flow` lines — they're emitted every 5 seconds when bytes are moving and every ~30 seconds while idle, with `clientBytes`, `upstreamBytes`, and `idleMs` fields. A stuck upstream shows `upstreamBytes` frozen and `idleMs` climbing. If `maxy-ttyd` is not running, restart it with `sudo systemctl --user restart maxy-ttyd`, then close and reopen the Software Update window. If `ttyd` is healthy and `idleMs` keeps climbing, the installer process itself has died — re-run `npx -y @rubytech/create-maxy@latest` from an SSH shell directly.
|
|
142
|
+
|
|
143
|
+
**If no narration appears at all within ~10 seconds of click:** the xterm renderer or its WebSocket is broken — reload the admin UI in your browser. The absence of the self-narration is itself the diagnostic. On reload, if the preamble line does not appear again within a few hundred milliseconds of clicking Upgrade, the admin server cannot reach `ttyd`; follow the "Admin terminal not available" steps above.
|
|
144
|
+
|
|
145
|
+
## Terminal menu item renders an empty rectangle
|
|
146
|
+
|
|
147
|
+
**Symptom:** You opened the burger menu, clicked **Terminal**, and the fullscreen overlay mounted but the body area stayed black for more than a second or two — no prompt, no scrollback, just an empty rectangle where the shell should be.
|
|
148
|
+
|
|
149
|
+
**What it means:** `ttyd` on `127.0.0.1:7681` is not accepting the WebSocket, so `RemoteTerminal` cannot attach to `maxy-pty`. If `maxy-ttyd.service` is unreachable for long enough, the overlay flips to an inline "Remote terminal not available" message with a **Try again** button — but before that trips you get the empty-rectangle window. The quickest check is the same one used for the Software Update path:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
sudo systemctl --user status maxy-ttyd
|
|
153
|
+
sudo tail -n 50 ~/.maxy/logs/terminal.log
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Filter the log to this surface specifically: `grep corrId=header-overlay ~/.maxy/logs/terminal.log` — the Software Update window uses `corrId=upgrade-modal`, so the discriminator lets you tell which client hit the problem. A healthy open looks like `proxy-open corrId=header-overlay` followed by `proxy-flow` heartbeats every 5s; an unreachable backend looks like `proxy-error side=upstream-connect err=ECONNREFUSED`. If `maxy-ttyd` is not running, restart it with `sudo systemctl --user restart maxy-ttyd`, close the overlay, and reopen it from the burger menu — `tmux new-session -A` is idempotent so your session and scrollback come back intact.
|
|
141
157
|
|
|
142
158
|
## Orphan Account Directory Archived to `.trash/`
|
|
143
159
|
|