@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.
Files changed (33) hide show
  1. package/bundle/typescript/package.json +1 -1
  2. package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js +5 -0
  3. package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js.map +1 -1
  4. package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +23 -1
  5. package/bundle/typescript/src/commands/game/sideQuest/game.js +160 -3
  6. package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
  7. package/bundle/typescript/src/commands/game/sideQuest/models/npc.d.ts +2 -0
  8. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +8 -0
  9. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js.map +1 -1
  10. package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +2 -0
  11. package/bundle/typescript/src/commands/game/sideQuest/models/player.js +8 -0
  12. package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
  13. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.d.ts +10 -0
  14. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js +10 -0
  15. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js.map +1 -1
  16. package/bundle/typescript/src/commands/game/sideQuest/models/scene.d.ts +17 -0
  17. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js +32 -0
  18. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js.map +1 -1
  19. package/bundle/typescript/src/commands/game/sideQuest/types/save-file.d.ts +208 -0
  20. package/bundle/typescript/src/commands/game/sideQuest/types/save-file.js +14 -0
  21. package/bundle/typescript/src/commands/game/sideQuest/types/save-file.js.map +1 -0
  22. package/bundle/typescript/src/commands/game/sideQuest/ui.d.ts +6 -0
  23. package/bundle/typescript/src/commands/game/sideQuest/ui.js +48 -4
  24. package/bundle/typescript/src/commands/game/sideQuest/ui.js.map +1 -1
  25. package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.d.ts +50 -0
  26. package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.js +232 -0
  27. package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.js.map +1 -0
  28. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.d.ts +71 -0
  29. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js +447 -0
  30. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js.map +1 -0
  31. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +174 -18
  32. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
  33. 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
- const archetype = getArchetype(options.archetype);
104
- const player = new Player({ playerName, startLocation: nexus, combat: archetype.combat });
105
- outfitArchetype(player, archetype);
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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"}