@shardworks/nexus-arbor 0.1.119 → 0.1.121
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/arbor.d.ts.map +1 -1
- package/dist/arbor.js +17 -2
- package/dist/arbor.js.map +1 -1
- package/dist/guild-lifecycle.d.ts +14 -3
- package/dist/guild-lifecycle.d.ts.map +1 -1
- package/dist/guild-lifecycle.js +94 -8
- package/dist/guild-lifecycle.js.map +1 -1
- package/package.json +2 -2
package/dist/arbor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arbor.d.ts","sourceRoot":"","sources":["../src/arbor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAaH,OAAO,KAAK,EACV,KAAK,
|
|
1
|
+
{"version":3,"file":"arbor.d.ts","sourceRoot":"","sources":["../src/arbor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAaH,OAAO,KAAK,EACV,KAAK,EAIN,MAAM,wBAAwB,CAAC;AAchC;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAkJ/D"}
|
package/dist/arbor.js
CHANGED
|
@@ -24,7 +24,7 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
|
|
|
24
24
|
return path;
|
|
25
25
|
};
|
|
26
26
|
import { readGuildConfig, writeGuildConfig, findGuildRoot, isKit, isApparatus, setGuild, resolveGuildPackageEntry, resolvePackageNameForPluginId, readGuildPackageJson, } from '@shardworks/nexus-core';
|
|
27
|
-
import { validateRequires, topoSort, collectStartupWarnings, buildStartupContext, fireEvent, } from "./guild-lifecycle.js";
|
|
27
|
+
import { validateRequires, filterFailedPlugins, topoSort, collectStartupWarnings, buildStartupContext, fireEvent, } from "./guild-lifecycle.js";
|
|
28
28
|
// ── Public API ────────────────────────────────────────────────────────
|
|
29
29
|
/**
|
|
30
30
|
* Create and start a guild.
|
|
@@ -72,7 +72,21 @@ export async function createGuild(root) {
|
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
// ── Validation phase ───────────────────────────────────────────────
|
|
75
|
-
|
|
75
|
+
const allFailures = [];
|
|
76
|
+
const rootFailures = validateRequires(kits, apparatuses);
|
|
77
|
+
allFailures.push(...rootFailures);
|
|
78
|
+
// Remove plugins that transitively depend on failed ones
|
|
79
|
+
if (rootFailures.length > 0) {
|
|
80
|
+
const filtered = filterFailedPlugins(kits, apparatuses, rootFailures);
|
|
81
|
+
kits.length = 0;
|
|
82
|
+
kits.push(...filtered.kits);
|
|
83
|
+
apparatuses.length = 0;
|
|
84
|
+
apparatuses.push(...filtered.apparatuses);
|
|
85
|
+
allFailures.push(...filtered.cascaded);
|
|
86
|
+
for (const f of allFailures) {
|
|
87
|
+
console.warn(`[arbor] ${f.reason}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
76
90
|
// ── Startup warnings ───────────────────────────────────────────────
|
|
77
91
|
for (const warning of collectStartupWarnings(kits, apparatuses)) {
|
|
78
92
|
console.warn(warning);
|
|
@@ -116,6 +130,7 @@ export async function createGuild(root) {
|
|
|
116
130
|
},
|
|
117
131
|
kits() { return [...kits]; },
|
|
118
132
|
apparatuses() { return [...orderedApparatuses]; },
|
|
133
|
+
failedPlugins() { return [...allFailures]; },
|
|
119
134
|
};
|
|
120
135
|
setGuild(guildInstance);
|
|
121
136
|
// Fire plugin:initialized for all kits before starting any apparatus
|
package/dist/arbor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arbor.js","sourceRoot":"","sources":["../src/arbor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;;;;;;;;;AAEH,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,KAAK,EACL,WAAW,EACX,QAAQ,EACR,wBAAwB,EACxB,6BAA6B,EAC7B,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"arbor.js","sourceRoot":"","sources":["../src/arbor.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
* `createGuild()` in arbor.ts is the orchestrator that performs I/O
|
|
9
9
|
* (config reading, dynamic imports) then delegates to these functions.
|
|
10
10
|
*/
|
|
11
|
-
import type { StartupContext, LoadedKit, LoadedApparatus } from '@shardworks/nexus-core';
|
|
11
|
+
import type { StartupContext, LoadedKit, LoadedApparatus, FailedPlugin } from '@shardworks/nexus-core';
|
|
12
12
|
export type EventHandlerMap = Map<string, Array<(...args: unknown[]) => void | Promise<void>>>;
|
|
13
13
|
/**
|
|
14
14
|
* Validate all `requires` declarations and detect circular dependencies.
|
|
15
|
-
*
|
|
15
|
+
* Returns an array of FailedPlugin entries describing every problem found.
|
|
16
16
|
*
|
|
17
17
|
* Checks:
|
|
18
18
|
* - Apparatus requires: every named dependency must exist (kit or apparatus).
|
|
@@ -20,7 +20,18 @@ export type EventHandlerMap = Map<string, Array<(...args: unknown[]) => void | P
|
|
|
20
20
|
* depend on kits).
|
|
21
21
|
* - Cycle detection: no circular dependency chains among apparatuses.
|
|
22
22
|
*/
|
|
23
|
-
export declare function validateRequires(kits: LoadedKit[], apparatuses: LoadedApparatus[]):
|
|
23
|
+
export declare function validateRequires(kits: LoadedKit[], apparatuses: LoadedApparatus[]): FailedPlugin[];
|
|
24
|
+
/**
|
|
25
|
+
* Remove plugins that transitively depend on any failed plugin.
|
|
26
|
+
*
|
|
27
|
+
* Iterates until stable, cascading failures through the dependency graph.
|
|
28
|
+
* Returns healthy plugins and any newly-cascaded failures.
|
|
29
|
+
*/
|
|
30
|
+
export declare function filterFailedPlugins(kits: LoadedKit[], apparatuses: LoadedApparatus[], rootFailures: FailedPlugin[]): {
|
|
31
|
+
kits: LoadedKit[];
|
|
32
|
+
apparatuses: LoadedApparatus[];
|
|
33
|
+
cascaded: FailedPlugin[];
|
|
34
|
+
};
|
|
24
35
|
/**
|
|
25
36
|
* Sort apparatuses in dependency-resolved order using topological sort.
|
|
26
37
|
* validateRequires() must be called first to ensure the graph is acyclic.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guild-lifecycle.d.ts","sourceRoot":"","sources":["../src/guild-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,eAAe,
|
|
1
|
+
{"version":3,"file":"guild-lifecycle.d.ts","sourceRoot":"","sources":["../src/guild-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,eAAe,EACf,YAAY,EACb,MAAM,wBAAwB,CAAC;AAIhC,MAAM,MAAM,eAAe,GAAG,GAAG,CAC/B,MAAM,EACN,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CACpD,CAAC;AAIF;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,SAAS,EAAE,EACjB,WAAW,EAAE,eAAe,EAAE,GAC7B,YAAY,EAAE,CA0FhB;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,SAAS,EAAE,EACjB,WAAW,EAAE,eAAe,EAAE,EAC9B,YAAY,EAAE,YAAY,EAAE,GAC3B;IAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAAC,WAAW,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CA4CjF;AAID;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,WAAW,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAoB1E;AAID;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAS,SAAS,EAAE,EACxB,WAAW,EAAE,eAAe,EAAE,GAC7B,MAAM,EAAE,CA4CV;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,eAAe,GAC7B,cAAc,CAQhB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,aAAa,EAAE,eAAe,EAC9B,KAAK,EAAU,MAAM,EACrB,GAAG,IAAI,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,IAAI,CAAC,CAKf"}
|
package/dist/guild-lifecycle.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// ── Validation ───────────────────────────────────────────────────────
|
|
12
12
|
/**
|
|
13
13
|
* Validate all `requires` declarations and detect circular dependencies.
|
|
14
|
-
*
|
|
14
|
+
* Returns an array of FailedPlugin entries describing every problem found.
|
|
15
15
|
*
|
|
16
16
|
* Checks:
|
|
17
17
|
* - Apparatus requires: every named dependency must exist (kit or apparatus).
|
|
@@ -20,6 +20,8 @@
|
|
|
20
20
|
* - Cycle detection: no circular dependency chains among apparatuses.
|
|
21
21
|
*/
|
|
22
22
|
export function validateRequires(kits, apparatuses) {
|
|
23
|
+
const failures = [];
|
|
24
|
+
const failedIds = new Set();
|
|
23
25
|
const apparatusIds = new Set(apparatuses.map((a) => a.id));
|
|
24
26
|
const allIds = new Set([
|
|
25
27
|
...kits.map((k) => k.id),
|
|
@@ -29,7 +31,13 @@ export function validateRequires(kits, apparatuses) {
|
|
|
29
31
|
for (const app of apparatuses) {
|
|
30
32
|
for (const dep of app.apparatus.requires ?? []) {
|
|
31
33
|
if (!allIds.has(dep)) {
|
|
32
|
-
|
|
34
|
+
if (!failedIds.has(app.id)) {
|
|
35
|
+
failedIds.add(app.id);
|
|
36
|
+
failures.push({
|
|
37
|
+
id: app.id,
|
|
38
|
+
reason: `"${app.id}" requires "${dep}", which is not installed.`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
33
41
|
}
|
|
34
42
|
}
|
|
35
43
|
}
|
|
@@ -37,23 +45,40 @@ export function validateRequires(kits, apparatuses) {
|
|
|
37
45
|
for (const kit of kits) {
|
|
38
46
|
for (const dep of kit.kit.requires ?? []) {
|
|
39
47
|
if (!apparatusIds.has(dep)) {
|
|
40
|
-
if (!
|
|
41
|
-
|
|
48
|
+
if (!failedIds.has(kit.id)) {
|
|
49
|
+
failedIds.add(kit.id);
|
|
50
|
+
if (!allIds.has(dep)) {
|
|
51
|
+
failures.push({
|
|
52
|
+
id: kit.id,
|
|
53
|
+
reason: `kit "${kit.id}" requires "${dep}", which is not installed.`,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
failures.push({
|
|
58
|
+
id: kit.id,
|
|
59
|
+
reason: `kit "${kit.id}" requires "${dep}", but that plugin is a kit, not an apparatus. Kit requires must name apparatus plugins.`,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
42
62
|
}
|
|
43
|
-
throw new Error(`[arbor] kit "${kit.id}" requires "${dep}", but that plugin is a kit, not an apparatus. ` +
|
|
44
|
-
`Kit requires must name apparatus plugins.`);
|
|
45
63
|
}
|
|
46
64
|
}
|
|
47
65
|
}
|
|
48
66
|
// Detect circular dependencies among apparatuses
|
|
49
67
|
const visiting = new Set();
|
|
50
68
|
const visited = new Set();
|
|
69
|
+
const cycleParticipants = new Set();
|
|
51
70
|
function visit(id, chain) {
|
|
52
71
|
if (visited.has(id))
|
|
53
72
|
return;
|
|
54
73
|
if (visiting.has(id)) {
|
|
55
|
-
|
|
56
|
-
|
|
74
|
+
// Back-edge detected — extract cycle participants from chain
|
|
75
|
+
const cycleStart = chain.indexOf(id);
|
|
76
|
+
const cycleNodes = cycleStart >= 0 ? chain.slice(cycleStart) : [...chain];
|
|
77
|
+
cycleNodes.push(id);
|
|
78
|
+
for (const node of cycleNodes) {
|
|
79
|
+
cycleParticipants.add(node);
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
57
82
|
}
|
|
58
83
|
visiting.add(id);
|
|
59
84
|
const app = apparatuses.find((a) => a.id === id);
|
|
@@ -68,6 +93,67 @@ export function validateRequires(kits, apparatuses) {
|
|
|
68
93
|
for (const app of apparatuses) {
|
|
69
94
|
visit(app.id, []);
|
|
70
95
|
}
|
|
96
|
+
for (const id of cycleParticipants) {
|
|
97
|
+
if (!failedIds.has(id)) {
|
|
98
|
+
failedIds.add(id);
|
|
99
|
+
failures.push({
|
|
100
|
+
id,
|
|
101
|
+
reason: `"${id}" is part of a circular dependency chain.`,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return failures;
|
|
106
|
+
}
|
|
107
|
+
// ── Cascade filtering ─────────────────────────────────────────────────
|
|
108
|
+
/**
|
|
109
|
+
* Remove plugins that transitively depend on any failed plugin.
|
|
110
|
+
*
|
|
111
|
+
* Iterates until stable, cascading failures through the dependency graph.
|
|
112
|
+
* Returns healthy plugins and any newly-cascaded failures.
|
|
113
|
+
*/
|
|
114
|
+
export function filterFailedPlugins(kits, apparatuses, rootFailures) {
|
|
115
|
+
const failedIds = new Set(rootFailures.map((f) => f.id));
|
|
116
|
+
const cascaded = [];
|
|
117
|
+
// Apparatus cascade: iterate until no new failures
|
|
118
|
+
let changed = true;
|
|
119
|
+
while (changed) {
|
|
120
|
+
changed = false;
|
|
121
|
+
for (const app of apparatuses) {
|
|
122
|
+
if (failedIds.has(app.id))
|
|
123
|
+
continue;
|
|
124
|
+
for (const dep of app.apparatus.requires ?? []) {
|
|
125
|
+
if (failedIds.has(dep)) {
|
|
126
|
+
failedIds.add(app.id);
|
|
127
|
+
cascaded.push({
|
|
128
|
+
id: app.id,
|
|
129
|
+
reason: `"${app.id}" depends on failed plugin "${dep}".`,
|
|
130
|
+
});
|
|
131
|
+
changed = true;
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Kit cascade: single pass (kits can't depend on other kits)
|
|
138
|
+
for (const kit of kits) {
|
|
139
|
+
if (failedIds.has(kit.id))
|
|
140
|
+
continue;
|
|
141
|
+
for (const dep of kit.kit.requires ?? []) {
|
|
142
|
+
if (failedIds.has(dep)) {
|
|
143
|
+
failedIds.add(kit.id);
|
|
144
|
+
cascaded.push({
|
|
145
|
+
id: kit.id,
|
|
146
|
+
reason: `"${kit.id}" depends on failed plugin "${dep}".`,
|
|
147
|
+
});
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
kits: kits.filter((k) => !failedIds.has(k.id)),
|
|
154
|
+
apparatuses: apparatuses.filter((a) => !failedIds.has(a.id)),
|
|
155
|
+
cascaded,
|
|
156
|
+
};
|
|
71
157
|
}
|
|
72
158
|
// ── Dependency ordering ──────────────────────────────────────────────
|
|
73
159
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guild-lifecycle.js","sourceRoot":"","sources":["../src/guild-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"guild-lifecycle.js","sourceRoot":"","sources":["../src/guild-lifecycle.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shardworks/nexus-arbor",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.121",
|
|
4
4
|
"license": "ISC",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@shardworks/nexus-core": "0.1.
|
|
19
|
+
"@shardworks/nexus-core": "0.1.121"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@types/node": "25.5.0"
|