@rpgm-tools/neo-angband-mod-sdk 0.23.0 → 0.25.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/dist/capabilities.d.ts +18 -2
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +19 -3
- package/dist/capabilities.js.map +1 -1
- package/dist/compose.d.ts +1 -1
- package/dist/compose.js +1 -1
- package/dist/engine.d.ts +22 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +51 -0
- package/dist/engine.js.map +1 -1
- package/dist/hud.d.ts +1 -1
- package/dist/hud.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/sort.js +1 -1
- package/package.json +1 -1
- package/src/capabilities.ts +19 -3
- package/src/compose.ts +1 -1
- package/src/engine.ts +46 -0
- package/src/hud.ts +1 -1
- package/src/index.ts +1 -1
- package/src/sort.ts +1 -1
package/dist/capabilities.d.ts
CHANGED
|
@@ -6,12 +6,28 @@
|
|
|
6
6
|
* packs are validated data that cannot execute, so they request none
|
|
7
7
|
* (docs/MODS.md trust tiers). A plugin's `capabilities` list in its
|
|
8
8
|
* manifest is the consent surface: the installer shows each one in plain
|
|
9
|
-
* language, the user approves, and the runtime
|
|
10
|
-
*
|
|
9
|
+
* language, the user approves, and the runtime opens exactly that set of
|
|
10
|
+
* facades and no others (read the next paragraph for the scope of that
|
|
11
|
+
* claim, which is narrower than it sounds). The
|
|
11
12
|
* perceive/act facades (a later P7 phase) call `CapabilitySet.check()`
|
|
12
13
|
* before honoring a request; an ungranted capability throws a clear
|
|
13
14
|
* author-facing error rather than silently doing nothing or diverging.
|
|
14
15
|
*
|
|
16
|
+
* WHAT "GRANTS EXACTLY THAT SET" MEANS, AND WHAT IT DOES NOT. It is a
|
|
17
|
+
* statement about the FACADES, and it holds: a facade whose capability
|
|
18
|
+
* was not granted throws. It is not a statement about what in-process
|
|
19
|
+
* code can reach. A trusted plugin also receives `ctx.core` (the live
|
|
20
|
+
* engine namespace), `ctx.state` and `ctx.registries`, none of them
|
|
21
|
+
* capability-checked, and those carry the same live registry objects the
|
|
22
|
+
* `registry:*` facades write through - see docs/modding/PLUGINS.md,
|
|
23
|
+
* "What a capability gates", and the measurement in
|
|
24
|
+
* packages/web/src/capability-gate-reach.test.ts. So a capability list
|
|
25
|
+
* is a DECLARATION the player reads and the conflict report is built
|
|
26
|
+
* from, not a containment boundary; the boundary is the install consent.
|
|
27
|
+
* A capability granted to the SANDBOXED Worker tier is a different
|
|
28
|
+
* matter - that tier is isolated by construction and gets none of the
|
|
29
|
+
* registries.
|
|
30
|
+
*
|
|
15
31
|
* Vocabulary (four forms, MOD_LIFECYCLE section 4 / the frost example in
|
|
16
32
|
* section 2):
|
|
17
33
|
* - "command:add" - register commands on the act facade.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuJG;AAEH,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAE5D,qBAAa,eAAgB,SAAQ,KAAK;CAAG;AAE7C,2DAA2D;AAC3D,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,CAAC;AA6CzC;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CA8C7D;AAiED;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAE1C,OAAO;IAUP;;;;;;;OAOG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,aAAa;IAgB1D;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAKzB;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOxB,0EAA0E;IAC1E,kBAAkB,IAAI,OAAO;IAI7B,6DAA6D;IAC7D,iBAAiB,IAAI,OAAO;CAG7B"}
|
package/dist/capabilities.js
CHANGED
|
@@ -6,12 +6,28 @@
|
|
|
6
6
|
* packs are validated data that cannot execute, so they request none
|
|
7
7
|
* (docs/MODS.md trust tiers). A plugin's `capabilities` list in its
|
|
8
8
|
* manifest is the consent surface: the installer shows each one in plain
|
|
9
|
-
* language, the user approves, and the runtime
|
|
10
|
-
*
|
|
9
|
+
* language, the user approves, and the runtime opens exactly that set of
|
|
10
|
+
* facades and no others (read the next paragraph for the scope of that
|
|
11
|
+
* claim, which is narrower than it sounds). The
|
|
11
12
|
* perceive/act facades (a later P7 phase) call `CapabilitySet.check()`
|
|
12
13
|
* before honoring a request; an ungranted capability throws a clear
|
|
13
14
|
* author-facing error rather than silently doing nothing or diverging.
|
|
14
15
|
*
|
|
16
|
+
* WHAT "GRANTS EXACTLY THAT SET" MEANS, AND WHAT IT DOES NOT. It is a
|
|
17
|
+
* statement about the FACADES, and it holds: a facade whose capability
|
|
18
|
+
* was not granted throws. It is not a statement about what in-process
|
|
19
|
+
* code can reach. A trusted plugin also receives `ctx.core` (the live
|
|
20
|
+
* engine namespace), `ctx.state` and `ctx.registries`, none of them
|
|
21
|
+
* capability-checked, and those carry the same live registry objects the
|
|
22
|
+
* `registry:*` facades write through - see docs/modding/PLUGINS.md,
|
|
23
|
+
* "What a capability gates", and the measurement in
|
|
24
|
+
* packages/web/src/capability-gate-reach.test.ts. So a capability list
|
|
25
|
+
* is a DECLARATION the player reads and the conflict report is built
|
|
26
|
+
* from, not a containment boundary; the boundary is the install consent.
|
|
27
|
+
* A capability granted to the SANDBOXED Worker tier is a different
|
|
28
|
+
* matter - that tier is isolated by construction and gets none of the
|
|
29
|
+
* registries.
|
|
30
|
+
*
|
|
15
31
|
* Vocabulary (four forms, MOD_LIFECYCLE section 4 / the frost example in
|
|
16
32
|
* section 2):
|
|
17
33
|
* - "command:add" - register commands on the act facade.
|
|
@@ -335,7 +351,7 @@ export class CapabilitySet {
|
|
|
335
351
|
check(cap) {
|
|
336
352
|
if (this.has(cap))
|
|
337
353
|
return;
|
|
338
|
-
throw new CapabilityError(`this plugin needs capability "${cap}"; add it to
|
|
354
|
+
throw new CapabilityError(`this plugin needs capability "${cap}"; add it to manifest.json capabilities`);
|
|
339
355
|
}
|
|
340
356
|
/** True if the manifest declared `nondeterministic: true` (section 4). */
|
|
341
357
|
isNondeterministic() {
|
package/dist/capabilities.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"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"}
|
package/dist/compose.d.ts
CHANGED
|
@@ -114,7 +114,7 @@ export interface ComposedRecord {
|
|
|
114
114
|
* from the mistake.
|
|
115
115
|
*
|
|
116
116
|
* Deliberately NOT a ComposeError. That type is the mod-attributable channel -
|
|
117
|
-
* it carries a pack id and tells an author which line to fix - and this is
|
|
117
|
+
* it carries a pack id and tells an author which line to fix - and this is the SDK's own
|
|
118
118
|
* bug, not a mod's. Blaming whichever pack happened to be loading would send a
|
|
119
119
|
* reader after the wrong thing entirely.
|
|
120
120
|
*/
|
package/dist/compose.js
CHANGED
|
@@ -146,7 +146,7 @@ const fieldProvenanceByRecord = new WeakMap();
|
|
|
146
146
|
* from the mistake.
|
|
147
147
|
*
|
|
148
148
|
* Deliberately NOT a ComposeError. That type is the mod-attributable channel -
|
|
149
|
-
* it carries a pack id and tells an author which line to fix - and this is
|
|
149
|
+
* it carries a pack id and tells an author which line to fix - and this is the SDK's own
|
|
150
150
|
* bug, not a mod's. Blaming whichever pack happened to be loading would send a
|
|
151
151
|
* reader after the wrong thing entirely.
|
|
152
152
|
*/
|
package/dist/engine.d.ts
CHANGED
|
@@ -85,6 +85,28 @@ export type EngineVerdict = {
|
|
|
85
85
|
* Pure, and takes the version as an argument rather than importing it, so a test
|
|
86
86
|
* can drive any build and so mod-sdk stays independent of core.
|
|
87
87
|
*/
|
|
88
|
+
/**
|
|
89
|
+
* Whether a NEWER game could satisfy this range, when the current one does not.
|
|
90
|
+
*
|
|
91
|
+
* WHY THIS IS NOT PART OF THE VERDICT. `engineVerdict` deliberately refuses to say
|
|
92
|
+
* which side is behind, because a range does not give that away: `>=0.24.0` wants a
|
|
93
|
+
* newer game and `<0.5.0` wants an older one, and a confident "update the game"
|
|
94
|
+
* would be wrong half the time on the one line a player acts on. That restraint is
|
|
95
|
+
* right for the verdict, which has to be correct for every range. But a screen that
|
|
96
|
+
* has decided to OFFER an older version of a mod does need to know whether updating
|
|
97
|
+
* the game is the thing that would unlock the newer one, or whether it would make
|
|
98
|
+
* matters worse - so the question gets asked separately, and answered by probing
|
|
99
|
+
* rather than by reasoning about a range this matcher cannot decompose.
|
|
100
|
+
*
|
|
101
|
+
* A BOUNDED PROBE, NOT AN INTERVAL SOLVER, and the bound is the honest part. It
|
|
102
|
+
* tries the next nine patches, the next nine minors and the next nine majors above
|
|
103
|
+
* the running version, plus one far-future version for an open upper bound. `true`
|
|
104
|
+
* means one of those satisfies the range, so a game update really can get there.
|
|
105
|
+
* `false` means none of them does, which is not a proof that none ever could - so
|
|
106
|
+
* the caller must fall back to naming both versions and claiming nothing, exactly
|
|
107
|
+
* as the verdict does. `null` is a range this build cannot read at all.
|
|
108
|
+
*/
|
|
109
|
+
export declare function newerGameCouldRun(range: string, engineVersion: string): boolean | null;
|
|
88
110
|
export declare function engineVerdict(manifest: Pick<PackManifest, "engine" | "modApi">, engineVersion: string,
|
|
89
111
|
/**
|
|
90
112
|
* Whether this pack ships CODE, and therefore whether a mismatch is a gate or
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GACrB;IACE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,CAAC;IAC/C;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,CAAC;AAIN;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,QAAQ,CAAC,EACjD,aAAa,EAAE,MAAM;AACrB;;;;;;;GAOG;AACH,OAAO,GAAE,OAAuC,GAC/C,aAAa,CA0Df"}
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GACrB;IACE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,CAAC;IAC/C;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,CAAC;AAIN;;;;;;;;;;;;GAYG;AACH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAuBtF;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,QAAQ,CAAC,EACjD,aAAa,EAAE,MAAM;AACrB;;;;;;;GAOG;AACH,OAAO,GAAE,OAAuC,GAC/C,aAAa,CA0Df"}
|
package/dist/engine.js
CHANGED
|
@@ -58,6 +58,57 @@ const OK = { ok: true };
|
|
|
58
58
|
* Pure, and takes the version as an argument rather than importing it, so a test
|
|
59
59
|
* can drive any build and so mod-sdk stays independent of core.
|
|
60
60
|
*/
|
|
61
|
+
/**
|
|
62
|
+
* Whether a NEWER game could satisfy this range, when the current one does not.
|
|
63
|
+
*
|
|
64
|
+
* WHY THIS IS NOT PART OF THE VERDICT. `engineVerdict` deliberately refuses to say
|
|
65
|
+
* which side is behind, because a range does not give that away: `>=0.24.0` wants a
|
|
66
|
+
* newer game and `<0.5.0` wants an older one, and a confident "update the game"
|
|
67
|
+
* would be wrong half the time on the one line a player acts on. That restraint is
|
|
68
|
+
* right for the verdict, which has to be correct for every range. But a screen that
|
|
69
|
+
* has decided to OFFER an older version of a mod does need to know whether updating
|
|
70
|
+
* the game is the thing that would unlock the newer one, or whether it would make
|
|
71
|
+
* matters worse - so the question gets asked separately, and answered by probing
|
|
72
|
+
* rather than by reasoning about a range this matcher cannot decompose.
|
|
73
|
+
*
|
|
74
|
+
* A BOUNDED PROBE, NOT AN INTERVAL SOLVER, and the bound is the honest part. It
|
|
75
|
+
* tries the next nine patches, the next nine minors and the next nine majors above
|
|
76
|
+
* the running version, plus one far-future version for an open upper bound. `true`
|
|
77
|
+
* means one of those satisfies the range, so a game update really can get there.
|
|
78
|
+
* `false` means none of them does, which is not a proof that none ever could - so
|
|
79
|
+
* the caller must fall back to naming both versions and claiming nothing, exactly
|
|
80
|
+
* as the verdict does. `null` is a range this build cannot read at all.
|
|
81
|
+
*/
|
|
82
|
+
export function newerGameCouldRun(range, engineVersion) {
|
|
83
|
+
const m = /^v?(\d+)\.(\d+)\.(\d+)/u.exec(engineVersion);
|
|
84
|
+
if (!m)
|
|
85
|
+
return null;
|
|
86
|
+
const major = Number(m[1]);
|
|
87
|
+
const minor = Number(m[2]);
|
|
88
|
+
const patch = Number(m[3]);
|
|
89
|
+
const ladder = [];
|
|
90
|
+
for (let i = 1; i <= 9; i++)
|
|
91
|
+
ladder.push(`${String(major)}.${String(minor)}.${String(patch + i)}`);
|
|
92
|
+
for (let i = 1; i <= 9; i++)
|
|
93
|
+
ladder.push(`${String(major)}.${String(minor + i)}.0`);
|
|
94
|
+
for (let i = 1; i <= 9; i++)
|
|
95
|
+
ladder.push(`${String(major + i)}.0.0`);
|
|
96
|
+
ladder.push("9999.0.0");
|
|
97
|
+
for (const candidate of ladder) {
|
|
98
|
+
try {
|
|
99
|
+
if (satisfies(candidate, range))
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
/* An unreadable range is unreadable for every candidate, so one throw settles
|
|
104
|
+
* it. Reported as "cannot tell" rather than "no", because the manifest being
|
|
105
|
+
* broken is a different fact from the game being the wrong version, and the
|
|
106
|
+
* caller says different words for each. */
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
61
112
|
export function engineVerdict(manifest, engineVersion,
|
|
62
113
|
/**
|
|
63
114
|
* Whether this pack ships CODE, and therefore whether a mismatch is a gate or
|
package/dist/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA+BxC,MAAM,EAAE,GAAkB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AAEvC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAiD,EACjD,aAAqB;AACrB;;;;;;;GAOG;AACH,UAAmB,QAAQ,CAAC,MAAM,KAAK,SAAS;IAEhD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAEnC;;;;qEAIiE;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC;IAEvB,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX;;;;;sFAK8E;QAC9E,OAAO;YACL,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,cAAc;YACpB,MAAM;YACN,GAAG,EACD,sBAAsB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,iCAAiC;gBAC5E,uBAAuB,OAAO,CAAC,CAAC,CAAC,+BAA+B;gBAChE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gCAAgC,CAAC;SACnD,CAAC;IACJ,CAAC;IACD,IAAI,OAAO;QAAE,OAAO,EAAE,CAAC;IAEvB;;;;;;;kBAOc;IACd;;;;;gCAK4B;IAC5B,OAAO;QACL,EAAE,EAAE,KAAK;QACT,IAAI,EAAE,cAAc;QACpB,MAAM;QACN,GAAG,EAAE,MAAM;YACT,CAAC,CAAC,0BAA0B,KAAK,sBAAsB,aAAa,KAAK;gBACvE,gFAAgF;YAClF,CAAC,CAAC,0BAA0B,KAAK,qBAAqB,aAAa,aAAa;gBAC9E,4EAA4E;gBAC5E,6CAA6C;KAClD,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,CAAU;IACzB,OAAO,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/hud.d.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* OWNERSHIP IS PER REGION, which is the whole shape of this file. A plugin's
|
|
11
11
|
* `hud()` returns a sink per region name it wants, each one gated by its own
|
|
12
12
|
* `ui:<region>.replace` capability, and it receives ONLY those regions. The
|
|
13
|
-
* others stay core's and keep being drawn. That follows the
|
|
13
|
+
* others stay core's and keep being drawn. That follows the rule that a screen
|
|
14
14
|
* is COMPOSED of regions rather than covering them.
|
|
15
15
|
*
|
|
16
16
|
* This module contains types only. A folder plugin may `import type` from the
|
package/dist/hud.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* OWNERSHIP IS PER REGION, which is the whole shape of this file. A plugin's
|
|
11
11
|
* `hud()` returns a sink per region name it wants, each one gated by its own
|
|
12
12
|
* `ui:<region>.replace` capability, and it receives ONLY those regions. The
|
|
13
|
-
* others stay core's and keep being drawn. That follows the
|
|
13
|
+
* others stay core's and keep being drawn. That follows the rule that a screen
|
|
14
14
|
* is COMPOSED of regions rather than covering them.
|
|
15
15
|
*
|
|
16
16
|
* This module contains types only. A folder plugin may `import type` from the
|
package/dist/index.d.ts
CHANGED
|
@@ -32,7 +32,7 @@ export type { DroppedEdge, SortEdge, SortPin, SortResult, SortTier } from "./sor
|
|
|
32
32
|
export { contestedSlots, describeContested, describeDeclaredConflict, foldDiscards, } from "./contested.js";
|
|
33
33
|
export type { Claim, ContestedLayer, ContestedSlot, DeclaredConflict, Fold, NameOf, } from "./contested.js";
|
|
34
34
|
export { compareSemver, satisfies, SemverError } from "./semver.js";
|
|
35
|
-
export { engineVerdict } from "./engine.js";
|
|
35
|
+
export { engineVerdict, newerGameCouldRun } from "./engine.js";
|
|
36
36
|
export type { EngineVerdict } from "./engine.js";
|
|
37
37
|
export { ComposeError, composePacks, mergePatch, RENAMED_HINT } from "./compose.js";
|
|
38
38
|
export { composeContentPacks, composeDroppingBroken } from "./loader.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,WAAW,EACX,WAAW,EACX,aAAa,EACb,UAAU,EACV,OAAO,EACP,aAAa,EACb,OAAO,EACP,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,SAAS,EACT,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,OAAO,EACP,QAAQ,EACR,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACvE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACtF,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,KAAK,EACL,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,IAAI,EACJ,MAAM,GACP,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,WAAW,EACX,WAAW,EACX,aAAa,EACb,UAAU,EACV,OAAO,EACP,aAAa,EACb,OAAO,EACP,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,SAAS,EACT,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,OAAO,EACP,QAAQ,EACR,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACvE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACtF,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,KAAK,EACL,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,IAAI,EACJ,MAAM,GACP,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC/D,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAChF,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,YAAY,EACV,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,UAAU,EACV,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,aAAa,EACb,aAAa,EACb,OAAO,EACP,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EACV,cAAc,EACd,UAAU,EACV,cAAc,EACd,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpF,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,UAAU,EACV,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,WAAW,EACX,OAAO,EACP,YAAY,EACZ,WAAW,EACX,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,UAAU,EACV,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EACL,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,WAAW,EACX,UAAU,EACV,QAAQ,EACR,cAAc,EACd,aAAa,EACb,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,OAAO,EACP,UAAU,EACV,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACzE,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC9D,YAAY,EACV,UAAU,EACV,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,UAAU,EACV,cAAc,EACd,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,MAAM,EACN,UAAU,EACV,cAAc,EACd,SAAS,GACV,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,cAAc,EACd,aAAa,EACb,YAAY,EACZ,aAAa,GACd,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,cAAc,EACd,WAAW,EACX,UAAU,EACV,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,UAAU,GACX,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -27,7 +27,7 @@ export { expandedPackContents, expandSections, resolveSectionState, sectionFlag,
|
|
|
27
27
|
export { collectSortEdges, SORT_TIERS, sortModOrder } from "./sort.js";
|
|
28
28
|
export { contestedSlots, describeContested, describeDeclaredConflict, foldDiscards, } from "./contested.js";
|
|
29
29
|
export { compareSemver, satisfies, SemverError } from "./semver.js";
|
|
30
|
-
export { engineVerdict } from "./engine.js";
|
|
30
|
+
export { engineVerdict, newerGameCouldRun } from "./engine.js";
|
|
31
31
|
export { ComposeError, composePacks, mergePatch, RENAMED_HINT } from "./compose.js";
|
|
32
32
|
export { composeContentPacks, composeDroppingBroken } from "./loader.js";
|
|
33
33
|
export { PROVENANCE_KEY, provenanceOf, stampProvenance } from "./provenance.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,WAAW,EACX,WAAW,EACX,aAAa,EACb,UAAU,EACV,OAAO,EACP,aAAa,EACb,OAAO,EACP,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,SAAS,EACT,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAqBxB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEvE,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,GACb,MAAM,gBAAgB,CAAC;AASxB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,WAAW,EACX,WAAW,EACX,aAAa,EACb,UAAU,EACV,OAAO,EACP,aAAa,EACb,OAAO,EACP,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,SAAS,EACT,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAqBxB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEvE,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,GACb,MAAM,gBAAgB,CAAC;AASxB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEhF,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,aAAa,GACd,MAAM,iBAAiB,CAAC;AAUzB,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,UAAU,EACV,aAAa,GACd,MAAM,YAAY,CAAC;AAOpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAOvD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpF,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,UAAU,EACV,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAQxB;;;;wDAIwD;AACxD,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,UAAU,EACV,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,WAAW,EACX,UAAU,EACV,QAAQ,EACR,cAAc,EACd,aAAa,EACb,cAAc,GACf,MAAM,gBAAgB,CAAC;AAYxB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAOzE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/sort.js
CHANGED
|
@@ -224,7 +224,7 @@ export function sortModOrder(manifests, options = {}) {
|
|
|
224
224
|
let edges = collectSortEdges(manifests, options.pins ?? []);
|
|
225
225
|
const dropped = [];
|
|
226
226
|
const unresolvable = [];
|
|
227
|
-
/* Drop the weakest edge on a cycle until nothing is left that
|
|
227
|
+
/* Drop the weakest edge on a cycle until nothing is left that may be dropped.
|
|
228
228
|
* Bounded by the edge count: every pass removes one edge or records one
|
|
229
229
|
* unbreakable cycle and stops. */
|
|
230
230
|
for (;;) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rpgm-tools/neo-angband-mod-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.25.0",
|
|
4
4
|
"description": "Pack schemas, validation, and tooling for Neo Angband mods (content packs, tile packs, scripted plugins)",
|
|
5
5
|
"license": "GPL-2.0-only",
|
|
6
6
|
"author": "neostryder (RPGM Tools)",
|
package/src/capabilities.ts
CHANGED
|
@@ -6,12 +6,28 @@
|
|
|
6
6
|
* packs are validated data that cannot execute, so they request none
|
|
7
7
|
* (docs/MODS.md trust tiers). A plugin's `capabilities` list in its
|
|
8
8
|
* manifest is the consent surface: the installer shows each one in plain
|
|
9
|
-
* language, the user approves, and the runtime
|
|
10
|
-
*
|
|
9
|
+
* language, the user approves, and the runtime opens exactly that set of
|
|
10
|
+
* facades and no others (read the next paragraph for the scope of that
|
|
11
|
+
* claim, which is narrower than it sounds). The
|
|
11
12
|
* perceive/act facades (a later P7 phase) call `CapabilitySet.check()`
|
|
12
13
|
* before honoring a request; an ungranted capability throws a clear
|
|
13
14
|
* author-facing error rather than silently doing nothing or diverging.
|
|
14
15
|
*
|
|
16
|
+
* WHAT "GRANTS EXACTLY THAT SET" MEANS, AND WHAT IT DOES NOT. It is a
|
|
17
|
+
* statement about the FACADES, and it holds: a facade whose capability
|
|
18
|
+
* was not granted throws. It is not a statement about what in-process
|
|
19
|
+
* code can reach. A trusted plugin also receives `ctx.core` (the live
|
|
20
|
+
* engine namespace), `ctx.state` and `ctx.registries`, none of them
|
|
21
|
+
* capability-checked, and those carry the same live registry objects the
|
|
22
|
+
* `registry:*` facades write through - see docs/modding/PLUGINS.md,
|
|
23
|
+
* "What a capability gates", and the measurement in
|
|
24
|
+
* packages/web/src/capability-gate-reach.test.ts. So a capability list
|
|
25
|
+
* is a DECLARATION the player reads and the conflict report is built
|
|
26
|
+
* from, not a containment boundary; the boundary is the install consent.
|
|
27
|
+
* A capability granted to the SANDBOXED Worker tier is a different
|
|
28
|
+
* matter - that tier is isolated by construction and gets none of the
|
|
29
|
+
* registries.
|
|
30
|
+
*
|
|
15
31
|
* Vocabulary (four forms, MOD_LIFECYCLE section 4 / the frost example in
|
|
16
32
|
* section 2):
|
|
17
33
|
* - "command:add" - register commands on the act facade.
|
|
@@ -374,7 +390,7 @@ export class CapabilitySet {
|
|
|
374
390
|
check(cap: string): void {
|
|
375
391
|
if (this.has(cap)) return;
|
|
376
392
|
throw new CapabilityError(
|
|
377
|
-
`this plugin needs capability "${cap}"; add it to
|
|
393
|
+
`this plugin needs capability "${cap}"; add it to manifest.json capabilities`,
|
|
378
394
|
);
|
|
379
395
|
}
|
|
380
396
|
|
package/src/compose.ts
CHANGED
|
@@ -249,7 +249,7 @@ const fieldProvenanceByRecord = new WeakMap<ComposedRecord, FieldProvenance>();
|
|
|
249
249
|
* from the mistake.
|
|
250
250
|
*
|
|
251
251
|
* Deliberately NOT a ComposeError. That type is the mod-attributable channel -
|
|
252
|
-
* it carries a pack id and tells an author which line to fix - and this is
|
|
252
|
+
* it carries a pack id and tells an author which line to fix - and this is the SDK's own
|
|
253
253
|
* bug, not a mod's. Blaming whichever pack happened to be loading would send a
|
|
254
254
|
* reader after the wrong thing entirely.
|
|
255
255
|
*/
|
package/src/engine.ts
CHANGED
|
@@ -91,6 +91,52 @@ const OK: EngineVerdict = { ok: true };
|
|
|
91
91
|
* Pure, and takes the version as an argument rather than importing it, so a test
|
|
92
92
|
* can drive any build and so mod-sdk stays independent of core.
|
|
93
93
|
*/
|
|
94
|
+
/**
|
|
95
|
+
* Whether a NEWER game could satisfy this range, when the current one does not.
|
|
96
|
+
*
|
|
97
|
+
* WHY THIS IS NOT PART OF THE VERDICT. `engineVerdict` deliberately refuses to say
|
|
98
|
+
* which side is behind, because a range does not give that away: `>=0.24.0` wants a
|
|
99
|
+
* newer game and `<0.5.0` wants an older one, and a confident "update the game"
|
|
100
|
+
* would be wrong half the time on the one line a player acts on. That restraint is
|
|
101
|
+
* right for the verdict, which has to be correct for every range. But a screen that
|
|
102
|
+
* has decided to OFFER an older version of a mod does need to know whether updating
|
|
103
|
+
* the game is the thing that would unlock the newer one, or whether it would make
|
|
104
|
+
* matters worse - so the question gets asked separately, and answered by probing
|
|
105
|
+
* rather than by reasoning about a range this matcher cannot decompose.
|
|
106
|
+
*
|
|
107
|
+
* A BOUNDED PROBE, NOT AN INTERVAL SOLVER, and the bound is the honest part. It
|
|
108
|
+
* tries the next nine patches, the next nine minors and the next nine majors above
|
|
109
|
+
* the running version, plus one far-future version for an open upper bound. `true`
|
|
110
|
+
* means one of those satisfies the range, so a game update really can get there.
|
|
111
|
+
* `false` means none of them does, which is not a proof that none ever could - so
|
|
112
|
+
* the caller must fall back to naming both versions and claiming nothing, exactly
|
|
113
|
+
* as the verdict does. `null` is a range this build cannot read at all.
|
|
114
|
+
*/
|
|
115
|
+
export function newerGameCouldRun(range: string, engineVersion: string): boolean | null {
|
|
116
|
+
const m = /^v?(\d+)\.(\d+)\.(\d+)/u.exec(engineVersion);
|
|
117
|
+
if (!m) return null;
|
|
118
|
+
const major = Number(m[1]);
|
|
119
|
+
const minor = Number(m[2]);
|
|
120
|
+
const patch = Number(m[3]);
|
|
121
|
+
const ladder: string[] = [];
|
|
122
|
+
for (let i = 1; i <= 9; i++) ladder.push(`${String(major)}.${String(minor)}.${String(patch + i)}`);
|
|
123
|
+
for (let i = 1; i <= 9; i++) ladder.push(`${String(major)}.${String(minor + i)}.0`);
|
|
124
|
+
for (let i = 1; i <= 9; i++) ladder.push(`${String(major + i)}.0.0`);
|
|
125
|
+
ladder.push("9999.0.0");
|
|
126
|
+
for (const candidate of ladder) {
|
|
127
|
+
try {
|
|
128
|
+
if (satisfies(candidate, range)) return true;
|
|
129
|
+
} catch {
|
|
130
|
+
/* An unreadable range is unreadable for every candidate, so one throw settles
|
|
131
|
+
* it. Reported as "cannot tell" rather than "no", because the manifest being
|
|
132
|
+
* broken is a different fact from the game being the wrong version, and the
|
|
133
|
+
* caller says different words for each. */
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
|
|
94
140
|
export function engineVerdict(
|
|
95
141
|
manifest: Pick<PackManifest, "engine" | "modApi">,
|
|
96
142
|
engineVersion: string,
|
package/src/hud.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* OWNERSHIP IS PER REGION, which is the whole shape of this file. A plugin's
|
|
11
11
|
* `hud()` returns a sink per region name it wants, each one gated by its own
|
|
12
12
|
* `ui:<region>.replace` capability, and it receives ONLY those regions. The
|
|
13
|
-
* others stay core's and keep being drawn. That follows the
|
|
13
|
+
* others stay core's and keep being drawn. That follows the rule that a screen
|
|
14
14
|
* is COMPOSED of regions rather than covering them.
|
|
15
15
|
*
|
|
16
16
|
* This module contains types only. A folder plugin may `import type` from the
|
package/src/index.ts
CHANGED
|
@@ -90,7 +90,7 @@ export type {
|
|
|
90
90
|
NameOf,
|
|
91
91
|
} from "./contested.js";
|
|
92
92
|
export { compareSemver, satisfies, SemverError } from "./semver.js";
|
|
93
|
-
export { engineVerdict } from "./engine.js";
|
|
93
|
+
export { engineVerdict, newerGameCouldRun } from "./engine.js";
|
|
94
94
|
export type { EngineVerdict } from "./engine.js";
|
|
95
95
|
export { ComposeError, composePacks, mergePatch, RENAMED_HINT } from "./compose.js";
|
|
96
96
|
export { composeContentPacks, composeDroppingBroken } from "./loader.js";
|
package/src/sort.ts
CHANGED
|
@@ -297,7 +297,7 @@ export function sortModOrder(
|
|
|
297
297
|
const dropped: DroppedEdge[] = [];
|
|
298
298
|
const unresolvable: string[][] = [];
|
|
299
299
|
|
|
300
|
-
/* Drop the weakest edge on a cycle until nothing is left that
|
|
300
|
+
/* Drop the weakest edge on a cycle until nothing is left that may be dropped.
|
|
301
301
|
* Bounded by the edge count: every pass removes one edge or records one
|
|
302
302
|
* unbreakable cycle and stops. */
|
|
303
303
|
for (;;) {
|