@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.
Files changed (116) 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 +72 -0
  4. package/payload/platform/lib/account-schema-regions/dist/index.d.ts.map +1 -0
  5. package/payload/platform/lib/account-schema-regions/dist/index.js +115 -0
  6. package/payload/platform/lib/account-schema-regions/dist/index.js.map +1 -0
  7. package/payload/platform/lib/account-schema-regions/package.json +7 -0
  8. package/payload/platform/lib/account-schema-regions/src/index.ts +135 -0
  9. package/payload/platform/lib/account-schema-regions/tsconfig.json +9 -0
  10. package/payload/platform/package.json +3 -3
  11. package/payload/platform/plugins/admin/PLUGIN.md +36 -0
  12. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +105 -17
  13. package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +3 -3
  14. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +13 -0
  15. package/payload/platform/plugins/aeo/PLUGIN.md +3 -0
  16. package/payload/platform/plugins/browser/PLUGIN.md +18 -0
  17. package/payload/platform/plugins/connector/PLUGIN.md +4 -0
  18. package/payload/platform/plugins/contacts/PLUGIN.md +9 -0
  19. package/payload/platform/plugins/docs/references/admin-ui.md +78 -16
  20. package/payload/platform/plugins/docs/references/plugins-guide.md +26 -0
  21. package/payload/platform/plugins/email/PLUGIN.md +17 -0
  22. package/payload/platform/plugins/filesystem/PLUGIN.md +6 -0
  23. package/payload/platform/plugins/google/PLUGIN.md +12 -0
  24. package/payload/platform/plugins/graph/PLUGIN.md +3 -0
  25. package/payload/platform/plugins/graph-viewer/PLUGIN.md +1 -0
  26. package/payload/platform/plugins/ledger/PLUGIN.md +7 -0
  27. package/payload/platform/plugins/memory/PLUGIN.md +41 -0
  28. package/payload/platform/plugins/outlook/PLUGIN.md +24 -0
  29. package/payload/platform/plugins/quickbooks/PLUGIN.md +15 -0
  30. package/payload/platform/plugins/replicate/PLUGIN.md +3 -0
  31. package/payload/platform/plugins/scheduling/PLUGIN.md +10 -0
  32. package/payload/platform/plugins/storage-broker/PLUGIN.md +12 -0
  33. package/payload/platform/plugins/telegram/PLUGIN.md +3 -0
  34. package/payload/platform/plugins/url-get/PLUGIN.md +1 -0
  35. package/payload/platform/plugins/voice-mirror/PLUGIN.md +5 -0
  36. package/payload/platform/plugins/whatsapp/PLUGIN.md +12 -0
  37. package/payload/platform/plugins/work/PLUGIN.md +15 -0
  38. package/payload/platform/plugins/workflows/PLUGIN.md +8 -0
  39. package/payload/platform/scripts/check-no-esm-require.mjs +5 -0
  40. package/payload/platform/scripts/check-risk-class.mjs +145 -0
  41. package/payload/platform/scripts/lib/__pycache__/account-schema-owned-dirs.cpython-314.pyc +0 -0
  42. package/payload/platform/scripts/lib/provision-account-dir.sh +4 -1
  43. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts +1 -1
  44. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts.map +1 -1
  45. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js +50 -3
  46. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js.map +1 -1
  47. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  48. package/payload/platform/services/claude-session-manager/dist/http-server.js +4 -0
  49. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  50. package/payload/platform/services/claude-session-manager/dist/index.js +8 -0
  51. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  52. package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts +13 -0
  53. package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts.map +1 -1
  54. package/payload/platform/services/claude-session-manager/dist/tool-surface.js +33 -8
  55. package/payload/platform/services/claude-session-manager/dist/tool-surface.js.map +1 -1
  56. package/payload/server/{chunk-HN4HFTXE.js → chunk-2WAXM5N2.js} +1504 -1503
  57. package/payload/server/maxy-edge.js +1 -1
  58. package/payload/server/public/activity.html +5 -5
  59. package/payload/server/public/agents.html +4 -4
  60. package/payload/server/public/assets/{AdminLoginScreens-DeWt3H7l.js → AdminLoginScreens-YT7jsh_H.js} +1 -1
  61. package/payload/server/public/assets/{AdminShell-u32d8puE.js → AdminShell-Ckht9hmU.js} +2 -2
  62. package/payload/server/public/assets/{activity-DjP45-DD.js → activity-DH3Wgc3O.js} +1 -1
  63. package/payload/server/public/assets/admin-DetvulAu.js +1 -0
  64. package/payload/server/public/assets/agents-X_IvDHLZ.js +1 -0
  65. package/payload/server/public/assets/{browser-ULvl_K5x.js → browser-Bym8QhfA.js} +1 -1
  66. package/payload/server/public/assets/{calendar-CGMrT6WZ.js → calendar-CFnufJOy.js} +1 -1
  67. package/payload/server/public/assets/chat-wrckyIpw.js +1 -0
  68. package/payload/server/public/assets/chevron-left-Dtk3jEK5.js +1 -0
  69. package/payload/server/public/assets/chevron-right-Dih6IZ8B.js +1 -0
  70. package/payload/server/public/assets/clock-iJCrrmWM.js +1 -0
  71. package/payload/server/public/assets/data-D76--TYs.js +1 -0
  72. package/payload/server/public/assets/{file-text-C5K6DMcK.js → file-text-zch0E1GJ.js} +1 -1
  73. package/payload/server/public/assets/{graph-CO6e1bgD.js → graph-BavHLzpV.js} +2 -2
  74. package/payload/server/public/assets/{graph-labels-iliQjlfE.js → graph-labels-CBwh4g-6.js} +1 -1
  75. package/payload/server/public/assets/{maximize-2-D-64XK6V.js → maximize-2-bTn_Ozpi.js} +1 -1
  76. package/payload/server/public/assets/{operator-DyXgogJ1.js → operator-a4IOwf62.js} +1 -1
  77. package/payload/server/public/assets/page-3T2mE63b.js +1 -0
  78. package/payload/server/public/assets/page-D6M1CmPe.js +32 -0
  79. package/payload/server/public/assets/{public-B9NVDBxW.js → public-B3y_YU1G.js} +1 -1
  80. package/payload/server/public/assets/{rotate-ccw-P35h7ogS.js → rotate-ccw-BGvzNB1b.js} +1 -1
  81. package/payload/server/public/assets/{routines-BeiynLF7.js → routines-C7Dr16am.js} +1 -1
  82. package/payload/server/public/assets/{skills-C5H7ohLp.js → skills-DFeb3XO3.js} +1 -1
  83. package/payload/server/public/assets/tasks-CSfnCKJe.js +1 -0
  84. package/payload/server/public/assets/{time-entry-format-CDhHCMrW.js → time-entry-format-BgZqOOqG.js} +1 -1
  85. package/payload/server/public/assets/{triangle-alert-OgY71rDV.js → triangle-alert-DBJ7xz_t.js} +1 -1
  86. package/payload/server/public/assets/{useCopyFeedback-jOGmWwa3.js → useCopyFeedback-BFOujMl-.js} +1 -1
  87. package/payload/server/public/assets/{useSubAccountSwitcher-6AFuRawP.js → useSubAccountSwitcher-0PfRrN6i.js} +1 -1
  88. package/payload/server/public/assets/useSubAccountSwitcher-BkQ5tA8A.css +1 -0
  89. package/payload/server/public/assets/{useVoiceRecorder-CnE3fhfV.js → useVoiceRecorder-BP6CpYQD.js} +1 -1
  90. package/payload/server/public/assets/{wrench-B1hsCj0R.js → wrench-DdaRhfzS.js} +1 -1
  91. package/payload/server/public/brand/fonts/inter-400.woff2 +0 -0
  92. package/payload/server/public/brand/fonts/inter-500.woff2 +0 -0
  93. package/payload/server/public/brand-defaults.css +47 -4
  94. package/payload/server/public/browser.html +4 -4
  95. package/payload/server/public/calendar.html +7 -7
  96. package/payload/server/public/chat.html +13 -13
  97. package/payload/server/public/data.html +11 -11
  98. package/payload/server/public/graph.html +9 -9
  99. package/payload/server/public/index.html +14 -14
  100. package/payload/server/public/operator.html +14 -14
  101. package/payload/server/public/public.html +13 -13
  102. package/payload/server/public/routines.html +6 -6
  103. package/payload/server/public/skills.html +5 -5
  104. package/payload/server/public/tasks.html +6 -6
  105. package/payload/server/server.js +1991 -1372
  106. package/payload/server/public/assets/admin-Bo-Y6Vjx.js +0 -1
  107. package/payload/server/public/assets/agents-C80aCXd8.js +0 -1
  108. package/payload/server/public/assets/chat-DnWXaWD4.js +0 -1
  109. package/payload/server/public/assets/chevron-left-BB5Iljw-.js +0 -1
  110. package/payload/server/public/assets/chevron-right-DijU96_j.js +0 -1
  111. package/payload/server/public/assets/clock-DsmnhhJh.js +0 -1
  112. package/payload/server/public/assets/data-JPlhOLGC.js +0 -1
  113. package/payload/server/public/assets/page-DrbiAFS-.js +0 -32
  114. package/payload/server/public/assets/page-WeM2ry61.js +0 -1
  115. package/payload/server/public/assets/tasks-CI74_b6H.js +0 -1
  116. package/payload/server/public/assets/useSubAccountSwitcher-AFSwtthL.css +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.505",
