@rubytech/create-sitedesk-code 0.1.516 → 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.
- package/dist/__tests__/tier-flag.test.js +10 -6
- package/dist/index.js +1 -1
- package/dist/tier-flag.js +10 -5
- package/package.json +1 -1
- package/payload/platform/lib/entitlement/dist/index.d.ts +24 -0
- package/payload/platform/lib/entitlement/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/entitlement/dist/index.js +40 -2
- package/payload/platform/lib/entitlement/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/index.js +5 -9
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/skills/admin-user-management/SKILL.md +1 -1
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +205 -2
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +10 -0
- package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
- package/payload/platform/scripts/generate-entitlement-fixture.mjs +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +16 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js +15 -0
- package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +12 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.js +10 -2
- package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/server.js +17 -2
- package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
- package/payload/server/public/activity.html +4 -4
- package/payload/server/public/agents.html +3 -3
- package/payload/server/public/assets/{AdminLoginScreens-B5qKb3YK.js → AdminLoginScreens-CDpNkwkf.js} +1 -1
- package/payload/server/public/assets/AdminLoginScreens-CDpNkwkf.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-CDpNkwkf.js.gz +0 -0
- package/payload/server/public/assets/{AdminShell-BgJEq2zJ.js → AdminShell-TSa8KgID.js} +2 -2
- package/payload/server/public/assets/AdminShell-TSa8KgID.js.br +0 -0
- package/payload/server/public/assets/AdminShell-TSa8KgID.js.gz +0 -0
- package/payload/server/public/assets/{activity-DmnVUDYO.js → activity-BE9gv5xL.js} +1 -1
- package/payload/server/public/assets/activity-BE9gv5xL.js.br +0 -0
- package/payload/server/public/assets/activity-BE9gv5xL.js.gz +0 -0
- package/payload/server/public/assets/{admin-Dpge4OG9.js → admin-Cb0BZriv.js} +1 -1
- package/payload/server/public/assets/admin-Cb0BZriv.js.br +0 -0
- package/payload/server/public/assets/admin-Cb0BZriv.js.gz +0 -0
- package/payload/server/public/assets/{agents-Bmq9X7P3.js → agents-B-x0Ai2v.js} +1 -1
- package/payload/server/public/assets/agents-B-x0Ai2v.js.br +0 -0
- package/payload/server/public/assets/agents-B-x0Ai2v.js.gz +0 -0
- package/payload/server/public/assets/{browser-B1G-W80B.js → browser-ZEQUkPfs.js} +1 -1
- package/payload/server/public/assets/browser-ZEQUkPfs.js.br +0 -0
- package/payload/server/public/assets/browser-ZEQUkPfs.js.gz +0 -0
- package/payload/server/public/assets/{calendar-CHgrOFIN.js → calendar-DsRxrW0G.js} +1 -1
- package/payload/server/public/assets/calendar-DsRxrW0G.js.br +0 -0
- package/payload/server/public/assets/calendar-DsRxrW0G.js.gz +0 -0
- package/payload/server/public/assets/chat-BS9B9lDo.js +1 -0
- package/payload/server/public/assets/chat-BS9B9lDo.js.br +1 -0
- package/payload/server/public/assets/chat-BS9B9lDo.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-DLtGuH6K.js +1 -0
- package/payload/server/public/assets/chevron-right-CY_trg5L.js +1 -0
- package/payload/server/public/assets/chevron-right-CY_trg5L.js.br +0 -0
- package/payload/server/public/assets/clock-oM5driJm.js +1 -0
- package/payload/server/public/assets/clock-oM5driJm.js.br +0 -0
- package/payload/server/public/assets/clock-oM5driJm.js.gz +0 -0
- package/payload/server/public/assets/data-Cio6PO0F.js +1 -0
- package/payload/server/public/assets/data-Cio6PO0F.js.br +2 -0
- package/payload/server/public/assets/data-Cio6PO0F.js.gz +0 -0
- package/payload/server/public/assets/{file-text-BVqqaDun.js → file-text-BTV6EdBv.js} +1 -1
- package/payload/server/public/assets/file-text-BTV6EdBv.js.br +0 -0
- package/payload/server/public/assets/file-text-BTV6EdBv.js.gz +0 -0
- package/payload/server/public/assets/{graph-CEcME0lp.js → graph-hD_gPbbL.js} +1 -1
- package/payload/server/public/assets/graph-hD_gPbbL.js.br +0 -0
- package/payload/server/public/assets/graph-hD_gPbbL.js.gz +0 -0
- package/payload/server/public/assets/{graph-labels-Zl32_AOH.js → graph-labels-CY1T19PY.js} +1 -1
- package/payload/server/public/assets/graph-labels-CY1T19PY.js.br +0 -0
- package/payload/server/public/assets/graph-labels-CY1T19PY.js.gz +0 -0
- package/payload/server/public/assets/{maximize-2-rkkMyAhf.js → maximize-2-BFV9VKHO.js} +1 -1
- package/payload/server/public/assets/maximize-2-BFV9VKHO.js.br +0 -0
- package/payload/server/public/assets/maximize-2-BFV9VKHO.js.gz +0 -0
- package/payload/server/public/assets/{operator-DlL023ch.js → operator-Dxze8CwV.js} +1 -1
- package/payload/server/public/assets/operator-Dxze8CwV.js.br +0 -0
- package/payload/server/public/assets/operator-Dxze8CwV.js.gz +0 -0
- package/payload/server/public/assets/{page-k0BhBkA2.js → page-Bi86QF6_.js} +1 -1
- package/payload/server/public/assets/page-Bi86QF6_.js.br +0 -0
- package/payload/server/public/assets/page-Bi86QF6_.js.gz +0 -0
- package/payload/server/public/assets/{page-BAmYYqxp.js → page-BnXly9aN.js} +1 -1
- package/payload/server/public/assets/page-BnXly9aN.js.br +0 -0
- package/payload/server/public/assets/page-BnXly9aN.js.gz +0 -0
- package/payload/server/public/assets/{public-Cqgfmo1D.js → public-D6Tnj5LU.js} +1 -1
- package/payload/server/public/assets/public-D6Tnj5LU.js.br +0 -0
- package/payload/server/public/assets/public-D6Tnj5LU.js.gz +0 -0
- package/payload/server/public/assets/{rotate-ccw-O3RmqoTy.js → rotate-ccw-C-RfQUza.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-C-RfQUza.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-C-RfQUza.js.gz +0 -0
- package/payload/server/public/assets/{routines-DMYObMUy.js → routines-NIMElUzV.js} +1 -1
- package/payload/server/public/assets/routines-NIMElUzV.js.br +0 -0
- package/payload/server/public/assets/routines-NIMElUzV.js.gz +0 -0
- package/payload/server/public/assets/{skills-DON1BKu5.js → skills-N0ZlHosx.js} +1 -1
- package/payload/server/public/assets/skills-N0ZlHosx.js.br +0 -0
- package/payload/server/public/assets/skills-N0ZlHosx.js.gz +0 -0
- package/payload/server/public/assets/{tasks-C2PhUSrf.js → tasks-BsB_0duv.js} +1 -1
- package/payload/server/public/assets/tasks-BsB_0duv.js.br +0 -0
- package/payload/server/public/assets/tasks-BsB_0duv.js.gz +0 -0
- package/payload/server/public/assets/{time-entry-format-4zgmuQI0.js → time-entry-format-jQxlRPoI.js} +1 -1
- package/payload/server/public/assets/time-entry-format-jQxlRPoI.js.br +0 -0
- package/payload/server/public/assets/time-entry-format-jQxlRPoI.js.gz +0 -0
- package/payload/server/public/assets/{triangle-alert-By5D7wuI.js → triangle-alert-wUS4rpzv.js} +1 -1
- package/payload/server/public/assets/triangle-alert-wUS4rpzv.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-wUS4rpzv.js.gz +0 -0
- package/payload/server/public/assets/{useCopyFeedback-Dx0vtm9s.js → useCopyFeedback-BRix_wIl.js} +1 -1
- package/payload/server/public/assets/useCopyFeedback-BRix_wIl.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-BRix_wIl.js.gz +0 -0
- package/payload/server/public/assets/{useSubAccountSwitcher-CRWoQXuU.js → useSubAccountSwitcher-DWMWxvYo.js} +6 -1
- package/payload/server/public/assets/useSubAccountSwitcher-DWMWxvYo.js.br +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-DWMWxvYo.js.gz +0 -0
- package/payload/server/public/assets/{useVoiceRecorder-BgwOCCwj.js → useVoiceRecorder-1TAfCP2k.js} +1 -1
- package/payload/server/public/assets/useVoiceRecorder-1TAfCP2k.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-1TAfCP2k.js.gz +0 -0
- package/payload/server/public/assets/{wrench-CHfMwLza.js → wrench-sDivAjhf.js} +1 -1
- package/payload/server/public/assets/wrench-sDivAjhf.js.br +0 -0
- package/payload/server/public/assets/wrench-sDivAjhf.js.gz +0 -0
- package/payload/server/public/browser.html +3 -3
- package/payload/server/public/calendar.html +6 -6
- package/payload/server/public/chat.html +12 -12
- package/payload/server/public/data.html +10 -10
- package/payload/server/public/graph.html +8 -8
- package/payload/server/public/index.html +13 -13
- package/payload/server/public/operator.html +13 -13
- package/payload/server/public/public.html +12 -12
- package/payload/server/public/routines.html +5 -5
- package/payload/server/public/skills.html +4 -4
- package/payload/server/public/tasks.html +5 -5
- package/payload/server/server.js +36 -9
- package/payload/platform/plugins/email/Archive.zip +0 -0
- package/payload/server/public/assets/AdminLoginScreens-B5qKb3YK.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-B5qKb3YK.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-BgJEq2zJ.js.br +0 -0
- package/payload/server/public/assets/AdminShell-BgJEq2zJ.js.gz +0 -0
- package/payload/server/public/assets/activity-DmnVUDYO.js.br +0 -0
- package/payload/server/public/assets/activity-DmnVUDYO.js.gz +0 -0
- package/payload/server/public/assets/admin-Dpge4OG9.js.br +0 -0
- package/payload/server/public/assets/admin-Dpge4OG9.js.gz +0 -0
- package/payload/server/public/assets/agents-Bmq9X7P3.js.br +0 -0
- package/payload/server/public/assets/agents-Bmq9X7P3.js.gz +0 -0
- package/payload/server/public/assets/browser-B1G-W80B.js.br +0 -0
- package/payload/server/public/assets/browser-B1G-W80B.js.gz +0 -0
- package/payload/server/public/assets/calendar-CHgrOFIN.js.br +0 -0
- package/payload/server/public/assets/calendar-CHgrOFIN.js.gz +0 -0
- package/payload/server/public/assets/chat-CIwmmtwP.js +0 -1
- package/payload/server/public/assets/chat-CIwmmtwP.js.br +0 -0
- package/payload/server/public/assets/chat-CIwmmtwP.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-EQjfaQ-n.js +0 -1
- package/payload/server/public/assets/chevron-left-EQjfaQ-n.js.br +0 -0
- package/payload/server/public/assets/chevron-right-Ct8jZUGP.js +0 -1
- package/payload/server/public/assets/chevron-right-Ct8jZUGP.js.br +0 -0
- package/payload/server/public/assets/clock-Cxz5ybck.js +0 -1
- package/payload/server/public/assets/clock-Cxz5ybck.js.br +0 -0
- package/payload/server/public/assets/clock-Cxz5ybck.js.gz +0 -0
- package/payload/server/public/assets/data-BQVXKVsJ.js +0 -1
- package/payload/server/public/assets/data-BQVXKVsJ.js.br +0 -1
- package/payload/server/public/assets/data-BQVXKVsJ.js.gz +0 -0
- package/payload/server/public/assets/file-text-BVqqaDun.js.br +0 -0
- package/payload/server/public/assets/file-text-BVqqaDun.js.gz +0 -0
- package/payload/server/public/assets/graph-CEcME0lp.js.br +0 -0
- package/payload/server/public/assets/graph-CEcME0lp.js.gz +0 -0
- package/payload/server/public/assets/graph-labels-Zl32_AOH.js.br +0 -0
- package/payload/server/public/assets/graph-labels-Zl32_AOH.js.gz +0 -0
- package/payload/server/public/assets/maximize-2-rkkMyAhf.js.br +0 -0
- package/payload/server/public/assets/maximize-2-rkkMyAhf.js.gz +0 -0
- package/payload/server/public/assets/operator-DlL023ch.js.br +0 -0
- package/payload/server/public/assets/operator-DlL023ch.js.gz +0 -0
- package/payload/server/public/assets/page-BAmYYqxp.js.br +0 -0
- package/payload/server/public/assets/page-BAmYYqxp.js.gz +0 -0
- package/payload/server/public/assets/page-k0BhBkA2.js.br +0 -0
- package/payload/server/public/assets/page-k0BhBkA2.js.gz +0 -0
- package/payload/server/public/assets/public-Cqgfmo1D.js.br +0 -0
- package/payload/server/public/assets/public-Cqgfmo1D.js.gz +0 -0
- package/payload/server/public/assets/rotate-ccw-O3RmqoTy.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-O3RmqoTy.js.gz +0 -0
- package/payload/server/public/assets/routines-DMYObMUy.js.br +0 -0
- package/payload/server/public/assets/routines-DMYObMUy.js.gz +0 -0
- package/payload/server/public/assets/skills-DON1BKu5.js.br +0 -0
- package/payload/server/public/assets/skills-DON1BKu5.js.gz +0 -0
- package/payload/server/public/assets/tasks-C2PhUSrf.js.br +0 -0
- package/payload/server/public/assets/tasks-C2PhUSrf.js.gz +0 -0
- package/payload/server/public/assets/time-entry-format-4zgmuQI0.js.br +0 -0
- package/payload/server/public/assets/time-entry-format-4zgmuQI0.js.gz +0 -0
- package/payload/server/public/assets/triangle-alert-By5D7wuI.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-By5D7wuI.js.gz +0 -0
- package/payload/server/public/assets/useCopyFeedback-Dx0vtm9s.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-Dx0vtm9s.js.gz +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-CRWoQXuU.js.br +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-CRWoQXuU.js.gz +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BgwOCCwj.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BgwOCCwj.js.gz +0 -0
- package/payload/server/public/assets/wrench-CHfMwLza.js.br +0 -0
- 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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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>
|
|
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(
|
|
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:
|
|
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
|
@@ -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":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;;;
|
|
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
|
-
|
|
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
|
}
|