@rubytech/create-maxy-code 0.1.125 → 0.1.127
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.js +23 -1
- package/package.json +2 -2
- package/payload/platform/config/brand.json +20 -1
- package/payload/platform/lib/aeo-llms-txt-writer/dist/index.d.ts +33 -0
- package/payload/platform/lib/aeo-llms-txt-writer/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/aeo-llms-txt-writer/dist/index.js +119 -0
- package/payload/platform/lib/aeo-llms-txt-writer/dist/index.js.map +1 -0
- package/payload/platform/lib/aeo-llms-txt-writer/src/index.ts +172 -0
- package/payload/platform/lib/aeo-llms-txt-writer/tsconfig.json +8 -0
- package/payload/platform/lib/graph-style/dist/index.d.ts +78 -0
- package/payload/platform/lib/graph-style/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/graph-style/dist/index.js +296 -0
- package/payload/platform/lib/graph-style/dist/index.js.map +1 -0
- package/payload/platform/lib/graph-style/src/__tests__/parity.test.ts +114 -0
- package/payload/platform/lib/graph-style/src/index.ts +307 -0
- package/payload/platform/lib/graph-style/tsconfig.json +9 -0
- package/payload/platform/lib/graph-style/vitest.config.ts +9 -0
- package/payload/platform/package-lock.json +318 -0
- package/payload/platform/package.json +3 -2
- package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
- package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +4 -1
- package/payload/platform/plugins/admin/mcp/dist/index.js +73 -0
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/tools/publish-site.d.ts +34 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/publish-site.d.ts.map +1 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/publish-site.js +176 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/publish-site.js.map +1 -0
- package/payload/platform/plugins/admin/skills/publish-site/SKILL.md +19 -57
- package/payload/platform/plugins/aeo/mcp/dist/tools/aeo-write-llms-txt.d.ts +5 -38
- package/payload/platform/plugins/aeo/mcp/dist/tools/aeo-write-llms-txt.d.ts.map +1 -1
- package/payload/platform/plugins/aeo/mcp/dist/tools/aeo-write-llms-txt.js +7 -114
- package/payload/platform/plugins/aeo/mcp/dist/tools/aeo-write-llms-txt.js.map +1 -1
- package/payload/platform/plugins/docs/references/visitor-graph.md +4 -3
- package/payload/platform/plugins/graph-viewer/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/graph-viewer/PLUGIN.md +56 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/index.d.ts +7 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/index.d.ts.map +1 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/index.js +74 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/index.js.map +1 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/lib/neo4j.d.ts +5 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/lib/neo4j.d.ts.map +1 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/lib/neo4j.js +43 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/lib/neo4j.js.map +1 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/render/draw.d.ts +28 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/render/draw.d.ts.map +1 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/render/draw.js +73 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/render/draw.js.map +1 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/render/layout.d.ts +40 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/render/layout.d.ts.map +1 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/render/layout.js +77 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/render/layout.js.map +1 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/tools/graph-render.d.ts +45 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/tools/graph-render.d.ts.map +1 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/tools/graph-render.js +170 -0
- package/payload/platform/plugins/graph-viewer/mcp/dist/tools/graph-render.js.map +1 -0
- package/payload/platform/plugins/graph-viewer/mcp/package.json +25 -0
- package/payload/platform/plugins/graph-viewer/mcp/vitest.config.ts +8 -0
- package/payload/platform/plugins/graph-viewer/skills/render-graph/SKILL.md +35 -0
- package/payload/platform/scripts/check-plugin-tools-mcp-consistency.mjs +136 -0
- package/payload/platform/templates/specialists/agents/content-producer.md +3 -3
- package/payload/server/public/assets/{admin-D6IfAzYY.js → admin-FcRHAL-3.js} +7 -7
- package/payload/server/public/assets/{data-BGbQyufe.js → data-Ds37mflX.js} +1 -1
- package/payload/server/public/assets/{graph-D-1lRTeL.js → graph-CmWRhaiS.js} +1 -1
- package/payload/server/public/assets/graph-labels-Ch2r00Gt.js +1 -0
- package/payload/server/public/assets/page-BOtNny_4.js +51 -0
- package/payload/server/public/assets/page-BcHhJXUt.js +1 -0
- package/payload/server/public/consent.css +97 -0
- package/payload/server/public/consent.js +259 -0
- package/payload/server/public/data.html +3 -3
- package/payload/server/public/graph.html +3 -3
- package/payload/server/public/index.html +4 -4
- package/payload/server/public/privacy.html +68 -5
- package/payload/server/public/v.js +53 -0
- package/payload/server/server.js +465 -176
- package/payload/server/public/assets/graph-labels-BRXJHNYE.js +0 -1
- package/payload/server/public/assets/page-B4oirCvn.js +0 -1
- package/payload/server/public/assets/page-FmJ7PIYx.js +0 -51
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared palette + display-string primitives for any surface that renders
|
|
3
|
+
* the Neo4j graph. Both the live `/graph` page in platform/ui and the
|
|
4
|
+
* graph-viewer MCP plugin's PNG renderer import from here so a node looks
|
|
5
|
+
* the same wherever it appears: same colour family per label, same short
|
|
6
|
+
* canvas label per node.
|
|
7
|
+
*
|
|
8
|
+
* UI-only constants (filter-popover sets, zoom-tier wrap helpers,
|
|
9
|
+
* agent-action label sets) stay in platform/ui/app/lib/graph-labels.ts and
|
|
10
|
+
* platform/ui/app/graph/display-helpers.ts — they re-export the symbols
|
|
11
|
+
* defined here. The two parity tests (this lib's __tests__ and the UI's
|
|
12
|
+
* unchanged colour-stability tests) keep the surfaces in lockstep.
|
|
13
|
+
*
|
|
14
|
+
* Sources of truth:
|
|
15
|
+
* - Label list: .docs/neo4j.md "Schema (Phase 0)" + "Standards Compliance"
|
|
16
|
+
* - Brand colour for LocalBusiness: brand.json defaultColors.primary
|
|
17
|
+
* (resolved at runtime; this module supplies the schema-default fallback)
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Label → display colour mapping. Closed list of node labels written by
|
|
22
|
+
* the Maxy MCP write paths. A new label without an entry here renders in
|
|
23
|
+
* FALLBACK_LABEL_COLOUR and is omitted from the legend.
|
|
24
|
+
*/
|
|
25
|
+
export const GRAPH_LABEL_COLOURS: Record<string, string> = {
|
|
26
|
+
// Business identity — slate-blue family
|
|
27
|
+
LocalBusiness: '#4F6B8A',
|
|
28
|
+
Service: '#6B85A0',
|
|
29
|
+
PriceSpecification: '#8AA0B8',
|
|
30
|
+
OpeningHoursSpecification: '#A8BACE',
|
|
31
|
+
|
|
32
|
+
// Estate-agent ontology. Listing/Property share the business slate-blue
|
|
33
|
+
// family; Viewing/Offer are transactional events placed in a warm amber
|
|
34
|
+
// family distinct from Agent and from the dusty-rose Task/Project/Event
|
|
35
|
+
// hues so the legend reads them as a separate band.
|
|
36
|
+
Listing: '#3F5670',
|
|
37
|
+
Property: '#5C7A99',
|
|
38
|
+
Viewing: '#D4A574',
|
|
39
|
+
Offer: '#B08850',
|
|
40
|
+
|
|
41
|
+
// External business entity — schema:Organization, written by memory-write
|
|
42
|
+
// as the Supplier label. Warm tobacco — distinct hue from internal-business
|
|
43
|
+
// slates so external entities are scannable at a glance.
|
|
44
|
+
Organization: '#8A6B47',
|
|
45
|
+
|
|
46
|
+
// People — terracotta family (warm, human)
|
|
47
|
+
Person: '#B86E4A',
|
|
48
|
+
UserProfile: '#D08960',
|
|
49
|
+
Preference: '#DFA67A',
|
|
50
|
+
AdminUser: '#8C5230',
|
|
51
|
+
AccessGrant: '#66381F',
|
|
52
|
+
|
|
53
|
+
// Knowledge — moss family (organic)
|
|
54
|
+
KnowledgeDocument: '#6E8A5A',
|
|
55
|
+
// chunked WhatsApp/messaging archive parent. Sits in the
|
|
56
|
+
// knowledge moss family because it's structurally a document parent
|
|
57
|
+
// (HAS_SECTION → :Section:Conversation chunks); the conversational
|
|
58
|
+
// plum family is reserved for the live Conversation/Message labels.
|
|
59
|
+
ConversationArchive: '#82A06A',
|
|
60
|
+
Section: '#8AA876',
|
|
61
|
+
Chunk: '#A6C194',
|
|
62
|
+
DigitalDocument: '#5A7548',
|
|
63
|
+
CreativeWork: '#B5C9A2',
|
|
64
|
+
Question: '#C7D6B5',
|
|
65
|
+
FAQPage: '#95B385',
|
|
66
|
+
DefinedTerm: '#76906A',
|
|
67
|
+
Review: '#3F5A2E',
|
|
68
|
+
ImageObject: '#A0BB8C',
|
|
69
|
+
|
|
70
|
+
// Conversational — muted plum/lavender family.
|
|
71
|
+
// Pairwise-distinctness invariants enforced by the UI test
|
|
72
|
+
// graph-labels.test.ts; UserMessage matches Preference (Person/family cue,
|
|
73
|
+
// the one intentional duplicate in the registry).
|
|
74
|
+
Conversation: '#6B5A85',
|
|
75
|
+
AdminConversation: '#4F4070',
|
|
76
|
+
PublicConversation: '#8A75A8',
|
|
77
|
+
Message: '#6B7280',
|
|
78
|
+
UserMessage: '#DFA67A',
|
|
79
|
+
AssistantMessage: '#C9A876',
|
|
80
|
+
ToolCall: '#B5ABCB',
|
|
81
|
+
|
|
82
|
+
// Tasks / projects / events — dusty rose family
|
|
83
|
+
Task: '#B0617A',
|
|
84
|
+
Project: '#8E4A60',
|
|
85
|
+
Event: '#C68095',
|
|
86
|
+
|
|
87
|
+
// Workflows — muted teal
|
|
88
|
+
Workflow: '#3A6F77',
|
|
89
|
+
WorkflowStep: '#5A8E96',
|
|
90
|
+
WorkflowRun: '#7AAAB2',
|
|
91
|
+
StepResult: '#9CC4CB',
|
|
92
|
+
|
|
93
|
+
// Email — muted moss, hue-adjacent to Knowledge but lower-saturation
|
|
94
|
+
// and warmer; never co-rendered with KnowledgeDocument.
|
|
95
|
+
Email: '#6F7F4A',
|
|
96
|
+
EmailAccount: '#91A063',
|
|
97
|
+
|
|
98
|
+
// Public-agent projection — burnished bronze sits between
|
|
99
|
+
// people-terracotta and email-moss but shares neither hue.
|
|
100
|
+
Agent: '#B8893D',
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export const FALLBACK_LABEL_COLOUR = '#94A3B8'
|
|
104
|
+
|
|
105
|
+
export const ALL_GRAPH_LABELS: readonly string[] = Object.freeze(
|
|
106
|
+
Object.keys(GRAPH_LABEL_COLOURS)
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Select the sublabel whose colour should drive the node hue. Walks the
|
|
111
|
+
* label array from index 1 (skipping the base label at index 0) and
|
|
112
|
+
* returns the first sublabel that has a registered colour; falls back to
|
|
113
|
+
* labels[0]. Pure — drift-counting lives in resolveNodeColour.
|
|
114
|
+
*/
|
|
115
|
+
export function pickDisplayLabel(labels: readonly string[]): string | null {
|
|
116
|
+
for (let i = 1; i < labels.length; i++) {
|
|
117
|
+
if (Object.prototype.hasOwnProperty.call(GRAPH_LABEL_COLOURS, labels[i])) {
|
|
118
|
+
return labels[i]
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return labels[0] ?? null
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function colourForLabel(label: string): string {
|
|
125
|
+
return GRAPH_LABEL_COLOURS[label] ?? FALLBACK_LABEL_COLOUR
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export interface ResolvedNodeColour {
|
|
129
|
+
displayLabel: string | null
|
|
130
|
+
colour: string
|
|
131
|
+
driftCandidates: number
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Single-source colour resolver. driftCandidates counts registered
|
|
136
|
+
* sublabels in labels[1..]; a node with two registered sublabels has
|
|
137
|
+
* driftCandidates = 2 and its rendered hue is order-dependent.
|
|
138
|
+
*/
|
|
139
|
+
export function resolveNodeColour(labels: readonly string[]): ResolvedNodeColour {
|
|
140
|
+
const displayLabel = pickDisplayLabel(labels)
|
|
141
|
+
const colour = displayLabel ? colourForLabel(displayLabel) : FALLBACK_LABEL_COLOUR
|
|
142
|
+
let driftCandidates = 0
|
|
143
|
+
for (let i = 1; i < labels.length; i++) {
|
|
144
|
+
if (Object.prototype.hasOwnProperty.call(GRAPH_LABEL_COLOURS, labels[i])) {
|
|
145
|
+
driftCandidates++
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return { displayLabel, colour, driftCandidates }
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ---------------------------------------------------------------------------
|
|
152
|
+
// Display strings — short canvas label + untruncated display name.
|
|
153
|
+
// Verbatim from platform/ui/app/graph/display-helpers.ts at extraction time.
|
|
154
|
+
// UI helpers that wrap on zoom tier, pack into multi-line canvas labels,
|
|
155
|
+
// or compose tooltips stay in display-helpers.ts and call into these.
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Structural type used by display-string helpers. Mirrors the shape of
|
|
160
|
+
* GraphNode without coupling to it.
|
|
161
|
+
*/
|
|
162
|
+
export interface GraphNodeLike {
|
|
163
|
+
id: string
|
|
164
|
+
labels: string[]
|
|
165
|
+
properties: Record<string, unknown>
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const ISO_MINUTE_RE = /^(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2})/
|
|
169
|
+
const ISO_SECOND_RE = /^\d{4}-\d{2}-\d{2}T(\d{2}:\d{2}:\d{2})/
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* YYYY-MM-DD HH:mm from an ISO 8601 prefix. Reads the prefix directly so
|
|
173
|
+
* timezone-stored UTC timestamps render identically across operator
|
|
174
|
+
* timezones; parsing to Date + reformatting would flip the day.
|
|
175
|
+
*/
|
|
176
|
+
export function formatRunTimestamp(iso: string): string | null {
|
|
177
|
+
const m = iso.match(ISO_MINUTE_RE)
|
|
178
|
+
if (!m) return null
|
|
179
|
+
return `${m[1]} ${m[2]}`
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** HH:mm:ss from an ISO 8601 prefix. Same tz-stable contract. */
|
|
183
|
+
export function formatMessageTimestamp(iso: string): string | null {
|
|
184
|
+
const m = iso.match(ISO_SECOND_RE)
|
|
185
|
+
if (!m) return null
|
|
186
|
+
return m[1]
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* 24-char canvas label for a node. Label precedence per label family
|
|
191
|
+
* (ToolCall.toolName, WorkflowRun startedAt formatted, WorkflowStep.label,
|
|
192
|
+
* Person givenName+familyName compose, Agent displayName/slug, Message
|
|
193
|
+
* role+timestamp, ConversationArchive.title), then a generic fallthrough
|
|
194
|
+
* across curated keys (name, title, summary, givenName, subject, text),
|
|
195
|
+
* then a Conversation-specific `Conv <id8>` fallback so unpopulated
|
|
196
|
+
* conversations don't render as the literal label.
|
|
197
|
+
*/
|
|
198
|
+
export function pickShortLabel(node: GraphNodeLike): string {
|
|
199
|
+
const props = node.properties
|
|
200
|
+
const primaryLabel = node.labels[0]
|
|
201
|
+
if (primaryLabel === 'ToolCall') {
|
|
202
|
+
const v = props.toolName
|
|
203
|
+
if (typeof v === 'string' && v.length > 0) {
|
|
204
|
+
return v.length > 24 ? v.slice(0, 24) + '…' : v
|
|
205
|
+
}
|
|
206
|
+
} else if (primaryLabel === 'WorkflowRun') {
|
|
207
|
+
const v = props.startedAt
|
|
208
|
+
if (typeof v === 'string' && v.length > 0) {
|
|
209
|
+
const ts = formatRunTimestamp(v)
|
|
210
|
+
if (ts) return ts
|
|
211
|
+
}
|
|
212
|
+
} else if (primaryLabel === 'WorkflowStep') {
|
|
213
|
+
const v = props.label
|
|
214
|
+
if (typeof v === 'string' && v.length > 0) {
|
|
215
|
+
return v.length > 24 ? v.slice(0, 24) + '…' : v
|
|
216
|
+
}
|
|
217
|
+
} else if (primaryLabel === 'Person') {
|
|
218
|
+
const given = typeof props.givenName === 'string' ? props.givenName : ''
|
|
219
|
+
const family = typeof props.familyName === 'string' ? props.familyName : ''
|
|
220
|
+
const full = [given, family].filter((s) => s.length > 0).join(' ')
|
|
221
|
+
if (full.length > 0) {
|
|
222
|
+
return full.length > 24 ? full.slice(0, 24) + '…' : full
|
|
223
|
+
}
|
|
224
|
+
} else if (primaryLabel === 'Agent') {
|
|
225
|
+
const dn = typeof props.displayName === 'string' ? props.displayName : ''
|
|
226
|
+
const slug = typeof props.slug === 'string' ? props.slug : ''
|
|
227
|
+
const v = dn.length > 0 ? dn : slug
|
|
228
|
+
if (v.length > 0) {
|
|
229
|
+
return v.length > 24 ? v.slice(0, 24) + '…' : v
|
|
230
|
+
}
|
|
231
|
+
} else if (primaryLabel === 'Message') {
|
|
232
|
+
const role = typeof props.role === 'string' ? props.role : ''
|
|
233
|
+
const roleShort =
|
|
234
|
+
role === 'user' ? 'user'
|
|
235
|
+
: role === 'assistant' ? 'asst'
|
|
236
|
+
: role === 'system' ? 'sys'
|
|
237
|
+
: role === 'tool' ? 'tool'
|
|
238
|
+
: null
|
|
239
|
+
const createdAt = typeof props.createdAt === 'string' ? props.createdAt : ''
|
|
240
|
+
if (roleShort && createdAt) {
|
|
241
|
+
const ts = formatMessageTimestamp(createdAt)
|
|
242
|
+
if (ts) return `${roleShort} ${ts}`
|
|
243
|
+
}
|
|
244
|
+
} else if (primaryLabel === 'ConversationArchive') {
|
|
245
|
+
const t = typeof props.title === 'string' ? props.title : ''
|
|
246
|
+
if (t.length > 0) {
|
|
247
|
+
return t.length > 24 ? t.slice(0, 24) + '…' : t
|
|
248
|
+
}
|
|
249
|
+
return primaryLabel
|
|
250
|
+
}
|
|
251
|
+
for (const k of ['name', 'title', 'summary', 'givenName', 'subject', 'text']) {
|
|
252
|
+
const v = props[k]
|
|
253
|
+
if (typeof v === 'string' && v.length > 0) {
|
|
254
|
+
return v.length > 24 ? v.slice(0, 24) + '…' : v
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (primaryLabel === 'Conversation') {
|
|
258
|
+
const id = typeof props.conversationId === 'string' ? props.conversationId : null
|
|
259
|
+
if (id) return `Conv ${id.slice(0, 8)}`
|
|
260
|
+
}
|
|
261
|
+
return primaryLabel ?? '…'
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Untruncated sibling of pickShortLabel. Used by side-panel headings and
|
|
266
|
+
* tooltips where the 24-char canvas-overlap cap does not apply.
|
|
267
|
+
*/
|
|
268
|
+
export function pickDisplayName(node: GraphNodeLike): string {
|
|
269
|
+
const props = node.properties
|
|
270
|
+
const primaryLabel = node.labels[0]
|
|
271
|
+
if (primaryLabel === 'ToolCall') {
|
|
272
|
+
const v = props.toolName
|
|
273
|
+
if (typeof v === 'string' && v.length > 0) return v
|
|
274
|
+
} else if (primaryLabel === 'WorkflowRun') {
|
|
275
|
+
const v = props.startedAt
|
|
276
|
+
if (typeof v === 'string' && v.length > 0) {
|
|
277
|
+
const ts = formatRunTimestamp(v)
|
|
278
|
+
if (ts) return ts
|
|
279
|
+
}
|
|
280
|
+
} else if (primaryLabel === 'WorkflowStep') {
|
|
281
|
+
const v = props.label
|
|
282
|
+
if (typeof v === 'string' && v.length > 0) return v
|
|
283
|
+
} else if (primaryLabel === 'Person') {
|
|
284
|
+
const given = typeof props.givenName === 'string' ? props.givenName : ''
|
|
285
|
+
const family = typeof props.familyName === 'string' ? props.familyName : ''
|
|
286
|
+
const full = [given, family].filter((s) => s.length > 0).join(' ')
|
|
287
|
+
if (full.length > 0) return full
|
|
288
|
+
} else if (primaryLabel === 'Agent') {
|
|
289
|
+
const dn = typeof props.displayName === 'string' ? props.displayName : ''
|
|
290
|
+
const slug = typeof props.slug === 'string' ? props.slug : ''
|
|
291
|
+
const v = dn.length > 0 ? dn : slug
|
|
292
|
+
if (v.length > 0) return v
|
|
293
|
+
} else if (primaryLabel === 'ConversationArchive') {
|
|
294
|
+
const t = typeof props.title === 'string' ? props.title : ''
|
|
295
|
+
if (t.length > 0) return t
|
|
296
|
+
return primaryLabel
|
|
297
|
+
}
|
|
298
|
+
for (const k of ['name', 'title', 'summary', 'givenName', 'subject', 'text']) {
|
|
299
|
+
const v = props[k]
|
|
300
|
+
if (typeof v === 'string' && v.length > 0) return v
|
|
301
|
+
}
|
|
302
|
+
if (primaryLabel === 'Conversation') {
|
|
303
|
+
const id = typeof props.conversationId === 'string' ? props.conversationId : null
|
|
304
|
+
if (id) return `Conv ${id.slice(0, 8)}`
|
|
305
|
+
}
|
|
306
|
+
return primaryLabel ?? '…'
|
|
307
|
+
}
|
|
@@ -97,6 +97,10 @@
|
|
|
97
97
|
"resolved": "plugins/email/mcp",
|
|
98
98
|
"link": true
|
|
99
99
|
},
|
|
100
|
+
"node_modules/@maxy/graph-viewer": {
|
|
101
|
+
"resolved": "plugins/graph-viewer/mcp",
|
|
102
|
+
"link": true
|
|
103
|
+
},
|
|
100
104
|
"node_modules/@maxy/memory": {
|
|
101
105
|
"resolved": "plugins/memory/mcp",
|
|
102
106
|
"link": true
|
|
@@ -196,6 +200,255 @@
|
|
|
196
200
|
}
|
|
197
201
|
}
|
|
198
202
|
},
|
|
203
|
+
"node_modules/@napi-rs/canvas": {
|
|
204
|
+
"version": "0.1.100",
|
|
205
|
+
"resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.100.tgz",
|
|
206
|
+
"integrity": "sha512-xglYA6q3XO5P3BNJYxVZ1IV7DLVjp1Py6nwag88YntrS+3vKHyYcMqXVS4ZztJmwz2uGvz1FWhI/4LgbR5uQDA==",
|
|
207
|
+
"license": "MIT",
|
|
208
|
+
"workspaces": [
|
|
209
|
+
"e2e/*"
|
|
210
|
+
],
|
|
211
|
+
"engines": {
|
|
212
|
+
"node": ">= 10"
|
|
213
|
+
},
|
|
214
|
+
"funding": {
|
|
215
|
+
"type": "github",
|
|
216
|
+
"url": "https://github.com/sponsors/Brooooooklyn"
|
|
217
|
+
},
|
|
218
|
+
"optionalDependencies": {
|
|
219
|
+
"@napi-rs/canvas-android-arm64": "0.1.100",
|
|
220
|
+
"@napi-rs/canvas-darwin-arm64": "0.1.100",
|
|
221
|
+
"@napi-rs/canvas-darwin-x64": "0.1.100",
|
|
222
|
+
"@napi-rs/canvas-linux-arm-gnueabihf": "0.1.100",
|
|
223
|
+
"@napi-rs/canvas-linux-arm64-gnu": "0.1.100",
|
|
224
|
+
"@napi-rs/canvas-linux-arm64-musl": "0.1.100",
|
|
225
|
+
"@napi-rs/canvas-linux-riscv64-gnu": "0.1.100",
|
|
226
|
+
"@napi-rs/canvas-linux-x64-gnu": "0.1.100",
|
|
227
|
+
"@napi-rs/canvas-linux-x64-musl": "0.1.100",
|
|
228
|
+
"@napi-rs/canvas-win32-arm64-msvc": "0.1.100",
|
|
229
|
+
"@napi-rs/canvas-win32-x64-msvc": "0.1.100"
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
"node_modules/@napi-rs/canvas-android-arm64": {
|
|
233
|
+
"version": "0.1.100",
|
|
234
|
+
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.100.tgz",
|
|
235
|
+
"integrity": "sha512-hjhCKhntPv9+t4ckHymdx0phYNcVW+GKQR6Lzw2zE+pOVjOplSmtx9nNNknTjbEDLcuLZqA1y8ufKg1XfgftzQ==",
|
|
236
|
+
"cpu": [
|
|
237
|
+
"arm64"
|
|
238
|
+
],
|
|
239
|
+
"license": "MIT",
|
|
240
|
+
"optional": true,
|
|
241
|
+
"os": [
|
|
242
|
+
"android"
|
|
243
|
+
],
|
|
244
|
+
"engines": {
|
|
245
|
+
"node": ">= 10"
|
|
246
|
+
},
|
|
247
|
+
"funding": {
|
|
248
|
+
"type": "github",
|
|
249
|
+
"url": "https://github.com/sponsors/Brooooooklyn"
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
"node_modules/@napi-rs/canvas-darwin-arm64": {
|
|
253
|
+
"version": "0.1.100",
|
|
254
|
+
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.100.tgz",
|
|
255
|
+
"integrity": "sha512-2PcswRaC7Ly645DGt88///zuFDhJxJYdKAs1uU3mfk1atYkXufgcgLfBpk6Tm12nCQBaNt1wpybuPZ4qOhTo8A==",
|
|
256
|
+
"cpu": [
|
|
257
|
+
"arm64"
|
|
258
|
+
],
|
|
259
|
+
"license": "MIT",
|
|
260
|
+
"optional": true,
|
|
261
|
+
"os": [
|
|
262
|
+
"darwin"
|
|
263
|
+
],
|
|
264
|
+
"engines": {
|
|
265
|
+
"node": ">= 10"
|
|
266
|
+
},
|
|
267
|
+
"funding": {
|
|
268
|
+
"type": "github",
|
|
269
|
+
"url": "https://github.com/sponsors/Brooooooklyn"
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
"node_modules/@napi-rs/canvas-darwin-x64": {
|
|
273
|
+
"version": "0.1.100",
|
|
274
|
+
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.100.tgz",
|
|
275
|
+
"integrity": "sha512-ePNZtj7pNIva/siZMg+HmbeozkIjqUIYdoymH8HaA3qK7LfzFN4WMBM8G6HQ9ZC+H3+Dnn5pqtiXpgLykaPOhw==",
|
|
276
|
+
"cpu": [
|
|
277
|
+
"x64"
|
|
278
|
+
],
|
|
279
|
+
"license": "MIT",
|
|
280
|
+
"optional": true,
|
|
281
|
+
"os": [
|
|
282
|
+
"darwin"
|
|
283
|
+
],
|
|
284
|
+
"engines": {
|
|
285
|
+
"node": ">= 10"
|
|
286
|
+
},
|
|
287
|
+
"funding": {
|
|
288
|
+
"type": "github",
|
|
289
|
+
"url": "https://github.com/sponsors/Brooooooklyn"
|
|
290
|
+
}
|
|
291
|
+
},
|
|
292
|
+
"node_modules/@napi-rs/canvas-linux-arm-gnueabihf": {
|
|
293
|
+
"version": "0.1.100",
|
|
294
|
+
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.100.tgz",
|
|
295
|
+
"integrity": "sha512-d5cDB48oWFGU8/XPhUOFAlySgb/VAu7D+s8fi55K1Pcfg8aPplHWqMgibhVLU8ky7Pyg/fuiVLz4Nf3JrSTuUA==",
|
|
296
|
+
"cpu": [
|
|
297
|
+
"arm"
|
|
298
|
+
],
|
|
299
|
+
"license": "MIT",
|
|
300
|
+
"optional": true,
|
|
301
|
+
"os": [
|
|
302
|
+
"linux"
|
|
303
|
+
],
|
|
304
|
+
"engines": {
|
|
305
|
+
"node": ">= 10"
|
|
306
|
+
},
|
|
307
|
+
"funding": {
|
|
308
|
+
"type": "github",
|
|
309
|
+
"url": "https://github.com/sponsors/Brooooooklyn"
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
"node_modules/@napi-rs/canvas-linux-arm64-gnu": {
|
|
313
|
+
"version": "0.1.100",
|
|
314
|
+
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.100.tgz",
|
|
315
|
+
"integrity": "sha512-rDxgxRu69RvDlX/bh9o22DxLsGr8EqsNgotL9+RwQE1S0b0cqeatqsw6aW45mukm0B42DIAaAacKaYQ8cqS1nw==",
|
|
316
|
+
"cpu": [
|
|
317
|
+
"arm64"
|
|
318
|
+
],
|
|
319
|
+
"license": "MIT",
|
|
320
|
+
"optional": true,
|
|
321
|
+
"os": [
|
|
322
|
+
"linux"
|
|
323
|
+
],
|
|
324
|
+
"engines": {
|
|
325
|
+
"node": ">= 10"
|
|
326
|
+
},
|
|
327
|
+
"funding": {
|
|
328
|
+
"type": "github",
|
|
329
|
+
"url": "https://github.com/sponsors/Brooooooklyn"
|
|
330
|
+
}
|
|
331
|
+
},
|
|
332
|
+
"node_modules/@napi-rs/canvas-linux-arm64-musl": {
|
|
333
|
+
"version": "0.1.100",
|
|
334
|
+
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.100.tgz",
|
|
335
|
+
"integrity": "sha512-K3mDW66N+xT2/V439u1alFANiBUjdEx2gLiNYnCmUsva5jZMxWTjafBYwTzYK+EMFMHrUoabuU+T1BIP5CgbYQ==",
|
|
336
|
+
"cpu": [
|
|
337
|
+
"arm64"
|
|
338
|
+
],
|
|
339
|
+
"license": "MIT",
|
|
340
|
+
"optional": true,
|
|
341
|
+
"os": [
|
|
342
|
+
"linux"
|
|
343
|
+
],
|
|
344
|
+
"engines": {
|
|
345
|
+
"node": ">= 10"
|
|
346
|
+
},
|
|
347
|
+
"funding": {
|
|
348
|
+
"type": "github",
|
|
349
|
+
"url": "https://github.com/sponsors/Brooooooklyn"
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
"node_modules/@napi-rs/canvas-linux-riscv64-gnu": {
|
|
353
|
+
"version": "0.1.100",
|
|
354
|
+
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.100.tgz",
|
|
355
|
+
"integrity": "sha512-mooqUBTIsccZpnoQC4NgrC1v6C1vof39etLNMnBwCY+p0gajWJvAHLGQ6g/gGyS5YrpDW+GefSN4+Cvcr08UWw==",
|
|
356
|
+
"cpu": [
|
|
357
|
+
"riscv64"
|
|
358
|
+
],
|
|
359
|
+
"license": "MIT",
|
|
360
|
+
"optional": true,
|
|
361
|
+
"os": [
|
|
362
|
+
"linux"
|
|
363
|
+
],
|
|
364
|
+
"engines": {
|
|
365
|
+
"node": ">= 10"
|
|
366
|
+
},
|
|
367
|
+
"funding": {
|
|
368
|
+
"type": "github",
|
|
369
|
+
"url": "https://github.com/sponsors/Brooooooklyn"
|
|
370
|
+
}
|
|
371
|
+
},
|
|
372
|
+
"node_modules/@napi-rs/canvas-linux-x64-gnu": {
|
|
373
|
+
"version": "0.1.100",
|
|
374
|
+
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.100.tgz",
|
|
375
|
+
"integrity": "sha512-1eCvkDCazm7FFhsT7DfGOdSaHgZVK3bt/dSBl5EWHOWmnz+I7j8tPseJqqD81NF+MH21jKUK4wQSDjN0mdhnTg==",
|
|
376
|
+
"cpu": [
|
|
377
|
+
"x64"
|
|
378
|
+
],
|
|
379
|
+
"license": "MIT",
|
|
380
|
+
"optional": true,
|
|
381
|
+
"os": [
|
|
382
|
+
"linux"
|
|
383
|
+
],
|
|
384
|
+
"engines": {
|
|
385
|
+
"node": ">= 10"
|
|
386
|
+
},
|
|
387
|
+
"funding": {
|
|
388
|
+
"type": "github",
|
|
389
|
+
"url": "https://github.com/sponsors/Brooooooklyn"
|
|
390
|
+
}
|
|
391
|
+
},
|
|
392
|
+
"node_modules/@napi-rs/canvas-linux-x64-musl": {
|
|
393
|
+
"version": "0.1.100",
|
|
394
|
+
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.100.tgz",
|
|
395
|
+
"integrity": "sha512-20arT6lnI19S68qNlii73TSEDbECNgzMz2EpldC1V3mZFuRkeujXkcebRk0LRJe9SEUAooYiLokfMViY8IX7yA==",
|
|
396
|
+
"cpu": [
|
|
397
|
+
"x64"
|
|
398
|
+
],
|
|
399
|
+
"license": "MIT",
|
|
400
|
+
"optional": true,
|
|
401
|
+
"os": [
|
|
402
|
+
"linux"
|
|
403
|
+
],
|
|
404
|
+
"engines": {
|
|
405
|
+
"node": ">= 10"
|
|
406
|
+
},
|
|
407
|
+
"funding": {
|
|
408
|
+
"type": "github",
|
|
409
|
+
"url": "https://github.com/sponsors/Brooooooklyn"
|
|
410
|
+
}
|
|
411
|
+
},
|
|
412
|
+
"node_modules/@napi-rs/canvas-win32-arm64-msvc": {
|
|
413
|
+
"version": "0.1.100",
|
|
414
|
+
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.100.tgz",
|
|
415
|
+
"integrity": "sha512-DZFFT1wIAg37LJw37yhMRFfjATd3vTQzjZ1Yki8u2vhO6Hi5VE6BVaGQ1aaDu7xb4iMErz+9EOwjpS7xcxFeBw==",
|
|
416
|
+
"cpu": [
|
|
417
|
+
"arm64"
|
|
418
|
+
],
|
|
419
|
+
"license": "MIT",
|
|
420
|
+
"optional": true,
|
|
421
|
+
"os": [
|
|
422
|
+
"win32"
|
|
423
|
+
],
|
|
424
|
+
"engines": {
|
|
425
|
+
"node": ">= 10"
|
|
426
|
+
},
|
|
427
|
+
"funding": {
|
|
428
|
+
"type": "github",
|
|
429
|
+
"url": "https://github.com/sponsors/Brooooooklyn"
|
|
430
|
+
}
|
|
431
|
+
},
|
|
432
|
+
"node_modules/@napi-rs/canvas-win32-x64-msvc": {
|
|
433
|
+
"version": "0.1.100",
|
|
434
|
+
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.100.tgz",
|
|
435
|
+
"integrity": "sha512-MyT1j3mHC2+Lu4pBi9mKyMJhtP6U7k7EldY7sj/uS5gJA65gTXt8MefJQXLJo5d/vZbuWmfxzkEUNc/urV3pHA==",
|
|
436
|
+
"cpu": [
|
|
437
|
+
"x64"
|
|
438
|
+
],
|
|
439
|
+
"license": "MIT",
|
|
440
|
+
"optional": true,
|
|
441
|
+
"os": [
|
|
442
|
+
"win32"
|
|
443
|
+
],
|
|
444
|
+
"engines": {
|
|
445
|
+
"node": ">= 10"
|
|
446
|
+
},
|
|
447
|
+
"funding": {
|
|
448
|
+
"type": "github",
|
|
449
|
+
"url": "https://github.com/sponsors/Brooooooklyn"
|
|
450
|
+
}
|
|
451
|
+
},
|
|
199
452
|
"node_modules/@napi-rs/wasm-runtime": {
|
|
200
453
|
"version": "1.1.4",
|
|
201
454
|
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
|
|
@@ -524,6 +777,13 @@
|
|
|
524
777
|
"assertion-error": "^2.0.1"
|
|
525
778
|
}
|
|
526
779
|
},
|
|
780
|
+
"node_modules/@types/d3-force": {
|
|
781
|
+
"version": "3.0.10",
|
|
782
|
+
"resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz",
|
|
783
|
+
"integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==",
|
|
784
|
+
"dev": true,
|
|
785
|
+
"license": "MIT"
|
|
786
|
+
},
|
|
527
787
|
"node_modules/@types/deep-eql": {
|
|
528
788
|
"version": "4.0.2",
|
|
529
789
|
"resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
|
|
@@ -1038,6 +1298,47 @@
|
|
|
1038
1298
|
"node": ">= 8"
|
|
1039
1299
|
}
|
|
1040
1300
|
},
|
|
1301
|
+
"node_modules/d3-dispatch": {
|
|
1302
|
+
"version": "3.0.1",
|
|
1303
|
+
"resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
|
|
1304
|
+
"integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
|
|
1305
|
+
"license": "ISC",
|
|
1306
|
+
"engines": {
|
|
1307
|
+
"node": ">=12"
|
|
1308
|
+
}
|
|
1309
|
+
},
|
|
1310
|
+
"node_modules/d3-force": {
|
|
1311
|
+
"version": "3.0.0",
|
|
1312
|
+
"resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
|
|
1313
|
+
"integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
|
|
1314
|
+
"license": "ISC",
|
|
1315
|
+
"dependencies": {
|
|
1316
|
+
"d3-dispatch": "1 - 3",
|
|
1317
|
+
"d3-quadtree": "1 - 3",
|
|
1318
|
+
"d3-timer": "1 - 3"
|
|
1319
|
+
},
|
|
1320
|
+
"engines": {
|
|
1321
|
+
"node": ">=12"
|
|
1322
|
+
}
|
|
1323
|
+
},
|
|
1324
|
+
"node_modules/d3-quadtree": {
|
|
1325
|
+
"version": "3.0.1",
|
|
1326
|
+
"resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
|
|
1327
|
+
"integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
|
|
1328
|
+
"license": "ISC",
|
|
1329
|
+
"engines": {
|
|
1330
|
+
"node": ">=12"
|
|
1331
|
+
}
|
|
1332
|
+
},
|
|
1333
|
+
"node_modules/d3-timer": {
|
|
1334
|
+
"version": "3.0.1",
|
|
1335
|
+
"resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
|
|
1336
|
+
"integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
|
|
1337
|
+
"license": "ISC",
|
|
1338
|
+
"engines": {
|
|
1339
|
+
"node": ">=12"
|
|
1340
|
+
}
|
|
1341
|
+
},
|
|
1041
1342
|
"node_modules/debug": {
|
|
1042
1343
|
"version": "4.4.3",
|
|
1043
1344
|
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
|
|
@@ -3410,6 +3711,23 @@
|
|
|
3410
3711
|
"typescript": "^5.7.0"
|
|
3411
3712
|
}
|
|
3412
3713
|
},
|
|
3714
|
+
"plugins/graph-viewer/mcp": {
|
|
3715
|
+
"name": "@maxy/graph-viewer",
|
|
3716
|
+
"version": "0.1.0",
|
|
3717
|
+
"dependencies": {
|
|
3718
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
3719
|
+
"@napi-rs/canvas": "^0.1.56",
|
|
3720
|
+
"d3-force": "^3.0.0",
|
|
3721
|
+
"neo4j-driver": "^5.28.1",
|
|
3722
|
+
"zod": "^3.23.0"
|
|
3723
|
+
},
|
|
3724
|
+
"devDependencies": {
|
|
3725
|
+
"@types/d3-force": "^3.0.10",
|
|
3726
|
+
"@types/node": "^22.0.0",
|
|
3727
|
+
"typescript": "^5.7.0",
|
|
3728
|
+
"vitest": "^4.1.2"
|
|
3729
|
+
}
|
|
3730
|
+
},
|
|
3413
3731
|
"plugins/memory/mcp": {
|
|
3414
3732
|
"name": "@maxy/memory",
|
|
3415
3733
|
"version": "0.1.0",
|