@nyuchi/mzizi-mcp 0.13.0 → 0.15.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 (73) hide show
  1. package/README.md +197 -26
  2. package/dist/auth/front.d.ts +8 -0
  3. package/dist/auth/front.d.ts.map +1 -1
  4. package/dist/auth/front.js +10 -0
  5. package/dist/auth/front.js.map +1 -1
  6. package/dist/auth/mcp-api-handler.d.ts +1 -1
  7. package/dist/auth/mcp-api-handler.d.ts.map +1 -1
  8. package/dist/auth/mcp-api-handler.js +4 -3
  9. package/dist/auth/mcp-api-handler.js.map +1 -1
  10. package/dist/auth/provider-options.d.ts +16 -0
  11. package/dist/auth/provider-options.d.ts.map +1 -0
  12. package/dist/auth/provider-options.js +21 -0
  13. package/dist/auth/provider-options.js.map +1 -0
  14. package/dist/docs-federation.d.ts +1 -1
  15. package/dist/docs-federation.d.ts.map +1 -1
  16. package/dist/docs-federation.js +1 -0
  17. package/dist/docs-federation.js.map +1 -1
  18. package/dist/env.d.ts +1 -0
  19. package/dist/env.d.ts.map +1 -1
  20. package/dist/floors.d.ts +117 -0
  21. package/dist/floors.d.ts.map +1 -0
  22. package/dist/floors.js +103 -0
  23. package/dist/floors.js.map +1 -0
  24. package/dist/fundi-client.d.ts +6 -0
  25. package/dist/fundi-client.d.ts.map +1 -1
  26. package/dist/fundi-client.js +14 -3
  27. package/dist/fundi-client.js.map +1 -1
  28. package/dist/generated/registry-pin.d.ts +8 -1
  29. package/dist/generated/registry-pin.d.ts.map +1 -1
  30. package/dist/generated/registry-pin.js +3 -1
  31. package/dist/generated/registry-pin.js.map +1 -1
  32. package/dist/generated/registry.d.ts +2 -2
  33. package/dist/generated/registry.d.ts.map +1 -1
  34. package/dist/generated/registry.js +381 -325
  35. package/dist/generated/registry.js.map +1 -1
  36. package/dist/generated/skills.d.ts +11 -1
  37. package/dist/generated/skills.d.ts.map +1 -1
  38. package/dist/generated/skills.js +216 -21
  39. package/dist/generated/skills.js.map +1 -1
  40. package/dist/http.d.ts +32 -2
  41. package/dist/http.d.ts.map +1 -1
  42. package/dist/http.js +109 -28
  43. package/dist/http.js.map +1 -1
  44. package/dist/limits.d.ts +32 -0
  45. package/dist/limits.d.ts.map +1 -0
  46. package/dist/limits.js +44 -0
  47. package/dist/limits.js.map +1 -0
  48. package/dist/origin.d.ts +55 -0
  49. package/dist/origin.d.ts.map +1 -0
  50. package/dist/origin.js +127 -0
  51. package/dist/origin.js.map +1 -0
  52. package/dist/rate-limit.d.ts +1 -1
  53. package/dist/rate-limit.d.ts.map +1 -1
  54. package/dist/rate-limit.js +3 -2
  55. package/dist/rate-limit.js.map +1 -1
  56. package/dist/registry.d.ts +1 -1
  57. package/dist/registry.d.ts.map +1 -1
  58. package/dist/registry.js +22 -1
  59. package/dist/registry.js.map +1 -1
  60. package/dist/server.d.ts +83 -4
  61. package/dist/server.d.ts.map +1 -1
  62. package/dist/server.js +109 -10
  63. package/dist/server.js.map +1 -1
  64. package/dist/stdio.js +5 -4
  65. package/dist/stdio.js.map +1 -1
  66. package/dist/tools.d.ts +21 -1
  67. package/dist/tools.d.ts.map +1 -1
  68. package/dist/tools.js +413 -114
  69. package/dist/tools.js.map +1 -1
  70. package/dist/worker.d.ts.map +1 -1
  71. package/dist/worker.js +19 -8
  72. package/dist/worker.js.map +1 -1
  73. package/package.json +18 -17
