@rubytech/create-sitedesk-code 0.1.517 → 0.1.518

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 (192) hide show
  1. package/dist/__tests__/tier-flag.test.js +10 -6
  2. package/dist/index.js +1 -1
  3. package/dist/tier-flag.js +10 -5
  4. package/package.json +1 -1
  5. package/payload/platform/lib/entitlement/dist/index.d.ts +24 -0
  6. package/payload/platform/lib/entitlement/dist/index.d.ts.map +1 -1
  7. package/payload/platform/lib/entitlement/dist/index.js +40 -2
  8. package/payload/platform/lib/entitlement/dist/index.js.map +1 -1
  9. package/payload/platform/plugins/admin/mcp/dist/index.js +5 -9
  10. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  11. package/payload/platform/plugins/admin/skills/admin-user-management/SKILL.md +1 -1
  12. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +205 -2
  13. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +6 -0
  14. package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
  15. package/payload/platform/scripts/generate-entitlement-fixture.mjs +1 -1
  16. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
  17. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +16 -1
  18. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  19. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.d.ts.map +1 -1
  20. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js +15 -0
  21. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js.map +1 -1
  22. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +12 -1
  23. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  24. package/payload/platform/services/whatsapp-channel/dist/notification.js +10 -2
  25. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  26. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  27. package/payload/platform/services/whatsapp-channel/dist/server.js +17 -2
  28. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  29. package/payload/server/public/activity.html +4 -4
  30. package/payload/server/public/agents.html +3 -3
  31. package/payload/server/public/assets/{AdminLoginScreens-B5qKb3YK.js → AdminLoginScreens-CDpNkwkf.js} +1 -1
  32. package/payload/server/public/assets/AdminLoginScreens-CDpNkwkf.js.br +0 -0
  33. package/payload/server/public/assets/AdminLoginScreens-CDpNkwkf.js.gz +0 -0
  34. package/payload/server/public/assets/{AdminShell-BgJEq2zJ.js → AdminShell-TSa8KgID.js} +2 -2
  35. package/payload/server/public/assets/AdminShell-TSa8KgID.js.br +0 -0
  36. package/payload/server/public/assets/AdminShell-TSa8KgID.js.gz +0 -0
  37. package/payload/server/public/assets/{activity-DmnVUDYO.js → activity-BE9gv5xL.js} +1 -1
  38. package/payload/server/public/assets/activity-BE9gv5xL.js.br +0 -0
  39. package/payload/server/public/assets/activity-BE9gv5xL.js.gz +0 -0
  40. package/payload/server/public/assets/{admin-Dpge4OG9.js → admin-Cb0BZriv.js} +1 -1
  41. package/payload/server/public/assets/admin-Cb0BZriv.js.br +0 -0
  42. package/payload/server/public/assets/admin-Cb0BZriv.js.gz +0 -0
  43. package/payload/server/public/assets/{agents-Bmq9X7P3.js → agents-B-x0Ai2v.js} +1 -1
  44. package/payload/server/public/assets/agents-B-x0Ai2v.js.br +0 -0
  45. package/payload/server/public/assets/agents-B-x0Ai2v.js.gz +0 -0
  46. package/payload/server/public/assets/{browser-B1G-W80B.js → browser-ZEQUkPfs.js} +1 -1
  47. package/payload/server/public/assets/browser-ZEQUkPfs.js.br +0 -0
  48. package/payload/server/public/assets/browser-ZEQUkPfs.js.gz +0 -0
  49. package/payload/server/public/assets/{calendar-CHgrOFIN.js → calendar-DsRxrW0G.js} +1 -1
  50. package/payload/server/public/assets/calendar-DsRxrW0G.js.br +0 -0
  51. package/payload/server/public/assets/calendar-DsRxrW0G.js.gz +0 -0
  52. package/payload/server/public/assets/chat-BS9B9lDo.js +1 -0
  53. package/payload/server/public/assets/chat-BS9B9lDo.js.br +1 -0
  54. package/payload/server/public/assets/chat-BS9B9lDo.js.gz +0 -0
  55. package/payload/server/public/assets/chevron-left-DLtGuH6K.js +1 -0
  56. package/payload/server/public/assets/chevron-right-CY_trg5L.js +1 -0
  57. package/payload/server/public/assets/chevron-right-CY_trg5L.js.br +0 -0
  58. package/payload/server/public/assets/clock-oM5driJm.js +1 -0
  59. package/payload/server/public/assets/clock-oM5driJm.js.br +0 -0
  60. package/payload/server/public/assets/clock-oM5driJm.js.gz +0 -0
  61. package/payload/server/public/assets/data-Cio6PO0F.js +1 -0
  62. package/payload/server/public/assets/data-Cio6PO0F.js.br +2 -0
  63. package/payload/server/public/assets/data-Cio6PO0F.js.gz +0 -0
  64. package/payload/server/public/assets/{file-text-BVqqaDun.js → file-text-BTV6EdBv.js} +1 -1
  65. package/payload/server/public/assets/file-text-BTV6EdBv.js.br +0 -0
  66. package/payload/server/public/assets/file-text-BTV6EdBv.js.gz +0 -0
  67. package/payload/server/public/assets/{graph-CEcME0lp.js → graph-hD_gPbbL.js} +1 -1
  68. package/payload/server/public/assets/graph-hD_gPbbL.js.br +0 -0
  69. package/payload/server/public/assets/graph-hD_gPbbL.js.gz +0 -0
  70. package/payload/server/public/assets/{graph-labels-Zl32_AOH.js → graph-labels-CY1T19PY.js} +1 -1
  71. package/payload/server/public/assets/graph-labels-CY1T19PY.js.br +0 -0
  72. package/payload/server/public/assets/graph-labels-CY1T19PY.js.gz +0 -0
  73. package/payload/server/public/assets/{maximize-2-rkkMyAhf.js → maximize-2-BFV9VKHO.js} +1 -1
  74. package/payload/server/public/assets/maximize-2-BFV9VKHO.js.br +0 -0
  75. package/payload/server/public/assets/maximize-2-BFV9VKHO.js.gz +0 -0
  76. package/payload/server/public/assets/{operator-DlL023ch.js → operator-Dxze8CwV.js} +1 -1
  77. package/payload/server/public/assets/operator-Dxze8CwV.js.br +0 -0
  78. package/payload/server/public/assets/operator-Dxze8CwV.js.gz +0 -0
  79. package/payload/server/public/assets/{page-k0BhBkA2.js → page-Bi86QF6_.js} +1 -1
  80. package/payload/server/public/assets/page-Bi86QF6_.js.br +0 -0
  81. package/payload/server/public/assets/page-Bi86QF6_.js.gz +0 -0
  82. package/payload/server/public/assets/{page-BAmYYqxp.js → page-BnXly9aN.js} +1 -1
  83. package/payload/server/public/assets/page-BnXly9aN.js.br +0 -0
  84. package/payload/server/public/assets/page-BnXly9aN.js.gz +0 -0
  85. package/payload/server/public/assets/{public-Cqgfmo1D.js → public-D6Tnj5LU.js} +1 -1
  86. package/payload/server/public/assets/public-D6Tnj5LU.js.br +0 -0
  87. package/payload/server/public/assets/public-D6Tnj5LU.js.gz +0 -0
  88. package/payload/server/public/assets/{rotate-ccw-O3RmqoTy.js → rotate-ccw-C-RfQUza.js} +1 -1
  89. package/payload/server/public/assets/rotate-ccw-C-RfQUza.js.br +0 -0
  90. package/payload/server/public/assets/rotate-ccw-C-RfQUza.js.gz +0 -0
  91. package/payload/server/public/assets/{routines-DMYObMUy.js → routines-NIMElUzV.js} +1 -1
  92. package/payload/server/public/assets/routines-NIMElUzV.js.br +0 -0
  93. package/payload/server/public/assets/routines-NIMElUzV.js.gz +0 -0
  94. package/payload/server/public/assets/{skills-DON1BKu5.js → skills-N0ZlHosx.js} +1 -1
  95. package/payload/server/public/assets/skills-N0ZlHosx.js.br +0 -0
  96. package/payload/server/public/assets/skills-N0ZlHosx.js.gz +0 -0
  97. package/payload/server/public/assets/{tasks-C2PhUSrf.js → tasks-BsB_0duv.js} +1 -1
  98. package/payload/server/public/assets/tasks-BsB_0duv.js.br +0 -0
  99. package/payload/server/public/assets/tasks-BsB_0duv.js.gz +0 -0
  100. package/payload/server/public/assets/{time-entry-format-4zgmuQI0.js → time-entry-format-jQxlRPoI.js} +1 -1
  101. package/payload/server/public/assets/time-entry-format-jQxlRPoI.js.br +0 -0
  102. package/payload/server/public/assets/time-entry-format-jQxlRPoI.js.gz +0 -0
  103. package/payload/server/public/assets/{triangle-alert-By5D7wuI.js → triangle-alert-wUS4rpzv.js} +1 -1
  104. package/payload/server/public/assets/triangle-alert-wUS4rpzv.js.br +0 -0
  105. package/payload/server/public/assets/triangle-alert-wUS4rpzv.js.gz +0 -0
  106. package/payload/server/public/assets/{useCopyFeedback-Dx0vtm9s.js → useCopyFeedback-BRix_wIl.js} +1 -1
  107. package/payload/server/public/assets/useCopyFeedback-BRix_wIl.js.br +0 -0
  108. package/payload/server/public/assets/useCopyFeedback-BRix_wIl.js.gz +0 -0
  109. package/payload/server/public/assets/{useSubAccountSwitcher-CRWoQXuU.js → useSubAccountSwitcher-DWMWxvYo.js} +6 -1
  110. package/payload/server/public/assets/useSubAccountSwitcher-DWMWxvYo.js.br +0 -0
  111. package/payload/server/public/assets/useSubAccountSwitcher-DWMWxvYo.js.gz +0 -0
  112. package/payload/server/public/assets/{useVoiceRecorder-BgwOCCwj.js → useVoiceRecorder-1TAfCP2k.js} +1 -1
  113. package/payload/server/public/assets/useVoiceRecorder-1TAfCP2k.js.br +0 -0
  114. package/payload/server/public/assets/useVoiceRecorder-1TAfCP2k.js.gz +0 -0
  115. package/payload/server/public/assets/{wrench-CHfMwLza.js → wrench-sDivAjhf.js} +1 -1
  116. package/payload/server/public/assets/wrench-sDivAjhf.js.br +0 -0
  117. package/payload/server/public/assets/wrench-sDivAjhf.js.gz +0 -0
  118. package/payload/server/public/browser.html +3 -3
  119. package/payload/server/public/calendar.html +6 -6
  120. package/payload/server/public/chat.html +12 -12
  121. package/payload/server/public/data.html +10 -10
  122. package/payload/server/public/graph.html +8 -8
  123. package/payload/server/public/index.html +13 -13
  124. package/payload/server/public/operator.html +13 -13
  125. package/payload/server/public/public.html +12 -12
  126. package/payload/server/public/routines.html +5 -5
  127. package/payload/server/public/skills.html +4 -4
  128. package/payload/server/public/tasks.html +5 -5
  129. package/payload/server/server.js +36 -9
  130. package/payload/server/public/assets/AdminLoginScreens-B5qKb3YK.js.br +0 -0
  131. package/payload/server/public/assets/AdminLoginScreens-B5qKb3YK.js.gz +0 -0
  132. package/payload/server/public/assets/AdminShell-BgJEq2zJ.js.br +0 -0
  133. package/payload/server/public/assets/AdminShell-BgJEq2zJ.js.gz +0 -0
  134. package/payload/server/public/assets/activity-DmnVUDYO.js.br +0 -0
  135. package/payload/server/public/assets/activity-DmnVUDYO.js.gz +0 -0
  136. package/payload/server/public/assets/admin-Dpge4OG9.js.br +0 -0
  137. package/payload/server/public/assets/admin-Dpge4OG9.js.gz +0 -0
  138. package/payload/server/public/assets/agents-Bmq9X7P3.js.br +0 -0
  139. package/payload/server/public/assets/agents-Bmq9X7P3.js.gz +0 -0
  140. package/payload/server/public/assets/browser-B1G-W80B.js.br +0 -0
  141. package/payload/server/public/assets/browser-B1G-W80B.js.gz +0 -0
  142. package/payload/server/public/assets/calendar-CHgrOFIN.js.br +0 -0
  143. package/payload/server/public/assets/calendar-CHgrOFIN.js.gz +0 -0
  144. package/payload/server/public/assets/chat-CIwmmtwP.js +0 -1
  145. package/payload/server/public/assets/chat-CIwmmtwP.js.br +0 -0
  146. package/payload/server/public/assets/chat-CIwmmtwP.js.gz +0 -0
  147. package/payload/server/public/assets/chevron-left-EQjfaQ-n.js +0 -1
  148. package/payload/server/public/assets/chevron-left-EQjfaQ-n.js.br +0 -0
  149. package/payload/server/public/assets/chevron-right-Ct8jZUGP.js +0 -1
  150. package/payload/server/public/assets/chevron-right-Ct8jZUGP.js.br +0 -0
  151. package/payload/server/public/assets/clock-Cxz5ybck.js +0 -1
  152. package/payload/server/public/assets/clock-Cxz5ybck.js.br +0 -0
  153. package/payload/server/public/assets/clock-Cxz5ybck.js.gz +0 -0
  154. package/payload/server/public/assets/data-BQVXKVsJ.js +0 -1
  155. package/payload/server/public/assets/data-BQVXKVsJ.js.br +0 -1
  156. package/payload/server/public/assets/data-BQVXKVsJ.js.gz +0 -0
  157. package/payload/server/public/assets/file-text-BVqqaDun.js.br +0 -0
  158. package/payload/server/public/assets/file-text-BVqqaDun.js.gz +0 -0
  159. package/payload/server/public/assets/graph-CEcME0lp.js.br +0 -0
  160. package/payload/server/public/assets/graph-CEcME0lp.js.gz +0 -0
  161. package/payload/server/public/assets/graph-labels-Zl32_AOH.js.br +0 -0
  162. package/payload/server/public/assets/graph-labels-Zl32_AOH.js.gz +0 -0
  163. package/payload/server/public/assets/maximize-2-rkkMyAhf.js.br +0 -0
  164. package/payload/server/public/assets/maximize-2-rkkMyAhf.js.gz +0 -0
  165. package/payload/server/public/assets/operator-DlL023ch.js.br +0 -0
  166. package/payload/server/public/assets/operator-DlL023ch.js.gz +0 -0
  167. package/payload/server/public/assets/page-BAmYYqxp.js.br +0 -0
  168. package/payload/server/public/assets/page-BAmYYqxp.js.gz +0 -0
  169. package/payload/server/public/assets/page-k0BhBkA2.js.br +0 -0
  170. package/payload/server/public/assets/page-k0BhBkA2.js.gz +0 -0
  171. package/payload/server/public/assets/public-Cqgfmo1D.js.br +0 -0
  172. package/payload/server/public/assets/public-Cqgfmo1D.js.gz +0 -0
  173. package/payload/server/public/assets/rotate-ccw-O3RmqoTy.js.br +0 -0
  174. package/payload/server/public/assets/rotate-ccw-O3RmqoTy.js.gz +0 -0
  175. package/payload/server/public/assets/routines-DMYObMUy.js.br +0 -0
  176. package/payload/server/public/assets/routines-DMYObMUy.js.gz +0 -0
  177. package/payload/server/public/assets/skills-DON1BKu5.js.br +0 -0
  178. package/payload/server/public/assets/skills-DON1BKu5.js.gz +0 -0
  179. package/payload/server/public/assets/tasks-C2PhUSrf.js.br +0 -0
  180. package/payload/server/public/assets/tasks-C2PhUSrf.js.gz +0 -0
  181. package/payload/server/public/assets/time-entry-format-4zgmuQI0.js.br +0 -0
  182. package/payload/server/public/assets/time-entry-format-4zgmuQI0.js.gz +0 -0
  183. package/payload/server/public/assets/triangle-alert-By5D7wuI.js.br +0 -0
  184. package/payload/server/public/assets/triangle-alert-By5D7wuI.js.gz +0 -0
  185. package/payload/server/public/assets/useCopyFeedback-Dx0vtm9s.js.br +0 -0
  186. package/payload/server/public/assets/useCopyFeedback-Dx0vtm9s.js.gz +0 -0
  187. package/payload/server/public/assets/useSubAccountSwitcher-CRWoQXuU.js.br +0 -0
  188. package/payload/server/public/assets/useSubAccountSwitcher-CRWoQXuU.js.gz +0 -0
  189. package/payload/server/public/assets/useVoiceRecorder-BgwOCCwj.js.br +0 -0
  190. package/payload/server/public/assets/useVoiceRecorder-BgwOCCwj.js.gz +0 -0
  191. package/payload/server/public/assets/wrench-CHfMwLza.js.br +0 -0
  192. package/payload/server/public/assets/wrench-CHfMwLza.js.gz +0 -0
