@rubytech/create-maxy-code 0.1.506 → 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.
Files changed (104) hide show
  1. package/package.json +2 -2
  2. package/payload/platform/config/brand.json +79 -18
  3. package/payload/platform/lib/account-schema-regions/dist/index.d.ts +17 -5
  4. package/payload/platform/lib/account-schema-regions/dist/index.d.ts.map +1 -1
  5. package/payload/platform/lib/account-schema-regions/dist/index.js +20 -6
  6. package/payload/platform/lib/account-schema-regions/dist/index.js.map +1 -1
  7. package/payload/platform/lib/account-schema-regions/src/index.ts +20 -6
  8. package/payload/platform/plugins/admin/PLUGIN.md +36 -0
  9. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +48 -2
  10. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +7 -0
  11. package/payload/platform/plugins/aeo/PLUGIN.md +3 -0
  12. package/payload/platform/plugins/browser/PLUGIN.md +18 -0
  13. package/payload/platform/plugins/connector/PLUGIN.md +4 -0
  14. package/payload/platform/plugins/contacts/PLUGIN.md +9 -0
  15. package/payload/platform/plugins/docs/references/admin-ui.md +21 -1
  16. package/payload/platform/plugins/docs/references/plugins-guide.md +26 -0
  17. package/payload/platform/plugins/email/PLUGIN.md +17 -0
  18. package/payload/platform/plugins/filesystem/PLUGIN.md +6 -0
  19. package/payload/platform/plugins/google/PLUGIN.md +12 -0
  20. package/payload/platform/plugins/graph/PLUGIN.md +3 -0
  21. package/payload/platform/plugins/graph-viewer/PLUGIN.md +1 -0
  22. package/payload/platform/plugins/ledger/PLUGIN.md +7 -0
  23. package/payload/platform/plugins/memory/PLUGIN.md +41 -0
  24. package/payload/platform/plugins/outlook/PLUGIN.md +24 -0
  25. package/payload/platform/plugins/quickbooks/PLUGIN.md +15 -0
  26. package/payload/platform/plugins/replicate/PLUGIN.md +3 -0
  27. package/payload/platform/plugins/scheduling/PLUGIN.md +10 -0
  28. package/payload/platform/plugins/storage-broker/PLUGIN.md +12 -0
  29. package/payload/platform/plugins/telegram/PLUGIN.md +3 -0
  30. package/payload/platform/plugins/url-get/PLUGIN.md +1 -0
  31. package/payload/platform/plugins/voice-mirror/PLUGIN.md +5 -0
  32. package/payload/platform/plugins/whatsapp/PLUGIN.md +12 -0
  33. package/payload/platform/plugins/work/PLUGIN.md +15 -0
  34. package/payload/platform/plugins/workflows/PLUGIN.md +8 -0
  35. package/payload/platform/scripts/check-risk-class.mjs +145 -0
  36. package/payload/platform/scripts/lib/__pycache__/account-schema-owned-dirs.cpython-314.pyc +0 -0
  37. package/payload/platform/scripts/lib/provision-account-dir.sh +4 -1
  38. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  39. package/payload/platform/services/claude-session-manager/dist/http-server.js +4 -0
  40. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  41. package/payload/platform/services/claude-session-manager/dist/index.js +8 -0
  42. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  43. package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts +13 -0
  44. package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts.map +1 -1
  45. package/payload/platform/services/claude-session-manager/dist/tool-surface.js +33 -8
  46. package/payload/platform/services/claude-session-manager/dist/tool-surface.js.map +1 -1
  47. package/payload/server/{chunk-5ADBNEJA.js → chunk-2WAXM5N2.js} +111 -111
  48. package/payload/server/maxy-edge.js +1 -1
  49. package/payload/server/public/activity.html +5 -5
  50. package/payload/server/public/agents.html +4 -4
  51. package/payload/server/public/assets/{AdminLoginScreens-D5KOQA8S.js → AdminLoginScreens-YT7jsh_H.js} +1 -1
  52. package/payload/server/public/assets/{AdminShell-C8wazpnz.js → AdminShell-Ckht9hmU.js} +1 -1
  53. package/payload/server/public/assets/{activity-CFqkDhTs.js → activity-DH3Wgc3O.js} +1 -1
  54. package/payload/server/public/assets/admin-DetvulAu.js +1 -0
  55. package/payload/server/public/assets/{agents-DPulfmrd.js → agents-X_IvDHLZ.js} +1 -1
  56. package/payload/server/public/assets/{browser-T_5xbnJh.js → browser-Bym8QhfA.js} +1 -1
  57. package/payload/server/public/assets/{calendar-CKjuiG8c.js → calendar-CFnufJOy.js} +1 -1
  58. package/payload/server/public/assets/chat-wrckyIpw.js +1 -0
  59. package/payload/server/public/assets/chevron-left-Dtk3jEK5.js +1 -0
  60. package/payload/server/public/assets/chevron-right-Dih6IZ8B.js +1 -0
  61. package/payload/server/public/assets/clock-iJCrrmWM.js +1 -0
  62. package/payload/server/public/assets/data-D76--TYs.js +1 -0
  63. package/payload/server/public/assets/{file-text-c6cA4Evd.js → file-text-zch0E1GJ.js} +1 -1
  64. package/payload/server/public/assets/{graph-DIk-o45J.js → graph-BavHLzpV.js} +1 -1
  65. package/payload/server/public/assets/{graph-labels-5bjxhC_p.js → graph-labels-CBwh4g-6.js} +1 -1
  66. package/payload/server/public/assets/{maximize-2-BCQkFb1_.js → maximize-2-bTn_Ozpi.js} +1 -1
  67. package/payload/server/public/assets/{operator-0UnNo2ms.js → operator-a4IOwf62.js} +1 -1
  68. package/payload/server/public/assets/page-3T2mE63b.js +1 -0
  69. package/payload/server/public/assets/{page-HVtUfub2.js → page-D6M1CmPe.js} +4 -4
  70. package/payload/server/public/assets/{public-CKEYyIPn.js → public-B3y_YU1G.js} +1 -1
  71. package/payload/server/public/assets/{rotate-ccw-dTpO5dhL.js → rotate-ccw-BGvzNB1b.js} +1 -1
  72. package/payload/server/public/assets/{routines-C6P1-Dto.js → routines-C7Dr16am.js} +1 -1
  73. package/payload/server/public/assets/{skills-ClrpVqlz.js → skills-DFeb3XO3.js} +1 -1
  74. package/payload/server/public/assets/{tasks-C8SNhSFC.js → tasks-CSfnCKJe.js} +1 -1
  75. package/payload/server/public/assets/{time-entry-format-CCO6N6XZ.js → time-entry-format-BgZqOOqG.js} +1 -1
  76. package/payload/server/public/assets/{triangle-alert-CHjdKpag.js → triangle-alert-DBJ7xz_t.js} +1 -1
  77. package/payload/server/public/assets/{useCopyFeedback-BTUu3-l8.js → useCopyFeedback-BFOujMl-.js} +1 -1
  78. package/payload/server/public/assets/useSubAccountSwitcher-BkQ5tA8A.css +1 -0
  79. package/payload/server/public/assets/{useVoiceRecorder-BeNqxmm2.js → useVoiceRecorder-BP6CpYQD.js} +1 -1
  80. package/payload/server/public/assets/{wrench-CeNnc7oO.js → wrench-DdaRhfzS.js} +1 -1
  81. package/payload/server/public/brand/fonts/inter-400.woff2 +0 -0
  82. package/payload/server/public/brand/fonts/inter-500.woff2 +0 -0
  83. package/payload/server/public/brand-defaults.css +47 -4
  84. package/payload/server/public/browser.html +4 -4
  85. package/payload/server/public/calendar.html +7 -7
  86. package/payload/server/public/chat.html +13 -13
  87. package/payload/server/public/data.html +11 -11
  88. package/payload/server/public/graph.html +9 -9
  89. package/payload/server/public/index.html +14 -14
  90. package/payload/server/public/operator.html +14 -14
  91. package/payload/server/public/public.html +13 -13
  92. package/payload/server/public/routines.html +6 -6
  93. package/payload/server/public/skills.html +5 -5
  94. package/payload/server/public/tasks.html +6 -6
  95. package/payload/server/server.js +702 -586
  96. package/payload/server/public/assets/admin-B-EGUWS4.js +0 -1
  97. package/payload/server/public/assets/chat-DWLYAA70.js +0 -1
  98. package/payload/server/public/assets/chevron-left-DBMCTKlT.js +0 -1
  99. package/payload/server/public/assets/chevron-right-SBAr6zzc.js +0 -1
  100. package/payload/server/public/assets/clock-kkzt7Scf.js +0 -1
  101. package/payload/server/public/assets/data-CV8N9qcy.js +0 -1
  102. package/payload/server/public/assets/page-JJa2xdzf.js +0 -1
  103. package/payload/server/public/assets/useSubAccountSwitcher-DyrH8DA8.css +0 -1
  104. /package/payload/server/public/assets/{useSubAccountSwitcher-DSW9vDi2.js → useSubAccountSwitcher-0PfRrN6i.js} +0 -0
