roblox-mcp-pro 0.2.0 → 0.2.1
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/licensing/license.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAiBH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AASD,+EAA+E;AAC/E,wBAAgB,cAAc,IAAI,YAAY,CAE7C;
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/licensing/license.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAiBH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AASD,+EAA+E;AAC/E,wBAAgB,cAAc,IAAI,YAAY,CAE7C;AAiJD,iEAAiE;AACjE,wBAAsB,cAAc,IAAI,OAAO,CAAC,YAAY,CAAC,CAW5D"}
|
|
@@ -43,64 +43,96 @@ async function readLicenseFile() {
|
|
|
43
43
|
return undefined;
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
// else: reachable but invalid → fall through to validate for a clear status
|
|
46
|
+
/** A subscription/key status that still grants access. */
|
|
47
|
+
function isLive(status) {
|
|
48
|
+
return status !== "expired" && status !== "disabled";
|
|
49
|
+
}
|
|
50
|
+
/** Result when Lemon Squeezy is unreachable: offline grace window, else locked. */
|
|
51
|
+
function offlineResult(store) {
|
|
52
|
+
if (store.lastValidationOk && store.lastValidatedAt) {
|
|
53
|
+
const used = daysBetween(store.lastValidatedAt, Date.now());
|
|
54
|
+
if (used <= OFFLINE_GRACE_DAYS) {
|
|
55
|
+
return {
|
|
56
|
+
status: "licensed",
|
|
57
|
+
message: `Licensed ✅ (offline — re-checks within ${OFFLINE_GRACE_DAYS - used} day(s)).`,
|
|
58
|
+
daysLeft: OFFLINE_GRACE_DAYS - used,
|
|
59
|
+
};
|
|
62
60
|
}
|
|
63
|
-
// If unreachable, fall through to the offline-grace path below.
|
|
64
61
|
}
|
|
65
|
-
|
|
66
|
-
|
|
62
|
+
return {
|
|
63
|
+
status: "locked",
|
|
64
|
+
message: `Couldn't verify your ${PRODUCT_NAME} license (no internet). ` +
|
|
65
|
+
"Connect to the internet and try again.",
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const licensed = (expiresAt) => ({
|
|
69
|
+
status: "licensed",
|
|
70
|
+
message: `Licensed ✅ (${PRODUCT_NAME}).`,
|
|
71
|
+
expiresAt: expiresAt ?? null,
|
|
72
|
+
});
|
|
73
|
+
/**
|
|
74
|
+
* Resolve a license key. The activation limit is enforced by REQUIRING a bound
|
|
75
|
+
* activation instance: a machine either re-validates its own instance, or it
|
|
76
|
+
* must successfully ACTIVATE a new one. If activation fails because the limit is
|
|
77
|
+
* full, we lock — we never fall back to a bare key check (which would let one key
|
|
78
|
+
* run on unlimited machines).
|
|
79
|
+
*/
|
|
80
|
+
async function resolveWithKey(key) {
|
|
81
|
+
const store = await readStore();
|
|
82
|
+
const boundInstance = store.licenseKey === key ? store.instanceId : undefined;
|
|
83
|
+
// 1) Returning machine — re-validate its own activation instance.
|
|
84
|
+
if (boundInstance) {
|
|
85
|
+
const val = await validate(key, boundInstance);
|
|
86
|
+
if (!val.reachable)
|
|
87
|
+
return offlineResult(store);
|
|
67
88
|
if (!ownsKey(val))
|
|
68
89
|
return "no-key";
|
|
69
|
-
if (val.valid && val.status
|
|
90
|
+
if (val.valid && isLive(val.status)) {
|
|
70
91
|
await writeStore({
|
|
71
92
|
licenseKey: key,
|
|
72
93
|
lastValidatedAt: new Date().toISOString(),
|
|
73
94
|
lastValidationOk: true,
|
|
74
95
|
});
|
|
96
|
+
return licensed(val.expiresAt);
|
|
97
|
+
}
|
|
98
|
+
if (!isLive(val.status)) {
|
|
99
|
+
await writeStore({ lastValidationOk: false });
|
|
75
100
|
return {
|
|
76
|
-
status: "
|
|
77
|
-
message: `
|
|
101
|
+
status: "locked",
|
|
102
|
+
message: `Your ${PRODUCT_NAME} subscription is ${val.status}. Renew at ${PURCHASE_URL}`,
|
|
78
103
|
expiresAt: val.expiresAt ?? null,
|
|
79
104
|
};
|
|
80
105
|
}
|
|
81
|
-
|
|
106
|
+
// Instance was deactivated elsewhere — forget it and try to re-activate below.
|
|
107
|
+
await writeStore({ instanceId: undefined });
|
|
108
|
+
}
|
|
109
|
+
// 2) New machine — MUST activate. This is what enforces the activation limit.
|
|
110
|
+
const act = await activate(key, os.hostname() || "device");
|
|
111
|
+
if (!act.reachable)
|
|
112
|
+
return offlineResult(store);
|
|
113
|
+
if (act.valid && act.instanceId && ownsKey(act)) {
|
|
114
|
+
await writeStore({
|
|
115
|
+
instanceId: act.instanceId,
|
|
116
|
+
licenseKey: key,
|
|
117
|
+
lastValidatedAt: new Date().toISOString(),
|
|
118
|
+
lastValidationOk: true,
|
|
119
|
+
});
|
|
120
|
+
return licensed(act.expiresAt);
|
|
121
|
+
}
|
|
122
|
+
// Activation failed — classify why.
|
|
123
|
+
if (!ownsKey(act))
|
|
124
|
+
return "no-key"; // wrong store/product or key not found → trial
|
|
125
|
+
if (!isLive(act.status)) {
|
|
82
126
|
return {
|
|
83
127
|
status: "locked",
|
|
84
|
-
message: `Your ${PRODUCT_NAME} subscription is ${
|
|
85
|
-
`Renew at ${PURCHASE_URL}`,
|
|
86
|
-
expiresAt: val.expiresAt ?? null,
|
|
128
|
+
message: `Your ${PRODUCT_NAME} subscription is ${act.status}. Renew at ${PURCHASE_URL}`,
|
|
87
129
|
};
|
|
88
130
|
}
|
|
89
|
-
//
|
|
90
|
-
if (store.lastValidationOk && store.lastValidatedAt) {
|
|
91
|
-
const used = daysBetween(store.lastValidatedAt, Date.now());
|
|
92
|
-
if (used <= OFFLINE_GRACE_DAYS) {
|
|
93
|
-
return {
|
|
94
|
-
status: "licensed",
|
|
95
|
-
message: `Licensed ✅ (offline — re-checks within ${OFFLINE_GRACE_DAYS - used} day(s)).`,
|
|
96
|
-
daysLeft: OFFLINE_GRACE_DAYS - used,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
}
|
|
131
|
+
// Key is valid & ours, but this machine couldn't be activated → device limit hit.
|
|
100
132
|
return {
|
|
101
133
|
status: "locked",
|
|
102
|
-
message: `
|
|
103
|
-
|
|
134
|
+
message: `This license is already active on another device (activation limit reached). ` +
|
|
135
|
+
`Deactivate the other device, or get another license at ${PURCHASE_URL}`,
|
|
104
136
|
};
|
|
105
137
|
}
|
|
106
138
|
async function resolveTrial() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/licensing/license.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/licensing/license.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "roblox-mcp-pro",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "MCP server that lets AI agents control Roblox Studio: live Luau execution, instance query/mutate, UI/terrain/lighting, and bidirectional Studio<->local sync. Paid subscription with a free trial.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"author": "Peerapol",
|