@rubytech/create-maxy-code 0.1.505 → 0.1.507
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 +2 -2
- package/payload/platform/config/brand.json +79 -18
- package/payload/platform/lib/account-schema-regions/dist/index.d.ts +72 -0
- package/payload/platform/lib/account-schema-regions/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/account-schema-regions/dist/index.js +115 -0
- package/payload/platform/lib/account-schema-regions/dist/index.js.map +1 -0
- package/payload/platform/lib/account-schema-regions/package.json +7 -0
- package/payload/platform/lib/account-schema-regions/src/index.ts +135 -0
- package/payload/platform/lib/account-schema-regions/tsconfig.json +9 -0
- package/payload/platform/package.json +3 -3
- package/payload/platform/plugins/admin/PLUGIN.md +36 -0
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +105 -17
- package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +3 -3
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +13 -0
- package/payload/platform/plugins/aeo/PLUGIN.md +3 -0
- package/payload/platform/plugins/browser/PLUGIN.md +18 -0
- package/payload/platform/plugins/connector/PLUGIN.md +4 -0
- package/payload/platform/plugins/contacts/PLUGIN.md +9 -0
- package/payload/platform/plugins/docs/references/admin-ui.md +78 -16
- package/payload/platform/plugins/docs/references/plugins-guide.md +26 -0
- package/payload/platform/plugins/email/PLUGIN.md +17 -0
- package/payload/platform/plugins/filesystem/PLUGIN.md +6 -0
- package/payload/platform/plugins/google/PLUGIN.md +12 -0
- package/payload/platform/plugins/graph/PLUGIN.md +3 -0
- package/payload/platform/plugins/graph-viewer/PLUGIN.md +1 -0
- package/payload/platform/plugins/ledger/PLUGIN.md +7 -0
- package/payload/platform/plugins/memory/PLUGIN.md +41 -0
- package/payload/platform/plugins/outlook/PLUGIN.md +24 -0
- package/payload/platform/plugins/quickbooks/PLUGIN.md +15 -0
- package/payload/platform/plugins/replicate/PLUGIN.md +3 -0
- package/payload/platform/plugins/scheduling/PLUGIN.md +10 -0
- package/payload/platform/plugins/storage-broker/PLUGIN.md +12 -0
- package/payload/platform/plugins/telegram/PLUGIN.md +3 -0
- package/payload/platform/plugins/url-get/PLUGIN.md +1 -0
- package/payload/platform/plugins/voice-mirror/PLUGIN.md +5 -0
- package/payload/platform/plugins/whatsapp/PLUGIN.md +12 -0
- package/payload/platform/plugins/work/PLUGIN.md +15 -0
- package/payload/platform/plugins/workflows/PLUGIN.md +8 -0
- package/payload/platform/scripts/check-no-esm-require.mjs +5 -0
- package/payload/platform/scripts/check-risk-class.mjs +145 -0
- package/payload/platform/scripts/lib/__pycache__/account-schema-owned-dirs.cpython-314.pyc +0 -0
- package/payload/platform/scripts/lib/provision-account-dir.sh +4 -1
- package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts +1 -1
- package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js +50 -3
- package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +4 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +8 -0
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts +13 -0
- package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/tool-surface.js +33 -8
- package/payload/platform/services/claude-session-manager/dist/tool-surface.js.map +1 -1
- package/payload/server/{chunk-HN4HFTXE.js → chunk-2WAXM5N2.js} +1504 -1503
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/public/activity.html +5 -5
- package/payload/server/public/agents.html +4 -4
- package/payload/server/public/assets/{AdminLoginScreens-DeWt3H7l.js → AdminLoginScreens-YT7jsh_H.js} +1 -1
- package/payload/server/public/assets/{AdminShell-u32d8puE.js → AdminShell-Ckht9hmU.js} +2 -2
- package/payload/server/public/assets/{activity-DjP45-DD.js → activity-DH3Wgc3O.js} +1 -1
- package/payload/server/public/assets/admin-DetvulAu.js +1 -0
- package/payload/server/public/assets/agents-X_IvDHLZ.js +1 -0
- package/payload/server/public/assets/{browser-ULvl_K5x.js → browser-Bym8QhfA.js} +1 -1
- package/payload/server/public/assets/{calendar-CGMrT6WZ.js → calendar-CFnufJOy.js} +1 -1
- package/payload/server/public/assets/chat-wrckyIpw.js +1 -0
- package/payload/server/public/assets/chevron-left-Dtk3jEK5.js +1 -0
- package/payload/server/public/assets/chevron-right-Dih6IZ8B.js +1 -0
- package/payload/server/public/assets/clock-iJCrrmWM.js +1 -0
- package/payload/server/public/assets/data-D76--TYs.js +1 -0
- package/payload/server/public/assets/{file-text-C5K6DMcK.js → file-text-zch0E1GJ.js} +1 -1
- package/payload/server/public/assets/{graph-CO6e1bgD.js → graph-BavHLzpV.js} +2 -2
- package/payload/server/public/assets/{graph-labels-iliQjlfE.js → graph-labels-CBwh4g-6.js} +1 -1
- package/payload/server/public/assets/{maximize-2-D-64XK6V.js → maximize-2-bTn_Ozpi.js} +1 -1
- package/payload/server/public/assets/{operator-DyXgogJ1.js → operator-a4IOwf62.js} +1 -1
- package/payload/server/public/assets/page-3T2mE63b.js +1 -0
- package/payload/server/public/assets/page-D6M1CmPe.js +32 -0
- package/payload/server/public/assets/{public-B9NVDBxW.js → public-B3y_YU1G.js} +1 -1
- package/payload/server/public/assets/{rotate-ccw-P35h7ogS.js → rotate-ccw-BGvzNB1b.js} +1 -1
- package/payload/server/public/assets/{routines-BeiynLF7.js → routines-C7Dr16am.js} +1 -1
- package/payload/server/public/assets/{skills-C5H7ohLp.js → skills-DFeb3XO3.js} +1 -1
- package/payload/server/public/assets/tasks-CSfnCKJe.js +1 -0
- package/payload/server/public/assets/{time-entry-format-CDhHCMrW.js → time-entry-format-BgZqOOqG.js} +1 -1
- package/payload/server/public/assets/{triangle-alert-OgY71rDV.js → triangle-alert-DBJ7xz_t.js} +1 -1
- package/payload/server/public/assets/{useCopyFeedback-jOGmWwa3.js → useCopyFeedback-BFOujMl-.js} +1 -1
- package/payload/server/public/assets/{useSubAccountSwitcher-6AFuRawP.js → useSubAccountSwitcher-0PfRrN6i.js} +1 -1
- package/payload/server/public/assets/useSubAccountSwitcher-BkQ5tA8A.css +1 -0
- package/payload/server/public/assets/{useVoiceRecorder-CnE3fhfV.js → useVoiceRecorder-BP6CpYQD.js} +1 -1
- package/payload/server/public/assets/{wrench-B1hsCj0R.js → wrench-DdaRhfzS.js} +1 -1
- package/payload/server/public/brand/fonts/inter-400.woff2 +0 -0
- package/payload/server/public/brand/fonts/inter-500.woff2 +0 -0
- package/payload/server/public/brand-defaults.css +47 -4
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +7 -7
- package/payload/server/public/chat.html +13 -13
- package/payload/server/public/data.html +11 -11
- package/payload/server/public/graph.html +9 -9
- package/payload/server/public/index.html +14 -14
- package/payload/server/public/operator.html +14 -14
- package/payload/server/public/public.html +13 -13
- package/payload/server/public/routines.html +6 -6
- package/payload/server/public/skills.html +5 -5
- package/payload/server/public/tasks.html +6 -6
- package/payload/server/server.js +1991 -1372
- package/payload/server/public/assets/admin-Bo-Y6Vjx.js +0 -1
- package/payload/server/public/assets/agents-C80aCXd8.js +0 -1
- package/payload/server/public/assets/chat-DnWXaWD4.js +0 -1
- package/payload/server/public/assets/chevron-left-BB5Iljw-.js +0 -1
- package/payload/server/public/assets/chevron-right-DijU96_j.js +0 -1
- package/payload/server/public/assets/clock-DsmnhhJh.js +0 -1
- package/payload/server/public/assets/data-JPlhOLGC.js +0 -1
- package/payload/server/public/assets/page-DrbiAFS-.js +0 -32
- package/payload/server/public/assets/page-WeM2ry61.js +0 -1
- package/payload/server/public/assets/tasks-CI74_b6H.js +0 -1
- package/payload/server/public/assets/useSubAccountSwitcher-AFSwtthL.css +0 -1
|
@@ -6,111 +6,147 @@ tools:
|
|
|
6
6
|
- name: system-status
|
|
7
7
|
publicAllowlist: false
|
|
8
8
|
adminAllowlist: false
|
|
9
|
+
riskClass: read
|
|
9
10
|
- name: public-hostname
|
|
10
11
|
publicAllowlist: false
|
|
11
12
|
adminAllowlist: false
|
|
13
|
+
riskClass: read
|
|
12
14
|
- name: admin-hostname
|
|
13
15
|
publicAllowlist: false
|
|
14
16
|
adminAllowlist: false
|
|
17
|
+
riskClass: read
|
|
15
18
|
- name: publish-site
|
|
16
19
|
publicAllowlist: false
|
|
17
20
|
adminAllowlist: false
|
|
21
|
+
riskClass: write_local
|
|
18
22
|
- name: brand-settings
|
|
19
23
|
publicAllowlist: false
|
|
20
24
|
adminAllowlist: false
|
|
25
|
+
riskClass: write_local
|
|
21
26
|
- name: account-manage
|
|
22
27
|
publicAllowlist: false
|
|
23
28
|
adminAllowlist: false
|
|
29
|
+
riskClass: write_local
|
|
24
30
|
- name: capabilities-here
|
|
25
31
|
publicAllowlist: false
|
|
26
32
|
adminAllowlist: false
|
|
33
|
+
riskClass: read
|
|
27
34
|
- name: account-update
|
|
28
35
|
publicAllowlist: false
|
|
29
36
|
adminAllowlist: false
|
|
37
|
+
riskClass: write_local
|
|
30
38
|
- name: account_list
|
|
31
39
|
publicAllowlist: false
|
|
32
40
|
adminAllowlist: true
|
|
41
|
+
riskClass: read
|
|
33
42
|
- name: account_roster
|
|
34
43
|
publicAllowlist: false
|
|
35
44
|
adminAllowlist: true
|
|
45
|
+
riskClass: read
|
|
36
46
|
- name: account_create
|
|
37
47
|
publicAllowlist: false
|
|
38
48
|
adminAllowlist: true
|
|
49
|
+
riskClass: write_local
|
|
39
50
|
- name: account_reassign_admin
|
|
40
51
|
publicAllowlist: false
|
|
41
52
|
adminAllowlist: true
|
|
53
|
+
riskClass: write_local
|
|
42
54
|
- name: account_set_owner_name
|
|
43
55
|
publicAllowlist: false
|
|
44
56
|
adminAllowlist: true
|
|
57
|
+
riskClass: write_local
|
|
45
58
|
- name: account_delete
|
|
46
59
|
publicAllowlist: false
|
|
47
60
|
adminAllowlist: true
|
|
61
|
+
riskClass: write_local
|
|
48
62
|
- name: account_purge
|
|
49
63
|
publicAllowlist: false
|
|
50
64
|
adminAllowlist: true
|
|
65
|
+
riskClass: write_local
|
|
51
66
|
- name: account_channel_routing
|
|
52
67
|
publicAllowlist: false
|
|
53
68
|
adminAllowlist: true
|
|
69
|
+
riskClass: read
|
|
54
70
|
- name: account_channel_routing_set
|
|
55
71
|
publicAllowlist: false
|
|
56
72
|
adminAllowlist: true
|
|
73
|
+
riskClass: write_local
|
|
57
74
|
- name: admin-add
|
|
58
75
|
publicAllowlist: false
|
|
59
76
|
adminAllowlist: true
|
|
77
|
+
riskClass: write_local
|
|
60
78
|
- name: admin-remove
|
|
61
79
|
publicAllowlist: false
|
|
62
80
|
adminAllowlist: true
|
|
81
|
+
riskClass: write_local
|
|
63
82
|
- name: admin-list
|
|
64
83
|
publicAllowlist: false
|
|
65
84
|
adminAllowlist: true
|
|
85
|
+
riskClass: read
|
|
66
86
|
- name: admin-update-pin
|
|
67
87
|
publicAllowlist: false
|
|
68
88
|
adminAllowlist: true
|
|
89
|
+
riskClass: write_local
|
|
69
90
|
- name: agent-list
|
|
70
91
|
publicAllowlist: false
|
|
71
92
|
adminAllowlist: true
|
|
93
|
+
riskClass: read
|
|
72
94
|
- name: agent-config-read
|
|
73
95
|
publicAllowlist: false
|
|
74
96
|
adminAllowlist: true
|
|
97
|
+
riskClass: read
|
|
75
98
|
- name: logs-read
|
|
76
99
|
publicAllowlist: false
|
|
77
100
|
adminAllowlist: false
|
|
101
|
+
riskClass: read
|
|
78
102
|
- name: cpu-triage-start
|
|
79
103
|
publicAllowlist: false
|
|
80
104
|
adminAllowlist: true
|
|
105
|
+
riskClass: exec
|
|
81
106
|
- name: cpu-triage-read
|
|
82
107
|
publicAllowlist: false
|
|
83
108
|
adminAllowlist: true
|
|
109
|
+
riskClass: read
|
|
84
110
|
- name: plugin-read
|
|
85
111
|
publicAllowlist: false
|
|
86
112
|
adminAllowlist: false
|
|
113
|
+
riskClass: read
|
|
87
114
|
- name: skill-load
|
|
88
115
|
publicAllowlist: false
|
|
89
116
|
adminAllowlist: true
|
|
117
|
+
riskClass: read
|
|
90
118
|
- name: skill-search
|
|
91
119
|
publicAllowlist: false
|
|
92
120
|
adminAllowlist: true
|
|
121
|
+
riskClass: read
|
|
93
122
|
- name: store-skill
|
|
94
123
|
publicAllowlist: false
|
|
95
124
|
adminAllowlist: true
|
|
125
|
+
riskClass: write_local
|
|
96
126
|
- name: session-reset
|
|
97
127
|
publicAllowlist: false
|
|
98
128
|
adminAllowlist: true
|
|
129
|
+
riskClass: write_local
|
|
99
130
|
- name: session-resume
|
|
100
131
|
publicAllowlist: false
|
|
101
132
|
adminAllowlist: true
|
|
133
|
+
riskClass: write_local
|
|
102
134
|
- name: action-pending
|
|
103
135
|
publicAllowlist: false
|
|
104
136
|
adminAllowlist: true
|
|
137
|
+
riskClass: read
|
|
105
138
|
- name: action-approve
|
|
106
139
|
publicAllowlist: false
|
|
107
140
|
adminAllowlist: true
|
|
141
|
+
riskClass: external
|
|
108
142
|
- name: action-reject
|
|
109
143
|
publicAllowlist: false
|
|
110
144
|
adminAllowlist: true
|
|
145
|
+
riskClass: write_local
|
|
111
146
|
- name: action-edit
|
|
112
147
|
publicAllowlist: false
|
|
113
148
|
adminAllowlist: true
|
|
149
|
+
riskClass: write_local
|
|
114
150
|
hidden:
|
|
115
151
|
- remote-auth-status
|
|
116
152
|
- remote-auth-set-password
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-architecture
|
|
3
3
|
description: Use when grounding any documented-surface claim about what Maxy ships — plugins, skills, specialists, install/deploy flows, internals. This is the install catalogue, not evidence of what is enabled on the current account. For install state on this account, call `capabilities-here`; for documented surface, cite the `Source:` URL inline.
|
|
4
|
-
content-hash: sha256:
|
|
4
|
+
content-hash: sha256:a1e6cd6d7cccbf1c314340dd556761adf9aac772939fcd6a870265d0f7c00e1b
|
|
5
5
|
brand: maxy-code
|
|
6
6
|
product-name: Maxy
|
|
7
7
|
---
|
|
@@ -474,6 +474,32 @@ Skill content, plugin manifests, agent templates, and reference files reference
|
|
|
474
474
|
|
|
475
475
|
The runtime substitution happens at every read site that flows content into a system prompt or operator-visible UI: the admin agent's `plugin-read` tool (references + `PLUGIN.md`), the `skill-load` tool (SKILL.md by skill name — one-call resolver+reader, the canonical primitive for SKILL.md), the public agent's recursive plugin assembly, and `IDENTITY` / `SOUL` / `AGENTS` / `KNOWLEDGE` markdown reads. Missing or empty `productName` hard-fails — there is no fallback to a default brand string. See [.docs/agents.md](../../.docs/agents.md) § "Brand templating" for the full contract.
|
|
476
476
|
|
|
477
|
+
## Tool risk classes (for plugin authors)
|
|
478
|
+
|
|
479
|
+
Every tool a plugin declares in its `PLUGIN.md` `tools:` block carries three mandatory
|
|
480
|
+
fields. `publicAllowlist` and `adminAllowlist` say who may call the tool. `riskClass`
|
|
481
|
+
says what happens when they do, and takes one of four values:
|
|
482
|
+
|
|
483
|
+
- `read` changes no state anywhere. A remote lookup counts as `read`; reaching the
|
|
484
|
+
network is not by itself consequential.
|
|
485
|
+
- `write_local` mutates account files or the graph on this device and transmits nothing.
|
|
486
|
+
- `exec` runs an operating-system command, or code supplied by the caller or the operator.
|
|
487
|
+
- `external` transmits to, or changes state on, a system outside this device, or delivers
|
|
488
|
+
a message to a person.
|
|
489
|
+
|
|
490
|
+
Leaving the field out is a refusal-to-boot condition, not a silent default. The platform
|
|
491
|
+
refuses to start rather than treat an undeclared consequence as harmless, because a tool
|
|
492
|
+
that quietly reads as `read` escapes every check downstream of it.
|
|
493
|
+
|
|
494
|
+
Declaring the class does not yet gate anything. It gives any consumer one honest answer
|
|
495
|
+
to the question "is this tool consequential?" without maintaining a list of tool names,
|
|
496
|
+
which is what the checks in `platform/plugins/admin/hooks/` have had to do until now.
|
|
497
|
+
|
|
498
|
+
A publish-time gate flags declarations that contradict what the tool's own name says it
|
|
499
|
+
does, and a boot line reports the census across all four classes. The classification
|
|
500
|
+
rule, the exception mechanism, and the diagnostic commands are in
|
|
501
|
+
`.docs/tool-risk-classes.md`.
|
|
502
|
+
|
|
477
503
|
## MCP Plugin Observability (for plugin authors)
|
|
478
504
|
|
|
479
505
|
Every `console.error` line from a plugin's MCP server is captured to a per-server raw log. Capture is automatic and needs no import or call: the `mcp-spawn-tee` shim spawns every MCP server and mirrors its stderr to `mcp-<name>-<sessionId>.log` (or `mcp-<name>-nosession.log` for a spawn with no session). That file is keyed by session, which is the conversation, and that is where you grep. Prefix your diagnostics `[your-tool]` so a grep isolates one tool.
|
|
@@ -3101,25 +3127,49 @@ kinds, each card tagged `Public` or `Specialist`:
|
|
|
3101
3127
|
link.
|
|
3102
3128
|
|
|
3103
3129
|
The former "Public" flyout toggle in the account menu was removed; this page is
|
|
3104
|
-
the sole agent surface.
|
|
3105
|
-
|
|
3106
|
-
|
|
3130
|
+
the sole agent surface.
|
|
3131
|
+
|
|
3132
|
+
**Account scope.** The route (`server/routes/admin/agents.ts`) never infers an
|
|
3133
|
+
account from device state. The two reads resolve from the caller's admin session
|
|
3134
|
+
(`requireAdminSession` + the shared `accountDirForSession` in
|
|
3135
|
+
`server/routes/admin/_account-scope.ts`), returning 401 when the session maps to
|
|
3136
|
+
no valid account. The two writes carry no admin session (the
|
|
3137
|
+
`public-agent-manager` skill calls them), so they take an explicit `accountId`
|
|
3138
|
+
query parameter validated against the account list and refuse a missing or
|
|
3139
|
+
unknown one with 400 — never defaulting to a resolved account. `:slug` params
|
|
3140
|
+
reject `/`, `..`, `\` (the traversal guard); specialist detail is selected by an
|
|
3141
|
+
explicit `?plugin=` parameter, not inferred from `--` in the slug.
|
|
3107
3142
|
|
|
3108
3143
|
| Route | Behaviour |
|
|
3109
3144
|
|-------|-----------|
|
|
3110
|
-
| `GET /api/admin/agents` | Lists public `agents/*/` dirs (never the `admin` agent) plus user-created specialists from `plugins/*/agents/*.md`, each row tagged `kind`. Returns `{agents, skipped, specialistsSkipped}` — `skipped` counts public dirs whose `config.json` failed to parse; `specialistsSkipped` counts specialist `.md` files with no parseable `name`. |
|
|
3111
|
-
| `GET /api/admin/agents/:slug` |
|
|
3112
|
-
| `DELETE /api/admin/agents/:slug
|
|
3113
|
-
|
|
3114
|
-
|
|
3115
|
-
|
|
3116
|
-
|
|
3117
|
-
|
|
3118
|
-
|
|
3119
|
-
|
|
3120
|
-
`op=list
|
|
3121
|
-
|
|
3122
|
-
|
|
3145
|
+
| `GET /api/admin/agents` | Session-scoped. Lists the session account's public `agents/*/` dirs (never the `admin` agent) plus its user-created specialists from `plugins/*/agents/*.md`, each row tagged `kind`. Returns `{agents, accountId, skipped, specialistsSkipped}` — `accountId` names the account resolved (the client sends it back on a delete); `skipped` counts public dirs whose `config.json` failed to parse; `specialistsSkipped` counts specialist `.md` files with no parseable `name`. 401 when the session maps to no account. |
|
|
3146
|
+
| `GET /api/admin/agents/:slug` | Session-scoped. Without `?plugin=`, returns a public agent's config fields + four owned docs + a `present` map (a missing or unreadable doc is `''`/`present.<role>=false`, never a 500). With `?plugin=`, returns that plugin's specialist `{kind, model, tools, systemPrompt, skills}`. Unknown 404s, 401 as above. |
|
|
3147
|
+
| `DELETE /api/admin/agents/:slug?accountId=` | Public agents only, on the named validated account. Removes the dir after `deleteAgentProjection`; refuses the `admin` slug (403) and a missing/unknown `accountId` (400) with no write. Loud-fail: a graph-cleanup throw aborts the file removal. |
|
|
3148
|
+
| `POST /api/admin/agents/:slug/project?accountId=` | Re-projects the named account's on-disk agent into the graph. Same `accountId` contract as delete. |
|
|
3149
|
+
|
|
3150
|
+
Observability rides `[admin/agents]`, and **every line names the account it acted
|
|
3151
|
+
on** (`accountId=<id8>`) — a well-formed answer about the wrong account is
|
|
3152
|
+
otherwise indistinguishable from a correct one, which is exactly how an empty
|
|
3153
|
+
Agents page survived undiagnosed on a multi-account install.
|
|
3154
|
+
|
|
3155
|
+
- `op=list accountId=<id8> agents=<n> specialists=<m> skipped=<x> specialistsSkipped=<y>`
|
|
3156
|
+
— the heartbeat. Compare `accountId` against the account the operator is
|
|
3157
|
+
viewing; `skipped>0`/`specialistsSkipped>0` is a malformed-source signal the
|
|
3158
|
+
page renders as a banner, and `specialists=0` with user plugins present is the
|
|
3159
|
+
broken-walk signature.
|
|
3160
|
+
- `op=detail accountId=<id8> slug=<…> kind=<public|specialist>` — with
|
|
3161
|
+
`present=<comma-list|none>` on the public branch, where a role absent for an
|
|
3162
|
+
agent expected complete is the missing-doc signature. One
|
|
3163
|
+
`op=list-specialist-skip plugin=<p> file=<f>` per unreadable specialist.
|
|
3164
|
+
- `op=<list|detail> auth-rejected reason=no-account-for-session` — the session
|
|
3165
|
+
maps to no valid account. No `op=list` line at all for a page load means the
|
|
3166
|
+
request never reached the handler, a distinct signature from a zero count.
|
|
3167
|
+
- `op=<delete|project> rejected reason=<missing-accountId|unknown-accountId>` —
|
|
3168
|
+
a caller that did not name its account. A skill that was not updated produces
|
|
3169
|
+
this on its first call instead of writing to the wrong account.
|
|
3170
|
+
- `op=delete accountId=<id8> slug=<…> outcome=<ok|failed>` with
|
|
3171
|
+
`reason=<graph-cleanup-failed|rm-error>` on failure (files preserved on a
|
|
3172
|
+
graph-cleanup throw).
|
|
3123
3173
|
|
|
3124
3174
|
### Graph
|
|
3125
3175
|
|
|
@@ -3253,6 +3303,44 @@ the Web Share API and is disabled where unavailable. Signals:
|
|
|
3253
3303
|
`[data-ui] op=mount header=operator home=absent`, `op=select-enter`,
|
|
3254
3304
|
`op=select-exit reason=<cancel|action>`, `op=share supported=<bool> count=<n>`.
|
|
3255
3305
|
|
|
3306
|
+
**The dashboard has a surface ramp and a display type tier.** Every page sits on
|
|
3307
|
+
a page plane, cards rise onto a raised plane, and inputs and scroll regions
|
|
3308
|
+
recede onto an inset plane. Each brand chooses how the card separates: SiteDesk's
|
|
3309
|
+
card is a shade lighter than its page and casts no shadow, Real Agent's card and
|
|
3310
|
+
page are both white and a shadow does the work. The page header is an inverted
|
|
3311
|
+
band carrying the page title at the display size. Colours, radii, shadows and
|
|
3312
|
+
type weights all come from the brand's own tokens; nothing is hardcoded, and a
|
|
3313
|
+
token that resolves to nothing fails the build rather than painting invisibly.
|
|
3314
|
+
|
|
3315
|
+
**Folders open beside a rail on a wide screen.** At 1280px and above the folder
|
|
3316
|
+
view splits in two: a list of the account's folders on the left, the files on
|
|
3317
|
+
the right, with the folder you are in highlighted. Below that width the rail is
|
|
3318
|
+
hidden and the breadcrumb does the same job.
|
|
3319
|
+
|
|
3320
|
+
**Status colours are shared.** Success, warning, error and info each carry a
|
|
3321
|
+
solid fill, a pale tint and a text colour for that tint. Every pairing meets the
|
|
3322
|
+
WCAG AA contrast minimum, on every brand.
|
|
3323
|
+
|
|
3324
|
+
**`/data` opens on the account's own folders, as cards.** With no `#path=` in
|
|
3325
|
+
the URL the browser lands on **home**: the account's business folders (the
|
|
3326
|
+
entity folders of its trade, plus documents, projects, contacts, the work it
|
|
3327
|
+
has produced for you, anything a client has sent in, and any websites it
|
|
3328
|
+
has published) shown
|
|
3329
|
+
one per card, each listing the first 20 things inside it and a `+N more` row
|
|
3330
|
+
past that. Tapping a card opens that folder in the ordinary list or grid. There
|
|
3331
|
+
are never loose files at this level. Everything the platform and its plugins
|
|
3332
|
+
keep for themselves — caches, logs, published sites, plugin workspaces, hidden
|
|
3333
|
+
folders — sits behind a single **system** card at the end, and opens as the
|
|
3334
|
+
ordinary list too. The split comes from the account's own `SCHEMA.md`, so it
|
|
3335
|
+
follows the graph ontology rather than a hardcoded list, and nothing moves on
|
|
3336
|
+
disk. Upload and New folder are disabled on the cards view because it names no
|
|
3337
|
+
single folder to write into; open a folder first. The flat account root is still
|
|
3338
|
+
reachable from the account name in the breadcrumb, which is the way back if a
|
|
3339
|
+
folder is ever grouped wrongly. Signals: `[data-schema] op=classify` on every
|
|
3340
|
+
account-root listing (`home=`, `system=`, `unknown=`, `status=ok|parse-failed`),
|
|
3341
|
+
`op=home-files` when a name that should be a folder is a file, and
|
|
3342
|
+
`op=card-children … status=error` when one card's folder could not be read.
|
|
3343
|
+
|
|
3256
3344
|
**`/data` list ↔ grid view + image thumbnails.** A toolbar toggle switches the
|
|
3257
3345
|
file browser between the two-line list and a **grid**. In grid view, image
|
|
3258
3346
|
files render an inline thumbnail; folders render a folder tile (still navigate
|
|
@@ -176,7 +176,7 @@ After creation, no template metadata persists in the agent's files. The resultin
|
|
|
176
176
|
8. **KNOWLEDGE.md generation** — populate from the now-tagged set plus keyword matches using the `update-knowledge` skill workflow. KNOWLEDGE.md is required and must be non-empty; an empty or missing KNOWLEDGE is refused at spawn.
|
|
177
177
|
9. Write `config.json` with selected model, status "active", and `knowledgeKeywords`. This is the last gated write — placed after IDENTITY.md, SOUL.md, and KNOWLEDGE.md to prevent cascade failure if one gate stalls.
|
|
178
178
|
10. Check context budget — auto-summarise if over threshold
|
|
179
|
-
11. **Project the agent into the graph** — delegate to the `specialists:database-operator` specialist with the instruction: "Project public agent `{slug}` into the graph by POSTing to `/api/admin/agents/{slug}/project
|
|
179
|
+
11. **Project the agent into the graph** — delegate to the `specialists:database-operator` specialist with the instruction: "Project public agent `{slug}` into the graph by POSTing to `/api/admin/agents/{slug}/project?accountId=<the literal ACCOUNT_ID value you read>`." The route reads the on-disk files and idempotently MERGEs the `:Agent` node, the four owned `:KnowledgeDocument` projections (IDENTITY/SOUL/KNOWLEDGE/KNOWLEDGE-SUMMARY when present, namespaced `attachmentId="agent:<slug>:<role>"`), the `HAS_*` edges, and the `USES_KNOWLEDGE` edges to every operator-tagged doc. Loud-fail: if the route returns non-2xx, surface the error to the user verbatim — the agent's files exist on disk but its graph projection is incomplete, which means the operator's /graph view will not show this agent. Re-running the projection is safe; it is the same idempotent MERGE. The `accountId` query parameter is required on every write to this route (project and delete). The route no longer infers an account from device state, so it returns 400 without one and 403 when the caller is not entitled to the account it named. Source the value from the `ACCOUNT_ID` environment variable of this session (`echo $ACCOUNT_ID`), and substitute the literal id into the URL before delegating, since the specialist you delegate to does not share your shell.
|
|
180
180
|
12. **Set the default if none exists.** Read `defaultAgent` from `account-manage`. If it is empty, set it to this new slug via `account-update` (`field: "defaultAgent"`, `value: "{slug}"`) — otherwise the agent answers at `/{slug}` but the bare root serves nothing. If a default already exists, do not change it silently: tell the operator the current default and ask whether to switch the root to this new agent; call `account-update` only if they say yes.
|
|
181
181
|
13. Confirm creation: "Agent created and reachable at `/{slug}`." If you set or changed the default in step 12, add: "The site root also serves this agent." If a different default remains, add: "The site root still serves `{currentDefault}`."
|
|
182
182
|
|
|
@@ -213,7 +213,7 @@ For knowledge scope changes:
|
|
|
213
213
|
- Allow adding/removing keyword subscriptions (update `knowledgeKeywords` in `config.json`).
|
|
214
214
|
- After changes, offer to refresh KNOWLEDGE.md using the `update-knowledge` skill.
|
|
215
215
|
|
|
216
|
-
**After every Edit operation that touches IDENTITY/SOUL/KNOWLEDGE/KNOWLEDGE-SUMMARY/`config.json` (including `knowledgeKeywords` or direct-tag mutations), delegate to `specialists:database-operator` to re-project: POST `/api/admin/agents/{slug}/project`.** Without re-projection the on-disk files diverge from the graph state — the operator sees stale `:Agent` properties and stale `USES_KNOWLEDGE` edges in /graph. Loud-fail: surface non-2xx errors verbatim.
|
|
216
|
+
**After every Edit operation that touches IDENTITY/SOUL/KNOWLEDGE/KNOWLEDGE-SUMMARY/`config.json` (including `knowledgeKeywords` or direct-tag mutations), delegate to `specialists:database-operator` to re-project: POST `/api/admin/agents/{slug}/project?accountId={accountId}`.** Without re-projection the on-disk files diverge from the graph state — the operator sees stale `:Agent` properties and stale `USES_KNOWLEDGE` edges in /graph. Loud-fail: surface non-2xx errors verbatim.
|
|
217
217
|
|
|
218
218
|
### Delete
|
|
219
219
|
|
|
@@ -226,7 +226,7 @@ Deletion removes the entire agent directory (`agents/{slug}/`) — not individua
|
|
|
226
226
|
- If no other agents remain (or the user declines to set a new default), clear the `defaultAgent` field by calling `account-update` with `field: "defaultAgent"`, `value: ""`. Tell the user that visitors to the root URL will see a "no agents" message until a new agent is created.
|
|
227
227
|
|
|
228
228
|
**Cleanup sequence:**
|
|
229
|
-
- Issue `DELETE /api/admin/agents/{slug}` — the route removes the `:Agent` node and its four owned `:KnowledgeDocument` projections FIRST, then deletes the directory. Loud-fail: if graph cleanup throws, files are preserved and a 500 is returned with the error text. Re-issuing the DELETE is safe (idempotent on both layers). Operator-tagged docs survive the projection delete — only the `USES_KNOWLEDGE` edges from this Agent are removed.
|
|
229
|
+
- Issue `DELETE /api/admin/agents/{slug}?accountId={accountId}` — the route removes the `:Agent` node and its four owned `:KnowledgeDocument` projections FIRST, then deletes the directory. Loud-fail: if graph cleanup throws, files are preserved and a 500 is returned with the error text. Re-issuing the DELETE is safe (idempotent on both layers). Operator-tagged docs survive the projection delete — only the `USES_KNOWLEDGE` edges from this Agent are removed.
|
|
230
230
|
- Verify the directory no longer exists
|
|
231
231
|
- Report what was removed (list the files that were in the directory)
|
|
232
232
|
|
|
@@ -9,6 +9,19 @@ Invoked by the admin agent directly.
|
|
|
9
9
|
|
|
10
10
|
This is the platform's release timeline, newest first. Each entry shows the date it shipped and the version it shipped in, so you can tell the operator how current their install is. To compare, read the installed version from `capabilities-here` and match it against the versions below. Keep answers high level and in plain English; this is a summary, not a full commit log.
|
|
11
11
|
|
|
12
|
+
## 2026-07-25 (0.1.507)
|
|
13
|
+
|
|
14
|
+
- Chat now updates the moment a message or permission prompt arrives, instead of checking every couple of seconds.
|
|
15
|
+
- The dashboard has a visual refresh: cards now fill in properly instead of looking transparent.
|
|
16
|
+
- The Data page has a new two-pane view with a folder rail on wider screens, and uploads/sites are now correctly grouped under Home.
|
|
17
|
+
- Every assistant tool now carries a declared risk level, checked automatically so it cannot silently drift.
|
|
18
|
+
|
|
19
|
+
## 2026-07-25 (0.1.506)
|
|
20
|
+
|
|
21
|
+
- Fixed a bug where the Agents page and a few other admin screens could resolve the wrong account.
|
|
22
|
+
- The dashboard and sidebar now update instantly when something changes, instead of waiting for the next refresh.
|
|
23
|
+
- The Data page now groups your files into Home and System, with a clearer card layout.
|
|
24
|
+
|
|
12
25
|
## 2026-07-25 (0.1.505)
|
|
13
26
|
|
|
14
27
|
- Upgraded to Claude Opus 5, the assistant's most capable model.
|
|
@@ -5,12 +5,15 @@ tools:
|
|
|
5
5
|
- name: aeo-emit-jsonld
|
|
6
6
|
publicAllowlist: false
|
|
7
7
|
adminAllowlist: true
|
|
8
|
+
riskClass: write_local
|
|
8
9
|
- name: aeo-write-llms-txt
|
|
9
10
|
publicAllowlist: false
|
|
10
11
|
adminAllowlist: true
|
|
12
|
+
riskClass: write_local
|
|
11
13
|
- name: aeo-audit-page
|
|
12
14
|
publicAllowlist: false
|
|
13
15
|
adminAllowlist: true
|
|
16
|
+
riskClass: write_local
|
|
14
17
|
skills:
|
|
15
18
|
- skills/structured-answer/SKILL.md
|
|
16
19
|
always: false
|
|
@@ -5,57 +5,75 @@ tools:
|
|
|
5
5
|
- name: browser-render
|
|
6
6
|
publicAllowlist: false
|
|
7
7
|
adminAllowlist: true
|
|
8
|
+
riskClass: read
|
|
8
9
|
- name: browser-navigate
|
|
9
10
|
publicAllowlist: false
|
|
10
11
|
adminAllowlist: true
|
|
12
|
+
riskClass: read
|
|
11
13
|
- name: browser-snapshot
|
|
12
14
|
publicAllowlist: false
|
|
13
15
|
adminAllowlist: true
|
|
16
|
+
riskClass: read
|
|
14
17
|
- name: browser-click
|
|
15
18
|
publicAllowlist: false
|
|
16
19
|
adminAllowlist: true
|
|
20
|
+
riskClass: external
|
|
17
21
|
- name: browser-fill
|
|
18
22
|
publicAllowlist: false
|
|
19
23
|
adminAllowlist: true
|
|
24
|
+
riskClass: external
|
|
20
25
|
- name: browser-fill-form
|
|
21
26
|
publicAllowlist: false
|
|
22
27
|
adminAllowlist: true
|
|
28
|
+
riskClass: external
|
|
23
29
|
- name: browser-type
|
|
24
30
|
publicAllowlist: false
|
|
25
31
|
adminAllowlist: true
|
|
32
|
+
riskClass: external
|
|
26
33
|
- name: browser-press-key
|
|
27
34
|
publicAllowlist: false
|
|
28
35
|
adminAllowlist: true
|
|
36
|
+
riskClass: external
|
|
29
37
|
- name: browser-hover
|
|
30
38
|
publicAllowlist: false
|
|
31
39
|
adminAllowlist: true
|
|
40
|
+
riskClass: read
|
|
32
41
|
- name: browser-select-option
|
|
33
42
|
publicAllowlist: false
|
|
34
43
|
adminAllowlist: true
|
|
44
|
+
riskClass: external
|
|
35
45
|
- name: browser-wait-for
|
|
36
46
|
publicAllowlist: false
|
|
37
47
|
adminAllowlist: true
|
|
48
|
+
riskClass: read
|
|
38
49
|
- name: browser-handle-dialog
|
|
39
50
|
publicAllowlist: false
|
|
40
51
|
adminAllowlist: true
|
|
52
|
+
riskClass: external
|
|
41
53
|
- name: browser-evaluate
|
|
42
54
|
publicAllowlist: false
|
|
43
55
|
adminAllowlist: true
|
|
56
|
+
riskClass: exec
|
|
44
57
|
- name: browser-console-messages
|
|
45
58
|
publicAllowlist: false
|
|
46
59
|
adminAllowlist: true
|
|
60
|
+
riskClass: read
|
|
47
61
|
- name: browser-tabs
|
|
48
62
|
publicAllowlist: false
|
|
49
63
|
adminAllowlist: true
|
|
64
|
+
riskClass: read
|
|
50
65
|
- name: browser-pdf-save
|
|
51
66
|
publicAllowlist: false
|
|
52
67
|
adminAllowlist: true
|
|
68
|
+
riskClass: write_local
|
|
53
69
|
- name: browser-screenshot
|
|
54
70
|
publicAllowlist: false
|
|
55
71
|
adminAllowlist: true
|
|
72
|
+
riskClass: write_local
|
|
56
73
|
- name: browser-resize
|
|
57
74
|
publicAllowlist: false
|
|
58
75
|
adminAllowlist: true
|
|
76
|
+
riskClass: read
|
|
59
77
|
always: true
|
|
60
78
|
embed: false
|
|
61
79
|
metadata: {"platform":{}}
|
|
@@ -5,15 +5,19 @@ tools:
|
|
|
5
5
|
- name: connector-register
|
|
6
6
|
publicAllowlist: false
|
|
7
7
|
adminAllowlist: true
|
|
8
|
+
riskClass: write_local
|
|
8
9
|
- name: connector-call
|
|
9
10
|
publicAllowlist: false
|
|
10
11
|
adminAllowlist: true
|
|
12
|
+
riskClass: external
|
|
11
13
|
- name: connector-list
|
|
12
14
|
publicAllowlist: false
|
|
13
15
|
adminAllowlist: true
|
|
16
|
+
riskClass: read
|
|
14
17
|
- name: connector-deregister
|
|
15
18
|
publicAllowlist: false
|
|
16
19
|
adminAllowlist: true
|
|
20
|
+
riskClass: write_local
|
|
17
21
|
metadata: {"platform":{"optional":true,"pluginKey":"connector"}}
|
|
18
22
|
mcp:
|
|
19
23
|
command: node
|
|
@@ -5,30 +5,39 @@ tools:
|
|
|
5
5
|
- name: contact-create
|
|
6
6
|
publicAllowlist: false
|
|
7
7
|
adminAllowlist: false
|
|
8
|
+
riskClass: write_local
|
|
8
9
|
- name: contact-lookup
|
|
9
10
|
publicAllowlist: false
|
|
10
11
|
adminAllowlist: false
|
|
12
|
+
riskClass: read
|
|
11
13
|
- name: contact-update
|
|
12
14
|
publicAllowlist: false
|
|
13
15
|
adminAllowlist: false
|
|
16
|
+
riskClass: write_local
|
|
14
17
|
- name: contact-delete
|
|
15
18
|
publicAllowlist: false
|
|
16
19
|
adminAllowlist: false
|
|
20
|
+
riskClass: write_local
|
|
17
21
|
- name: contact-list
|
|
18
22
|
publicAllowlist: false
|
|
19
23
|
adminAllowlist: false
|
|
24
|
+
riskClass: read
|
|
20
25
|
- name: contact-export
|
|
21
26
|
publicAllowlist: false
|
|
22
27
|
adminAllowlist: false
|
|
28
|
+
riskClass: write_local
|
|
23
29
|
- name: contact-erase
|
|
24
30
|
publicAllowlist: false
|
|
25
31
|
adminAllowlist: false
|
|
32
|
+
riskClass: write_local
|
|
26
33
|
- name: group-create
|
|
27
34
|
publicAllowlist: false
|
|
28
35
|
adminAllowlist: false
|
|
36
|
+
riskClass: write_local
|
|
29
37
|
- name: group-manage
|
|
30
38
|
publicAllowlist: false
|
|
31
39
|
adminAllowlist: false
|
|
40
|
+
riskClass: write_local
|
|
32
41
|
always: false
|
|
33
42
|
embed: false
|
|
34
43
|
metadata: {"platform":{}}
|
|
@@ -174,25 +174,49 @@ kinds, each card tagged `Public` or `Specialist`:
|
|
|
174
174
|
link.
|
|
175
175
|
|
|
176
176
|
The former "Public" flyout toggle in the account menu was removed; this page is
|
|
177
|
-
the sole agent surface.
|
|
178
|
-
|
|
179
|
-
|
|
177
|
+
the sole agent surface.
|
|
178
|
+
|
|
179
|
+
**Account scope.** The route (`server/routes/admin/agents.ts`) never infers an
|
|
180
|
+
account from device state. The two reads resolve from the caller's admin session
|
|
181
|
+
(`requireAdminSession` + the shared `accountDirForSession` in
|
|
182
|
+
`server/routes/admin/_account-scope.ts`), returning 401 when the session maps to
|
|
183
|
+
no valid account. The two writes carry no admin session (the
|
|
184
|
+
`public-agent-manager` skill calls them), so they take an explicit `accountId`
|
|
185
|
+
query parameter validated against the account list and refuse a missing or
|
|
186
|
+
unknown one with 400 — never defaulting to a resolved account. `:slug` params
|
|
187
|
+
reject `/`, `..`, `\` (the traversal guard); specialist detail is selected by an
|
|
188
|
+
explicit `?plugin=` parameter, not inferred from `--` in the slug.
|
|
180
189
|
|
|
181
190
|
| Route | Behaviour |
|
|
182
191
|
|-------|-----------|
|
|
183
|
-
| `GET /api/admin/agents` | Lists public `agents/*/` dirs (never the `admin` agent) plus user-created specialists from `plugins/*/agents/*.md`, each row tagged `kind`. Returns `{agents, skipped, specialistsSkipped}` — `skipped` counts public dirs whose `config.json` failed to parse; `specialistsSkipped` counts specialist `.md` files with no parseable `name`. |
|
|
184
|
-
| `GET /api/admin/agents/:slug` |
|
|
185
|
-
| `DELETE /api/admin/agents/:slug
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
`op=list
|
|
194
|
-
|
|
195
|
-
|
|
192
|
+
| `GET /api/admin/agents` | Session-scoped. Lists the session account's public `agents/*/` dirs (never the `admin` agent) plus its user-created specialists from `plugins/*/agents/*.md`, each row tagged `kind`. Returns `{agents, accountId, skipped, specialistsSkipped}` — `accountId` names the account resolved (the client sends it back on a delete); `skipped` counts public dirs whose `config.json` failed to parse; `specialistsSkipped` counts specialist `.md` files with no parseable `name`. 401 when the session maps to no account. |
|
|
193
|
+
| `GET /api/admin/agents/:slug` | Session-scoped. Without `?plugin=`, returns a public agent's config fields + four owned docs + a `present` map (a missing or unreadable doc is `''`/`present.<role>=false`, never a 500). With `?plugin=`, returns that plugin's specialist `{kind, model, tools, systemPrompt, skills}`. Unknown 404s, 401 as above. |
|
|
194
|
+
| `DELETE /api/admin/agents/:slug?accountId=` | Public agents only, on the named validated account. Removes the dir after `deleteAgentProjection`; refuses the `admin` slug (403) and a missing/unknown `accountId` (400) with no write. Loud-fail: a graph-cleanup throw aborts the file removal. |
|
|
195
|
+
| `POST /api/admin/agents/:slug/project?accountId=` | Re-projects the named account's on-disk agent into the graph. Same `accountId` contract as delete. |
|
|
196
|
+
|
|
197
|
+
Observability rides `[admin/agents]`, and **every line names the account it acted
|
|
198
|
+
on** (`accountId=<id8>`) — a well-formed answer about the wrong account is
|
|
199
|
+
otherwise indistinguishable from a correct one, which is exactly how an empty
|
|
200
|
+
Agents page survived undiagnosed on a multi-account install.
|
|
201
|
+
|
|
202
|
+
- `op=list accountId=<id8> agents=<n> specialists=<m> skipped=<x> specialistsSkipped=<y>`
|
|
203
|
+
— the heartbeat. Compare `accountId` against the account the operator is
|
|
204
|
+
viewing; `skipped>0`/`specialistsSkipped>0` is a malformed-source signal the
|
|
205
|
+
page renders as a banner, and `specialists=0` with user plugins present is the
|
|
206
|
+
broken-walk signature.
|
|
207
|
+
- `op=detail accountId=<id8> slug=<…> kind=<public|specialist>` — with
|
|
208
|
+
`present=<comma-list|none>` on the public branch, where a role absent for an
|
|
209
|
+
agent expected complete is the missing-doc signature. One
|
|
210
|
+
`op=list-specialist-skip plugin=<p> file=<f>` per unreadable specialist.
|
|
211
|
+
- `op=<list|detail> auth-rejected reason=no-account-for-session` — the session
|
|
212
|
+
maps to no valid account. No `op=list` line at all for a page load means the
|
|
213
|
+
request never reached the handler, a distinct signature from a zero count.
|
|
214
|
+
- `op=<delete|project> rejected reason=<missing-accountId|unknown-accountId>` —
|
|
215
|
+
a caller that did not name its account. A skill that was not updated produces
|
|
216
|
+
this on its first call instead of writing to the wrong account.
|
|
217
|
+
- `op=delete accountId=<id8> slug=<…> outcome=<ok|failed>` with
|
|
218
|
+
`reason=<graph-cleanup-failed|rm-error>` on failure (files preserved on a
|
|
219
|
+
graph-cleanup throw).
|
|
196
220
|
|
|
197
221
|
### Graph
|
|
198
222
|
|
|
@@ -326,6 +350,44 @@ the Web Share API and is disabled where unavailable. Signals:
|
|
|
326
350
|
`[data-ui] op=mount header=operator home=absent`, `op=select-enter`,
|
|
327
351
|
`op=select-exit reason=<cancel|action>`, `op=share supported=<bool> count=<n>`.
|
|
328
352
|
|
|
353
|
+
**The dashboard has a surface ramp and a display type tier.** Every page sits on
|
|
354
|
+
a page plane, cards rise onto a raised plane, and inputs and scroll regions
|
|
355
|
+
recede onto an inset plane. Each brand chooses how the card separates: SiteDesk's
|
|
356
|
+
card is a shade lighter than its page and casts no shadow, Real Agent's card and
|
|
357
|
+
page are both white and a shadow does the work. The page header is an inverted
|
|
358
|
+
band carrying the page title at the display size. Colours, radii, shadows and
|
|
359
|
+
type weights all come from the brand's own tokens; nothing is hardcoded, and a
|
|
360
|
+
token that resolves to nothing fails the build rather than painting invisibly.
|
|
361
|
+
|
|
362
|
+
**Folders open beside a rail on a wide screen.** At 1280px and above the folder
|
|
363
|
+
view splits in two: a list of the account's folders on the left, the files on
|
|
364
|
+
the right, with the folder you are in highlighted. Below that width the rail is
|
|
365
|
+
hidden and the breadcrumb does the same job.
|
|
366
|
+
|
|
367
|
+
**Status colours are shared.** Success, warning, error and info each carry a
|
|
368
|
+
solid fill, a pale tint and a text colour for that tint. Every pairing meets the
|
|
369
|
+
WCAG AA contrast minimum, on every brand.
|
|
370
|
+
|
|
371
|
+
**`/data` opens on the account's own folders, as cards.** With no `#path=` in
|
|
372
|
+
the URL the browser lands on **home**: the account's business folders (the
|
|
373
|
+
entity folders of its trade, plus documents, projects, contacts, the work it
|
|
374
|
+
has produced for you, anything a client has sent in, and any websites it
|
|
375
|
+
has published) shown
|
|
376
|
+
one per card, each listing the first 20 things inside it and a `+N more` row
|
|
377
|
+
past that. Tapping a card opens that folder in the ordinary list or grid. There
|
|
378
|
+
are never loose files at this level. Everything the platform and its plugins
|
|
379
|
+
keep for themselves — caches, logs, published sites, plugin workspaces, hidden
|
|
380
|
+
folders — sits behind a single **system** card at the end, and opens as the
|
|
381
|
+
ordinary list too. The split comes from the account's own `SCHEMA.md`, so it
|
|
382
|
+
follows the graph ontology rather than a hardcoded list, and nothing moves on
|
|
383
|
+
disk. Upload and New folder are disabled on the cards view because it names no
|
|
384
|
+
single folder to write into; open a folder first. The flat account root is still
|
|
385
|
+
reachable from the account name in the breadcrumb, which is the way back if a
|
|
386
|
+
folder is ever grouped wrongly. Signals: `[data-schema] op=classify` on every
|
|
387
|
+
account-root listing (`home=`, `system=`, `unknown=`, `status=ok|parse-failed`),
|
|
388
|
+
`op=home-files` when a name that should be a folder is a file, and
|
|
389
|
+
`op=card-children … status=error` when one card's folder could not be read.
|
|
390
|
+
|
|
329
391
|
**`/data` list ↔ grid view + image thumbnails.** A toolbar toggle switches the
|
|
330
392
|
file browser between the two-line list and a **grid**. In grid view, image
|
|
331
393
|
files render an inline thumbnail; folders render a folder tile (still navigate
|