@@ -5,33 +5,43 @@ tools:
5
5
  - name: schedule-event
6
6
  publicAllowlist: false
7
7
  adminAllowlist: false
8
+ riskClass: write_local
8
9
  - name: schedule-list
9
10
  publicAllowlist: false
10
11
  adminAllowlist: false
12
+ riskClass: read
11
13
  - name: schedule-get
12
14
  publicAllowlist: false
13
15
  adminAllowlist: false
16
+ riskClass: read
14
17
  - name: schedule-update
15
18
  publicAllowlist: false
16
19
  adminAllowlist: false
20
+ riskClass: write_local
17
21
  - name: schedule-cancel
18
22
  publicAllowlist: false
19
23
  adminAllowlist: false
24
+ riskClass: write_local
20
25
  - name: schedule-export-ics
21
26
  publicAllowlist: false
22
27
  adminAllowlist: false
28
+ riskClass: write_local
23
29
  - name: schedule-import-ics
24
30
  publicAllowlist: false
25
31
  adminAllowlist: false
32
+ riskClass: write_local
26
33
  - name: schedule-archive-ics
27
34
  publicAllowlist: false
28
35
  adminAllowlist: false
36
+ riskClass: write_local
29
37
  - name: schedule-connector-busy-sync
30
38
  publicAllowlist: false