3
+ "version": "0.1.507",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -13,7 +13,7 @@
13
13
  "build": "tsc",
14
14
  "bundle": "node scripts/bundle.js",
15
15
  "test": "npm run build && node --test 'dist/__tests__/*.test.js'",
16
- "prepublishOnly": "bash ../../platform/scripts/verify-skill-tool-surface.sh && node ../../platform/scripts/check-plugin-tools-mcp-consistency.mjs && node ../../platform/scripts/check-specialist-tool-surface.mjs && node ../../platform/scripts/check-agent-contract.mjs && node ../../platform/scripts/check-routing-prose-bash.mjs && node ../../platform/scripts/check-no-task-id-leaks.mjs && node ../../platform/scripts/check-no-esm-require.mjs && node ../../platform/scripts/check-no-raw-mcp-registrations.mjs && node ../../platform/scripts/check-skill-load-coverage.mjs && node ../../platform/scripts/check-architecture-skill-no-drift.mjs && node ../../platform/ui/scripts/check-route-wiring.mjs && node ../../platform/ui/scripts/check-edge-admin-routes.mjs && npm run build && node --test 'dist/__tests__/*.test.js' && chmod +x dist/index.js && npm run bundle && bash ../../platform/scripts/smoke-boot-services.sh && node ../../platform/ui/scripts/check-bundle-node-imports.mjs --dir=./payload/server/public/assets"
16
+ "prepublishOnly": "bash ../../platform/scripts/verify-skill-tool-surface.sh && node ../../platform/scripts/check-plugin-tools-mcp-consistency.mjs && node ../../platform/scripts/check-risk-class.mjs && node ../../platform/scripts/check-specialist-tool-surface.mjs && node ../../platform/scripts/check-agent-contract.mjs && node ../../platform/scripts/check-routing-prose-bash.mjs && node ../../platform/scripts/check-no-task-id-leaks.mjs && node ../../platform/scripts/check-no-esm-require.mjs && node ../../platform/scripts/check-no-raw-mcp-registrations.mjs && node ../../platform/scripts/check-skill-load-coverage.mjs && node ../../platform/scripts/check-architecture-skill-no-drift.mjs && node ../../platform/ui/scripts/check-route-wiring.mjs && node ../../platform/ui/scripts/check-edge-admin-routes.mjs && npm run build && node --test 'dist/__tests__/*.test.js' && chmod +x dist/index.js && npm run bundle && bash ../../platform/scripts/smoke-boot-services.sh && node ../../platform/ui/scripts/check-bundle-node-imports.mjs --dir=./payload/server/public/assets"
17
17
  },