@@ -0,0 +1,117 @@
1
+ /**
2
+ * The Bundu floor, as this MCP states it.
3
+ *
4
+ * Nothing here is a number. The registry carries the floors in `/v1/brand`
5
+ * `accessibility` (`minTouchTarget`, `minInset`, `minControlGap`, `minLabelGap`,
6
+ * `minItemGap`, `minBodyLeading`), built from `BUNDU_FLOOR` in its
7
+ * `lib/tokens/roles.source.ts` and held equal to it by a registry test. This module reads
8
+ * those keys out of the bundled brand payload, so the MCP serves whatever the pinned
9
+ * registry commit says and cannot drift from it.
10
+ *
11
+ * A pin from before the spacing floor (owner, 2026-11-04, mzizi-registry#617) has no such
12
+ * keys: `spacingFloorFrom` returns undefined then, and the tools say so rather than
13
+ * answering from a copy.
14
+ */
15
+ export type SpacingFloor = {
16
+ /** Padding between text and its container edge, px (`--inset-floor`). */
17
+ insetPx: number;
18
+ /** Gap between adjacent interactive controls, visible edge to visible edge, px (`--gap-floor`). */
19
+ controlGapPx: number;
20
+ /** Gap between a label and its field, px (`--gap-floor`). */
21
+ labelGapPx: number;
22
+ /** Gap between sibling items in a list, grid or toolbar, px (`--gap-floor`). */
23
+ itemGapPx: number;
24
+ /** Body line height, unitless (`--leading-floor`). */
25
+ leadingBody: number;
26
+ };
27
+ /** The CSS custom property that carries each floor. Names, not values: the registry's token layer defines them. */
28
+ export declare const SPACING_FLOOR_PROPERTIES: Record<keyof SpacingFloor, string>;
29
+ /** The spacing floor in a `/v1/brand` payload, or undefined when the pinned registry predates it. */
30
+ export declare function spacingFloorFrom(brand: Record<string, unknown>): SpacingFloor | undefined;
31
+ /**
32
+ * The floor in a phrase for static text (tool descriptions, server instructions), from the
33
+ * pinned registry's numbers at build time. Without them the phrase names no number.
34
+ */
35
+ export declare function spacingFloorPhrase(floor: SpacingFloor | null): string;
36
+ export declare const SPACING_FLOOR_MISSING = "This build's registry pin predates the spacing floor (mzizi-registry#617), so it has no spacing floor numbers to state. Bump the pin in registry.pin.json.";
37
+ /** How the floor is enforced and what to do about it: the same text on every surface that states it. */
38
+ export declare const SPACING_FLOOR_GUIDANCE: {
39
+ readonly meaning: {
40
+ readonly insetPx: "Padding between text and the edge of its container.";
41
+ readonly controlGapPx: "Gap between adjacent interactive controls, visible edge to visible edge. Hit regions may touch, never overlap.";
42
+ readonly labelGapPx: "Gap between a label and its field.";
43
+ readonly itemGapPx: "Gap between sibling items in a list, grid or toolbar.";
44
+ readonly leadingBody: "Body line height (WCAG 1.4.12). Headings keep their own leading.";
45
+ };
46
+ readonly enforcement: "A base-layer rule in the registry's token layer gives every element the floor even when you add no padding or gap; the token test fails a component spec below it; each component contract asserts its spacing minimums (TypeScript and Rust agree); a rendered geometry guard checks neighbouring controls, text inset and WCAG 1.4.12 stress; `mzizi check` (@nyuchi/mzizi-cli 0.8.0 or later) fails a project's CSS or TSX that goes under it, and `mzizi_check_accessibility` checks values you pass it.";
47
+ readonly nothingGoesUnder: "No brand pack, density layer, component or app may lower a floor. `data-mzizi-sizes=\"legacy\"` on the root is the one opt-out, and it steps out of the other Bundu floors too.";
48
+ readonly whatToDo: "Use the components and the tokens (--inset-floor, --gap-floor, --leading-floor). Never write p-0, gap-0, a negative margin or leading-none on a text container or a row of controls without an exception comment: `mzizi-spacing-exempt: <reason>`.";
49
+ };
50
+ /** The floors of a registry, for the catalogue, `mzizi_mcp_describe` and `mzizi://tools`. */
51
+ export declare function floorsOf(registry: () => Promise<{
52
+ getBrand(): {
53
+ data: Record<string, unknown>;
54
+ };
55
+ }>): Promise<{
56
+ spacing: null;
57
+ hitAreaPx: number | null;
58
+ note: string;
59
+ } | {
60
+ source: string;
61
+ meaning: {
62
+ readonly insetPx: "Padding between text and the edge of its container.";
63
+ readonly controlGapPx: "Gap between adjacent interactive controls, visible edge to visible edge. Hit regions may touch, never overlap.";
64
+ readonly labelGapPx: "Gap between a label and its field.";
65
+ readonly itemGapPx: "Gap between sibling items in a list, grid or toolbar.";
66
+ readonly leadingBody: "Body line height (WCAG 1.4.12). Headings keep their own leading.";
67
+ };
68
+ enforcement: "A base-layer rule in the registry's token layer gives every element the floor even when you add no padding or gap; the token test fails a component spec below it; each component contract asserts its spacing minimums (TypeScript and Rust agree); a rendered geometry guard checks neighbouring controls, text inset and WCAG 1.4.12 stress; `mzizi check` (@nyuchi/mzizi-cli 0.8.0 or later) fails a project's CSS or TSX that goes under it, and `mzizi_check_accessibility` checks values you pass it.";
69
+ nothingGoesUnder: "No brand pack, density layer, component or app may lower a floor. `data-mzizi-sizes=\"legacy\"` on the root is the one opt-out, and it steps out of the other Bundu floors too.";
70
+ whatToDo: "Use the components and the tokens (--inset-floor, --gap-floor, --leading-floor). Never write p-0, gap-0, a negative margin or leading-none on a text container or a row of controls without an exception comment: `mzizi-spacing-exempt: <reason>`.";
71
+ spacing: SpacingFloor;
72
+ customProperties: Record<keyof SpacingFloor, string>;
73
+ hitAreaPx: number | null;
74
+ note?: undefined;
75
+ }>;
76
+ /** The floors as `mzizi_get_tokens`, `mzizi_get_doctrine` and `mzizi_mcp_describe` state them. */
77
+ export declare function describeFloors(brand: Record<string, unknown>): {
78
+ spacing: null;
79
+ hitAreaPx: number | null;
80
+ note: string;
81
+ } | {
82
+ source: string;
83
+ meaning: {
84
+ readonly insetPx: "Padding between text and the edge of its container.";
85
+ readonly controlGapPx: "Gap between adjacent interactive controls, visible edge to visible edge. Hit regions may touch, never overlap.";
86
+ readonly labelGapPx: "Gap between a label and its field.";
87
+ readonly itemGapPx: "Gap between sibling items in a list, grid or toolbar.";
88
+ readonly leadingBody: "Body line height (WCAG 1.4.12). Headings keep their own leading.";
89
+ };
90
+ enforcement: "A base-layer rule in the registry's token layer gives every element the floor even when you add no padding or gap; the token test fails a component spec below it; each component contract asserts its spacing minimums (TypeScript and Rust agree); a rendered geometry guard checks neighbouring controls, text inset and WCAG 1.4.12 stress; `mzizi check` (@nyuchi/mzizi-cli 0.8.0 or later) fails a project's CSS or TSX that goes under it, and `mzizi_check_accessibility` checks values you pass it.";
91
+ nothingGoesUnder: "No brand pack, density layer, component or app may lower a floor. `data-mzizi-sizes=\"legacy\"` on the root is the one opt-out, and it steps out of the other Bundu floors too.";
92
+ whatToDo: "Use the components and the tokens (--inset-floor, --gap-floor, --leading-floor). Never write p-0, gap-0, a negative margin or leading-none on a text container or a row of controls without an exception comment: `mzizi-spacing-exempt: <reason>`.";
93
+ spacing: SpacingFloor;
94
+ customProperties: Record<keyof SpacingFloor, string>;
95
+ hitAreaPx: number | null;
96
+ note?: undefined;
97
+ };
98
+ export type SpacingChecks = {
99
+ insetPx?: number;
100
+ controlGapPx?: number;
101
+ labelGapPx?: number;
102
+ itemGapPx?: number;
103
+ leading?: number;
104
+ };
105
+ /** Compare the values a caller states with the floor. Only the values given are checked. */
106
+ export declare function checkSpacing(floor: SpacingFloor, given: SpacingChecks): {
107
+ floor: SpacingFloor;
108
+ checks: {
109
+ name: string;
110
+ value: number;
111
+ minimum: number;
112
+ unit: "px" | "ratio";
113
+ passes: boolean;
114
+ }[];
115
+ meetsFloor: boolean;
116
+ };
117
+ //# sourceMappingURL=floors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floors.d.ts","sourceRoot":"","sources":["../src/floors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,YAAY,GAAG;IACzB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,mGAAmG;IACnG,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,mHAAmH;AACnH,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,YAAY,EAAE,MAAM,CAMvE,CAAC;AAYF,qGAAqG;AACrG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,GAAG,SAAS,CAWzF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,MAAM,CAGrE;AAED,eAAO,MAAM,qBAAqB,+JAC4H,CAAC;AAE/J,wGAAwG;AACxG,eAAO,MAAM,sBAAsB;;;;;;;;;;;CAezB,CAAC;AAEX,6FAA6F;AAC7F,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC;IAAE,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAA;CAAE,CAAC;;;;;;;;;;;;;;;;;;;;GAExG;AAED,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;EAe5D;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa;;;cAC1C,MAAM;eAAS,MAAM;iBAAW,MAAM;cAAQ,IAAI,GAAG,OAAO;gBAAU,OAAO;;;EAUxG"}
package/dist/floors.js ADDED
@@ -0,0 +1,103 @@
1
+ /**
2
+ * The Bundu floor, as this MCP states it.
3
+ *
4
+ * Nothing here is a number. The registry carries the floors in `/v1/brand`
5
+ * `accessibility` (`minTouchTarget`, `minInset`, `minControlGap`, `minLabelGap`,
6
+ * `minItemGap`, `minBodyLeading`), built from `BUNDU_FLOOR` in its
7
+ * `lib/tokens/roles.source.ts` and held equal to it by a registry test. This module reads
8
+ * those keys out of the bundled brand payload, so the MCP serves whatever the pinned
9
+ * registry commit says and cannot drift from it.
10
+ *
11
+ * A pin from before the spacing floor (owner, 2026-11-04, mzizi-registry#617) has no such
12
+ * keys: `spacingFloorFrom` returns undefined then, and the tools say so rather than
13
+ * answering from a copy.
14
+ */
15
+ /** The CSS custom property that carries each floor. Names, not values: the registry's token layer defines them. */
16
+ export const SPACING_FLOOR_PROPERTIES = {
17
+ insetPx: "--inset-floor",
18
+ controlGapPx: "--gap-floor",
19
+ labelGapPx: "--gap-floor",
20
+ itemGapPx: "--gap-floor",
21
+ leadingBody: "--leading-floor",
22
+ };
23
+ const KEYS = {
24
+ insetPx: "minInset",
25
+ controlGapPx: "minControlGap",
26
+ labelGapPx: "minLabelGap",
27
+ itemGapPx: "minItemGap",
28
+ leadingBody: "minBodyLeading",
29
+ };
30
+ const num = (v) => (typeof v === "number" && Number.isFinite(v) ? v : undefined);
31
+ /** The spacing floor in a `/v1/brand` payload, or undefined when the pinned registry predates it. */
32
+ export function spacingFloorFrom(brand) {
33
+ const a = brand.accessibility;
34
+ if (!a || typeof a !== "object")
35
+ return undefined;
36
+ const rec = a;
37
+ const out = {};
38
+ for (const [field, key] of Object.entries(KEYS)) {
39
+ const v = num(rec[key]);
40
+ if (v === undefined)
41
+ return undefined;
42
+ out[field] = v;
43
+ }
44
+ return out;
45
+ }
46
+ /**
47
+ * The floor in a phrase for static text (tool descriptions, server instructions), from the
48
+ * pinned registry's numbers at build time. Without them the phrase names no number.
49
+ */
50
+ export function spacingFloorPhrase(floor) {
51
+ if (!floor)
52
+ return "the spacing floor (inset, gaps between controls, labels and items, and body leading)";
53
+ return `the spacing floor (${floor.insetPx}px inset, ${floor.controlGapPx}px gaps between controls, ${floor.labelGapPx}px between a label and its field, ${floor.itemGapPx}px between items, ${floor.leadingBody} body leading)`;
54
+ }
55
+ export const SPACING_FLOOR_MISSING = "This build's registry pin predates the spacing floor (mzizi-registry#617), so it has no spacing floor numbers to state. Bump the pin in registry.pin.json.";
56
+ /** How the floor is enforced and what to do about it: the same text on every surface that states it. */
57
+ export const SPACING_FLOOR_GUIDANCE = {
58
+ meaning: {
59
+ insetPx: "Padding between text and the edge of its container.",
60
+ controlGapPx: "Gap between adjacent interactive controls, visible edge to visible edge. Hit regions may touch, never overlap.",
61
+ labelGapPx: "Gap between a label and its field.",
62
+ itemGapPx: "Gap between sibling items in a list, grid or toolbar.",
63
+ leadingBody: "Body line height (WCAG 1.4.12). Headings keep their own leading.",
64
+ },
65
+ enforcement: "A base-layer rule in the registry's token layer gives every element the floor even when you add no padding or gap; the token test fails a component spec below it; each component contract asserts its spacing minimums (TypeScript and Rust agree); a rendered geometry guard checks neighbouring controls, text inset and WCAG 1.4.12 stress; `mzizi check` (@nyuchi/mzizi-cli 0.8.0 or later) fails a project's CSS or TSX that goes under it, and `mzizi_check_accessibility` checks values you pass it.",
66
+ nothingGoesUnder: "No brand pack, density layer, component or app may lower a floor. `data-mzizi-sizes=\"legacy\"` on the root is the one opt-out, and it steps out of the other Bundu floors too.",
67
+ whatToDo: "Use the components and the tokens (--inset-floor, --gap-floor, --leading-floor). Never write p-0, gap-0, a negative margin or leading-none on a text container or a row of controls without an exception comment: `mzizi-spacing-exempt: <reason>`.",
68
+ };
69
+ /** The floors of a registry, for the catalogue, `mzizi_mcp_describe` and `mzizi://tools`. */
70
+ export async function floorsOf(registry) {
71
+ return describeFloors((await registry()).getBrand().data);
72
+ }
73
+ /** The floors as `mzizi_get_tokens`, `mzizi_get_doctrine` and `mzizi_mcp_describe` state them. */
74
+ export function describeFloors(brand) {
75
+ const spacing = spacingFloorFrom(brand);
76
+ const a = (brand.accessibility ?? {});
77
+ const hitAreaPx = num(a.minTouchTarget);
78
+ if (!spacing) {
79
+ return { spacing: null, hitAreaPx: hitAreaPx ?? null, note: SPACING_FLOOR_MISSING };
80
+ }
81
+ return {
82
+ spacing,
83
+ customProperties: SPACING_FLOOR_PROPERTIES,
84
+ hitAreaPx: hitAreaPx ?? null,
85
+ ...SPACING_FLOOR_GUIDANCE,
86
+ source: "mzizi_get_tokens family=accessibility (brand.accessibility at the pinned registry commit; BUNDU_FLOOR.spacing in lib/tokens/roles.source.ts)",
87
+ };
88
+ }
89
+ /** Compare the values a caller states with the floor. Only the values given are checked. */
90
+ export function checkSpacing(floor, given) {
91
+ const rows = [];
92
+ const add = (name, value, minimum, unit) => {
93
+ if (value !== undefined)
94
+ rows.push({ name, value, minimum, unit, passes: value >= minimum });
95
+ };
96
+ add("inset", given.insetPx, floor.insetPx, "px");
97
+ add("controlGap", given.controlGapPx, floor.controlGapPx, "px");
98
+ add("labelGap", given.labelGapPx, floor.labelGapPx, "px");
99
+ add("itemGap", given.itemGapPx, floor.itemGapPx, "px");
100
+ add("leading", given.leading, floor.leadingBody, "ratio");
101
+ return { floor, checks: rows, meetsFloor: rows.every((r) => r.passes) };
102
+ }
103
+ //# sourceMappingURL=floors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floors.js","sourceRoot":"","sources":["../src/floors.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,12 @@
10
10
  */
