@rubytech/create-realagent 1.0.703 → 1.0.705

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 (23) hide show
  1. package/dist/uninstall.js +24 -15
  2. package/package.json +1 -1
  3. package/payload/platform/neo4j/edge-annotations.json +134 -0
  4. package/payload/server/chunk-LQ5GSMEW.js +12036 -0
  5. package/payload/server/maxy-edge.js +1 -1
  6. package/payload/server/public/assets/{Checkbox-CDUmQ1Bu.js → Checkbox-B2Lk8F4X.js} +1 -1
  7. package/payload/server/public/assets/{admin-picYWZfn.js → admin-agtgi48Q.js} +30 -30
  8. package/payload/server/public/assets/{data-yYbcrFrc.js → data-B7nsyBTV.js} +1 -1
  9. package/payload/server/public/assets/{file-CzLc4Rvq.js → file-DHWTu8LP.js} +1 -1
  10. package/payload/server/public/assets/{graph-BRzC0ZtS.js → graph-ChDwqqhJ.js} +1 -1
  11. package/payload/server/public/assets/{house-lM4gLKkH.js → house-CfjnRPO6.js} +1 -1
  12. package/payload/server/public/assets/jsx-runtime-81wg0w0Q.css +1 -0
  13. package/payload/server/public/assets/{public-scZadgzt.js → public-CE1kyVnz.js} +1 -1
  14. package/payload/server/public/assets/{share-2-CNdrRWue.js → share-2-CAd1beVT.js} +1 -1
  15. package/payload/server/public/assets/{useVoiceRecorder-D2kfoqVB.js → useVoiceRecorder-LSAU68Eo.js} +1 -1
  16. package/payload/server/public/assets/{x-CsDhB6Vr.js → x-B0xK3Aoq.js} +1 -1
  17. package/payload/server/public/data.html +6 -6
  18. package/payload/server/public/graph.html +7 -7
  19. package/payload/server/public/index.html +8 -8
  20. package/payload/server/public/public.html +5 -5
  21. package/payload/server/server.js +114 -54
  22. package/payload/server/public/assets/jsx-runtime-I6ZqIGn8.css +0 -1
  23. /package/payload/server/public/assets/{jsx-runtime-BK2hplUC.js → jsx-runtime-DhzH26q8.js} +0 -0
package/dist/uninstall.js CHANGED
@@ -79,32 +79,40 @@ function commandExists(cmd) {
79
79
  export function isMaxyInstalled() {
80
80
  return existsSync(INSTALL_DIR);
81
81
  }
82
+ /** Known brand hostnames in the Maxy ecosystem. Each brand ships a main unit
83
+ * (`<hostname>.service`) and a per-brand edge unit (`<hostname>-edge.service`,
84
+ * Task 662). Peer detection matches only these filenames, not any stray
85
+ * `.service` file — stale units, gnome-keyring disable markers, and unrelated
86
+ * user services are not peer evidence (Task 683). When a third brand is
87
+ * added under `brands/`, append its hostname here. */
88
+ const KNOWN_BRAND_HOSTNAMES = ["maxy", "realagent"];
82
89
  /** Detect whether another brand is installed on this device.
83
90
  * Task 659: device-wide steps (apt package purge, Ollama binary removal, apt
84
91
  * repo cleanup, ~/.claude / ~/.ollama wipes) must skip when a peer brand is
85
92
  * present — its runtime still depends on those singletons.
86
93
  *
87
- * Detection: any `.service` file in `~/.config/systemd/user/` whose name is
88
- * not this brand's `BRAND.serviceName` and not this brand's own edge unit
89
- * (Task 662 each brand owns its own per-brand edge unit, so that file
90
- * must not register as peer evidence). Task 664 retired the per-brand
91
- * ttyd unit, so it no longer needs an exclusion.
94
+ * Returns the matched peer service filename (so callers can cite it in logs)
95
+ * or `undefined` when no peer brand is detected. Truthiness maps cleanly to
96
+ * "peer present" for existing `if (peerBrandPresent())` callers.
92
97
  *
93
- * Legacy pre-662 shared `maxy-edge.service` (and pre-664 `maxy-ttyd.service`)
94
- * are intentionally counted as peer evidence on uninstall: on a dual-brand
95
- * device the legacy shared unit belonged to whichever brand last ran the
96
- * installer treating it as peer evidence keeps the uninstaller from
97
- * purging device-wide singletons the other brand still depends on. */
98
+ * Task 683: narrowed from "any `.service` file that isn't ours" to an
99
+ * allowlist keyed on `KNOWN_BRAND_HOSTNAMES`. The previous rule counted
100
+ * a `gnome-keyring-daemon.service -> /dev/null` disable-marker symlink (and
101
+ * any other unrelated user unit) as peer evidence, silently preserving
102
+ * `~/.claude` OAuth state on single-brand re-installs. */
98
103
  function peerBrandPresent() {
99
104
  const systemdUserDir = resolve(HOME, ".config/systemd/user");
100
105
  if (!existsSync(systemdUserDir))
101
- return false;
102
- const thisBrandEdge = `${BRAND.hostname}-edge.service`;
106
+ return undefined;
107
+ const peerUnits = KNOWN_BRAND_HOSTNAMES
108
+ .filter((h) => h !== BRAND.hostname)
109
+ .flatMap((h) => [`${h}.service`, `${h}-edge.service`]);
103
110
  try {
104
- return readdirSync(systemdUserDir).some((f) => f.endsWith(".service") && f !== BRAND.serviceName && f !== thisBrandEdge);
111
+ const files = new Set(readdirSync(systemdUserDir));
112
+ return peerUnits.find((unit) => files.has(unit));
105
113
  }
106
114
  catch {
107
- return false;
115
+ return undefined;
108
116
  }
109
117
  }
110
118
  // ---------------------------------------------------------------------------
@@ -380,7 +388,8 @@ function removeAppDirs() {
380
388
  ]),