@@ -4,17 +4,20 @@
4
4
  import test from "node:test";
5
5
  import assert from "node:assert/strict";
6
6
  import { validateTierFlag, applyTierToAccountConfig, isValidTier, } from "../tier-flag.js";
7
- test("validateTierFlag accepts solo|family|pro when commercialMode is false", () => {
7
+ test("validateTierFlag accepts solo|family|pro|max when commercialMode is false", () => {
8
8
  assert.equal(validateTierFlag("solo", false), "solo");
9
9
  assert.equal(validateTierFlag("family", false), "family");
10
10
  assert.equal(validateTierFlag("pro", false), "pro");
11
+ assert.equal(validateTierFlag("max", false), "max");
11
12
  });
12
- test("validateTierFlag rejects values outside the enum", () => {
13
- assert.throws(() => validateTierFlag("enterprise", false), /--tier value must be one of: solo, family, pro/);
14
- assert.throws(() => validateTierFlag("max", false), /--tier value must be one of: solo, family, pro/);
13
+ // Task 2063 both messages are joined from VALID_TIERS, never written out.
14
+ // The stale-payload failure mode is diagnosed from exactly this text, so a
15
+ // hardcoded list would let a stale build print a plausible one.
16
+ test("validateTierFlag rejects values outside the enum, naming every valid tier", () => {
17
+ assert.throws(() => validateTierFlag("enterprise", false), /--tier value must be one of: solo, family, pro, max \(got: enterprise\)/);
15
18
  });
16
- test("validateTierFlag rejects empty or flag-shaped value", () => {
17
- assert.throws(() => validateTierFlag(undefined, false), /--tier requires a value/);
19
+ test("validateTierFlag rejects empty or flag-shaped value, naming every valid tier", () => {
20
+ assert.throws(() => validateTierFlag(undefined, false), /--tier requires a value \(one of: solo, family, pro, max\)/);
18
21
  assert.throws(() => validateTierFlag("", false), /--tier requires a value/);
19
22
  assert.throws(() => validateTierFlag("--hostname", false), /--tier requires a value/);
20
23
  });
@@ -48,6 +51,7 @@ test("isValidTier narrows correctly", () => {
48
51
  assert.equal(isValidTier("solo"), true);
49
52
  assert.equal(isValidTier("family"), true);
50
53
  assert.equal(isValidTier("pro"), true);
54
+ assert.equal(isValidTier("max"), true);
51
55
  assert.equal(isValidTier("enterprise"), false);
52
56
  assert.equal(isValidTier(""), false);
53
57
  });
package/dist/index.js CHANGED
@@ -4998,7 +4998,7 @@ if (hostnameIdx !== -1) {
4998
4998
  // ---------------------------------------------------------------------------
4999
4999
  // Founder-side tier-set flags (Task 240).
5000
5000
  //
5001
- // `--tier <solo|family|pro>` stamps account.json.tier directly when the brand
5001
+ // `--tier <solo|family|pro|max>` stamps account.json.tier directly when the brand
5002
5002
  // is personal-mode (today's default for both maxy-code and realagent-code).
5003
5003
  // `--entitlement-base64 <b64>` decodes a signed payload and writes it to
5004
5004
  // ~/<BRAND.configDir>/entitlement.json when the brand is commercial-mode.
package/dist/tier-flag.js CHANGED
@@ -1,12 +1,17 @@
1
1
  // Pure validation + path helpers for the founder-side tier-set installer flags
2
2
  // (Task 240). Two flags wired into the installer at src/index.ts:
3
- // --tier <solo|family|pro> personal-mode (brand.commercialMode === false)
3
+ // --tier <solo|family|pro|max> personal-mode (brand.commercialMode === false)
4
4
  // --entitlement-base64 <b64> commercial-mode (brand.commercialMode === true)
5
5
  //
6
6
  // Both helpers throw on invalid input; the caller exits non-zero and surfaces the
7
7
  // thrown message. No filesystem or console side effects — index.ts owns those.
8
8
  import { resolve } from "node:path";
9
- const VALID_TIERS = new Set(["solo", "family", "pro"]);
9
+ const VALID_TIERS = new Set(["solo", "family", "pro", "max"]);
10
+ // Task 2063 — the list in both thrown messages is JOINED FROM VALID_TIERS,
11
+ // never written out. A device that rejects a valid `--tier` because it carries
12
+ // a stale bundled build is diagnosed from exactly this text, so a hardcoded
13
+ // list would let a stale build print a plausible one and destroy the signal.
14
+ const TIER_LIST = [...VALID_TIERS].join(", ");
10
15
  export function isValidTier(value) {
11
16
  return VALID_TIERS.has(value);
12
17
  }
@@ -15,7 +20,7 @@ export function isValidTier(value) {
15
20
  *
16
21
  * Throws when:
17
22
  * - raw is missing / starts with `--` (no value supplied after the flag)
18
- * - raw is not in {solo, family, pro}
23
+ * - raw is not in {solo, family, pro, max}
19
24
  * - brand is commercial-mode (operator must use --entitlement-base64 instead)
20
25
  */
21
26
  export function validateTierFlag(raw, commercialMode) {
@@ -23,10 +28,10 @@ export function validateTierFlag(raw, commercialMode) {
23
28
  throw new Error("--tier is for personal mode. Commercial mode — use --entitlement-base64 to deliver a signed payload.");
24
29
  }
25
30
  if (!raw || raw.startsWith("--")) {
26
- throw new Error("--tier requires a value (one of: solo, family, pro).");
31
+ throw new Error(`--tier requires a value (one of: ${TIER_LIST}).`);
27
32
  }
28
33
  if (!isValidTier(raw)) {
29
- throw new Error(`--tier value must be one of: solo, family, pro (got: ${raw}).`);
34
+ throw new Error(`--tier value must be one of: ${TIER_LIST} (got: ${raw}).`);
30
35
  }
31
36
  return raw;
32
37
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-sitedesk-code",
3
- "version": "0.1.517",
3
+ "version": "0.1.518",
4
4
  "description": "Install SiteDesk — automated back office for independent building contractors",
5
5
  "bin": {
6
6
  "create-sitedesk-code": "./dist/index.js"
@@ -62,6 +62,30 @@ export interface BrandConfigSubset {
62
62
  /** True only when this brand has flipped to commercial entitlement enforcement. */
63
63
  commercialMode?: boolean;
64
64
  }
65
+ /**
66
+ * Admin seats per tier. Lives beside VALID_TIERS deliberately (Task 2063).
67
+ * The admin MCP used to hold its own copy and resolve through a silent
68
+ * `?? MAX_ADMINS_DEFAULT`, so a tier added to the signed-payload registry
69
+ * but not to that table refused the 6th admin with a message reading as a
70
+ * limit rather than a bug — no event, and re-running reproduced nothing.
71
+ * Adding a tier now puts both edits in one file, and the unmapped case is
72
+ * an event rather than a fallback.
73
+ */
74
+ export declare const MAX_ADMINS_BY_TIER: Readonly<Record<string, number>>;
75
+ export declare const MAX_ADMINS_DEFAULT = 5;
76
+ /**
77
+ * Admin seat cap for an effective tier. Emits `op=tier-cap-unmapped` when a
78
+ * tier that IS SET carries no entry — the standing signal for a tier that
79
+ * verifies but has no seat count, which is otherwise indistinguishable from a
80
+ * real limit.
81
+ *
82
+ * An EMPTY tier is not that fault and must stay silent. The installer stamps
83
+ * account.json.tier only when `--tier` is passed, so every default personal
84
+ * install reaches implicitTrust with `tier: ""` — the commonest shape there
85
+ * is. Alerting on it would fire this signal on installs where nothing is
86
+ * wrong, which is the same loss as having no signal at all.
87
+ */
88
+ export declare function resolveMaxAdmins(tier: string): number;
65
89
  /**
66
90
  * Resolve effective entitlement for the current install. Sync — Ed25519
67
91
  * verify is a CPU-bound primitive on the order of 0.3ms; no async surface.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAoBH,eAAO,MAAM,aAAa,qEAAqE,CAAC;AAMhG,MAAM,MAAM,iBAAiB,GACzB,QAAQ,GACR,cAAc,GACd,gBAAgB,GAChB,oBAAoB,CAAC;AAEzB,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,2GAA2G;IAC3G,YAAY,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA0BD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,GAC3B,mBAAmB,CAuBrB;AAED,sEAAsE;AACtE,wBAAgB,UAAU,IAAI,IAAI,CAEjC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAoBH,eAAO,MAAM,aAAa,qEAAqE,CAAC;AAMhG,MAAM,MAAM,iBAAiB,GACzB,QAAQ,GACR,cAAc,GACd,gBAAgB,GAChB,oBAAoB,CAAC;AAEzB,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,2GAA2G;IAC3G,YAAY,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA0BD;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAK/D,CAAC;AACF,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASrD;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,GAC3B,mBAAmB,CAuBrB;AAED,sEAAsE;AACtE,wBAAgB,UAAU,IAAI,IAAI,CAEjC"}
@@ -41,7 +41,8 @@
41
41
  * is explicitly out of scope.
42
42
  */
43
43
  Object.defineProperty(exports, "__esModule", { value: true });
44
- exports.PUBKEY_SHA256 = void 0;
44
+ exports.MAX_ADMINS_DEFAULT = exports.MAX_ADMINS_BY_TIER = exports.PUBKEY_SHA256 = void 0;
45
+ exports.resolveMaxAdmins = resolveMaxAdmins;
45
46
  exports.resolveEntitlement = resolveEntitlement;
46
47
  exports._clearMemo = _clearMemo;
47
48
  const node_crypto_1 = require("node:crypto");
@@ -78,7 +79,44 @@ function memoKey(mtimeMs, account) {
78
79
  const bucket = Math.floor(Date.now() / 60000);
79
80
  return `${mtimeMs}:${bucket}:${account.accountId}:${account.customerEmail ?? ""}`;
80
81
  }
81
- const VALID_TIERS = new Set(["solo", "family", "pro"]);
82
+ const VALID_TIERS = new Set(["solo", "family", "pro", "max"]);
83
+ /**
84
+ * Admin seats per tier. Lives beside VALID_TIERS deliberately (Task 2063).
85
+ * The admin MCP used to hold its own copy and resolve through a silent
86
+ * `?? MAX_ADMINS_DEFAULT`, so a tier added to the signed-payload registry
87
+ * but not to that table refused the 6th admin with a message reading as a
88
+ * limit rather than a bug — no event, and re-running reproduced nothing.
89
+ * Adding a tier now puts both edits in one file, and the unmapped case is
90
+ * an event rather than a fallback.
91
+ */
92
+ exports.MAX_ADMINS_BY_TIER = {
93
+ solo: 1,
94
+ family: 5,
95
+ pro: 5,
96
+ max: 20,
97
+ };
98
+ exports.MAX_ADMINS_DEFAULT = 5;
99
+ /**
100
+ * Admin seat cap for an effective tier. Emits `op=tier-cap-unmapped` when a
101
+ * tier that IS SET carries no entry — the standing signal for a tier that
102
+ * verifies but has no seat count, which is otherwise indistinguishable from a
103
+ * real limit.
104
+ *
105
+ * An EMPTY tier is not that fault and must stay silent. The installer stamps
106
+ * account.json.tier only when `--tier` is passed, so every default personal
107
+ * install reaches implicitTrust with `tier: ""` — the commonest shape there
108
+ * is. Alerting on it would fire this signal on installs where nothing is
109
+ * wrong, which is the same loss as having no signal at all.
110
+ */
111
+ function resolveMaxAdmins(tier) {
112
+ const mapped = exports.MAX_ADMINS_BY_TIER[tier];
113
+ if (typeof mapped === "number")
114
+ return mapped;
115
+ if (tier !== "") {
116
+ console.error(`[entitlement] op=tier-cap-unmapped tier=${tier} fallback=${exports.MAX_ADMINS_DEFAULT}`);
117
+ }
118
+ return exports.MAX_ADMINS_DEFAULT;
119
+ }
82
120
  /**
83
121
  * Resolve effective entitlement for the current install. Sync — Ed25519
84
122
  * verify is a CPU-bound primitive on the order of 0.3ms; no async surface.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@ import { embed } from "../../../../lib/embed-client/dist/index.js";
13
13
  import { requirePortEnv } from "../../../../lib/require-port-env/dist/index.js";
14
14
  import { deviceUrlBlock } from "../../../../lib/device-url/dist/index.js";
15
15
  import { substituteBrandPlaceholders } from "../../../../lib/brand-templating/dist/index.js";
16
- import { resolveEntitlement } from "../../../../lib/entitlement/dist/index.js";
16
+ import { resolveEntitlement, resolveMaxAdmins } from "../../../../lib/entitlement/dist/index.js";
17
17
  import { createHash, randomInt, randomUUID } from "node:crypto";
18
18
  import { createConnection } from "node:net";
19
19
  import { homedir, hostname as osHostname } from "node:os";
@@ -223,13 +223,6 @@ const USERS_FILE = resolve(CONFIG_DIR, "users.json");
223
223
  // Append-only credential-store audit log — same path the admin server resolves
224
224
  // from app/lib/paths (CONFIG_DIR == MAXY_DIR for both processes).
225
225
  const USERS_AUDIT_LOG = resolve(CONFIG_DIR, "logs", "users-audit.log");
226
- /** Maximum number of admin users allowed per tier. */
227
- const MAX_ADMINS_BY_TIER = {
228
- solo: 1,
229
- family: 5,
230
- pro: 5,
231
- };
232
- const MAX_ADMINS_DEFAULT = 5;
233
226
  function hashPin(pin) {
234
227
  return createHash("sha256").update(pin).digest("hex");
235
228
  }
@@ -905,7 +898,10 @@ eagerTool(server, "admin-add", "Add a new admin user to this account. Creates a
905
898
  const currentAdmins = (config.admins ?? []);
906
899
  const entitlement = await currentEntitlement();
907
900
  const tier = entitlement.tier;
908
- const maxAdmins = MAX_ADMINS_BY_TIER[tier] ?? MAX_ADMINS_DEFAULT;
901
+ // Task 2063 — the seat table and the tier list live together in the
902
+ // entitlement lib. A tier with no entry emits op=tier-cap-unmapped there
903
+ // rather than silently resolving to 5 here, which read as a limit.
904
+ const maxAdmins = resolveMaxAdmins(tier);
909
905
  if (currentAdmins.length >= maxAdmins) {
910
906
  return { content: [{ type: "text", text: `${TAG} Admin limit reached (${maxAdmins} for ${tier || "this"} tier). Remove an existing admin before adding a new one.` }], isError: true };
911
907
  }