@rubytech/create-maxy 1.0.697 → 1.0.699

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 (24) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/neo4j/schema.cypher +33 -4
  3. package/payload/platform/plugins/docs/references/platform.md +1 -1
  4. package/payload/platform/plugins/docs/references/troubleshooting.md +28 -0
  5. package/payload/server/chunk-32ZHQJNX.js +11395 -0
  6. package/payload/server/chunk-3VVHVJK2.js +11405 -0
  7. package/payload/server/maxy-edge.js +1 -1
  8. package/payload/server/public/assets/{admin-BsLm49w9.js → admin-CjRb2gH7.js} +1 -1
  9. package/payload/server/public/assets/{data-BKexd229.js → data-sqtkLfgS.js} +1 -1
  10. package/payload/server/public/assets/{file-DZkqmm8M.js → file-Dsaxvh3t.js} +1 -1
  11. package/payload/server/public/assets/{graph-CPqHYozW.js → graph-ih5hzKOO.js} +1 -1
  12. package/payload/server/public/assets/{house-CPxWBrMl.js → house-Bse5AWrO.js} +1 -1
  13. package/payload/server/public/assets/{jsx-runtime-2yRmkrVq.css → jsx-runtime-DDu3Iu4h.css} +1 -1
  14. package/payload/server/public/assets/public-Btb8pJWN.js +5 -0
  15. package/payload/server/public/assets/{share-2-Bauv6ctA.js → share-2-nB3FxYbd.js} +1 -1
  16. package/payload/server/public/assets/{useVoiceRecorder-BTEcf6H3.js → useVoiceRecorder-D2OAQlJy.js} +3 -3
  17. package/payload/server/public/assets/{x-Kc93nSru.js → x-g2pNE8fh.js} +1 -1
  18. package/payload/server/public/data.html +6 -6
  19. package/payload/server/public/graph.html +6 -6
  20. package/payload/server/public/index.html +7 -7
  21. package/payload/server/public/public.html +4 -4
  22. package/payload/server/server.js +70 -26
  23. package/payload/server/public/assets/public-BthX_YNC.js +0 -5
  24. /package/payload/server/public/assets/{jsx-runtime-7o3Lvx89.js → jsx-runtime-rRO5uNvZ.js} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy",
3
- "version": "1.0.697",
3
+ "version": "1.0.699",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy": "./dist/index.js"
@@ -259,8 +259,8 @@ ON EACH [k.summary, k.content];
259
259
 
260
260
  // ----------------------------------------------------------
261
261
  // Conversation node — persistent conversation sessions
262
- // One Conversation per sessionKey. Scoped to an account via
263
- // (Conversation)-[:BELONGS_TO]->(LocalBusiness).
262
+ // One Conversation per sessionKey. Account scope is encoded by the
263
+ // `accountId` property on the node itself — every read filters by it.
264
264
  // Public conversations carry a visitorId (browser cookie) and
265
265
  // agentSlug for session resume across page reloads and server restarts.
266
266
  // Task 621 — carries a `summary` string denormalised from the first
@@ -463,8 +463,9 @@ FOR (sr:StepResult) ON (sr.runId);
463
463
 
464
464
  // ----------------------------------------------------------
465
465
  // UserProfile node — structured knowledge about the business owner
466
- // Platform-native (no Schema.org equivalent). One per account.
467
- // Linked via (UserProfile)-[:BELONGS_TO]->(LocalBusiness).
466
+ // Platform-native (no Schema.org equivalent). One per (accountId, userId).
467
+ // Linked via (AdminUser)-[:HAS_PROFILE]->(UserProfile). Account scope is
468
+ // encoded by the `accountId` property on the node itself.
468
469
  //
469
470
  // Created automatically on first admin session start via MERGE.
470
471
  // Properties populated progressively through conversation and
@@ -717,3 +718,31 @@ FOR (n:Trashed) ON (n.accountId);
717
718
 
718
719
  CREATE INDEX trashed_at IF NOT EXISTS
719
720
  FOR (n:Trashed) ON (n.trashedAt);
721
+
722
+ // ----------------------------------------------------------
723
+ // Person.linkedinUrl — natural key for LinkedIn-origin Persons.
724
+ // Indexed (not uniquely constrained) so a Person can appear
725
+ // first from another source (email-first) and later have its
726
+ // linkedinUrl filled in without collision. Schema-base requires
727
+ // `email or telephone` on :Person, but LinkedIn basic exports
728
+ // rarely emit either for connections; `linkedinUrl` is the
729
+ // reliable dedup key for the linkedin-import skill.
730
+ // ----------------------------------------------------------
731
+ CREATE INDEX person_linkedin_url IF NOT EXISTS
732
+ FOR (p:Person) ON (p.linkedinUrl);
733
+
734
+ // ----------------------------------------------------------
735
+ // Credential — schema:EducationalOccupationalCredential.
736
+ // Professional certifications (e.g. LinkedIn's Certifications.csv,
737
+ // or credentials entered through memory-write). Natural key is
738
+ // the triple (accountId, name, authority) — a credential is
739
+ // identified by what it is and who issued it, within a tenant.
740
+ // No existing Maxy label covers this semantics, so a new label
741
+ // is warranted (unlike articles → :CreativeWork, recommendations
742
+ // → :Review, skills → :DefinedTerm, which all reuse existing labels).
743
+ // ----------------------------------------------------------
744
+ CREATE CONSTRAINT credential_unique IF NOT EXISTS
745
+ FOR (c:Credential) REQUIRE (c.accountId, c.name, c.authority) IS UNIQUE;
746
+
747
+ CREATE INDEX credential_account IF NOT EXISTS
748
+ FOR (c:Credential) ON (c.accountId);
@@ -52,7 +52,7 @@ The memory graph is stored on your Pi. It never leaves your network.
52
52
 