31
39
  adminAllowlist: false
40
+ riskClass: write_local
32
41
  - name: time-resolve
33
42
  publicAllowlist: false
34
43
  adminAllowlist: true
44
+ riskClass: read
35
45
  skills:
36
46
  - skills/daily-prep/SKILL.md
37
47
  - skills/briefing/SKILL.md
@@ -6,39 +6,51 @@ tools:
6
6
  - name: storage-d1-list
7
7
  publicAllowlist: false
8
8
  adminAllowlist: true
9
+ riskClass: read
9
10
  - name: storage-d1-create
10
11
  publicAllowlist: false
11
12
  adminAllowlist: true
13
+ riskClass: external
12
14
  - name: storage-d1-query
13
15
  publicAllowlist: false
14
16
  adminAllowlist: true
17
+ riskClass: external
15
18
  - name: storage-r2-bucket-list
16
19
  publicAllowlist: false
17
20
  adminAllowlist: true
21
+ riskClass: read
18
22
  - name: storage-r2-bucket-create
19
23
  publicAllowlist: false
20
24
  adminAllowlist: true
25
+ riskClass: external
21
26
  - name: storage-r2-object-list
22
27
  publicAllowlist: false
23
28
  adminAllowlist: true
29
+ riskClass: read
24
30
  - name: storage-r2-object-get
25
31
  publicAllowlist: false
26
32
  adminAllowlist: true
33
+ riskClass: read
27
34
  - name: storage-r2-object-put
28
35
  publicAllowlist: false
29
36
  adminAllowlist: true
37
+ riskClass: external
30
38
  - name: storage-r2-object-delete
31
39
  publicAllowlist: false
32
40
  adminAllowlist: true
41
+ riskClass: external
33
42
  - name: storage-pages-create
34
43
  publicAllowlist: false
35
44
  adminAllowlist: true
45
+ riskClass: external
36
46
  - name: storage-pages-deploy
37
47
  publicAllowlist: false
38
48
  adminAllowlist: true
49
+ riskClass: external
39
50
  - name: storage-pages-adopt
