@shardworks/spider-apparatus 0.1.238 → 0.1.240

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.
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Rig view aggregator — builds the UI-facing RigView from a persisted
3
- * RigDoc by joining against the animator/sessions book.
3
+ * RigDoc by joining against the Animator's per-session cost snapshot.
4
4
  *
5
5
  * Read-only. Pure derived fields; never persisted.
6
6
  *
@@ -11,18 +11,21 @@
11
11
  * zeros; sessions that are missing from the book are skipped silently.
12
12
  * - tokenUsage fields are optional: when no contributing session has
13
13
  * tokenUsage, the aggregate inputTokens/outputTokens are omitted.
14
+ *
15
+ * The cost data comes from AnimatorApi.getSessionCosts — the Animator owns
16
+ * the shape of cost answers, so consumers like this aggregator do not reach
17
+ * into the sessions book directly.
14
18
  */
15
- import type { StacksApi } from '@shardworks/stacks-apparatus';
16
19
  import type { RigDoc, RigView } from './types.ts';
17
20
  /**
18
- * Build a RigView for a single rig by reading every engine's session doc
19
- * (if any) from the animator/sessions book and summing cost + token usage.
21
+ * Build a RigView for a single rig by asking the Animator for cost/token
22
+ * snapshots of every engine's session (if any) and summing across them.
20
23
  *
21
24
  * Does not mutate the rig. Safe to call on every read.
22
25
  */
23
- export declare function enrichRigView(rig: RigDoc, stacks: StacksApi): Promise<RigView>;
26
+ export declare function enrichRigView(rig: RigDoc): Promise<RigView>;
24
27
  /**
25
28
  * Enrich an array of rigs in parallel.
26
29
  */
27
- export declare function enrichRigViews(rigs: RigDoc[], stacks: StacksApi): Promise<RigView[]>;
30
+ export declare function enrichRigViews(rigs: RigDoc[]): Promise<RigView[]>;
28
31
  //# sourceMappingURL=rig-view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rig-view.d.ts","sourceRoot":"","sources":["../src/rig-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,KAAK,EACV,MAAM,EACN,OAAO,EAGR,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CA8DpF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAE1F"}