18
18
  "files": [
19
19
  "dist",
@@ -19,9 +19,16 @@
19
19
  "googleClientSecret": "",
20
20
  "commercialMode": false,
21
21
  "vertical": "schema-knowledge-work",
22
- "shipsPremiumBundles": ["venture-studio", "writer-craft", "teaching", "management-consulting"],
23
- "primaryContainer": { "label": "Project", "term": "Projects" },
24
-
22
+ "shipsPremiumBundles": [
23
+ "venture-studio",
24
+ "writer-craft",
25
+ "teaching",
26
+ "management-consulting"
27
+ ],
28
+ "primaryContainer": {
29
+ "label": "Project",
30
+ "term": "Projects"
31
+ },
25
32
  "defaultColors": {
26
33
  "primary": "#7C8C72",
27
34
  "primaryHover": "#6A7A62",
@@ -31,14 +38,11 @@
31
38
  "background": "#F6F5F2",
32
39
  "agentBubble": "#F5F2ED"
33
40
  },
34
-
35
41
  "defaultFonts": {
36
42
  "display": "'Newsreader', Georgia, serif",
37
43
  "body": "'Inter', -apple-system, BlinkMacSystemFont, sans-serif"
38
44
  },
39
-
40
45
  "logoContainsName": true,
41
-
42
46
  "assets": {
43
47
  "logo": "maxy-square.png",
44
48
  "icon": "maxy-monochrome.png",
@@ -48,27 +52,69 @@
48
52
  "appIcon192": "maxy-app-icon-192.png",
49
53
  "maskableIcon": "maxy-app-icon-maskable-512.png"
50
54
  },
51
-
52
55
  "npm": {
53
56
  "packageName": "@rubytech/create-maxy-code",
54
57
  "binName": "create-maxy-code",
55
58
  "author": "Rubytech LLC"
56
59
  },
57
-
58
60
  "plugins": {
59
- "core": ["admin", "memory", "docs", "cloudflare", "anthropic", "workflows", "work", "ledger", "scheduling", "email", "contacts", "projects", "prompt-optimiser", "browser"],
60
- "defaultEnabled": ["business-assistant", "sales", "web-designer"],
61
- "available": ["connector", "telegram", "deep-research", "whatsapp", "replicate", "linkedin-import", "notion-import", "obsidian-import", "x-import", "slides"],
62
- "excluded": ["joblogic"]
61
+ "core": [
62
+ "admin",
63
+ "memory",
64
+ "docs",
65
+ "cloudflare",
66
+ "anthropic",
67
+ "workflows",
68
+ "work",
69
+ "ledger",
70
+ "scheduling",
71
+ "email",
72
+ "contacts",
73
+ "projects",
74
+ "prompt-optimiser",
75
+ "browser"
76
+ ],
77
+ "defaultEnabled": [
78
+ "business-assistant",
79
+ "sales",
80
+ "web-designer"
81
+ ],
82
+ "available": [
83
+ "connector",
84
+ "telegram",
85
+ "deep-research",
86
+ "whatsapp",
87
+ "replicate",
88
+ "linkedin-import",
89
+ "notion-import",
90
+ "obsidian-import",
91
+ "x-import",
92
+ "slides"
93
+ ],
94
+ "excluded": [
95
+ "joblogic"
96
+ ]
63
97
  },
64
-
65
98
  "externalPlugins": [
66
- { "name": "discord", "marketplace": "claude-plugins-official", "channelPlugin": true },
67
- { "name": "imessage", "marketplace": "claude-plugins-official", "channelPlugin": true },
68
- { "name": "superpowers", "marketplace": "claude-plugins-official" },
69
- { "name": "code-review", "marketplace": "claude-plugins-official" }
99
+ {
100
+ "name": "discord",
101
+ "marketplace": "claude-plugins-official",
102
+ "channelPlugin": true
103
+ },
104
+ {
105
+ "name": "imessage",
106
+ "marketplace": "claude-plugins-official",
107
+ "channelPlugin": true
108
+ },
109
+ {
110
+ "name": "superpowers",
111
+ "marketplace": "claude-plugins-official"
112
+ },
113
+ {
114
+ "name": "code-review",
115
+ "marketplace": "claude-plugins-official"
116
+ }
70
117
  ],
71
-
72
118
  "consent": {
73
119
  "copy": {
74
120
  "title": "Before you browse this listing",
@@ -86,5 +132,20 @@
86
132
  "accentFg": "#FFFFFF",
87
133
  "border": "#E8ECF0"
88
134
  }
135
+ },
136
+ "fonts": {
137
+ "body": {
138
+ "family": "Inter",
139
+ "faces": [
140
+ {
141
+ "weight": 400,
142
+ "file": "inter-400.woff2"
143
+ },
144
+ {
145
+ "weight": 500,
146
+ "file": "inter-500.woff2"
147
+ }
148
+ ]
149
+ }
89
150
  }
90
151
  }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Parser for the three machine-readable regions of an account's SCHEMA.md.