53
53
  ## The Web Interface
54
54
 
55
- The web app runs on your Pi on port 19200. A small always-on front door (`maxy-edge`) owns that port and the remote terminal transport — so when the Software Update command restarts the app server, the browser-side terminal keeps streaming bytes exactly like an SSH session would. The edge also hosts the update flow's own routes (the sudo prompt, the action launcher, the SSE progress stream, the installed-version poll), so the Software Update modal's log panel does not go blank during the app-server restart window — it keeps receiving lines, heartbeats, and the final exit event unbroken. Login cookies are HMAC-signed with a shared key on disk, so both processes recognise the same session without any coordination and you do not have to log in again after an update. It provides:
55
+ The web app runs on your Pi on port 19200. A small always-on front door (`maxy-edge`) owns that port and the remote terminal transport — so when the Software Update command restarts the app server, the browser-side terminal keeps streaming bytes exactly like an SSH session would. The edge also hosts the update flow's own routes (the sudo prompt, the action launcher, the SSE progress stream, the installed-version poll), so the Software Update modal's log panel does not go blank during the app-server restart window — it keeps receiving lines, heartbeats, and the final exit event unbroken. Login cookies are HMAC-signed with a shared key on disk, so both processes recognise the same session without any coordination and you do not have to log in again after an update. Every request is also classified as LAN or external based on the network shape it arrived on — LAN browsers reach admin directly; the remote password screen only appears on the tunnel-exposed admin domain. It provides:
56
56
 
57
57
  - **Admin chat** (at `/`) — your primary interface, PIN-protected
58
58
  - **Public chat** (at `/{agent-name}`) — visitor-facing agents, each with their own URL. On public hostnames, the root path serves the default agent.
@@ -1,5 +1,33 @@
1
1
  # Troubleshooting
2
2
 
3
+ ## Fresh install opens to "Set your remote password" on the LAN URL
4
+
5
+ **Symptom:** On a brand-new device, the LAN URL printed by `create-maxy` (e.g. `http://maxy.local:19200`) opens to a remote-password setup page instead of admin onboarding. This was a Task-647-era regression and should not occur on any install built after Task 679.
6
+
7
+ **Diagnose:** On the Pi, grep the UI server log for the gate's disambiguation fields:
8
+
9
+ ```
10
+ tail -200 ~/.maxy/logs/maxy-ui.log | rg '\[remote-auth\].*resolvedKind='
11
+ ```
12
+
13
+ - `resolvedKind=lan` on a `login required` or `not configured` line means the classifier sees the request as local — if the browser is still on the remote-auth page, something cached the older page before the fix shipped (hard-refresh the tab).
14
+ - `resolvedKind=external` means the request chain presents as remote (routable IP in the first `x-forwarded-for` hop). On a LAN-only browser this points to a proxy or VPN rewriting headers between the browser and the Pi.
15
+ - `resolvedKind=unknown` is a defect — the classifier could not identify the TCP peer. Capture the log line and file it; do not work around it.
16
+
17
+ **Fix:** If all three fields confirm the LAN shape and the gate still refuses, upgrade the platform (`Software Update` from admin chat) to pick up the Task-679 classifier.
18
+
19
+ ---
20
+
21
+ ## Remote sign-in is rejected with "Remote access requires TLS"
22
+
23
+ **Symptom:** Posting the remote-auth password returns a plain-text `400 Remote access requires TLS` response instead of completing sign-in.
24
+
25
+ **What this means:** The login endpoint will only issue a session cookie when the request arrived over HTTPS (via the Cloudflare tunnel). Browsers silently drop `Set-Cookie: Secure` on plain-HTTP responses, so minting a cookie there would produce a dead-end redirect. Task 679 replaced that silent failure with this loud one.
26
+
27
+ **Fix:** Reach the admin surface through the tunnel hostname (e.g. `https://admin.<your-domain>`), not an IP or plain-HTTP URL. If you need LAN access, use the LAN URL (`http://<hostname>.local:<port>`) — LAN never hits the remote-auth endpoint.
28
+
29
+ ---
30
+
3
31
  ## Agent Not Responding
4
32
 
5
33
  **Symptom:** You send a message and nothing comes back, or the response never arrives.