@wildo-ai/platform-core-shared 1.0.1 → 1.1.1

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 (77) hide show
  1. package/LICENSE +34 -0
  2. package/dist/esm/.builder.pid +9 -0
  3. package/dist/esm/core/resources/resources-operations.custom.shared.definitions.d.ts +1 -1
  4. package/dist/esm/core/resources/resources-operations.custom.shared.definitions.d.ts.map +1 -1
  5. package/dist/esm/core/resources/resources-operations.custom.shared.definitions.js +6 -1
  6. package/dist/esm/core/resources/resources-operations.custom.shared.definitions.js.map +1 -1
  7. package/dist/esm/core/resources/resources-relationships.custom.shared.definitions.d.ts +20 -0
  8. package/dist/esm/core/resources/resources-relationships.custom.shared.definitions.d.ts.map +1 -1
  9. package/dist/esm/core/resources/resources-relationships.custom.shared.definitions.js +93 -3
  10. package/dist/esm/core/resources/resources-relationships.custom.shared.definitions.js.map +1 -1
  11. package/dist/esm/core/resources/resources-types.custom.shared.schemas.d.ts +4 -1
  12. package/dist/esm/core/resources/resources-types.custom.shared.schemas.d.ts.map +1 -1
  13. package/dist/esm/core/resources/resources-types.custom.shared.schemas.js +7 -1
  14. package/dist/esm/core/resources/resources-types.custom.shared.schemas.js.map +1 -1
  15. package/dist/esm/index.d.ts +14 -8
  16. package/dist/esm/index.d.ts.map +1 -1
  17. package/dist/esm/index.js +16 -1
  18. package/dist/esm/index.js.map +1 -1
  19. package/dist/esm/runtime/application-backend-env.contracts.d.ts +212 -15
  20. package/dist/esm/runtime/application-backend-env.contracts.d.ts.map +1 -1
  21. package/dist/esm/runtime/application-backend-env.contracts.js +256 -20
  22. package/dist/esm/runtime/application-backend-env.contracts.js.map +1 -1
  23. package/dist/esm/runtime/application-worker-env.contracts.d.ts +82 -0
  24. package/dist/esm/runtime/application-worker-env.contracts.d.ts.map +1 -0
  25. package/dist/esm/runtime/application-worker-env.contracts.js +106 -0
  26. package/dist/esm/runtime/application-worker-env.contracts.js.map +1 -0
  27. package/dist/esm/runtime/runtime-topology.contracts.d.ts +10 -3
  28. package/dist/esm/runtime/runtime-topology.contracts.d.ts.map +1 -1
  29. package/dist/esm/runtime/runtime-topology.contracts.js +8 -5
  30. package/dist/esm/runtime/runtime-topology.contracts.js.map +1 -1
  31. package/dist/esm/security/authorizations/roles.custom.shared.definitions.d.ts.map +1 -1
  32. package/dist/esm/security/authorizations/roles.custom.shared.definitions.js +1 -1
  33. package/dist/esm/security/authorizations/roles.custom.shared.definitions.js.map +1 -1
  34. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.resources-config.schemas.d.ts +830 -0
  35. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.resources-config.schemas.d.ts.map +1 -0
  36. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.resources-config.schemas.js +58 -0
  37. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.resources-config.schemas.js.map +1 -0
  38. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.schemas.d.ts +834 -0
  39. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.schemas.d.ts.map +1 -0
  40. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.schemas.js +27 -0
  41. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.schemas.js.map +1 -0
  42. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.resources-config.schemas.d.ts +342 -0
  43. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.resources-config.schemas.d.ts.map +1 -0
  44. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.resources-config.schemas.js +38 -0
  45. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.resources-config.schemas.js.map +1 -0
  46. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.d.ts +343 -0
  47. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.d.ts.map +1 -0
  48. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.js +38 -0
  49. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.js.map +1 -0
  50. package/dist/esm/wildo-applications/wildo-applications.custom.shared.resources-config.schemas.d.ts.map +1 -1
  51. package/dist/esm/wildo-applications/wildo-applications.custom.shared.resources-config.schemas.js +30 -1
  52. package/dist/esm/wildo-applications/wildo-applications.custom.shared.resources-config.schemas.js.map +1 -1
  53. package/dist/esm/wildo-applications/wildo-applications.custom.shared.schemas.d.ts +2 -2
  54. package/dist/esm/wildo-applications/wildo-applications.custom.shared.schemas.d.ts.map +1 -1
  55. package/dist/esm/wildo-applications/wildo-applications.custom.shared.schemas.js +35 -2
  56. package/dist/esm/wildo-applications/wildo-applications.custom.shared.schemas.js.map +1 -1
  57. package/dist/esm/wildo-applications-versions/wildo-applications-versions.custom.shared.resources-config.schemas.d.ts.map +1 -1
  58. package/dist/esm/wildo-applications-versions/wildo-applications-versions.custom.shared.resources-config.schemas.js +1 -1
  59. package/dist/esm/wildo-applications-versions/wildo-applications-versions.custom.shared.resources-config.schemas.js.map +1 -1
  60. package/dist/esm/wildo-applications-versions/wildo-applications-versions.custom.shared.schemas.d.ts +1 -1
  61. package/dist/esm/wildo-applications-versions/wildo-applications-versions.custom.shared.schemas.d.ts.map +1 -1
  62. package/dist/esm/wildo-applications-versions/wildo-applications-versions.custom.shared.schemas.js +1 -1
  63. package/dist/esm/wildo-applications-versions/wildo-applications-versions.custom.shared.schemas.js.map +1 -1
  64. package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.d.ts +57 -0
  65. package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.d.ts.map +1 -0
  66. package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.js +59 -0
  67. package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.js.map +1 -0
  68. package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.d.ts +79 -0
  69. package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.d.ts.map +1 -0
  70. package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.js +198 -0
  71. package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.js.map +1 -0
  72. package/dist/esm/workbench/workbench-resources.custom.shared.schemas.d.ts +65 -0
  73. package/dist/esm/workbench/workbench-resources.custom.shared.schemas.d.ts.map +1 -0
  74. package/dist/esm/workbench/workbench-resources.custom.shared.schemas.js +120 -0
  75. package/dist/esm/workbench/workbench-resources.custom.shared.schemas.js.map +1 -0
  76. package/dist/tsconfig.build.tsbuildinfo +1 -1
  77. package/package.json +21 -15