3
+ *
4
+ * Shared because two separate builds need the same answer: the admin UI server
5
+ * (platform/ui/server/lib/account-root-groups.ts, which groups the /data root
6
+ * into home/system) and the session manager's standing schema reconcile
7
+ * (platform/services/claude-session-manager/src/account-dir-schema-reconcile.ts,
8
+ * which audits declared-versus-on-disk parity). A third reader,
9
+ * platform/plugins/cloudflare/bin/schema-exposed-dirs.mjs, ships in a separate
10
+ * deploy tree and keeps its own copy; a parity test asserts the two agree.
11
+ *
12
+ * The regions are written by platform/scripts/lib/account-schema-owned-dirs.py
13
+ * merge(). Their separators differ:
14
+ *
15
+ * ontology roots: - `jobs/` - one folder per Job record. (ASCII hyphen)
16
+ * plugin-owned: - `pages/` — Owned by the … plugin. (em dash)
17
+ *
18
+ * .docs/data-portal-folder-index.md records that parsing the ontology region on
19
+ * the wrong separator matches nothing and reads as "this account has no
20
+ * deliverables". This parser sidesteps that failure entirely by anchoring on the
21
+ * backticked `dir/` head rather than the separator, and a test pins the
22
+ * behaviour so a future edit cannot reintroduce separator sensitivity.
23
+ */
24
+ /**
25
+ * Non-ontology buckets that are still the operator's own work, so they are home
26
+ * on every brand. They carry no ontology row because they are not entity
27
+ * buckets. On a vertical with no `## Top-level node types` table
28
+ * (schema-knowledge-work) they are the whole of home.
29
+ *
30
+ * The membership test is "would the operator go looking for this?", not "who
31
+ * writes it". `output`, `generated` and `extracted` hold delivered work product;
32
+ * `sites` holds published websites; `uploads` holds what a client sent in. The
33
+ * shipped template groups those five under "tool-owned", but that is a rule
34
+ * about not reorganising their internals — a write constraint, not a reason to
35
+ * file them behind the platform's own plumbing. What stays out is genuinely
36
+ * internal: caches, state, logs, secrets, temp, the git and Claude control
37
+ * dirs, and plugin workspaces.
38
+ *
39
+ * Every name here is created at provision (provision-account-dir.sh `_seed_dirs`),
40
+ * so the standing home-parity audit finds them on disk rather than reporting
41
+ * them missing.
42
+ *
43
+ * Lives here rather than in either consumer because both the /data page and the
44
+ * standing reconcile audit must agree on the same set; a hand-synced copy in
45
+ * each build is precisely the drift this shared module exists to prevent.
46
+ */
47
+ export declare const HOME_FIXED: readonly string[];
48
+ export interface SchemaRegions {
49
+ /** Root bucket dirs from the ontology region, in table order, deduped. */
50
+ ontologyRoots: string[];
51
+ /** Dirs from the plugin-owned region, in file order, deduped. */
52
+ pluginOwned: string[];
53
+ /** Entries of the ```allowed-top-level fence, in file order. */
54
+ allowedTopLevel: string[];
55
+ /**
56
+ * True when the allowed-top-level fence was found with at least one entry.
57
+ * That fence is present in every valid account SCHEMA.md (it ships in
58
+ * platform/templates/account-schema/SCHEMA.md), so its absence means the file
59
+ * is missing or not an account schema. An EMPTY ontology region is NOT a
60
+ * parse failure: a vertical with no `## Top-level node types` table (for
61
+ * example schema-knowledge-work) legitimately projects no buckets.
62
+ */
63
+ parsed: boolean;
64
+ /**
65
+ * Why `parsed` is false, for the caller's log line. The two states need
66
+ * different remediation — provision the account versus regenerate its schema
67
+ * — so a single `status=parse-failed` cannot be acted on.
68
+ */
69
+ reason: 'ok' | 'schema-absent' | 'fence-absent';
70
+ }
71
+ export declare function parseSchemaRegions(schemaMd: string | null): SchemaRegions;
72
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAEtC,CAAA;AAiBF,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,iEAAiE;IACjE,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,gEAAgE;IAChE,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB;;;;;;;OAOG;IACH,MAAM,EAAE,OAAO,CAAA;IACf;;;;OAIG;IACH,MAAM,EAAE,IAAI,GAAG,eAAe,GAAG,cAAc,CAAA;CAChD;AAiCD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,aAAa,CAazE"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ /**
3
+ * Parser for the three machine-readable regions of an account's SCHEMA.md.
4
+ *
5
+ * Shared because two separate builds need the same answer: the admin UI server
6
+ * (platform/ui/server/lib/account-root-groups.ts, which groups the /data root
7
+ * into home/system) and the session manager's standing schema reconcile
8
+ * (platform/services/claude-session-manager/src/account-dir-schema-reconcile.ts,
9
+ * which audits declared-versus-on-disk parity). A third reader,
10
+ * platform/plugins/cloudflare/bin/schema-exposed-dirs.mjs, ships in a separate
11
+ * deploy tree and keeps its own copy; a parity test asserts the two agree.
12
+ *
13
+ * The regions are written by platform/scripts/lib/account-schema-owned-dirs.py
14
+ * merge(). Their separators differ:
15
+ *
16
+ * ontology roots: - `jobs/` - one folder per Job record. (ASCII hyphen)
17
+ * plugin-owned: - `pages/` — Owned by the … plugin. (em dash)
18
+ *
19
+ * .docs/data-portal-folder-index.md records that parsing the ontology region on
20
+ * the wrong separator matches nothing and reads as "this account has no
21
+ * deliverables". This parser sidesteps that failure entirely by anchoring on the
22
+ * backticked `dir/` head rather than the separator, and a test pins the
23
+ * behaviour so a future edit cannot reintroduce separator sensitivity.
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.HOME_FIXED = void 0;
27
+ exports.parseSchemaRegions = parseSchemaRegions;
28
+ /**
29
+ * Non-ontology buckets that are still the operator's own work, so they are home
30
+ * on every brand. They carry no ontology row because they are not entity
31
+ * buckets. On a vertical with no `## Top-level node types` table
32
+ * (schema-knowledge-work) they are the whole of home.
33
+ *
34
+ * The membership test is "would the operator go looking for this?", not "who
35
+ * writes it". `output`, `generated` and `extracted` hold delivered work product;
36
+ * `sites` holds published websites; `uploads` holds what a client sent in. The
37
+ * shipped template groups those five under "tool-owned", but that is a rule
38
+ * about not reorganising their internals — a write constraint, not a reason to
39
+ * file them behind the platform's own plumbing. What stays out is genuinely
40
+ * internal: caches, state, logs, secrets, temp, the git and Claude control
41
+ * dirs, and plugin workspaces.
42
+ *
43
+ * Every name here is created at provision (provision-account-dir.sh `_seed_dirs`),
44
+ * so the standing home-parity audit finds them on disk rather than reporting
45
+ * them missing.
46
+ *
47
+ * Lives here rather than in either consumer because both the /data page and the
48
+ * standing reconcile audit must agree on the same set; a hand-synced copy in
49
+ * each build is precisely the drift this shared module exists to prevent.
50
+ */
51
+ exports.HOME_FIXED = Object.freeze([
52
+ 'projects', 'contacts', 'documents', 'output', 'generated', 'extracted', 'sites', 'uploads',
53
+ ]);
54
+ const ONT_START = '<!-- ontology-buckets:start -->';
55
+ const ONT_END = '<!-- ontology-buckets:end -->';
56
+ const PLUGIN_START = '<!-- plugin-owned-dirs:start -->';
57
+ const PLUGIN_END = '<!-- plugin-owned-dirs:end -->';
58
+ const ALLOWED_FENCE = '```allowed-top-level';
59
+ /**
60
+ * A region line declaring a directory: `- \`<dir>/\` …`. The trailing slash
61
+ * inside the backticks is what excludes a nested-entity line
62
+ * (`- \`Quote\` records live under \`jobs/\` …`), whose first backtick span is a
63
+ * bare label. Anything after the closing backtick is ignored, so both
64
+ * separators parse.
65
+ */
66
+ const DIR_LINE = /^-\s+`([^`/]+)\/`/;
67
+ function regionLines(text, start, end) {
68
+ const from = text.indexOf(start);
69
+ if (from === -1)
70
+ return [];
71
+ const to = text.indexOf(end, from);
72
+ if (to === -1)
73
+ return [];
74
+ return text.slice(from + start.length, to).split('\n');
75
+ }
76
+ function dirsIn(lines) {
77
+ const out = [];
78
+ for (const line of lines) {
79
+ const m = DIR_LINE.exec(line.trim());
80
+ if (m && !out.includes(m[1]))
81
+ out.push(m[1]);
82
+ }
83
+ return out;
84
+ }
85
+ function fenceEntries(text) {
86
+ const from = text.indexOf(ALLOWED_FENCE);
87
+ if (from === -1)
88
+ return [];
89
+ const bodyStart = text.indexOf('\n', from);
90
+ if (bodyStart === -1)
91
+ return [];
92
+ const to = text.indexOf('```', bodyStart);
93
+ if (to === -1)
94
+ return [];
95
+ return text
96
+ .slice(bodyStart + 1, to)
97
+ .split('\n')
98
+ .map((s) => s.trim())
99
+ .filter((s) => s.length > 0);
100
+ }
101
+ function parseSchemaRegions(schemaMd) {
102
+ if (schemaMd === null || schemaMd.length === 0) {
103
+ return { ontologyRoots: [], pluginOwned: [], allowedTopLevel: [], parsed: false, reason: 'schema-absent' };
104
+ }
105
+ const allowedTopLevel = fenceEntries(schemaMd);
106
+ const parsed = allowedTopLevel.length > 0;
107
+ return {
108
+ ontologyRoots: dirsIn(regionLines(schemaMd, ONT_START, ONT_END)),
109
+ pluginOwned: dirsIn(regionLines(schemaMd, PLUGIN_START, PLUGIN_END)),
110
+ allowedTopLevel,
111
+ parsed,
112
+ reason: parsed ? 'ok' : 'fence-absent',
113
+ };
114
+ }
115
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAmGH,gDAaC;AA9GD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACU,QAAA,UAAU,GAAsB,MAAM,CAAC,MAAM,CAAC;IACzD,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS;CAC5F,CAAC,CAAA;AAEF,MAAM,SAAS,GAAG,iCAAiC,CAAA;AACnD,MAAM,OAAO,GAAG,+BAA+B,CAAA;AAC/C,MAAM,YAAY,GAAG,kCAAkC,CAAA;AACvD,MAAM,UAAU,GAAG,gCAAgC,CAAA;AACnD,MAAM,aAAa,GAAG,sBAAsB,CAAA;AAE5C;;;;;;GAMG;AACH,MAAM,QAAQ,GAAG,mBAAmB,CAAA;AA0BpC,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAChC,IAAI,IAAI,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAClC,IAAI,EAAE,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IACxB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AACxD,CAAC;AAED,SAAS,MAAM,CAAC,KAAe;IAC7B,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;IACxC,IAAI,IAAI,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC1C,IAAI,SAAS,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IACzC,IAAI,EAAE,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IACxB,OAAO,IAAI;SACR,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,EAAE,CAAC;SACxB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AAChC,CAAC;AAED,SAAgB,kBAAkB,CAAC,QAAuB;IACxD,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA;IAC5G,CAAC;IACD,MAAM,eAAe,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IAC9C,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAA;IACzC,OAAO;QACL,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAChE,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QACpE,eAAe;QACf,MAAM;QACN,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc;KACvC,CAAA;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@maxy/account-schema-regions",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "commonjs",
6
+ "main": "dist/index.js"
7
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Parser for the three machine-readable regions of an account's SCHEMA.md.
3
+ *
4
+ * Shared because two separate builds need the same answer: the admin UI server
5
+ * (platform/ui/server/lib/account-root-groups.ts, which groups the /data root
6
+ * into home/system) and the session manager's standing schema reconcile
7
+ * (platform/services/claude-session-manager/src/account-dir-schema-reconcile.ts,
8
+ * which audits declared-versus-on-disk parity). A third reader,
9
+ * platform/plugins/cloudflare/bin/schema-exposed-dirs.mjs, ships in a separate
10
+ * deploy tree and keeps its own copy; a parity test asserts the two agree.
11
+ *
12
+ * The regions are written by platform/scripts/lib/account-schema-owned-dirs.py
13
+ * merge(). Their separators differ:
14
+ *
15
+ * ontology roots: - `jobs/` - one folder per Job record. (ASCII hyphen)
16
+ * plugin-owned: - `pages/` — Owned by the … plugin. (em dash)
17
+ *
18
+ * .docs/data-portal-folder-index.md records that parsing the ontology region on
19
+ * the wrong separator matches nothing and reads as "this account has no
20
+ * deliverables". This parser sidesteps that failure entirely by anchoring on the
21
+ * backticked `dir/` head rather than the separator, and a test pins the
22
+ * behaviour so a future edit cannot reintroduce separator sensitivity.
23
+ */
24
+
25
+ /**
26
+ * Non-ontology buckets that are still the operator's own work, so they are home
27
+ * on every brand. They carry no ontology row because they are not entity
28
+ * buckets. On a vertical with no `## Top-level node types` table
29
+ * (schema-knowledge-work) they are the whole of home.
30
+ *
31
+ * The membership test is "would the operator go looking for this?", not "who
32
+ * writes it". `output`, `generated` and `extracted` hold delivered work product;
33
+ * `sites` holds published websites; `uploads` holds what a client sent in. The
34
+ * shipped template groups those five under "tool-owned", but that is a rule
35
+ * about not reorganising their internals — a write constraint, not a reason to
36
+ * file them behind the platform's own plumbing. What stays out is genuinely
37
+ * internal: caches, state, logs, secrets, temp, the git and Claude control
38
+ * dirs, and plugin workspaces.
39
+ *
40
+ * Every name here is created at provision (provision-account-dir.sh `_seed_dirs`),
41
+ * so the standing home-parity audit finds them on disk rather than reporting
42
+ * them missing.
43
+ *
44
+ * Lives here rather than in either consumer because both the /data page and the
45
+ * standing reconcile audit must agree on the same set; a hand-synced copy in
46
+ * each build is precisely the drift this shared module exists to prevent.
47
+ */
48
+ export const HOME_FIXED: readonly string[] = Object.freeze([
49
+ 'projects', 'contacts', 'documents', 'output', 'generated', 'extracted', 'sites', 'uploads',
50
+ ])
51
+
52
+ const ONT_START = '<!-- ontology-buckets:start -->'
53
+ const ONT_END = '<!-- ontology-buckets:end -->'
54
+ const PLUGIN_START = '<!-- plugin-owned-dirs:start -->'
55
+ const PLUGIN_END = '<!-- plugin-owned-dirs:end -->'
56
+ const ALLOWED_FENCE = '```allowed-top-level'
57
+
58
+ /**
59
+ * A region line declaring a directory: `- \`<dir>/\` …`. The trailing slash
60
+ * inside the backticks is what excludes a nested-entity line
61
+ * (`- \`Quote\` records live under \`jobs/\` …`), whose first backtick span is a
62
+ * bare label. Anything after the closing backtick is ignored, so both
63
+ * separators parse.
64
+ */
65
+ const DIR_LINE = /^-\s+`([^`/]+)\/`/
66
+
67
+ export interface SchemaRegions {
68
+ /** Root bucket dirs from the ontology region, in table order, deduped. */
69
+ ontologyRoots: string[]
70
+ /** Dirs from the plugin-owned region, in file order, deduped. */
71
+ pluginOwned: string[]
72
+ /** Entries of the ```allowed-top-level fence, in file order. */
73
+ allowedTopLevel: string[]
74
+ /**
75
+ * True when the allowed-top-level fence was found with at least one entry.
76
+ * That fence is present in every valid account SCHEMA.md (it ships in
77
+ * platform/templates/account-schema/SCHEMA.md), so its absence means the file
78
+ * is missing or not an account schema. An EMPTY ontology region is NOT a
79
+ * parse failure: a vertical with no `## Top-level node types` table (for
80
+ * example schema-knowledge-work) legitimately projects no buckets.
81
+ */
82
+ parsed: boolean
83
+ /**
84
+ * Why `parsed` is false, for the caller's log line. The two states need
85
+ * different remediation — provision the account versus regenerate its schema
86
+ * — so a single `status=parse-failed` cannot be acted on.
87
+ */
88
+ reason: 'ok' | 'schema-absent' | 'fence-absent'
89
+ }
90
+
91
+ function regionLines(text: string, start: string, end: string): string[] {
92
+ const from = text.indexOf(start)
93
+ if (from === -1) return []
94
+ const to = text.indexOf(end, from)
95
+ if (to === -1) return []
96
+ return text.slice(from + start.length, to).split('\n')
97
+ }
98
+
99
+ function dirsIn(lines: string[]): string[] {
100
+ const out: string[] = []
101
+ for (const line of lines) {
102
+ const m = DIR_LINE.exec(line.trim())
103
+ if (m && !out.includes(m[1])) out.push(m[1])
104
+ }
105
+ return out
106
+ }
107
+
108
+ function fenceEntries(text: string): string[] {
109
+ const from = text.indexOf(ALLOWED_FENCE)
110
+ if (from === -1) return []
111
+ const bodyStart = text.indexOf('\n', from)
112
+ if (bodyStart === -1) return []
113
+ const to = text.indexOf('```', bodyStart)
114
+ if (to === -1) return []
115
+ return text
116
+ .slice(bodyStart + 1, to)
117
+ .split('\n')
118
+ .map((s) => s.trim())
119
+ .filter((s) => s.length > 0)
120
+ }
121
+
122
+ export function parseSchemaRegions(schemaMd: string | null): SchemaRegions {
123
+ if (schemaMd === null || schemaMd.length === 0) {
124
+ return { ontologyRoots: [], pluginOwned: [], allowedTopLevel: [], parsed: false, reason: 'schema-absent' }
125
+ }
126
+ const allowedTopLevel = fenceEntries(schemaMd)
127
+ const parsed = allowedTopLevel.length > 0
128
+ return {
129
+ ontologyRoots: dirsIn(regionLines(schemaMd, ONT_START, ONT_END)),
130
+ pluginOwned: dirsIn(regionLines(schemaMd, PLUGIN_START, PLUGIN_END)),
131
+ allowedTopLevel,
132
+ parsed,
133
+ reason: parsed ? 'ok' : 'fence-absent',
134
+ }
135
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "rootDir": "src"
6
+ },
7
+ "include": ["src"],
8
+ "exclude": ["src/**/*.test.ts"]
9
+ }
@@ -6,8 +6,8 @@
6
6
  "services/*"