40
51
  publicAllowlist: false
41
52
  adminAllowlist: true
53
+ riskClass: external
42
54
  metadata: {"platform":{"embed":["admin"]}}
43
55
  mcp:
44
56
  command: node
@@ -6,12 +6,15 @@ tools:
6
6
  - name: message
7
7
  publicAllowlist: false
8
8
  adminAllowlist: false
9
+ riskClass: external
9
10
  - name: message-history
10
11
  publicAllowlist: false
11
12
  adminAllowlist: false
13
+ riskClass: read
12
14
  - name: telegram-webhook-register
13
15
  publicAllowlist: false
14
16
  adminAllowlist: false
17
+ riskClass: external
15
18
  mcp:
16
19
  command: node
17
20
  args:
@@ -17,6 +17,7 @@ tools:
17
17
  - name: url-get
18
18
  publicAllowlist: false
19
19
  adminAllowlist: true
20
+ riskClass: read
20
21
  always: true
21
22
  embed: false
22
23
  ---
@@ -7,18 +7,23 @@ tools:
7
7
  - name: voice-tag-content
8
8
  publicAllowlist: false
9
9
  adminAllowlist: true
10
+ riskClass: write_local
10
11
  - name: voice-distil-profile
11
12
  publicAllowlist: false
12
13
  adminAllowlist: true
14
+ riskClass: write_local
13
15
  - name: voice-retrieve-conditioning
14
16
  publicAllowlist: false
15
17
  adminAllowlist: false
18
+ riskClass: read
16
19
  - name: voice-record-feedback
17
20
  publicAllowlist: false
18
21
  adminAllowlist: true
22
+ riskClass: write_local
19
23
  - name: voice-ingest-session-text
20
24
  publicAllowlist: false
21
25
  adminAllowlist: true
26
+ riskClass: write_local
22
27
  mcp:
23
28
  command: node
24
29
  args:
@@ -5,39 +5,51 @@ tools:
5
5
  - name: whatsapp-login-start
6
6
  publicAllowlist: false
7
7
  adminAllowlist: false
8
+ riskClass: external
8
9
  - name: whatsapp-login-wait
9
10
  publicAllowlist: false
10
11
  adminAllowlist: false
12
+ riskClass: external
11
13
  - name: whatsapp-status
12
14
  publicAllowlist: false
13
15
  adminAllowlist: false
16
+ riskClass: read
14
17
  - name: whatsapp-disconnect
15
18
  publicAllowlist: false
16
19
  adminAllowlist: false
20
+ riskClass: external
17
21
  - name: whatsapp-config
18
22
  publicAllowlist: false
19
23
  adminAllowlist: false
24
+ riskClass: write_local
20
25
  - name: whatsapp-activity
21
26
  publicAllowlist: false
22
27
  adminAllowlist: false
28
+ riskClass: read
23
29
  - name: whatsapp-conversations
24
30
  publicAllowlist: false
25
31
  adminAllowlist: false
32
+ riskClass: read
26
33
  - name: whatsapp-messages
27
34
  publicAllowlist: false
28
35
  adminAllowlist: false
36
+ riskClass: read
29
37
  - name: whatsapp-conversation-graph-state
30
38
  publicAllowlist: false
31
39
  adminAllowlist: false
40
+ riskClass: read
32
41
  - name: whatsapp-group-info
33
42
  publicAllowlist: false
34
43
  adminAllowlist: false
44
+ riskClass: read
35
45
  - name: whatsapp-send-admin
36
46
  publicAllowlist: false
37
47
  adminAllowlist: false
48
+ riskClass: external
38
49
  - name: whatsapp-reply
39
50
  publicAllowlist: false
40
51
  adminAllowlist: false
52
+ riskClass: external
41
53
  metadata: {"platform":{"embed":["admin"]}}
42
54
  mcp:
43
55
  command: node
@@ -5,48 +5,63 @@ tools:
5
5
  - name: work-create
6
6
  publicAllowlist: false
7
7
  adminAllowlist: false
8
+ riskClass: write_local
8
9
  - name: work-update
9
10
  publicAllowlist: false
10
11
  adminAllowlist: false
12
+ riskClass: write_local
11
13
  - name: work-list