1
+ {"version":3,"file":"rig-view.d.ts","sourceRoot":"","sources":["../src/rig-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EACV,MAAM,EACN,OAAO,EAGR,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA8DjE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAEvE"}
package/dist/rig-view.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Rig view aggregator — builds the UI-facing RigView from a persisted
3
- * RigDoc by joining against the animator/sessions book.
3
+ * RigDoc by joining against the Animator's per-session cost snapshot.
4
4
  *
5
5
  * Read-only. Pure derived fields; never persisted.
6
6
  *
@@ -11,15 +11,19 @@
11
11
  * zeros; sessions that are missing from the book are skipped silently.
12
12
  * - tokenUsage fields are optional: when no contributing session has
13
13
  * tokenUsage, the aggregate inputTokens/outputTokens are omitted.
14
+ *
15
+ * The cost data comes from AnimatorApi.getSessionCosts — the Animator owns
16
+ * the shape of cost answers, so consumers like this aggregator do not reach
17
+ * into the sessions book directly.
14
18
  */
19
+ import { guild } from '@shardworks/nexus-core';
15
20
  /**
16
- * Build a RigView for a single rig by reading every engine's session doc
17
- * (if any) from the animator/sessions book and summing cost + token usage.
21
+ * Build a RigView for a single rig by asking the Animator for cost/token
22
+ * snapshots of every engine's session (if any) and summing across them.
18
23
  *
19
24
  * Does not mutate the rig. Safe to call on every read.
20
25
  */
21
- export async function enrichRigView(rig, stacks) {
22
- const sessionsBook = stacks.readBook('animator', 'sessions');
26
+ export async function enrichRigView(rig) {
23
27
  // Collect (engineId, sessionId) pairs to look up.
24
28
  const pairs = [];
25
29
  for (const engine of rig.engines || []) {
@@ -31,19 +35,23 @@ export async function enrichRigView(rig, stacks) {
31
35
  if (pairs.length === 0) {
32
36
  return { ...rig };
33
37
  }
34
- // Fetch all sessions concurrently.
35
- const sessions = await Promise.all(pairs.map((p) => sessionsBook.get(p.sessionId).catch(() => null)));
38
+ // Resolve the Animator via the same apparatus-resolution mechanism
39
+ // Spider's engines use elsewhere, and fetch cost snapshots in a single
40
+ // bulk call. Missing ids are silently omitted from the returned Map
41
+ // (see AnimatorApi.getSessionCosts), which preserves the "missing = zero
42
+ // contribution" semantic this aggregator has always had.
43
+ const animator = guild().apparatus('animator');
44
+ const costs = await animator.getSessionCosts(pairs.map((p) => p.sessionId));
36
45
  const engineCosts = {};
37
46
  let totalCostUsd = 0;
38
47
  let totalInputTokens = 0;
39
48
  let totalOutputTokens = 0;
40
49
  let anyTokenUsage = false;
41
- for (let i = 0; i < pairs.length; i++) {
42
- const { engineId } = pairs[i];
43
- const session = sessions[i];
44
- const costUsd = session?.costUsd ?? 0;
45
- const inputTokens = session?.tokenUsage?.inputTokens;
46
- const outputTokens = session?.tokenUsage?.outputTokens;
50
+ for (const { engineId, sessionId } of pairs) {
51
+ const cost = costs.get(sessionId);
52
+ const costUsd = cost?.costUsd ?? 0;
53
+ const inputTokens = cost?.inputTokens;
54
+ const outputTokens = cost?.outputTokens;
47
55
  const engineCost = { costUsd };
48
56
  if (inputTokens !== undefined)
49
57
  engineCost.inputTokens = inputTokens;
@@ -74,7 +82,7 @@ export async function enrichRigView(rig, stacks) {
74
82
  /**
75
83
  * Enrich an array of rigs in parallel.
76
84
  */
77
- export async function enrichRigViews(rigs, stacks) {
78
- return Promise.all(rigs.map((r) => enrichRigView(r, stacks)));
85
+ export async function enrichRigViews(rigs) {
86
+ return Promise.all(rigs.map((r) => enrichRigView(r)));
79
87
  }
80
88
  //# sourceMappingURL=rig-view.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rig-view.js","sourceRoot":"","sources":["../src/rig-view.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rig-view.js","sourceRoot":"","sources":["../src/rig-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAS/C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,kDAAkD;IAClD,MAAM,KAAK,GAAmD,EAAE,CAAC;IACjE,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACvC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,mEAAmE;IACnE,uEAAuE;IACvE,oEAAoE;IACpE,yEAAyE;IACzE,yDAAyD;IACzD,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAC,SAAS,CAAc,UAAU,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAE5E,MAAM,WAAW,GAAsC,EAAE,CAAC;IAC1D,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,KAAK,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,KAAK,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAElC,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC;QACnC,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,CAAC;QACtC,MAAM,YAAY,GAAG,IAAI,EAAE,YAAY,CAAC;QAExC,MAAM,UAAU,GAAsB,EAAE,OAAO,EAAE,CAAC;QAClD,IAAI,WAAW,KAAK,SAAS;YAAE,UAAU,CAAC,WAAW,GAAG,WAAW,CAAC;QACpE,IAAI,YAAY,KAAK,SAAS;YAAE,UAAU,CAAC,YAAY,GAAG,YAAY,CAAC;QACvE,WAAW,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC;QAEnC,YAAY,IAAI,OAAO,CAAC;QACxB,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,gBAAgB,IAAI,WAAW,CAAC;YAChC,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,iBAAiB,IAAI,YAAY,CAAC;YAClC,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAmB,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAC9D,IAAI,aAAa,EAAE,CAAC;QAClB,WAAW,CAAC,WAAW,GAAG,gBAAgB,CAAC;QAC3C,WAAW,CAAC,YAAY,GAAG,iBAAiB,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,GAAG,GAAG;QACN,WAAW;QACX,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"rig-list.d.ts","sourceRoot":"","sources":["../../src/tools/rig-list.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;;;;;;;;;;;;AAOxB,wBAkCG"}
1
+ {"version":3,"file":"rig-list.d.ts","sourceRoot":"","sources":["../../src/tools/rig-list.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;;;;;;;;;;;;AAMxB,wBAiCG"}
@@ -34,13 +34,12 @@ export default tool({
34
34
  handler: async (params) => {
35
35
  const g = guild();
36
36
  const spider = g.apparatus('spider');
37
- const stacks = g.apparatus('stacks');
38
37
  const rigs = await spider.list({
39
38
  status: params.status,
40
39
  limit: params.limit,
41
40
  offset: params.offset,
42
41
  });
43
- return enrichRigViews(rigs, stacks);
42
+ return enrichRigViews(rigs);
44
43
  },
45
44
  });
46
45
  //# sourceMappingURL=rig-list.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rig-list.js","sourceRoot":"","sources":["../../src/tools/rig-list.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAGnD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,eAAe,IAAI,CAAC;IAClB,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,iCAAiC;IAC9C,YAAY,EACV,+DAA+D;QAC/D,4EAA4E;QAC5E,4EAA4E;QAC5E,0EAA0E;IAC5E,MAAM,EAAE;QACN,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;aAC5D,QAAQ,EAAE;aACV,QAAQ,CAAC,uBAAuB,CAAC;QACpC,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,0CAA0C,CAAC;QACvD,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,4BAA4B,CAAC;KAC1C;IACD,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAsB,EAAE;QAC5C,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAY,QAAQ,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAY,QAAQ,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAC7B,MAAM,EAAE,MAAM,CAAC,MAA+B;YAC9C,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QACH,OAAO,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"rig-list.js","sourceRoot":"","sources":["../../src/tools/rig-list.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,eAAe,IAAI,CAAC;IAClB,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,iCAAiC;IAC9C,YAAY,EACV,+DAA+D;QAC/D,4EAA4E;QAC5E,4EAA4E;QAC5E,0EAA0E;IAC5E,MAAM,EAAE;QACN,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;aAC5D,QAAQ,EAAE;aACV,QAAQ,CAAC,uBAAuB,CAAC;QACpC,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,0CAA0C,CAAC;QACvD,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,4BAA4B,CAAC;KAC1C;IACD,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAsB,EAAE;QAC5C,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAY,QAAQ,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAC7B,MAAM,EAAE,MAAM,CAAC,MAA+B;YAC9C,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QACH,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"rig-show.d.ts","sourceRoot":"","sources":["../../src/tools/rig-show.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;;;;AAOxB,wBAkBG"}
1
+ {"version":3,"file":"rig-show.d.ts","sourceRoot":"","sources":["../../src/tools/rig-show.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;;;;AAMxB,wBAiBG"}
@@ -22,9 +22,8 @@ export default tool({
22
22
  handler: async (params) => {
23
23
  const g = guild();
24
24
  const spider = g.apparatus('spider');
25
- const stacks = g.apparatus('stacks');
26
25
  const rig = await spider.show(params.id);
27
- return enrichRigView(rig, stacks);
26
+ return enrichRigView(rig);
28
27
  },
29
28
  });
30
29
  //# sourceMappingURL=rig-show.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rig-show.js","sourceRoot":"","sources":["../../src/tools/rig-show.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAGnD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,eAAe,IAAI,CAAC;IAClB,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,sBAAsB;IACnC,YAAY,EACV,wEAAwE;QACxE,gFAAgF;QAChF,uGAAuG;IACzG,MAAM,EAAE;QACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;KAClD;IACD,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAoB,EAAE;QAC1C,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAY,QAAQ,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAY,QAAQ,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzC,OAAO,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"rig-show.js","sourceRoot":"","sources":["../../src/tools/rig-show.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,eAAe,IAAI,CAAC;IAClB,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,sBAAsB;IACnC,YAAY,EACV,wEAAwE;QACxE,gFAAgF;QAChF,uGAAuG;IACzG,MAAM,EAAE;QACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;KAClD;IACD,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAoB,EAAE;QAC1C,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAY,QAAQ,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzC,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shardworks/spider-apparatus",
3
- "version": "0.1.238",
3
+ "version": "0.1.240",
4
4
  "license": "ISC",
5
5
  "repository": {
6
6
  "type": "git",
@@ -22,17 +22,17 @@
22
22
  "hono": "^4.7.11",
23
23
  "yaml": "^2.0.0",
24
24
  "zod": "4.3.6",
25
- "@shardworks/fabricator-apparatus": "0.1.238",
26
- "@shardworks/clerk-apparatus": "0.1.238",
27
- "@shardworks/stacks-apparatus": "0.1.238",
28
- "@shardworks/tools-apparatus": "0.1.238",
29
- "@shardworks/codexes-apparatus": "0.1.238",
30
- "@shardworks/animator-apparatus": "0.1.238",
31
- "@shardworks/loom-apparatus": "0.1.238"
25
+ "@shardworks/fabricator-apparatus": "0.1.240",
26
+ "@shardworks/stacks-apparatus": "0.1.240",
27
+ "@shardworks/animator-apparatus": "0.1.240",
28
+ "@shardworks/codexes-apparatus": "0.1.240",
29
+ "@shardworks/loom-apparatus": "0.1.240",
30
+ "@shardworks/tools-apparatus": "0.1.240",
31
+ "@shardworks/clerk-apparatus": "0.1.240"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/node": "25.5.0",
35
- "@shardworks/nexus-core": "0.1.238"
35
+ "@shardworks/nexus-core": "0.1.240"
36
36
  },
37
37
  "files": [
38
38
  "dist",
@@ -521,8 +521,8 @@ describe('spider.js engine-detail stable-skeleton + updater', () => {
521
521
  );
522
522
  assert.match(
523
523
  updaterBlock[0],
524
- /setText\(['"]ed-cost['"]\s*,\s*formatCostWithTokens\(/,
525
- 'engine-detail cost row should render via formatCostWithTokens()',
524
+ /setText\(['"]ed-cost['"]\s*,\s*window\.NexusFormat\.formatCostWithTokens\(/,
525
+ 'engine-detail cost row should render via window.NexusFormat.formatCostWithTokens()',
526
526
  );
527
527
  assert.match(
528
528
  updaterBlock[0],
@@ -1033,70 +1033,48 @@ describe('spider.js server-supplied engine cost', () => {
1033
1033
  });
1034
1034
  });
1035
1035
 
1036
- // ── Cost / token formatting helpers ─────────────────────────────────────
1036
+ // ── Cost / token formatting via shared namespace ────────────────────────
1037
1037
 
1038
- describe('spider.js cost/token formatting helpers', () => {
1039
- // T3 / D6 / D7: a single source of truth for cost + token rendering,
1040
- // always using the explicit 'en-US' locale so grouping is stable.
1038
+ describe('spider.js cost/token formatting delegates to window.NexusFormat', () => {
1039
+ // Spider no longer defines its own cost/token helpers. The shared
1040
+ // formatter lives in oculus's static asset (nexus-format.js) and is
1041
+ // auto-injected into the dashboard <head> before this IIFE runs, so
1042
+ // every dashboard in the guild uses the same precision and locale.
1041
1043
 
1042
- it('defines formatTokenCount using toLocaleString(en-US)', () => {
1043
- assert.match(
1044
+ it('does not redefine formatTokenCount locally', () => {
1045
+ assert.doesNotMatch(
1044
1046
  spiderJs,
1045
- /function formatTokenCount\(n\)/,
1046
- 'should define formatTokenCount helper',
1047
- );
1048
- const block = spiderJs.match(
1049
- /function formatTokenCount[\s\S]*?(?=\n function )/,
1050
- );
1051
- assert.ok(block, 'should find formatTokenCount body');
1052
- assert.match(
1053
- block[0],
1054
- /toLocaleString\(['"]en-US['"]\)/,
1055
- 'formatTokenCount should pass "en-US" locale explicitly',
1047
+ /function formatTokenCount\(/,
1048
+ 'spider.js must not redeclare formatTokenCount — use window.NexusFormat.formatTokenCount',
1056
1049
  );
1057
1050
  });
1058
1051
 
1059
- it('defines formatCostUsd that always emits $x.yy (2 decimals)', () => {
1060
- assert.match(
1052
+ it('does not redefine formatCostUsd locally', () => {
1053
+ assert.doesNotMatch(
1061
1054
  spiderJs,
1062
- /function formatCostUsd\(costUsd\)/,
1063
- 'should define formatCostUsd helper',
1064
- );
1065
- const block = spiderJs.match(
1066
- /function formatCostUsd[\s\S]*?(?=\n\s*\/\*\*|\n function )/,
1067
- );
1068
- assert.ok(block, 'should find formatCostUsd body');
1069
- assert.match(
1070
- block[0],
1071
- /toFixed\(2\)/,
1072
- 'formatCostUsd should format to two decimal places',
1073
- );
1074
- assert.match(
1075
- block[0],
1076
- /['"]\$['"]\s*\+/,
1077
- 'formatCostUsd should prefix with "$"',
1055
+ /function formatCostUsd\(/,
1056
+ 'spider.js must not redeclare formatCostUsd — use window.NexusFormat.formatCostUsd',
1078
1057
  );
1079
1058
  });
1080
1059
 
1081
- it('defines formatCostWithTokens that omits parenthetical when tokens absent', () => {
1082
- assert.match(
1060
+ it('does not redefine formatCostWithTokens locally', () => {
1061
+ assert.doesNotMatch(
1083
1062
  spiderJs,
1084
- /function formatCostWithTokens\(costUsd, inputTokens, outputTokens\)/,
1085
- 'should define formatCostWithTokens helper',
1086
- );
1087
- const block = spiderJs.match(
1088
- /function formatCostWithTokens[\s\S]*?(?=\n function )/,
1063
+ /function formatCostWithTokens\(/,
1064
+ 'spider.js must not redeclare formatCostWithTokens — use window.NexusFormat.formatCostWithTokens',
1089
1065
  );
1090
- assert.ok(block, 'should find formatCostWithTokens body');
1066
+ });
1067
+
1068
+ it('calls into window.NexusFormat for cost rendering', () => {
1091
1069
  assert.match(
1092
- block[0],
1093
- /inputTokens\s*===\s*undefined\s*\|\|\s*outputTokens\s*===\s*undefined/,
1094
- 'formatCostWithTokens should detect absent tokens and skip parenthetical',
1070
+ spiderJs,
1071
+ /window\.NexusFormat\.formatCostUsd\(/,
1072
+ 'spider.js should route cost rendering through window.NexusFormat.formatCostUsd',
1095
1073
  );
1096
1074
  assert.match(
1097
- block[0],
1098
- /formatTokenCount\(inputTokens\)[\s\S]*?input[\s\S]*?formatTokenCount\(outputTokens\)[\s\S]*?output/,
1099
- 'formatCostWithTokens should render "(N input, M output)" via formatTokenCount',
1075
+ spiderJs,
1076
+ /window\.NexusFormat\.formatCostWithTokens\(/,
1077
+ 'spider.js should route cost+tokens rendering through window.NexusFormat.formatCostWithTokens',
1100
1078
  );
1101
1079
  });
1102
1080
  });
@@ -1228,14 +1206,14 @@ describe('spider.js rig-meta stable-id skeleton', () => {
1228
1206
  );
1229
1207
  });
1230
1208
 
1231
- it('updateRigMeta writes cost via formatCostWithTokens', () => {
1209
+ it('updateRigMeta writes cost via window.NexusFormat.formatCostWithTokens', () => {
1232
1210
  const block = spiderJs.match(
1233
1211
  /function updateRigMeta\(rig\)[\s\S]*?(?=\n function |\n \/\/)/,
1234
1212
  );
1235
1213
  assert.ok(block, 'should find updateRigMeta body');
1236
1214
  assert.match(
1237
1215
  block[0],
1238
- /setText\(['"]rig-meta-cost['"]\s*,\s*formatCostWithTokens\(/,
1216
+ /setText\(['"]rig-meta-cost['"]\s*,\s*window\.NexusFormat\.formatCostWithTokens\(/,
1239
1217
  'updateRigMeta should render cost via the shared formatter',
1240
1218
  );
1241
1219
  assert.match(
@@ -94,38 +94,11 @@
94
94
  }
95
95
 
96
96
  // ── Cost / token formatting ────────────────────────────────────────────
97
-
98
- // Single source of truth for grouping conventions. Always pass 'en-US'
99
- // explicitly so the comma separator is consistent regardless of viewer
100
- // locale.
101
- function formatTokenCount(n) {
102
- return Number(n).toLocaleString('en-US');
103
- }
104
-
105
- /**
106
- * Format a cost value as `$x.yy`. Used for the rig-list Cost column
107
- * and any other surface that shows cost without tokens.
108
- */
109
- function formatCostUsd(costUsd) {
110
- var n = Number(costUsd);
111
- if (!isFinite(n)) n = 0;
112
- return '$' + n.toFixed(2);
113
- }
114
-
115
- /**
116
- * Format a cost + tokens triplet as `$x.yy (N input, M output)` with
117
- * thousands-separator grouping. When either token count is absent
118
- * (undefined), the parenthetical is omitted entirely — matching the
119
- * brief's rule that we never render `(0 input, 0 output)` when no
120
- * anima session has reported usage.
121
- */
122
- function formatCostWithTokens(costUsd, inputTokens, outputTokens) {
123
- var cost = formatCostUsd(costUsd);
124
- if (inputTokens === undefined || outputTokens === undefined) {
125
- return cost;
126
- }
127
- return cost + ' (' + formatTokenCount(inputTokens) + ' input, ' + formatTokenCount(outputTokens) + ' output)';
128
- }
97
+ //
98
+ // Cost and token formatting routes through the shared window.NexusFormat
99
+ // namespace (served by oculus and auto-injected into every dashboard
100
+ // page, so it is defined before this IIFE runs). The namespace is the
101
+ // single source of truth — no local redefinitions here.
129
102
 
130
103
  function formatElapsed(startedAt, completedAt) {
131
104
  var diffMs = new Date(completedAt) - new Date(startedAt);
@@ -745,7 +718,7 @@
745
718
  var costTd = row.querySelector('.rig-row-cost');
746
719
  if (costTd) {
747
720
  var costUsd = (rig.costSummary && typeof rig.costSummary.costUsd === 'number') ? rig.costSummary.costUsd : 0;
748
- var costText = formatCostUsd(costUsd);
721
+ var costText = window.NexusFormat.formatCostUsd(costUsd);
749
722
  if (costTd.textContent !== costText) costTd.textContent = costText;
750
723
  }
751
724
 
@@ -818,7 +791,7 @@
818
791
  var costUsd = summary ? summary.costUsd : 0;
819
792
  var inputTokens = summary ? summary.inputTokens : undefined;
820
793
  var outputTokens = summary ? summary.outputTokens : undefined;
821
- setText('rig-meta-cost', formatCostWithTokens(costUsd, inputTokens, outputTokens));
794
+ setText('rig-meta-cost', window.NexusFormat.formatCostWithTokens(costUsd, inputTokens, outputTokens));
822
795
  }
823
796
 
824
797
  // ── Show rig detail ────────────────────────────────────────────────────
@@ -1310,7 +1283,7 @@
1310
1283
  // Updates on the 2 s rig poll cadence without any per-engine fetch.
1311
1284
  var engineCost = (currentRig && currentRig.engineCosts) ? currentRig.engineCosts[engine.id] : undefined;
1312
1285
  if (engineCost) {
1313
- setText('ed-cost', formatCostWithTokens(engineCost.costUsd, engineCost.inputTokens, engineCost.outputTokens));
1286
+ setText('ed-cost', window.NexusFormat.formatCostWithTokens(engineCost.costUsd, engineCost.inputTokens, engineCost.outputTokens));
1314
1287
  setRowDisplay('ed-cost-dt', 'ed-cost', true);
1315
1288
  } else {
1316
1289
  setText('ed-cost', '');