7
7
  ],
8
8
  "scripts": {
9
- "build": "tsc -p lib/models/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/ledger-core/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/active-rules/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p lib/storage-broker/tsconfig.json && tsc -p services/claude-session-manager/tsconfig.json && tsc -p services/whatsapp-channel/tsconfig.json && tsc -p services/webchat-channel/tsconfig.json && tsc -p services/telegram-channel/tsconfig.json && NODE_OPTIONS='--max-old-space-size=8192' tsc -b plugins/*/mcp/tsconfig.json",
10
- "build:lib": "tsc -p lib/models/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/ledger-core/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/active-rules/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p lib/storage-broker/tsconfig.json",
9
+ "build": "tsc -p lib/account-schema-regions/tsconfig.json && tsc -p lib/models/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/ledger-core/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/active-rules/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p lib/storage-broker/tsconfig.json && tsc -p services/claude-session-manager/tsconfig.json && tsc -p services/whatsapp-channel/tsconfig.json && tsc -p services/webchat-channel/tsconfig.json && tsc -p services/telegram-channel/tsconfig.json && NODE_OPTIONS='--max-old-space-size=8192' tsc -b plugins/*/mcp/tsconfig.json",
10
+ "build:lib": "tsc -p lib/account-schema-regions/tsconfig.json && tsc -p lib/models/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-lifeline/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/account-scope/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/ledger-core/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/active-rules/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/admin-access-password/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p lib/storage-broker/tsconfig.json",
11
11
  "gen:canonical-tools": "node scripts/generate-canonical-tool-names.mjs",
12
12
  "build:memory": "tsc -p plugins/memory/mcp/tsconfig.json",
13
13
  "build:contacts": "tsc -p plugins/contacts/mcp/tsconfig.json",
@@ -22,7 +22,7 @@
22
22
  "build:replicate": "tsc -p plugins/replicate/mcp/tsconfig.json",
23
23
  "build:graph-viewer": "tsc -p plugins/graph-viewer/mcp/tsconfig.json",
24
24
  "build:claude-session-manager": "tsc -p services/claude-session-manager/tsconfig.json",
25
- "build:whatsapp-channel": "tsc -p services/whatsapp-channel/tsconfig.json",
25
+ "build:whatsapp-channel": "tsc -p services/whatsapp-channel/tsconfig.json",
26
26
  "build:webchat-channel": "tsc -p services/webchat-channel/tsconfig.json",
27
27
  "build:telegram-channel": "tsc -p services/telegram-channel/tsconfig.json"
28
28
  },