381
389
  ];
382
390
  if (peer) {
383
- console.log(" Peer brand still installed — leaving ~/.claude and ~/.ollama in place.");
391
+ console.log(` Preserved ~/.claude (peer: ${peer})`);
392
+ console.log(` Preserved ~/.ollama (peer: ${peer})`);
384
393
  }
385
394
  for (const { path, label } of dirs) {
386
395
  if (existsSync(path)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-realagent",
3
- "version": "1.0.703",
3
+ "version": "1.0.705",
4
4
  "description": "Install Real Agent — Built for agents. By agents.",
5
5
  "bin": {
6
6
  "create-realagent": "./dist/index.js"
@@ -0,0 +1,134 @@
1
+ {
2
+ "edges": {
3
+ "PART_OF": {
4
+ "direction": "(Message)-[:PART_OF]->(Conversation)",
5
+ "note": "Messages belong to exactly one Conversation. Do NOT use :HAS_MESSAGE — that edge does not exist."
6
+ },
7
+ "NEXT": {
8
+ "direction": "(Message)-[:NEXT]->(Message)",
9
+ "note": "Chain order within a Conversation. Each Message has at most one NEXT successor."
10
+ },
11
+ "ADMIN_OF": {
12
+ "direction": "(AdminUser)-[:ADMIN_OF]->(LocalBusiness)",
13
+ "note": "Device-level admin membership (see admin-add / admin-remove)."
14
+ },
15
+ "HAS_PROFILE": {
16
+ "direction": "(AdminUser)-[:HAS_PROFILE]->(UserProfile)",
17
+ "note": "Admin's profile node. Account scope lives on the `accountId` property of each node — do NOT add a redundant edge to LocalBusiness just to satisfy the write doctrine. Every MATCH filters by `{accountId: $accountId}`."
18
+ },
19
+ "AUTHORED_BY": {
20
+ "direction": "(Message)-[:AUTHORED_BY]->(Person)",
21
+ "note": "Message authorship (when the author is an identified Person)."
22
+ },
23
+ "HAS_TOOL_CALL": {
24
+ "direction": "(Message)-[:HAS_TOOL_CALL]->(ToolCall)",
25
+ "note": "Tool calls attached to an assistant message."
26
+ },
27
+ "HAS_RESULT": {
28
+ "direction": "(WorkflowStep|ToolCall)-[:HAS_RESULT]->(StepResult)",
29
+ "note": "Workflow step / tool-call outputs."
30
+ },
31
+ "HAS_STEP": {
32
+ "direction": "(Workflow)-[:HAS_STEP]->(WorkflowStep)",
33
+ "note": "Workflow composition."
34
+ },
35
+ "RUN_OF": {
36
+ "direction": "(WorkflowRun)-[:RUN_OF]->(Workflow)",
37
+ "note": "Workflow execution instance."
38
+ },
39
+ "HAS_SECTION": {
40
+ "direction": "(KnowledgeDocument)-[:HAS_SECTION]->(Section)",
41
+ "note": "Document hierarchy."
42
+ },
43
+ "HAS_CHUNK": {
44
+ "direction": "(Section)-[:HAS_CHUNK]->(Chunk)",
45
+ "note": "Section-to-embeddable-chunk."
46
+ },
47
+ "HAS_PREFERENCE": {
48
+ "direction": "(Person)-[:HAS_PREFERENCE]->(Preference)",
49
+ "note": "Person-scoped preferences (profile memory)."
50
+ },
51
+ "HAS_ACCESS": {
52
+ "direction": "(Person)-[:HAS_ACCESS]->(AccessGrant)",
53
+ "note": "Public agent access grants."
54
+ },
55
+ "HAS_TASK": {
56
+ "direction": "(Person|LocalBusiness)-[:HAS_TASK]->(Task)",
57
+ "note": "Task ownership / assignment."
58
+ },
59
+ "HAS_PRICING": {
60
+ "direction": "(Service)-[:HAS_PRICING]->(PriceSpecification)",
61
+ "note": "Service pricing."
62
+ },
63
+ "HAS_HOURS": {
64
+ "direction": "(LocalBusiness)-[:HAS_HOURS]->(OpeningHoursSpecification)",
65
+ "note": "Opening hours."
66
+ },
67
+ "HAS_FAQ": {
68
+ "direction": "(LocalBusiness)-[:HAS_FAQ]->(Question)",
69
+ "note": "FAQ attached to business."
70
+ },
71
+ "HAS_BRAND_ASSET": {
72
+ "direction": "(LocalBusiness)-[:HAS_BRAND_ASSET]->(DigitalDocument|ImageObject)",
73
+ "note": "Branding assets."
74
+ },
75
+ "OFFERS": {
76
+ "direction": "(LocalBusiness)-[:OFFERS]->(Service)",
77
+ "note": "Service catalogue."
78
+ },
79
+ "CONTAINS": {
80
+ "direction": "(KnowledgeDocument)-[:CONTAINS]->(Chunk)",
81
+ "note": "Flat document-to-chunk (alternative to HAS_SECTION then HAS_CHUNK)."
82
+ },
83
+ "REFERENCES": {
84
+ "direction": "(Message|KnowledgeDocument)-[:REFERENCES]->(*)",
85
+ "note": "Soft reference link."
86
+ },
87
+ "ABOUT": {
88
+ "direction": "(Review|Message)-[:ABOUT]->(*)",
89
+ "note": "Subject pointer."
90
+ },
91
+ "REPLY_TO": {
92
+ "direction": "(Email)-[:REPLY_TO]->(Email)",
93
+ "note": "Email threading."
94
+ },
95
+ "RECEIVED_BY": {
96
+ "direction": "(Email)-[:RECEIVED_BY]->(Person)",
97
+ "note": "Email recipient."
98
+ },
99
+ "RAISED_BY": {
100
+ "direction": "(ReviewAlert)-[:RAISED_BY]->(*)",
101
+ "note": "Alert provenance."
102
+ },
103
+ "AFFECTS": {
104
+ "direction": "(ReviewAlert)-[:AFFECTS]->(*)",
105
+ "note": "Alert impact surface."
106
+ },
107
+ "BLOCKS": {
108
+ "direction": "(Task)-[:BLOCKS]->(Task)",
109
+ "note": "Task dependency."
110
+ },
111
+ "OBSERVED_IN": {
112
+ "direction": "(*)-[:OBSERVED_IN]->(Conversation)",
113
+ "note": "Observation provenance."
114
+ }
115
+ },
116
+ "sublabels": {
117
+ "AdminConversation": {
118
+ "base": "Conversation",
119
+ "note": "Admin-only conversation (admin chat, not public)."
120
+ },
121
+ "PublicConversation": {
122
+ "base": "Conversation",
123
+ "note": "Public agent conversation (visitor-facing)."
124
+ },
125
+ "UserMessage": {
126
+ "base": "Message",
127
+ "note": "Message authored by the human user."
128
+ },
129
+ "AssistantMessage": {
130
+ "base": "Message",
131
+ "note": "Message authored by the assistant."
132
+ }
133
+ }
134
+ }