@@ -0,0 +1,120 @@
1
+ import { z } from 'zod';
2
+ import { initZodDecorators } from '@wildo-ai/zod-decorators';
3
+ initZodDecorators(z);
4
+ /**
5
+ * An application's shared MODULE and the resources it owns — derived, never stored.
6
+ *
7
+ * The first resource backed by `PersistenceAdapter.INTROSPECTION`. Rows come from the companion's
8
+ * `resource-specifications` behavior, whose `moduleOwnership` is exactly this shape
9
+ * (`{ moduleId, resourceTypes }`), so nothing is reshaped on the way through: the binding names the
10
+ * behavior and the path, and the schema describes what that behavior already answers.
11
+ *
12
+ * ## Why `moduleId` is the primary key
13
+ *
14
+ * There is no store to mint a surrogate in. A derived row must be identified by something the SOURCE
15
+ * already guarantees unique, and a module id is that by construction — two modules with one id would
16
+ * be a defect in the application, not in this projection.
17
+ */
18
+ export const Workbench_ApplicationModule_Schema = z.object({
19
+ moduleId: z.string().min(1).isPrimaryKey().isSummaryField(),
20
+ /**
21
+ * The resource types this module registers.
22
+ *
23
+ * A plain string array rather than foreign keys: these name resources in the OBSERVED
24
+ * application's registry, not rows in any store this workbench can reach. Modelling them as
25
+ * relationships would promise a join that cannot exist.
26
+ */
27
+ resourceTypes: z.array(z.string()).isSummaryField(),
28
+ /**
29
+ * `domain` or `engine` — or absent, which an application is free to leave unset.
30
+ *
31
+ * Carried because it is the ONE field that distinguishes a business-domain module from an engine
32
+ * contribution, and the projection used to discard it. Without it a module carrying roles,
33
+ * features, milestones and a product catalog is indistinguishable from a broken empty one.
34
+ *
35
+ * A plain nullable string rather than the `ApplicationModuleKind` union: this is a projection of
36
+ * the OBSERVED application's declaration, which may be built against a different engine revision
37
+ * than the workbench. Binding the union here would make the workbench refuse to display a kind the
38
+ * observed app can legitimately declare — refusing to show exactly the drift it exists to reveal.
39
+ */
40
+ kind: z.string().min(1).nullable(),
41
+ /**
42
+ * What the module contributes, and how much of each.
43
+ *
44
+ * DERIVED from the module's own declared keys rather than from a fixed list, so a contribution
45
+ * kind added to `SharedSaaSModule` appears here without a schema or projection change. Counts
46
+ * rather than content: an inventory answers whether and how much, and the content belongs to
47
+ * whichever behavior projects that contribution specifically.
48
+ */
49
+ contributions: z.array(z.object({
50
+ contribution: z.string().min(1),
51
+ count: z.number().int().nonnegative(),
52
+ })),
53
+ });
54
+ /**
55
+ * One relationship edge between two of the observed application's resources.
56
+ *
57
+ * ## Where the shape comes from
58
+ *
59
+ * MEASURED against a live `resources-registry` derivation rather than transcribed from the engine's
60
+ * `ResourceRelationship` type: 16 edges, 12 keys present on all of them and `primaryScope` on 8. The
61
+ * engine type carries more than the behavior emits, and a schema written from the type would refuse
62
+ * every row for fields the projection never sends.
63
+ *
64
+ * ## Why the vocabularies are plain strings here
65
+ *
66
+ * `nature`, `cardinality*` and `accessScopeStrategy` ARE closed engine enums, and this is one of the
67
+ * documented exceptions rather than an oversight: these rows cross a subprocess boundary as JSON
68
+ * from the OBSERVED application's registry, which may be built against a different engine revision
69
+ * than the workbench. Binding to the enum would make a row the observed app can legitimately produce
70
+ * unparseable here — the workbench would refuse to show exactly the drift it exists to reveal. This
71
+ * is a projection of someone else's runtime, not an authored value the framework controls.
72
+ *
73
+ * `resolvedSemantics` is deliberately ABSENT. It is a deep nested object (handling modes, foreign-key
74
+ * persistence) that no current view reads, and copying it into the schema would freeze a shape whose
75
+ * consumer does not exist yet.
76
+ */
77
+ export const Workbench_ResourceRelationship_Schema = z.object({
78
+ /**
79
+ * Composed by the introspection source from the binding's `identityFields`, because a relationship
80
+ * row carries no identifier of its own — see `IntrospectionResourceBinding.identityFields`.
81
+ *
82
+ * ## Why this is named for the resource rather than `relationshipId`
83
+ *
84
+ * A COMPOSED identity is written to the resource's own `resourceFieldIdentifier`. That is the one
85
+ * name the source can resolve from the registry without introspecting decorators — the schema's
86
+ * `.isPrimaryKey()` marker is not readable as a field NAME from the built configuration, and
87
+ * duplicating the name onto the binding would create a second declaration that can disagree.
88
+ *
89
+ * Its sibling `workbenchApplicationModules` names its key `moduleId` instead, and the difference
90
+ * is real rather than inconsistent: that behavior's rows arrive carrying `moduleId`, so nothing is
91
+ * composed and the schema is free to keep the source's own name.
92
+ */
93
+ /*
94
+ * `.isSummaryField()` on the IDENTITY field, which is not cosmetic.
95
+ *
96
+ * A list renders the SUMMARY projection, and a row click resolves its target by reading the
97
+ * resource's addressing field off the clicked item. Omit it and the projection carries every
98
+ * display column and no id, so every row in the list is unclickable — `ResourceLayoutPreset_List`
99
+ * logs "could not resolve resource id from list item" and does nothing. Measured on this resource:
100
+ * the summary returned `nature, resourceType1, resourceType2` and no row could be opened.
101
+ */
102
+ workbenchResourceRelationshipId: z.string().min(1).isPrimaryKey().isSummaryField(),
103
+ resourceType1: z.string().min(1).isSummaryField(),
104
+ resourceType2: z.string().min(1).isSummaryField(),
105
+ /** `one` / `many`, as the observed application's registry reports them. */
106
+ cardinality1: z.string().min(1),
107
+ cardinality2: z.string().min(1),
108
+ /** `composition`, `aggregation`, `reference`, … — the observed app's vocabulary, not ours. */
109
+ nature: z.string().min(1).isSummaryField(),
110
+ /** The field carrying the join. Present on every measured edge. */
111
+ foreignKeyField: z.string().min(1),
112
+ accessScopeStrategy: z.string().min(1),
113
+ parentResourceRequirement: z.string().min(1),
114
+ isPrimaryScope: z.boolean(),
115
+ allowCycle: z.boolean(),
116
+ isDisabled: z.boolean(),
117
+ /** Present on 8 of 16 measured edges — optional because the projection genuinely omits it. */
118
+ primaryScope: z.string().min(1).optional(),
119
+ });
120
+ //# sourceMappingURL=workbench-resources.custom.shared.schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbench-resources.custom.shared.schemas.js","sourceRoot":"","sources":["../../../../src/workbench/workbench-resources.custom.shared.schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAErB;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,CAAC,MAAM,CAAC;IACzD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,cAAc,EAAE;IAC3D;;;;;;OAMG;IACH,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,cAAc,EAAE;IACnD;;;;;;;;;;;OAWG;IACH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClC;;;;;;;OAOG;IACH,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC,CAAC;CACJ,CAAC,CAAC;AAIH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5D;;;;;;;;;;;;;;OAcG;IACH;;;;;;;;OAQG;IACH,+BAA+B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,cAAc,EAAE;IAClF,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE;IACjD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE;IACjD,2EAA2E;IAC3E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,8FAA8F;IAC9F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE;IAC1C,mEAAmE;IACnE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAClC,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,yBAAyB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE;IAC3B,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;IACvB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;IACvB,8FAA8F;IAC9F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAC","sourcesContent":["import { z } from 'zod';\nimport { initZodDecorators } from '@wildo-ai/zod-decorators';\n\ninitZodDecorators(z);\n\n/**\n * An application's shared MODULE and the resources it owns — derived, never stored.\n *\n * The first resource backed by `PersistenceAdapter.INTROSPECTION`. Rows come from the companion's\n * `resource-specifications` behavior, whose `moduleOwnership` is exactly this shape\n * (`{ moduleId, resourceTypes }`), so nothing is reshaped on the way through: the binding names the\n * behavior and the path, and the schema describes what that behavior already answers.\n *\n * ## Why `moduleId` is the primary key\n *\n * There is no store to mint a surrogate in. A derived row must be identified by something the SOURCE\n * already guarantees unique, and a module id is that by construction — two modules with one id would\n * be a defect in the application, not in this projection.\n */\nexport const Workbench_ApplicationModule_Schema = z.object({\n moduleId: z.string().min(1).isPrimaryKey().isSummaryField(),\n /**\n * The resource types this module registers.\n *\n * A plain string array rather than foreign keys: these name resources in the OBSERVED\n * application's registry, not rows in any store this workbench can reach. Modelling them as\n * relationships would promise a join that cannot exist.\n */\n resourceTypes: z.array(z.string()).isSummaryField(),\n /**\n * `domain` or `engine` — or absent, which an application is free to leave unset.\n *\n * Carried because it is the ONE field that distinguishes a business-domain module from an engine\n * contribution, and the projection used to discard it. Without it a module carrying roles,\n * features, milestones and a product catalog is indistinguishable from a broken empty one.\n *\n * A plain nullable string rather than the `ApplicationModuleKind` union: this is a projection of\n * the OBSERVED application's declaration, which may be built against a different engine revision\n * than the workbench. Binding the union here would make the workbench refuse to display a kind the\n * observed app can legitimately declare — refusing to show exactly the drift it exists to reveal.\n */\n kind: z.string().min(1).nullable(),\n /**\n * What the module contributes, and how much of each.\n *\n * DERIVED from the module's own declared keys rather than from a fixed list, so a contribution\n * kind added to `SharedSaaSModule` appears here without a schema or projection change. Counts\n * rather than content: an inventory answers whether and how much, and the content belongs to\n * whichever behavior projects that contribution specifically.\n */\n contributions: z.array(z.object({\n contribution: z.string().min(1),\n count: z.number().int().nonnegative(),\n })),\n});\n\nexport type Workbench_ApplicationModule = z.infer<typeof Workbench_ApplicationModule_Schema>;\n\n/**\n * One relationship edge between two of the observed application's resources.\n *\n * ## Where the shape comes from\n *\n * MEASURED against a live `resources-registry` derivation rather than transcribed from the engine's\n * `ResourceRelationship` type: 16 edges, 12 keys present on all of them and `primaryScope` on 8. The\n * engine type carries more than the behavior emits, and a schema written from the type would refuse\n * every row for fields the projection never sends.\n *\n * ## Why the vocabularies are plain strings here\n *\n * `nature`, `cardinality*` and `accessScopeStrategy` ARE closed engine enums, and this is one of the\n * documented exceptions rather than an oversight: these rows cross a subprocess boundary as JSON\n * from the OBSERVED application's registry, which may be built against a different engine revision\n * than the workbench. Binding to the enum would make a row the observed app can legitimately produce\n * unparseable here — the workbench would refuse to show exactly the drift it exists to reveal. This\n * is a projection of someone else's runtime, not an authored value the framework controls.\n *\n * `resolvedSemantics` is deliberately ABSENT. It is a deep nested object (handling modes, foreign-key\n * persistence) that no current view reads, and copying it into the schema would freeze a shape whose\n * consumer does not exist yet.\n */\nexport const Workbench_ResourceRelationship_Schema = z.object({\n /**\n * Composed by the introspection source from the binding's `identityFields`, because a relationship\n * row carries no identifier of its own — see `IntrospectionResourceBinding.identityFields`.\n *\n * ## Why this is named for the resource rather than `relationshipId`\n *\n * A COMPOSED identity is written to the resource's own `resourceFieldIdentifier`. That is the one\n * name the source can resolve from the registry without introspecting decorators — the schema's\n * `.isPrimaryKey()` marker is not readable as a field NAME from the built configuration, and\n * duplicating the name onto the binding would create a second declaration that can disagree.\n *\n * Its sibling `workbenchApplicationModules` names its key `moduleId` instead, and the difference\n * is real rather than inconsistent: that behavior's rows arrive carrying `moduleId`, so nothing is\n * composed and the schema is free to keep the source's own name.\n */\n /*\n * `.isSummaryField()` on the IDENTITY field, which is not cosmetic.\n *\n * A list renders the SUMMARY projection, and a row click resolves its target by reading the\n * resource's addressing field off the clicked item. Omit it and the projection carries every\n * display column and no id, so every row in the list is unclickable — `ResourceLayoutPreset_List`\n * logs \"could not resolve resource id from list item\" and does nothing. Measured on this resource:\n * the summary returned `nature, resourceType1, resourceType2` and no row could be opened.\n */\n workbenchResourceRelationshipId: z.string().min(1).isPrimaryKey().isSummaryField(),\n resourceType1: z.string().min(1).isSummaryField(),\n resourceType2: z.string().min(1).isSummaryField(),\n /** `one` / `many`, as the observed application's registry reports them. */\n cardinality1: z.string().min(1),\n cardinality2: z.string().min(1),\n /** `composition`, `aggregation`, `reference`, … — the observed app's vocabulary, not ours. */\n nature: z.string().min(1).isSummaryField(),\n /** The field carrying the join. Present on every measured edge. */\n foreignKeyField: z.string().min(1),\n accessScopeStrategy: z.string().min(1),\n parentResourceRequirement: z.string().min(1),\n isPrimaryScope: z.boolean(),\n allowCycle: z.boolean(),\n isDisabled: z.boolean(),\n /** Present on 8 of 16 measured edges — optional because the projection genuinely omits it. */\n primaryScope: z.string().min(1).optional(),\n});\n\nexport type Workbench_ResourceRelationship = z.infer<typeof Workbench_ResourceRelationship_Schema>;\n\n"]}