11
11
  import type { Env } from "./env.js";
12
12
  import type { Props } from "./auth/props.js";
13
+ /**
14
+ * Every outbound call from a tool is bounded (#295): an identity-provider or
15
+ * fundi call that hangs would otherwise hold the MCP request until the
16
+ * platform kills it, which a client sees as a dropped connection.
17
+ */
18
+ export declare const UPSTREAM_TIMEOUT_MS = 15000;
13
19
  export interface FundiCaller {
14
20
  /**
15
21
  * Call a fundi route, forwarding the authenticated user's token.
@@ -1 +1 @@
1
- {"version":3,"file":"fundi-client.d.ts","sourceRoot":"","sources":["../src/fundi-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAgC5C,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;OAUG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CACnG;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,CAAA;IACnB,8EAA8E;IAC9E,gBAAgB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CACxC;AASD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAGjD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW,CAuBvD;AA4CD;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAqDrF"}
1
+ {"version":3,"file":"fundi-client.d.ts","sourceRoot":"","sources":["../src/fundi-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAK5C;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAS,CAAA;AAiCzC,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;OAUG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CACnG;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,CAAA;IACnB,8EAA8E;IAC9E,gBAAgB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CACxC;AASD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAGjD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW,CAyBvD;AA4CD;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAsDrF"}
@@ -11,12 +11,19 @@
11
11
  import { decodeJwt } from "jose";
12
12
  import { authkitDomain } from "./identity.js";
13
13
  let cached = null;
14
+ /**
15
+ * Every outbound call from a tool is bounded (#295): an identity-provider or
16
+ * fundi call that hangs would otherwise hold the MCP request until the
17
+ * platform kills it, which a client sees as a dropped connection.
18
+ */
19
+ export const UPSTREAM_TIMEOUT_MS = 15_000;
14
20
  async function mintM2MToken(env) {
15
21
  const now = Math.floor(Date.now() / 1000);
16
22
  if (cached && cached.exp > now + 60)
17
23
  return cached.jwt;
18
24
  const res = await fetch(new URL("/oauth2/token", authkitDomain(env)), {
19
25
  method: "POST",
26
+ signal: AbortSignal.timeout(UPSTREAM_TIMEOUT_MS),
20
27
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
21
28
  body: new URLSearchParams({
22
29
  grant_type: "client_credentials",
@@ -25,7 +32,10 @@ async function mintM2MToken(env) {
25
32
  }),
26
33
  });
27
34
  if (!res.ok) {
28
- throw new Error(`fundi M2M token mint failed (${res.status}): ${(await res.text()).slice(0, 300)}`);
35
+ // The identity provider's body goes to the Worker log, not into a tool
36
+ // result a model reads: it can name client configuration.
37
+ console.error(`fundi M2M token mint failed (${res.status}): ${(await res.text()).slice(0, 300)}`);
38
+ throw new Error(`fundi could not be reached: the machine sign-in failed (HTTP ${res.status}). Retry shortly; if it persists, report it with mzizi_report_issue.`);
29
39
  }
30
40
  const data = (await res.json());
31
41
  let exp = now + (data.expires_in ?? 3600);
@@ -88,7 +98,7 @@ export function createFundiCaller(env) {
88
98
  // No Authorization header: the binding IS the machine credential.
89
99
  // Cloudflare will not route a public request to a named entrypoint, so
90
100
  // there is no token to mint, replay, or leak.
91
- return service.fetch(new Request(new URL(path, BINDING_ORIGIN), { ...init, headers }));
101
+ return service.fetch(new Request(new URL(path, BINDING_ORIGIN), { ...init, headers, signal: init.signal ?? AbortSignal.timeout(UPSTREAM_TIMEOUT_MS) }));
92
102
  },
93
103
  };
94
104
  }
@@ -98,7 +108,7 @@ export function createFundiCaller(env) {
98
108
  const headers = new Headers(init.headers);
99
109
  headers.set("Authorization", `Bearer ${m2m}`);
100
110
  headers.set("X-Fundi-User-Token", await resolveUserToken());
101
- return fetch(new URL(path, env.FUNDI_URL), { ...init, headers });
111
+ return fetch(new URL(path, env.FUNDI_URL), { ...init, headers, signal: init.signal ?? AbortSignal.timeout(UPSTREAM_TIMEOUT_MS) });
102
112
  },
103
113
  };
