gamesteel 0.5.2 → 0.5.4
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/gamesteel.js +468 -146
- package/dist/pkgs/audio/dist/worker.js +3 -3
- package/dist/pkgs/model/dist/worker.js +3 -3
- package/dist/pkgs/paint/dist/worker.js +3 -3
- package/dist/pkgs/studio/dist/server/playtest-worker.js +205 -46
- package/dist/resolved/@gamesteel/online/worker/runtime.js +10 -10
- package/package.json +11 -11
|
@@ -5331,7 +5331,7 @@ function said(error) {
|
|
|
5331
5331
|
const found = FULL.exec(message);
|
|
5332
5332
|
if (found === null) return error;
|
|
5333
5333
|
const gb = Math.max(1, Math.round(Number(found[1]) * 1048576 / 1e9));
|
|
5334
|
-
return new Error(`this game's database is full: its size holds ${String(gb)} GB. Delete some of its data, or make the database bigger
|
|
5334
|
+
return new Error(`this game's database is full: its size holds ${String(gb)} GB. Delete some of its data, or make the database bigger on its Server page`);
|
|
5335
5335
|
}
|
|
5336
5336
|
function bindingDb(binding) {
|
|
5337
5337
|
return {
|
|
@@ -5713,7 +5713,7 @@ function guessServiceRegion(url, headers) {
|
|
|
5713
5713
|
}
|
|
5714
5714
|
|
|
5715
5715
|
// worker/files.ts
|
|
5716
|
-
var NO_FILES_WORDS = "this game has no files: turn them on
|
|
5716
|
+
var NO_FILES_WORDS = "this game has no files: turn them on, on its Server page (they need its database)";
|
|
5717
5717
|
var NO_FILES = {
|
|
5718
5718
|
uploadUrl: () => Promise.reject(new Error(NO_FILES_WORDS)),
|
|
5719
5719
|
downloadUrl: () => Promise.reject(new Error(NO_FILES_WORDS)),
|
|
@@ -5741,7 +5741,7 @@ function uploadOf(key, options, cap) {
|
|
|
5741
5741
|
keyed(key);
|
|
5742
5742
|
const { size } = options;
|
|
5743
5743
|
if (!Number.isInteger(size) || size < 1) throw new Error("an upload's size is a whole number of bytes, at least 1");
|
|
5744
|
-
if (size > cap) throw new Error(`a file is at most ${grouped(cap)} bytes on this server's size, and this is ${grouped(size)}: make the server bigger in the game's
|
|
5744
|
+
if (size > cap) throw new Error(`a file is at most ${grouped(cap)} bytes on this server's size, and this is ${grouped(size)}: make the server bigger in the game's Server page`);
|
|
5745
5745
|
const seconds = secondsOf(options.seconds, UPLOAD_SECONDS, `an upload's address lasts at most ${String(UPLOAD_SECONDS)} seconds`);
|
|
5746
5746
|
return { size, contentType: options.contentType ?? "application/octet-stream", seconds };
|
|
5747
5747
|
}
|
|
@@ -5834,7 +5834,7 @@ function filesOf(config, cap, fetcher = fetch) {
|
|
|
5834
5834
|
// src/firebase.ts
|
|
5835
5835
|
var TOKEN_URL = "https://oauth2.googleapis.com/token";
|
|
5836
5836
|
var FCM_SCOPE = "https://www.googleapis.com/auth/firebase.messaging";
|
|
5837
|
-
var FOR_PUSH = { scope: FCM_SCOPE, unusable: "the game's Firebase service account has no usable private key: add its JSON again
|
|
5837
|
+
var FOR_PUSH = { scope: FCM_SCOPE, unusable: "the game's Firebase service account has no usable private key: add its JSON again on the Server page" };
|
|
5838
5838
|
var base64url = (bytes) => {
|
|
5839
5839
|
let text = "";
|
|
5840
5840
|
for (const byte of bytes) text += String.fromCharCode(byte);
|
|
@@ -5874,7 +5874,7 @@ async function accessToken(account, fetcher, now, purpose = FOR_PUSH) {
|
|
|
5874
5874
|
|
|
5875
5875
|
// worker/push.ts
|
|
5876
5876
|
var PLATFORMS = ["ios", "android"];
|
|
5877
|
-
var NO_PUSH_WORDS = "this game has no push: turn it on
|
|
5877
|
+
var NO_PUSH_WORDS = "this game has no push: turn it on, on its Server page, with its Firebase project (it needs its database)";
|
|
5878
5878
|
var NO_PUSH = {
|
|
5879
5879
|
send: () => Promise.reject(new Error(NO_PUSH_WORDS)),
|
|
5880
5880
|
register: () => Promise.reject(new Error(NO_PUSH_WORDS))
|
|
@@ -6443,7 +6443,7 @@ async function factsOf(deps, body, app) {
|
|
|
6443
6443
|
async function purchase(deps, body, effects) {
|
|
6444
6444
|
const refused = (reason) => ({ result: "refused", reason, effects: effects() });
|
|
6445
6445
|
if (deps.onPurchase === void 0) return refused("this game's server code has no onPurchase");
|
|
6446
|
-
if (deps.app === null || Object.keys(deps.app.products).length === 0) return refused("this game sells nothing: its products are in its Upload
|
|
6446
|
+
if (deps.app === null || Object.keys(deps.app.products).length === 0) return refused("this game sells nothing: its products are in its Upload page");
|
|
6447
6447
|
let facts;
|
|
6448
6448
|
try {
|
|
6449
6449
|
const found = await factsOf(deps, body, deps.app);
|
|
@@ -6472,9 +6472,9 @@ async function purchase(deps, body, effects) {
|
|
|
6472
6472
|
}
|
|
6473
6473
|
async function notice(deps, body) {
|
|
6474
6474
|
const app = deps.app;
|
|
6475
|
-
if (app === null) return deps.log("a store's notice reached this game, which sells nothing: its products are in its Upload
|
|
6475
|
+
if (app === null) return deps.log("a store's notice reached this game, which sells nothing: its products are in its Upload page");
|
|
6476
6476
|
if (body.store === "apple") {
|
|
6477
|
-
if (app.bundleId === null) return deps.log("an App Store notice reached this game, which has no iOS app: its id is in
|
|
6477
|
+
if (app.bundleId === null) return deps.log("an App Store notice reached this game, which has no iOS app: its id is in Upload \u203A App");
|
|
6478
6478
|
const heard2 = await appleNotice(body.payload, { ...deps.apple, bundleId: app.bundleId, stage: body.stage });
|
|
6479
6479
|
if (heard2.type === "TEST") return deps.log("Apple's test notification reached the game");
|
|
6480
6480
|
const facts2 = heard2.transaction;
|
|
@@ -6524,7 +6524,7 @@ async function reward(deps, body) {
|
|
|
6524
6524
|
if (given.transaction === "") throw new Error("AdMob's reward has no transaction");
|
|
6525
6525
|
const unit = given.adUnit ?? "";
|
|
6526
6526
|
const ours = body.stage === "test" && unit === "test" ? true : unit !== "" && unit !== "test" && (deps.app?.rewardUnits ?? []).some((id) => id === unit || id.slice(id.lastIndexOf("/") + 1) === unit);
|
|
6527
|
-
if (!ours) return deps.log(`a reward from an ad unit that is not this game's (${unit === "" ? "none named" : unit}) was refused: its reward ad units are in its Upload
|
|
6527
|
+
if (!ours) return deps.log(`a reward from an ad unit that is not this game's (${unit === "" ? "none named" : unit}) was refused: its reward ad units are in its Upload page`);
|
|
6528
6528
|
if (!await once(deps, "admob", given.transaction)) return;
|
|
6529
6529
|
const kept = { placement: given.placement ?? "", amount: given.amount, item: given.item, transaction: given.transaction };
|
|
6530
6530
|
try {
|
|
@@ -6549,7 +6549,7 @@ function bound(text) {
|
|
|
6549
6549
|
return null;
|
|
6550
6550
|
}
|
|
6551
6551
|
}
|
|
6552
|
-
var NO_DATABASE = "this game has no database: turn it on
|
|
6552
|
+
var NO_DATABASE = "this game has no database: turn it on, on its Server page";
|
|
6553
6553
|
var noDb = { query: () => Promise.reject(new Error(NO_DATABASE)) };
|
|
6554
6554
|
var words2 = (error) => error instanceof Error ? error.message : String(error);
|
|
6555
6555
|
var answer = (body) => new Response(JSON.stringify(body), { headers: { "content-type": "application/json" } });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gamesteel",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.4",
|
|
4
4
|
"description": "The Gamesteel program your AI agent starts, and the command that sets it up in Claude Code, Codex, Gemini CLI, Cursor, VS Code and 25 more. The work runs on your machine; the website keeps your games.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gamesteel",
|
|
@@ -39,23 +39,23 @@
|
|
|
39
39
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
40
40
|
"esbuild": "0.28.2",
|
|
41
41
|
"miniflare": "4.20260730.0",
|
|
42
|
-
"@gamesteel/builder": "0.1.0",
|
|
43
|
-
"@gamesteel/connect": "0.1.0",
|
|
44
42
|
"@gamesteel/agent": "0.1.0",
|
|
43
|
+
"@gamesteel/accounts": "0.1.0",
|
|
44
|
+
"@gamesteel/builder": "0.1.0",
|
|
45
45
|
"@gamesteel/edit": "0.1.0",
|
|
46
|
-
"@gamesteel/
|
|
46
|
+
"@gamesteel/i18n": "0.1.0",
|
|
47
47
|
"@gamesteel/billing": "0.1.0",
|
|
48
|
+
"@gamesteel/core": "0.1.0",
|
|
48
49
|
"@gamesteel/cloud": "0.1.0",
|
|
49
|
-
"@gamesteel/
|
|
50
|
-
"@gamesteel/accounts": "0.1.0",
|
|
51
|
-
"@gamesteel/online": "0.1.0",
|
|
52
|
-
"@gamesteel/model": "0.1.0",
|
|
53
|
-
"@gamesteel/store": "0.1.0",
|
|
50
|
+
"@gamesteel/connect": "0.1.0",
|
|
54
51
|
"@gamesteel/design": "0.1.0",
|
|
55
|
-
"@gamesteel/
|
|
52
|
+
"@gamesteel/model": "0.1.0",
|
|
53
|
+
"@gamesteel/github": "0.1.0",
|
|
56
54
|
"@gamesteel/service": "0.1.0",
|
|
55
|
+
"@gamesteel/store": "0.1.0",
|
|
56
|
+
"@gamesteel/online": "0.1.0",
|
|
57
57
|
"@gamesteel/stores": "0.1.0",
|
|
58
|
-
"@gamesteel/
|
|
58
|
+
"@gamesteel/studio": "0.1.0"
|
|
59
59
|
},
|
|
60
60
|
"scripts": {
|
|
61
61
|
"pretest": "pnpm --filter \"gamesteel^...\" --filter \"!@gamesteel/studio\" build && pnpm --filter @gamesteel/studio exec tsc -p tsconfig.json && pnpm build",
|