12
14
  publicAllowlist: false
13
15
  adminAllowlist: false
16
+ riskClass: read
14
17
  - name: work-get
15
18
  publicAllowlist: false
16
19
  adminAllowlist: false
20
+ riskClass: read
17
21
  - name: work-relate
18
22
  publicAllowlist: false
19
23
  adminAllowlist: false
24
+ riskClass: write_local
20
25
  - name: work-complete
21
26
  publicAllowlist: false
22
27
  adminAllowlist: false
28
+ riskClass: write_local
23
29
  - name: work-ready
24
30
  publicAllowlist: false
25
31
  adminAllowlist: false
32
+ riskClass: read
26
33
  - name: session-list
27
34
  publicAllowlist: false
28
35
  adminAllowlist: false
36
+ riskClass: read
29
37
  - name: session-name
30
38
  publicAllowlist: false
31
39
  adminAllowlist: false
40
+ riskClass: write_local
32
41
  - name: session-metering
33
42
  publicAllowlist: false
34
43
  adminAllowlist: false
44
+ riskClass: read
35
45
  - name: project-create
36
46
  publicAllowlist: false
37
47
  adminAllowlist: false
48
+ riskClass: write_local
38
49
  - name: project-list
39
50
  publicAllowlist: false
40
51
  adminAllowlist: false
52
+ riskClass: read
41
53
  - name: project-get
42
54
  publicAllowlist: false
43
55
  adminAllowlist: false
56
+ riskClass: read
44
57
  - name: project-update
45
58
  publicAllowlist: false
46
59
  adminAllowlist: false
60
+ riskClass: write_local
47
61
  - name: project-complete
48
62
  publicAllowlist: false
49
63
  adminAllowlist: false
64
+ riskClass: write_local
50
65
  metadata: {"platform":{"always":false,"embed":[],"pluginKey":"work"}}
51
66
  skills:
52
67
  - skills/execute-task/SKILL.md
@@ -5,27 +5,35 @@ tools:
5
5
  - name: workflow-create
6
6
  publicAllowlist: false
7
7
  adminAllowlist: false
8
+ riskClass: write_local
8
9
  - name: workflow-list
9
10
  publicAllowlist: false
10
11
  adminAllowlist: false
12
+ riskClass: read
11
13
  - name: workflow-get
12
14
  publicAllowlist: false
13
15
  adminAllowlist: false
16
+ riskClass: read
14
17
  - name: workflow-update
15
18
  publicAllowlist: false
16
19
  adminAllowlist: false
20
+ riskClass: write_local
17
21
  - name: workflow-delete
18
22
  publicAllowlist: false
19
23
  adminAllowlist: false
24
+ riskClass: write_local
20
25
  - name: workflow-validate
21
26
  publicAllowlist: false
22
27
  adminAllowlist: false
28
+ riskClass: read
23
29
  - name: workflow-execute
24
30
  publicAllowlist: false
25
31
  adminAllowlist: false
32
+ riskClass: exec
26
33
  - name: workflow-runs
27
34
  publicAllowlist: false
28
35
  adminAllowlist: false
36
+ riskClass: read
29
37
  metadata: {"platform":{"always":false,"embed":[],"pluginKey":"workflows"}}
30
38
  mcp:
