@maka/maka-cli 5.9.0 → 5.10.0
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/bundle/typescript/package.json +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js +5 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +23 -1
- package/bundle/typescript/src/commands/game/sideQuest/game.js +160 -3
- package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.d.ts +2 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +8 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +2 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/player.js +8 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.d.ts +10 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js +10 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/scene.d.ts +17 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/scene.js +32 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/scene.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/types/save-file.d.ts +208 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/save-file.js +14 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/save-file.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/ui.d.ts +6 -0
- package/bundle/typescript/src/commands/game/sideQuest/ui.js +48 -4
- package/bundle/typescript/src/commands/game/sideQuest/ui.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.d.ts +50 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.js +232 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.d.ts +71 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js +447 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +174 -18
- package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { IItemSeedJson } from './seed/item-seed.js';
|
|
2
|
+
import { ISceneSeedJson } from './seed/scene-seed.js';
|
|
3
|
+
/**
|
|
4
|
+
* The save-file schema (see utilities/persistence.ts for the machinery).
|
|
5
|
+
* PERSISTENCE RULINGS (player decisions, fixed): character + hub world
|
|
6
|
+
* persist; runs are disposable; autosave at safe beats only (homecoming,
|
|
7
|
+
* rest, job-accept, quit); one slot per character name; PERMADEATH --
|
|
8
|
+
* real death burns the save. Saves always write locally and sync to
|
|
9
|
+
* maka-cli.com when logged in (local-first; the cloud is a mirror).
|
|
10
|
+
*
|
|
11
|
+
* Bump SAVE_VERSION on any breaking shape change; readers REFUSE a
|
|
12
|
+
* mismatched version and keep the file (no silent migration, no
|
|
13
|
+
* deletion -- an old save outlives the build that can't read it).
|
|
14
|
+
*/
|
|
15
|
+
export declare const SAVE_VERSION = 1;
|
|
16
|
+
export type SaveReason = 'homecoming' | 'rest' | 'job-accept' | 'quit';
|
|
17
|
+
/**
|
|
18
|
+
* A live Item flattened to seed shape PLUS the runtime the seed can't
|
|
19
|
+
* say -- ammo left in the magazine, a PAN-jammed device, a bricked
|
|
20
|
+
* deck's damage, a shot-up drone frame. `restoreItem` applies these
|
|
21
|
+
* AFTER construction (firearms auto-fill ammo to 10 in the ctor).
|
|
22
|
+
*/
|
|
23
|
+
export interface ISavedItem extends IItemSeedJson {
|
|
24
|
+
ammo?: number;
|
|
25
|
+
jammed?: boolean;
|
|
26
|
+
deckDamage?: number;
|
|
27
|
+
droneDamage?: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Equipment layout keyed "group.slot" ("rightHand.weapon") -> the FULL
|
|
31
|
+
* item. Full blobs, not name references: equipping REMOVES an item from
|
|
32
|
+
* inventory (archetypes.ts equipIntoEmptySlots), so a name-ref into the
|
|
33
|
+
* saved inventory would dangle.
|
|
34
|
+
*/
|
|
35
|
+
export type ISavedEquipment = Record<string, ISavedItem | null>;
|
|
36
|
+
export interface ISavedPlayer {
|
|
37
|
+
name: string;
|
|
38
|
+
archetypeName?: string;
|
|
39
|
+
attributes: {
|
|
40
|
+
body: number;
|
|
41
|
+
agility: number;
|
|
42
|
+
reaction: number;
|
|
43
|
+
combatSkill: number;
|
|
44
|
+
magic: number;
|
|
45
|
+
strength: number;
|
|
46
|
+
willpower: number;
|
|
47
|
+
logic: number;
|
|
48
|
+
intuition: number;
|
|
49
|
+
charisma: number;
|
|
50
|
+
edge: number;
|
|
51
|
+
resonance: number;
|
|
52
|
+
adept: boolean;
|
|
53
|
+
};
|
|
54
|
+
/** Talent before essence burn -- the true source; effective magic/
|
|
55
|
+
* resonance recompute from these + the aug replay. */
|
|
56
|
+
baseMagic: number;
|
|
57
|
+
baseResonance: number;
|
|
58
|
+
skills: Record<string, number>;
|
|
59
|
+
karma: number;
|
|
60
|
+
careerKarma: number;
|
|
61
|
+
/** Notoriety is its reasons (dedupe key IS the string) -- replayed
|
|
62
|
+
* through addNotoriety so derived rep recomputes. */
|
|
63
|
+
notorietyReasons: string[];
|
|
64
|
+
/** Written for round-trip verification only; the live value is
|
|
65
|
+
* reconstructed by replaying installAug over `augmentations`. */
|
|
66
|
+
essence: number;
|
|
67
|
+
augmentations: string[];
|
|
68
|
+
qualities: string[];
|
|
69
|
+
metamagics: string[];
|
|
70
|
+
initiationGrade: number;
|
|
71
|
+
edgeRemaining: number;
|
|
72
|
+
haggledThisJob: boolean;
|
|
73
|
+
damageTaken: number;
|
|
74
|
+
stunTaken: number;
|
|
75
|
+
needs: {
|
|
76
|
+
ateThisCycle: boolean;
|
|
77
|
+
sleptThisCycle: boolean;
|
|
78
|
+
hungerStreak: number;
|
|
79
|
+
sleepStreak: number;
|
|
80
|
+
hungerFatigue: number;
|
|
81
|
+
sleepFatigue: number;
|
|
82
|
+
};
|
|
83
|
+
autoStance: 'manual' | 'guarded' | 'aggressive';
|
|
84
|
+
inventory: ISavedItem[];
|
|
85
|
+
equipment: ISavedEquipment;
|
|
86
|
+
}
|
|
87
|
+
/** One hub room's divergence from its seed: inventory is a FULL
|
|
88
|
+
* replacement, the rest is runtime flags the seed can't express. */
|
|
89
|
+
export interface ISavedRoomOverlay {
|
|
90
|
+
name: string;
|
|
91
|
+
inventory: ISavedItem[];
|
|
92
|
+
plainSightItems: string[];
|
|
93
|
+
searchedBy: string[];
|
|
94
|
+
visitedBy: string[];
|
|
95
|
+
hostCracked: boolean;
|
|
96
|
+
doorLocks: {
|
|
97
|
+
direction: string;
|
|
98
|
+
isLocked: boolean;
|
|
99
|
+
}[];
|
|
100
|
+
/** Bank/authority deposits (Room._currencyLedger) -- player's only. */
|
|
101
|
+
currencyLedger: {
|
|
102
|
+
owner: string;
|
|
103
|
+
items: ISavedItem[];
|
|
104
|
+
}[];
|
|
105
|
+
}
|
|
106
|
+
export interface ISavedNpcOverlay {
|
|
107
|
+
name: string;
|
|
108
|
+
room: string;
|
|
109
|
+
atSpot?: string;
|
|
110
|
+
damageTaken: number;
|
|
111
|
+
stunTaken: number;
|
|
112
|
+
surrendered: boolean;
|
|
113
|
+
objective?: string;
|
|
114
|
+
/** AI memory tail -- how a contact remembers you across sessions. */
|
|
115
|
+
history: string[];
|
|
116
|
+
inventory: ISavedItem[];
|
|
117
|
+
equipment: ISavedEquipment;
|
|
118
|
+
}
|
|
119
|
+
export interface ISavedHub {
|
|
120
|
+
rooms: ISavedRoomOverlay[];
|
|
121
|
+
npcs: ISavedNpcOverlay[];
|
|
122
|
+
/** Seed NPCs absent from the live scene (killed) -- removed QUIETLY
|
|
123
|
+
* on load; their dropped gear is already in the room overlays. */
|
|
124
|
+
deadActors: string[];
|
|
125
|
+
puzzles: {
|
|
126
|
+
name: string;
|
|
127
|
+
solved: boolean;
|
|
128
|
+
bypassBurned: boolean;
|
|
129
|
+
}[];
|
|
130
|
+
worldEvents: string[];
|
|
131
|
+
roomOwnership: [string, string][];
|
|
132
|
+
itemOwnership: [string, string][];
|
|
133
|
+
/** The hideout is Game-owned and in no seed -- its whole inventory
|
|
134
|
+
* (the stash) and the player's secure storage ride here. */
|
|
135
|
+
home: {
|
|
136
|
+
inventory: ISavedItem[];
|
|
137
|
+
secureStash: ISavedItem[];
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
export interface ISavedGig {
|
|
141
|
+
from: string;
|
|
142
|
+
to: string;
|
|
143
|
+
itemName: string;
|
|
144
|
+
itemDescription: string;
|
|
145
|
+
pay: number;
|
|
146
|
+
brief: string;
|
|
147
|
+
}
|
|
148
|
+
export interface ISavedGameState {
|
|
149
|
+
lifestyleTier: string;
|
|
150
|
+
rentDebt: number;
|
|
151
|
+
tier: number;
|
|
152
|
+
contacts: [string, {
|
|
153
|
+
connection: number;
|
|
154
|
+
loyalty: number;
|
|
155
|
+
spent: number;
|
|
156
|
+
gigs: number;
|
|
157
|
+
asked: boolean;
|
|
158
|
+
}][];
|
|
159
|
+
fencedCategories: string[];
|
|
160
|
+
/** Rumor pool stays seed-sourced; only the cursor + active persist. */
|
|
161
|
+
rumorIndex: number;
|
|
162
|
+
activeRumor?: string;
|
|
163
|
+
/** The gig pool IS saved -- offerGigFrom splices entries out of it. */
|
|
164
|
+
gigPool: ISavedGig[];
|
|
165
|
+
gigIndex: number;
|
|
166
|
+
gigAvailable?: ISavedGig;
|
|
167
|
+
activeGig?: {
|
|
168
|
+
from: string;
|
|
169
|
+
to: string;
|
|
170
|
+
itemName: string;
|
|
171
|
+
pay: number;
|
|
172
|
+
};
|
|
173
|
+
/** A drafted-but-untaken job survives a quit -- 20-40s of generation
|
|
174
|
+
* (and any haggled payout, which lives in the seed) not re-billed. */
|
|
175
|
+
pendingRun?: {
|
|
176
|
+
seed: ISceneSeedJson;
|
|
177
|
+
tier: number;
|
|
178
|
+
ride?: {
|
|
179
|
+
arrive: string;
|
|
180
|
+
board: string;
|
|
181
|
+
};
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
export interface ISaveFileV1 {
|
|
185
|
+
version: typeof SAVE_VERSION;
|
|
186
|
+
savedAt: string;
|
|
187
|
+
reason: SaveReason;
|
|
188
|
+
playerName: string;
|
|
189
|
+
/** Cheap fields for the launcher's Continue menu -- no deep parse. */
|
|
190
|
+
summary: {
|
|
191
|
+
archetypeName?: string;
|
|
192
|
+
karma: number;
|
|
193
|
+
currency: number;
|
|
194
|
+
lifestyleTier: string;
|
|
195
|
+
hubName: string;
|
|
196
|
+
};
|
|
197
|
+
/** The hub seed EMBEDDED: resume never depends on scene2.json (or a
|
|
198
|
+
* generated hub) still existing or matching. */
|
|
199
|
+
hubSeed: ISceneSeedJson;
|
|
200
|
+
player: ISavedPlayer;
|
|
201
|
+
game: ISavedGameState;
|
|
202
|
+
hub: ISavedHub;
|
|
203
|
+
/** Cloud-sync bookkeeping (local-first): the cloud copy's savedAt as
|
|
204
|
+
* of our last successful push/pull -- divergence detection. */
|
|
205
|
+
sync?: {
|
|
206
|
+
lastCloudSavedAt?: string;
|
|
207
|
+
};
|
|
208
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The save-file schema (see utilities/persistence.ts for the machinery).
|
|
3
|
+
* PERSISTENCE RULINGS (player decisions, fixed): character + hub world
|
|
4
|
+
* persist; runs are disposable; autosave at safe beats only (homecoming,
|
|
5
|
+
* rest, job-accept, quit); one slot per character name; PERMADEATH --
|
|
6
|
+
* real death burns the save. Saves always write locally and sync to
|
|
7
|
+
* maka-cli.com when logged in (local-first; the cloud is a mirror).
|
|
8
|
+
*
|
|
9
|
+
* Bump SAVE_VERSION on any breaking shape change; readers REFUSE a
|
|
10
|
+
* mismatched version and keep the file (no silent migration, no
|
|
11
|
+
* deletion -- an old save outlives the build that can't read it).
|
|
12
|
+
*/
|
|
13
|
+
export const SAVE_VERSION = 1;
|
|
14
|
+
//# sourceMappingURL=save-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-file.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/types/save-file.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC"}
|
|
@@ -6,5 +6,11 @@ export interface IMainGameConfig {
|
|
|
6
6
|
generationNotice?: string;
|
|
7
7
|
/** Archetype name picked at launch -- sets the player's attribute sheet. */
|
|
8
8
|
archetype?: string;
|
|
9
|
+
/** Where this character's save slot lives (see utilities/persistence.ts).
|
|
10
|
+
* Unset = a session that never saves (classic scenes). */
|
|
11
|
+
saveFilePath?: string;
|
|
12
|
+
/** True when the launcher picked "Continue as <name>" -- the save at
|
|
13
|
+
* saveFilePath is loaded instead of rolling a fresh archetype. */
|
|
14
|
+
resume?: boolean;
|
|
9
15
|
}
|
|
10
16
|
export declare function main(playerName: string, sceneSeed: ISceneSeedJson, options: IMainGameConfig): Promise<void>;
|
|
@@ -7,6 +7,8 @@ import { getArchetype, outfitArchetype } from './archetypes.js';
|
|
|
7
7
|
import { STANCE_CYCLE } from './models/player.js';
|
|
8
8
|
import { AutoFight } from './utilities/auto-fight.js';
|
|
9
9
|
import { TERMINAL_RESET_SEQUENCE } from './utilities/terminal-reset.js';
|
|
10
|
+
import { readSave } from './utilities/persistence.js';
|
|
11
|
+
import { SAVE_VERSION } from './types/save-file.js';
|
|
10
12
|
// Windows Terminal draws astral-plane emoji (📞 call icon, 📍 HUD pin,
|
|
11
13
|
// 👥 companions, 💀) TWO columns wide, but blessed's 2015-era unicode
|
|
12
14
|
// tables predate emoji being classified wide and count them as ONE. The
|
|
@@ -100,12 +102,54 @@ export async function main(playerName, sceneSeed, options) {
|
|
|
100
102
|
// and its requisite gear comes with it -- granted on top of the
|
|
101
103
|
// scene's generic loadout, wearables equipped so a samurai starts
|
|
102
104
|
// with the Predator in hand and a Face wearing the good suit.
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
// RESUME (see utilities/persistence.ts): the player is rebuilt from
|
|
106
|
+
// the save's attribute block -- no archetype outfitting (gear,
|
|
107
|
+
// qualities, and augs all come from restorePlayer inside Game.init).
|
|
108
|
+
let player;
|
|
109
|
+
let resumeSave;
|
|
110
|
+
if (options.resume && options.saveFilePath) {
|
|
111
|
+
const read = readSave(options.saveFilePath);
|
|
112
|
+
if (!read.ok) {
|
|
113
|
+
// The file is KEPT -- an old save outlives the build that can't
|
|
114
|
+
// read it. console.error is the convention pre-screen-teardown.
|
|
115
|
+
console.error(read.error === 'version-mismatch'
|
|
116
|
+
? `This save was written by a different version (v${read.version}) -- this build reads v${SAVE_VERSION}. The file was left untouched.`
|
|
117
|
+
: `Could not read the save file (${read.error}). The file was left untouched.`);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
resumeSave = read.save;
|
|
121
|
+
const a = resumeSave.player.attributes;
|
|
122
|
+
player = new Player({
|
|
123
|
+
playerName: resumeSave.playerName,
|
|
124
|
+
startLocation: nexus,
|
|
125
|
+
combat: { ...a, skills: resumeSave.player.skills },
|
|
126
|
+
});
|
|
127
|
+
player.archetypeName = resumeSave.player.archetypeName;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const archetype = getArchetype(options.archetype);
|
|
131
|
+
player = new Player({ playerName, startLocation: nexus, combat: archetype.combat });
|
|
132
|
+
outfitArchetype(player, archetype);
|
|
133
|
+
}
|
|
106
134
|
// Create the game instance
|
|
107
|
-
const game = await Game.getInstance(player, sceneSeed);
|
|
135
|
+
const game = await Game.getInstance(player, resumeSave?.hubSeed ?? sceneSeed, resumeSave);
|
|
108
136
|
const ready = await game.init(options, screen);
|
|
137
|
+
// The quit seal (player ruling: autosave on quit). A clean exit --
|
|
138
|
+
// the quit verb, double-ESC, the C-c binding below -- all funnel
|
|
139
|
+
// through process.exit(0); this synchronous hook is the ONE place
|
|
140
|
+
// that covers every path. Death exits code 2 (and burned the save
|
|
141
|
+
// in Game.close); crashes exit 1 and deliberately do NOT save
|
|
142
|
+
// half-applied state -- the last safe-beat save stands.
|
|
143
|
+
process.on('exit', (code) => {
|
|
144
|
+
if (code === 0) {
|
|
145
|
+
try {
|
|
146
|
+
game.requestSave('quit');
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// requestSave logs its own failures; never let the hook throw.
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
109
153
|
// Print welcome message or initial room description
|
|
110
154
|
const notice = options.generationNotice
|
|
111
155
|
? `{yellow-fg}${options.generationNotice}{/yellow-fg}\n\n`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../../../../src/commands/game/sideQuest/ui.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../../../../src/commands/game/sideQuest/ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { ISaveFileV1 } from '../types/save-file.js';
|
|
2
|
+
export declare function authToken(): string | undefined;
|
|
3
|
+
export type CloudResult = 'ok' | 'unauthorized' | 'offline';
|
|
4
|
+
export interface ICloudSummary {
|
|
5
|
+
slug: string;
|
|
6
|
+
playerName: string;
|
|
7
|
+
summary: ISaveFileV1['summary'];
|
|
8
|
+
savedAt: string;
|
|
9
|
+
version: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Mirrors a freshly-written local save to the cloud. Fire-and-forget
|
|
13
|
+
* from the save beats (`void pushSave(...)`): on success the local file
|
|
14
|
+
* is re-stamped with sync.lastCloudSavedAt so the launcher can tell a
|
|
15
|
+
* clean mirror from a divergence.
|
|
16
|
+
*/
|
|
17
|
+
export declare function pushSave(saveFilePath: string, save: ISaveFileV1): Promise<CloudResult>;
|
|
18
|
+
export declare function fetchSummaries(): Promise<{
|
|
19
|
+
ok: true;
|
|
20
|
+
saves: ICloudSummary[];
|
|
21
|
+
} | {
|
|
22
|
+
ok: false;
|
|
23
|
+
reason: CloudResult;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function fetchSave(slug: string): Promise<ISaveFileV1 | undefined>;
|
|
26
|
+
/** POST-tunneled delete (the HTTPS helper speaks GET/POST only). */
|
|
27
|
+
export declare function deleteCloudSave(slug: string): Promise<CloudResult>;
|
|
28
|
+
/**
|
|
29
|
+
* PERMADEATH's cloud half (Game.close burns the local slot first). The
|
|
30
|
+
* tombstone is written SYNCHRONOUSLY before the async delete attempt --
|
|
31
|
+
* if the process exits (or the net is down) before the delete confirms,
|
|
32
|
+
* the marker survives and the launcher deletes the cloud copy when next
|
|
33
|
+
* reachable, instead of resurrecting the dead from the mirror.
|
|
34
|
+
*/
|
|
35
|
+
export declare function burnCloudSaveFor(saveFilePath: string, playerName: string): void;
|
|
36
|
+
export type ReconcileVerdict = 'in-sync' | 'local-only' | 'cloud-only' | 'push-local' | 'pull-cloud' | 'diverged';
|
|
37
|
+
/**
|
|
38
|
+
* Pure decision (rulings: newest wins, PROMPT on divergence). The
|
|
39
|
+
* divergence detector is sync.lastCloudSavedAt -- the cloud's savedAt as
|
|
40
|
+
* of our last successful mirror: cloud unchanged since then means every
|
|
41
|
+
* cloud byte is ours, so local wins; local at exactly the mirror point
|
|
42
|
+
* means the cloud moved on without us, so cloud wins; both moved means
|
|
43
|
+
* a real fork and a human decides.
|
|
44
|
+
*/
|
|
45
|
+
export declare function reconcile(local: {
|
|
46
|
+
savedAt: string;
|
|
47
|
+
lastCloudSavedAt?: string;
|
|
48
|
+
} | undefined, cloud: {
|
|
49
|
+
savedAt: string;
|
|
50
|
+
} | undefined): ReconcileVerdict;
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as os from 'os';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as http from 'http';
|
|
5
|
+
import * as https from 'https';
|
|
6
|
+
import { Logger } from './logger.js';
|
|
7
|
+
import { saveSlug, readSave, writeSaveAtomic, tombstonePathFor } from './persistence.js';
|
|
8
|
+
/**
|
|
9
|
+
* CLOUD MIRROR for the save slots (rulings: LOCAL-FIRST -- the local
|
|
10
|
+
* file is always written and always authoritative for play; the cloud
|
|
11
|
+
* at www.maka-cli.com is a mirror kept fresh when the user is logged in
|
|
12
|
+
* via `maka login`. Offline or logged out, everything here degrades to
|
|
13
|
+
* a silent no-op and the game never notices).
|
|
14
|
+
*
|
|
15
|
+
* Auth rides the same rails as login/logout: the Meteor resume token
|
|
16
|
+
* from global-config.json's `token` property, sent as `x-auth-token`.
|
|
17
|
+
* The child game process has no CFG tool, so the config is read
|
|
18
|
+
* directly (the hints.ts pattern). Tokens expire in 2 days server-side:
|
|
19
|
+
* any 401 disables sync for this process with ONE notice -- never a
|
|
20
|
+
* blocked save beat, never a crash.
|
|
21
|
+
*/
|
|
22
|
+
// The shared HTTPS tool hardcodes TLS + port 443, which can't reach a
|
|
23
|
+
// local `maka run` Meteor dev server (plain HTTP on 3000) -- so this
|
|
24
|
+
// module carries its own tiny transport. MAKA_DEV=True points it at
|
|
25
|
+
// http://localhost:3000 (override the port with MAKA_DEV_PORT);
|
|
26
|
+
// production is https://www.maka-cli.com as ever.
|
|
27
|
+
const DEV = process.env.MAKA_DEV === 'True';
|
|
28
|
+
const HOSTNAME = DEV ? 'localhost' : 'www.maka-cli.com';
|
|
29
|
+
const PORT = DEV ? Number(process.env.MAKA_DEV_PORT ?? 3000) : 443;
|
|
30
|
+
const API_BASE = 'api/v1/game-saves';
|
|
31
|
+
// Short on purpose: the beat already saved locally; a sluggish mirror
|
|
32
|
+
// must not hold anything hostage (the shared default is 300s).
|
|
33
|
+
const TIMEOUT_MS = 10000;
|
|
34
|
+
function request(method, apiPath, token, body) {
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
const payload = body === undefined ? undefined : JSON.stringify(body);
|
|
37
|
+
const mod = DEV ? http : https;
|
|
38
|
+
const req = mod.request({
|
|
39
|
+
hostname: HOSTNAME,
|
|
40
|
+
port: PORT,
|
|
41
|
+
path: apiPath,
|
|
42
|
+
method,
|
|
43
|
+
timeout: TIMEOUT_MS,
|
|
44
|
+
headers: {
|
|
45
|
+
'x-auth-token': token,
|
|
46
|
+
...(payload !== undefined
|
|
47
|
+
? { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload) }
|
|
48
|
+
: {}),
|
|
49
|
+
},
|
|
50
|
+
}, res => {
|
|
51
|
+
let data = '';
|
|
52
|
+
res.on('data', chunk => { data += chunk; });
|
|
53
|
+
res.on('end', () => resolve({ statusCode: res.statusCode ?? 0, data }));
|
|
54
|
+
});
|
|
55
|
+
req.on('timeout', () => req.destroy(new Error('Request timeout')));
|
|
56
|
+
req.on('error', reject);
|
|
57
|
+
if (payload !== undefined)
|
|
58
|
+
req.write(payload);
|
|
59
|
+
req.end();
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const GLOBAL_CONFIG_PATH = path.join(os.homedir(), '.meteor', '.maka', 'global-config.json');
|
|
63
|
+
export function authToken() {
|
|
64
|
+
try {
|
|
65
|
+
const cfg = JSON.parse(fs.readFileSync(GLOBAL_CONFIG_PATH, 'utf8'));
|
|
66
|
+
const token = cfg?.token?.authToken;
|
|
67
|
+
return typeof token === 'string' && token.length > 0 ? token : undefined;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// One 401 notice per process; afterward sync stays silently off.
|
|
74
|
+
let unauthorizedAnnounced = false;
|
|
75
|
+
let syncDisabled = false;
|
|
76
|
+
function noteUnauthorized() {
|
|
77
|
+
syncDisabled = true;
|
|
78
|
+
if (unauthorizedAnnounced)
|
|
79
|
+
return;
|
|
80
|
+
unauthorizedAnnounced = true;
|
|
81
|
+
const logger = Logger.getInstance();
|
|
82
|
+
if (logger.hasScreen()) {
|
|
83
|
+
logger.logWithColor(`Cloud sync is off -- your maka-cli.com login expired. Run \`maka login\` to sync your runner again.`, 'yellow');
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
logger.write('Cloud sync off: 401 from maka-cli.com (token expired or logged out).');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Mirrors a freshly-written local save to the cloud. Fire-and-forget
|
|
91
|
+
* from the save beats (`void pushSave(...)`): on success the local file
|
|
92
|
+
* is re-stamped with sync.lastCloudSavedAt so the launcher can tell a
|
|
93
|
+
* clean mirror from a divergence.
|
|
94
|
+
*/
|
|
95
|
+
export async function pushSave(saveFilePath, save) {
|
|
96
|
+
const logger = Logger.getInstance();
|
|
97
|
+
const token = authToken();
|
|
98
|
+
if (!token || syncDisabled)
|
|
99
|
+
return 'offline';
|
|
100
|
+
try {
|
|
101
|
+
const res = await request('POST', `/${API_BASE}/${saveSlug(save.playerName)}`, token, save);
|
|
102
|
+
if (res.statusCode === 200) {
|
|
103
|
+
// Stamp the mirror point -- but only if the slot on disk is still
|
|
104
|
+
// the save we pushed (a later beat may have already overwritten it).
|
|
105
|
+
const current = readSave(saveFilePath);
|
|
106
|
+
if (current.ok && current.save.savedAt === save.savedAt) {
|
|
107
|
+
current.save.sync = { lastCloudSavedAt: save.savedAt };
|
|
108
|
+
writeSaveAtomic(saveFilePath, current.save);
|
|
109
|
+
}
|
|
110
|
+
logger.write(`Cloud sync: pushed ${save.playerName} (${save.savedAt}).`);
|
|
111
|
+
return 'ok';
|
|
112
|
+
}
|
|
113
|
+
if (res.statusCode === 401) {
|
|
114
|
+
noteUnauthorized();
|
|
115
|
+
return 'unauthorized';
|
|
116
|
+
}
|
|
117
|
+
logger.write(`Cloud sync: push got ${res.statusCode} -- staying local.`);
|
|
118
|
+
return 'offline';
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
logger.write(`Cloud sync: push failed (${err.message ?? err}) -- staying local.`);
|
|
122
|
+
return 'offline';
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export async function fetchSummaries() {
|
|
126
|
+
const token = authToken();
|
|
127
|
+
if (!token || syncDisabled)
|
|
128
|
+
return { ok: false, reason: 'offline' };
|
|
129
|
+
try {
|
|
130
|
+
const res = await request('GET', `/${API_BASE}/list`, token);
|
|
131
|
+
if (res.statusCode === 200) {
|
|
132
|
+
const parsed = JSON.parse(res.data);
|
|
133
|
+
return { ok: true, saves: (parsed?.saves ?? []) };
|
|
134
|
+
}
|
|
135
|
+
if (res.statusCode === 401) {
|
|
136
|
+
noteUnauthorized();
|
|
137
|
+
return { ok: false, reason: 'unauthorized' };
|
|
138
|
+
}
|
|
139
|
+
return { ok: false, reason: 'offline' };
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return { ok: false, reason: 'offline' };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export async function fetchSave(slug) {
|
|
146
|
+
const token = authToken();
|
|
147
|
+
if (!token || syncDisabled)
|
|
148
|
+
return undefined;
|
|
149
|
+
try {
|
|
150
|
+
const res = await request('GET', `/${API_BASE}/${slug}`, token);
|
|
151
|
+
if (res.statusCode === 401) {
|
|
152
|
+
noteUnauthorized();
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
if (res.statusCode !== 200)
|
|
156
|
+
return undefined;
|
|
157
|
+
const parsed = JSON.parse(res.data);
|
|
158
|
+
return parsed?.save;
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** POST-tunneled delete (the HTTPS helper speaks GET/POST only). */
|
|
165
|
+
export async function deleteCloudSave(slug) {
|
|
166
|
+
const token = authToken();
|
|
167
|
+
if (!token)
|
|
168
|
+
return 'offline';
|
|
169
|
+
try {
|
|
170
|
+
const res = await request('POST', `/${API_BASE}/${slug}/delete`, token, {});
|
|
171
|
+
if (res.statusCode === 200)
|
|
172
|
+
return 'ok';
|
|
173
|
+
if (res.statusCode === 401) {
|
|
174
|
+
noteUnauthorized();
|
|
175
|
+
return 'unauthorized';
|
|
176
|
+
}
|
|
177
|
+
return 'offline';
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return 'offline';
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* PERMADEATH's cloud half (Game.close burns the local slot first). The
|
|
185
|
+
* tombstone is written SYNCHRONOUSLY before the async delete attempt --
|
|
186
|
+
* if the process exits (or the net is down) before the delete confirms,
|
|
187
|
+
* the marker survives and the launcher deletes the cloud copy when next
|
|
188
|
+
* reachable, instead of resurrecting the dead from the mirror.
|
|
189
|
+
*/
|
|
190
|
+
export function burnCloudSaveFor(saveFilePath, playerName) {
|
|
191
|
+
const dir = path.dirname(saveFilePath);
|
|
192
|
+
const tomb = tombstonePathFor(dir, playerName);
|
|
193
|
+
try {
|
|
194
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
195
|
+
fs.writeFileSync(tomb, JSON.stringify({ dead: true, at: new Date().toISOString() }), 'utf8');
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
Logger.getInstance().write(`burnCloudSaveFor: tombstone write failed: ${err}`);
|
|
199
|
+
}
|
|
200
|
+
void deleteCloudSave(saveSlug(playerName)).then(result => {
|
|
201
|
+
if (result === 'ok') {
|
|
202
|
+
try {
|
|
203
|
+
fs.rmSync(tomb, { force: true });
|
|
204
|
+
}
|
|
205
|
+
catch { /* the launcher sweep will retry */ }
|
|
206
|
+
}
|
|
207
|
+
}).catch(() => { });
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Pure decision (rulings: newest wins, PROMPT on divergence). The
|
|
211
|
+
* divergence detector is sync.lastCloudSavedAt -- the cloud's savedAt as
|
|
212
|
+
* of our last successful mirror: cloud unchanged since then means every
|
|
213
|
+
* cloud byte is ours, so local wins; local at exactly the mirror point
|
|
214
|
+
* means the cloud moved on without us, so cloud wins; both moved means
|
|
215
|
+
* a real fork and a human decides.
|
|
216
|
+
*/
|
|
217
|
+
export function reconcile(local, cloud) {
|
|
218
|
+
if (!local && !cloud)
|
|
219
|
+
return 'in-sync';
|
|
220
|
+
if (!cloud)
|
|
221
|
+
return 'local-only';
|
|
222
|
+
if (!local)
|
|
223
|
+
return 'cloud-only';
|
|
224
|
+
if (local.savedAt === cloud.savedAt)
|
|
225
|
+
return 'in-sync';
|
|
226
|
+
if (local.lastCloudSavedAt === cloud.savedAt)
|
|
227
|
+
return 'push-local';
|
|
228
|
+
if (local.savedAt === local.lastCloudSavedAt)
|
|
229
|
+
return 'pull-cloud';
|
|
230
|
+
return 'diverged';
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=cloud-saves.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-saves.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/utilities/cloud-saves.ts"],"names":[],"mappings":"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"}
|