104
114
  }
@@ -166,6 +176,7 @@ export function createUserTokenResolver(env, props) {
166
176
  }
167
177
  const res = await fetch(new URL("/oauth2/token", authkitDomain(env)), {
168
178
  method: "POST",
179
+ signal: AbortSignal.timeout(UPSTREAM_TIMEOUT_MS),
169
180
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
170
181
  // A PUBLIC client (PKCE): client_id only, never a secret. Sending one
171
182
  // here would be rejected, and there is none to send.
@@ -1 +1 @@
1
- {"version":3,"file":"fundi-client.js","sourceRoot":"","sources":["../src/fundi-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fundi-client.js","sourceRoot":"","sources":["../src/fundi-client.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,12 @@
1
1
  export declare const REGISTRY_PIN: {
2
2
  readonly repository: "https://github.com/mzizi-dev/mzizi-registry";
3
- readonly ref: "5067b5e4c1cd46d61a0f26b721e382d4c1eb7ed8";
3
+ readonly ref: "1ac4f81a0571f0c820efd8bc8974f64e79a5c8db";
4
4
  };
5
+ export declare const REGISTRY_SPACING_FLOOR: {
6
+ readonly insetPx: number;
7
+ readonly controlGapPx: number;
8
+ readonly labelGapPx: number;
9
+ readonly itemGapPx: number;
10
+ readonly leadingBody: number;
11
+ } | null;
5
12
  //# sourceMappingURL=registry-pin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry-pin.d.ts","sourceRoot":"","sources":["../../src/generated/registry-pin.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,YAAY;;;CAAyH,CAAA"}
1
+ {"version":3,"file":"registry-pin.d.ts","sourceRoot":"","sources":["../../src/generated/registry-pin.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,YAAY;;;CAAyH,CAAA;AAGlJ,eAAO,MAAM,sBAAsB,EAAE;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B,GAAG,IAAqF,CAAA"}
@@ -1,3 +1,5 @@
1
1
  // GENERATED by scripts/generate-registry.mjs — do not edit, do not commit.
2
- export const REGISTRY_PIN = { "repository": "https://github.com/mzizi-dev/mzizi-registry", "ref": "5067b5e4c1cd46d61a0f26b721e382d4c1eb7ed8" };
2
+ export const REGISTRY_PIN = { "repository": "https://github.com/mzizi-dev/mzizi-registry", "ref": "1ac4f81a0571f0c820efd8bc8974f64e79a5c8db" };
3
+ // The spacing floor the pinned registry states (brand accessibility.min*), or null when it predates the floor.
4
+ export const REGISTRY_SPACING_FLOOR = { "insetPx": 14, "controlGapPx": 7, "labelGapPx": 7, "itemGapPx": 7, "leadingBody": 1.5 };
3
5
  //# sourceMappingURL=registry-pin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry-pin.js","sourceRoot":"","sources":["../../src/generated/registry-pin.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,EAAC,YAAY,EAAC,6CAA6C,EAAC,KAAK,EAAC,0CAA0C,EAAU,CAAA"}
1
+ {"version":3,"file":"registry-pin.js","sourceRoot":"","sources":["../../src/generated/registry-pin.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,EAAC,YAAY,EAAC,6CAA6C,EAAC,KAAK,EAAC,0CAA0C,EAAU,CAAA;AAElJ,+GAA+G;AAC/G,MAAM,CAAC,MAAM,sBAAsB,GAMxB,EAAC,SAAS,EAAC,EAAE,EAAC,cAAc,EAAC,CAAC,EAAC,YAAY,EAAC,CAAC,EAAC,WAAW,EAAC,CAAC,EAAC,aAAa,EAAC,GAAG,EAAC,CAAA"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * GENERATED by scripts/generate-registry.mjs — do not edit, do not commit.
3
3
  *
4
- * The mzizi registry at https://github.com/mzizi-dev/mzizi-registry/tree/5067b5e4c1cd46d61a0f26b721e382d4c1eb7ed8
4
+ * The mzizi registry at https://github.com/mzizi-dev/mzizi-registry/tree/1ac4f81a0571f0c820efd8bc8974f64e79a5c8db
5
5
  * (pinned in registry.pin.json), produced by calling the registry's API route
6
6
  * handlers (ported from 270af9f into scripts/registry-handlers/) at build
7
7
  * time. Every value is a JSON string, parsed lazily by src/registry.ts, so a
@@ -9,7 +9,7 @@
9
9
  */
10
10
  export declare const REGISTRY_PIN: {
11
11
  readonly repository: "https://github.com/mzizi-dev/mzizi-registry";
12
- readonly ref: "5067b5e4c1cd46d61a0f26b721e382d4c1eb7ed8";
12
+ readonly ref: "1ac4f81a0571f0c820efd8bc8974f64e79a5c8db";
13
13
  };
14
14
  /** Whole-resource payloads, keyed by section. */
15
15
  export declare const SECTIONS: Readonly<Record<string, string>>;
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/generated/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,eAAO,MAAM,YAAY;;;CAAyH,CAAA;AAElJ,iDAAiD;AACjD,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUrD,CAAA;AAED,kDAAkD;AAClD,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgpBvD,CAAA;AAED,uCAAuC;AACvC,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgpB3D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA4DjD,CAAA;AAED,uGAAuG;AACvG,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAA64D,CAAA;AAEt8D,qFAAqF;AACrF,eAAO,MAAM,YAAY,EAAE,MAAyP,CAAA;AAEpR;;;;GAIG;AACH,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA0FlD,CAAA;AAED,kDAAkD;AAClD,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAalD,CAAA;AAED,qDAAqD;AACrD,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI5D,CAAA"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/generated/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,eAAO,MAAM,YAAY;;;CAAyH,CAAA;AAElJ,iDAAiD;AACjD,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUrD,CAAA;AAED,kDAAkD;AAClD,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoqBvD,CAAA;AAED,uCAAuC;AACvC,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoqB3D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6DjD,CAAA;AAED,uGAAuG;AACvG,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAA46D,CAAA;AAEr+D,qFAAqF;AACrF,eAAO,MAAM,YAAY,EAAE,MAAuc,CAAA;AAEle;;;;GAIG;AACH,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyGlD,CAAA;AAED,kDAAkD;AAClD,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAalD,CAAA;AAED,qDAAqD;AACrD,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI5D,CAAA"}