31
39
  command: node
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env node
2
+ // Publish-time gate: flag any `riskClass` declaration that contradicts what the
3
+ // tool's own name says it does.
4
+ //
5
+ // The session manager throws at boot when a riskClass is absent or off-enum
6
+ // (tool-surface.ts 'risk-class-missing' / 'risk-class-invalid'). It cannot
7
+ // catch a class that is present, valid, and wrong — `whatsapp-send` declared
8
+ // `read` parses fine, logs nothing, and stays invisible until a downstream
9
+ // gate acts on it. That is a no-event failure, so it needs a standing check
10
+ // rather than an event.
11
+ //
12
+ // The gate reports; it never rewrites a declaration. A contradiction is
13
+ // resolved either by correcting the manifest or by adding a named exception
14
+ // below with the reason it is not a mistake. An exception whose tool no longer
15
+ // contradicts is itself reported: a suppression that outlives its cause
16
+ // re-creates the blind spot the gate exists to remove.
17
+
18
+ import { readFileSync, readdirSync, statSync, existsSync } from 'node:fs'
19
+ import { dirname, join, resolve } from 'node:path'
20
+ import { fileURLToPath } from 'node:url'
21
+
22
+ const __dirname = dirname(fileURLToPath(import.meta.url))
23
+ const MAXY_CODE_ROOT = resolve(__dirname, '..', '..')
24
+
25
+ const PLUGIN_ROOTS = [
26
+ { root: join(MAXY_CODE_ROOT, 'platform', 'plugins'), depth: 1 },
27
+ { root: join(MAXY_CODE_ROOT, 'premium-plugins'), depth: 1 },
28
+ { root: join(MAXY_CODE_ROOT, 'premium-plugins'), depth: 2, mid: 'plugins' },
29
+ ]
30
+
31
+ // A name that says the call sends something outward, declared as if it stays
32
+ // on the device.
33
+ const OUTWARD_SIGNAL = /-(send|reply|publish|deploy|delete|post)\b/
34
+ const OUTWARD_CONTRADICTS = new Set(['read', 'write_local'])
35
+
36
+ // A name that says the call only looks at something, declared as if it acts.
37
+ const INWARD_SIGNAL = /-(read|list|search|status|info|get)\b/
38
+ const INWARD_CONTRADICTS = new Set(['external', 'exec'])
39
+
40
+ /** Named exceptions. Each entry suppresses exactly one tool+class pair and
41
+ * must carry the reason the name signal is misleading for that tool. */
42
+ const EXCEPTIONS = [
43
+ {
44
+ tool: 'joblogic-job-set-status',
45
+ riskClass: 'external',
46
+ reason: 'The -status suffix reads as a query, but this sets a job status on the remote JobLogic tenant. external is correct and the name signal is what is wrong here.',
47
+ },
48
+ {
49
+ tool: 'memory-delete',
50
+ riskClass: 'write_local',
51
+ reason: 'Soft-deletes a node in the local Neo4j graph. Trashed nodes still resolve by elementId; nothing leaves the device.',
52
+ },
53
+ {
54
+ tool: 'contact-delete',
55
+ riskClass: 'write_local',
56
+ reason: 'Removes a contact from the local graph. No remote address book is touched.',
57
+ },
58
+ {
59
+ tool: 'profile-delete',
60
+ riskClass: 'write_local',
61
+ reason: 'Removes a profile node from the local graph.',
62
+ },
63
+ {
64
+ tool: 'workflow-delete',
65
+ riskClass: 'write_local',
66
+ reason: 'Removes a workflow definition from the local graph. Any run history it produced is untouched.',
67
+ },
68
+ ]
69
+
70
+ function collectPluginDirs() {
71
+ const dirs = []
72
+ for (const spec of PLUGIN_ROOTS) {
73
+ if (!existsSync(spec.root)) continue
74
+ for (const entry of readdirSync(spec.root)) {
75
+ if (entry.startsWith('.')) continue
76
+ const lvl1 = join(spec.root, entry)
77
+ if (!statSync(lvl1).isDirectory()) continue
78
+ if (spec.depth === 1) {
79
+ dirs.push(lvl1)
80
+ continue
81
+ }
82
+ const mid = join(lvl1, spec.mid)
83
+ if (!existsSync(mid) || !statSync(mid).isDirectory()) continue
84
+ for (const sub of readdirSync(mid)) {
85
+ if (sub.startsWith('.')) continue
86
+ const lvl2 = join(mid, sub)
87
+ if (statSync(lvl2).isDirectory()) dirs.push(lvl2)
88
+ }
89
+ }
90
+ }
91
+ return dirs
92
+ }
93
+
94
+ /** Independent of tool-surface.ts on purpose: a gate that shares the parser it
95
+ * is checking cannot detect that parser drifting. */
96
+ function declaredTools(manifestPath) {
97
+ const out = []
98
+ let current = null
99
+ let inTools = false
100
+ for (const line of readFileSync(manifestPath, 'utf8').split(/\r?\n/)) {
101
+ if (/^tools:\s*$/.test(line)) { inTools = true; continue }
102
+ if (inTools && /^[A-Za-z_]/.test(line)) inTools = false
103
+ if (!inTools) continue
104
+ const name = line.match(/^\s+-\s+name:\s*(.+?)\s*$/)
105
+ if (name) { current = name[1]; continue }
106
+ const risk = line.match(/^\s+riskClass:\s*(.+?)\s*$/)
107
+ if (risk && current) { out.push({ tool: current, riskClass: risk[1].trim() }); current = null }
108
+ }
109
+ return out
110
+ }
111
+
112
+ const contradictions = []
113
+ const matchedExceptions = new Set()
114
+ let scanned = 0
115
+
116
+ for (const dir of collectPluginDirs()) {
117
+ const manifest = join(dir, 'PLUGIN.md')
118
+ if (!existsSync(manifest)) continue
119
+ for (const { tool, riskClass } of declaredTools(manifest)) {
120
+ scanned++
121
+ let signal = null
122
+ if (OUTWARD_SIGNAL.test(tool) && OUTWARD_CONTRADICTS.has(riskClass)) signal = 'outward-name'
123
+ if (INWARD_SIGNAL.test(tool) && INWARD_CONTRADICTS.has(riskClass)) signal = 'inward-name'
124
+ if (!signal) continue
125
+ const excepted = EXCEPTIONS.find((e) => e.tool === tool && e.riskClass === riskClass)
126
+ if (excepted) { matchedExceptions.add(`${tool}:${riskClass}`); continue }
127
+ contradictions.push({ tool, riskClass, signal, plugin: dir.replace(`${MAXY_CODE_ROOT}/`, '') })
128
+ }
129
+ }
130
+
131
+ const stale = EXCEPTIONS.filter((e) => !matchedExceptions.has(`${e.tool}:${e.riskClass}`))
132
+
133
+ for (const c of contradictions) {
134
+ console.error(`[risk-class] contradiction tool=${c.tool} declared=${c.riskClass} signal=${c.signal} plugin=${c.plugin}`)
135
+ }
136
+ for (const s of stale) {
137
+ console.error(`[risk-class] stale-exception tool=${s.tool} riskClass=${s.riskClass} — no longer contradicts; remove it from EXCEPTIONS`)
138
+ }
139
+
140
+ if (contradictions.length > 0 || stale.length > 0) {
141
+ console.error(`[gate] check-risk-class: FAIL (${contradictions.length} contradiction(s), ${stale.length} stale exception(s), ${scanned} tools scanned)`)
142
+ process.exit(1)
143
+ }
144
+
145
+ console.log(`[gate] check-risk-class: PASS (${scanned} tools scanned, ${EXCEPTIONS.length} named exception(s))`)
@@ -29,7 +29,10 @@ provision_account_dir() {
29
29
  # Operator-data buckets (entity-anchored, flat) + tool-owned dirs. agents/ and
30
30
  # specialists/ are created above. The seeded SCHEMA.md is the single source of
31
31
  # the allowed top-level set, parsed at runtime by the fs-schema write guard.
32
- local _seed_dirs=(projects contacts documents url-get output generated extracted uploads)
32
+ # `sites` joins the seed set because it is a home bucket in the /data browser
33
+ # (HOME_FIXED); an unseeded home bucket is reported by the standing
34
+ # home-parity audit as missing on every account that has not published a site.
35
+ local _seed_dirs=(projects contacts documents url-get output generated extracted uploads sites)
33
36
  local _d _seeded=0
34
37
  for _d in "${_seed_dirs[@]}"; do
35
38
  [ -d "$ACCOUNT_DIR/$_d" ] || { mkdir -p "$ACCOUNT_DIR/$_d" && _seeded=$((_seeded+1)); }
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
@@ -1343,6 +1343,10 @@ export function buildHttpApp(deps) {
1343
1343
  sessionId: row.sessionId,
1344
1344
  live: row.state === 'live',
1345
1345
  status: row.status,
1346
+ // Task 1997 — the account this row belongs to, so an SSE consumer can
1347
+ // scope its fan-out instead of broadcasting install-wide. Already on
1348
+ // the row (Task 1769); it was simply never put on the wire.
1349
+ accountId: row.accountId,
1346
1350
  agentLabel,
1347
1351
  cwd: row.cwd,
1348
1352
  firstPrompt,