@wildo-ai/saas-technical-doc 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 (216) hide show
  1. package/LICENSE +34 -0
  2. package/dist/esm/.builder.pid +9 -0
  3. package/dist/esm/build/csp-emit.d.ts +9 -0
  4. package/dist/esm/build/csp-emit.d.ts.map +1 -0
  5. package/dist/esm/build/csp-emit.js +8 -0
  6. package/dist/esm/build/csp-emit.js.map +1 -0
  7. package/dist/esm/build/load-materialized-frontend-providers.d.ts +9 -0
  8. package/dist/esm/build/load-materialized-frontend-providers.d.ts.map +1 -0
  9. package/dist/esm/build/load-materialized-frontend-providers.js +9 -0
  10. package/dist/esm/build/load-materialized-frontend-providers.js.map +1 -0
  11. package/dist/esm/companion/application-documentation/application-organization-role-documentation.d.ts +66 -0
  12. package/dist/esm/companion/application-documentation/application-organization-role-documentation.d.ts.map +1 -0
  13. package/dist/esm/companion/application-documentation/application-organization-role-documentation.js +195 -0
  14. package/dist/esm/companion/application-documentation/application-organization-role-documentation.js.map +1 -0
  15. package/dist/esm/companion/application-documentation/application-organization-unit-resource-documentation.d.ts +36 -0
  16. package/dist/esm/companion/application-documentation/application-organization-unit-resource-documentation.d.ts.map +1 -0
  17. package/dist/esm/companion/application-documentation/application-organization-unit-resource-documentation.js +71 -0
  18. package/dist/esm/companion/application-documentation/application-organization-unit-resource-documentation.js.map +1 -0
  19. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.d.ts +37 -0
  20. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.d.ts.map +1 -0
  21. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.js +1865 -0
  22. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.js.map +1 -0
  23. package/dist/esm/companion/application-documentation/technical-documentation-operational-evidence.d.ts +22 -0
  24. package/dist/esm/companion/application-documentation/technical-documentation-operational-evidence.d.ts.map +1 -0
  25. package/dist/esm/companion/application-documentation/technical-documentation-operational-evidence.js +31 -0
  26. package/dist/esm/companion/application-documentation/technical-documentation-operational-evidence.js.map +1 -0
  27. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.d.ts +31 -0
  28. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.d.ts.map +1 -0
  29. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.js +33 -0
  30. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.js.map +1 -0
  31. package/dist/esm/companion/application-documentation/technical-documentation-publication-policy.d.ts +13 -0
  32. package/dist/esm/companion/application-documentation/technical-documentation-publication-policy.d.ts.map +1 -0
  33. package/dist/esm/companion/application-documentation/technical-documentation-publication-policy.js +93 -0
  34. package/dist/esm/companion/application-documentation/technical-documentation-publication-policy.js.map +1 -0
  35. package/dist/esm/companion/content/application-consumer-documentation-content-loader.d.ts +52 -0
  36. package/dist/esm/companion/content/application-consumer-documentation-content-loader.d.ts.map +1 -0
  37. package/dist/esm/companion/content/application-consumer-documentation-content-loader.js +191 -0
  38. package/dist/esm/companion/content/application-consumer-documentation-content-loader.js.map +1 -0
  39. package/dist/esm/companion/index.d.ts +39 -0
  40. package/dist/esm/companion/index.d.ts.map +1 -0
  41. package/dist/esm/companion/index.js +39 -0
  42. package/dist/esm/companion/index.js.map +1 -0
  43. package/dist/esm/companion/openapi-generator.d.ts +94 -0
  44. package/dist/esm/companion/openapi-generator.d.ts.map +1 -0
  45. package/dist/esm/companion/openapi-generator.js +1562 -0
  46. package/dist/esm/companion/openapi-generator.js.map +1 -0
  47. package/dist/esm/companion/operation-projection.schemas.d.ts +797 -0
  48. package/dist/esm/companion/operation-projection.schemas.d.ts.map +1 -0
  49. package/dist/esm/companion/operation-projection.schemas.js +610 -0
  50. package/dist/esm/companion/operation-projection.schemas.js.map +1 -0
  51. package/dist/esm/companion/publish-result.types.d.ts +124 -0
  52. package/dist/esm/companion/publish-result.types.d.ts.map +1 -0
  53. package/dist/esm/companion/publish-result.types.js +28 -0
  54. package/dist/esm/companion/publish-result.types.js.map +1 -0
  55. package/dist/esm/companion/rendering/technical-documentation-authorized-bundle-reader.d.ts +26 -0
  56. package/dist/esm/companion/rendering/technical-documentation-authorized-bundle-reader.d.ts.map +1 -0
  57. package/dist/esm/companion/rendering/technical-documentation-authorized-bundle-reader.js +63 -0
  58. package/dist/esm/companion/rendering/technical-documentation-authorized-bundle-reader.js.map +1 -0
  59. package/dist/esm/companion/rendering/technical-documentation-build-measurement.d.ts +23 -0
  60. package/dist/esm/companion/rendering/technical-documentation-build-measurement.d.ts.map +1 -0
  61. package/dist/esm/companion/rendering/technical-documentation-build-measurement.js +104 -0
  62. package/dist/esm/companion/rendering/technical-documentation-build-measurement.js.map +1 -0
  63. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.d.ts +9 -0
  64. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.d.ts.map +1 -0
  65. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.js +421 -0
  66. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.js.map +1 -0
  67. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.d.ts +72 -0
  68. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.d.ts.map +1 -0
  69. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.js +204 -0
  70. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.js.map +1 -0
  71. package/dist/esm/companion/rendering/technical-documentation-markdown-renderer.d.ts +9 -0
  72. package/dist/esm/companion/rendering/technical-documentation-markdown-renderer.d.ts.map +1 -0
  73. package/dist/esm/companion/rendering/technical-documentation-markdown-renderer.js +106 -0
  74. package/dist/esm/companion/rendering/technical-documentation-markdown-renderer.js.map +1 -0
  75. package/dist/esm/companion/rendering/technical-documentation-mdx-escaping.d.ts +43 -0
  76. package/dist/esm/companion/rendering/technical-documentation-mdx-escaping.d.ts.map +1 -0
  77. package/dist/esm/companion/rendering/technical-documentation-mdx-escaping.js +88 -0
  78. package/dist/esm/companion/rendering/technical-documentation-mdx-escaping.js.map +1 -0
  79. package/dist/esm/companion/rendering/technical-documentation-openapi-renderer.d.ts +7 -0
  80. package/dist/esm/companion/rendering/technical-documentation-openapi-renderer.d.ts.map +1 -0
  81. package/dist/esm/companion/rendering/technical-documentation-openapi-renderer.js +51 -0
  82. package/dist/esm/companion/rendering/technical-documentation-openapi-renderer.js.map +1 -0
  83. package/dist/esm/companion/rendering/technical-documentation-render-model.d.ts +45 -0
  84. package/dist/esm/companion/rendering/technical-documentation-render-model.d.ts.map +1 -0
  85. package/dist/esm/companion/rendering/technical-documentation-render-model.js +178 -0
  86. package/dist/esm/companion/rendering/technical-documentation-render-model.js.map +1 -0
  87. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.d.ts +3 -0
  88. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.d.ts.map +1 -0
  89. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.js +49 -0
  90. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.js.map +1 -0
  91. package/dist/esm/companion/spec-to-operation-doc.d.ts +176 -0
  92. package/dist/esm/companion/spec-to-operation-doc.d.ts.map +1 -0
  93. package/dist/esm/companion/spec-to-operation-doc.js +326 -0
  94. package/dist/esm/companion/spec-to-operation-doc.js.map +1 -0
  95. package/dist/esm/companion/technical-documentation-asset-path.d.ts +16 -0
  96. package/dist/esm/companion/technical-documentation-asset-path.d.ts.map +1 -0
  97. package/dist/esm/companion/technical-documentation-asset-path.js +19 -0
  98. package/dist/esm/companion/technical-documentation-asset-path.js.map +1 -0
  99. package/dist/esm/companion/technical-documentation-capture-execution-port.d.ts +14 -0
  100. package/dist/esm/companion/technical-documentation-capture-execution-port.d.ts.map +1 -0
  101. package/dist/esm/companion/technical-documentation-capture-execution-port.js +1 -0
  102. package/dist/esm/companion/technical-documentation-capture-execution-port.js.map +1 -0
  103. package/dist/esm/companion/technical-documentation-diagram-materializer.d.ts +25 -0
  104. package/dist/esm/companion/technical-documentation-diagram-materializer.d.ts.map +1 -0
  105. package/dist/esm/companion/technical-documentation-diagram-materializer.js +86 -0
  106. package/dist/esm/companion/technical-documentation-diagram-materializer.js.map +1 -0
  107. package/dist/esm/companion/technical-documentation-placeholder-materializer.d.ts +17 -0
  108. package/dist/esm/companion/technical-documentation-placeholder-materializer.d.ts.map +1 -0
  109. package/dist/esm/companion/technical-documentation-placeholder-materializer.js +63 -0
  110. package/dist/esm/companion/technical-documentation-placeholder-materializer.js.map +1 -0
  111. package/dist/esm/companion/zod-to-openapi.d.ts +67 -0
  112. package/dist/esm/companion/zod-to-openapi.d.ts.map +1 -0
  113. package/dist/esm/companion/zod-to-openapi.js +211 -0
  114. package/dist/esm/companion/zod-to-openapi.js.map +1 -0
  115. package/dist/esm/companion-exports.d.ts +32 -0
  116. package/dist/esm/companion-exports.d.ts.map +1 -0
  117. package/dist/esm/companion-exports.js +32 -0
  118. package/dist/esm/companion-exports.js.map +1 -0
  119. package/dist/esm/config/define-tech-doc-config.d.ts +38 -0
  120. package/dist/esm/config/define-tech-doc-config.d.ts.map +1 -0
  121. package/dist/esm/config/define-tech-doc-config.js +40 -0
  122. package/dist/esm/config/define-tech-doc-config.js.map +1 -0
  123. package/dist/esm/config/index.d.ts +22 -0
  124. package/dist/esm/config/index.d.ts.map +1 -0
  125. package/dist/esm/config/index.js +22 -0
  126. package/dist/esm/config/index.js.map +1 -0
  127. package/dist/esm/config/wildo-tech-doc-config.schemas.d.ts +204 -0
  128. package/dist/esm/config/wildo-tech-doc-config.schemas.d.ts.map +1 -0
  129. package/dist/esm/config/wildo-tech-doc-config.schemas.js +192 -0
  130. package/dist/esm/config/wildo-tech-doc-config.schemas.js.map +1 -0
  131. package/dist/esm/content/application-consumer-documentation-content-manifest.schemas.d.ts +82 -0
  132. package/dist/esm/content/application-consumer-documentation-content-manifest.schemas.d.ts.map +1 -0
  133. package/dist/esm/content/application-consumer-documentation-content-manifest.schemas.js +114 -0
  134. package/dist/esm/content/application-consumer-documentation-content-manifest.schemas.js.map +1 -0
  135. package/dist/esm/content/application-consumer-documentation-content.techdoc.d.ts +420 -0
  136. package/dist/esm/content/application-consumer-documentation-content.techdoc.d.ts.map +1 -0
  137. package/dist/esm/content/application-consumer-documentation-content.techdoc.js +9619 -0
  138. package/dist/esm/content/application-consumer-documentation-content.techdoc.js.map +1 -0
  139. package/dist/esm/content.exports.d.ts +9 -0
  140. package/dist/esm/content.exports.d.ts.map +1 -0
  141. package/dist/esm/content.exports.js +9 -0
  142. package/dist/esm/content.exports.js.map +1 -0
  143. package/dist/esm/index.d.ts +26 -0
  144. package/dist/esm/index.d.ts.map +1 -0
  145. package/dist/esm/index.js +26 -0
  146. package/dist/esm/index.js.map +1 -0
  147. package/dist/esm/openapi/api-reference-link-index.d.ts +98 -0
  148. package/dist/esm/openapi/api-reference-link-index.d.ts.map +1 -0
  149. package/dist/esm/openapi/api-reference-link-index.js +301 -0
  150. package/dist/esm/openapi/api-reference-link-index.js.map +1 -0
  151. package/dist/esm/openapi/api-reference-targets.d.ts +71 -0
  152. package/dist/esm/openapi/api-reference-targets.d.ts.map +1 -0
  153. package/dist/esm/openapi/api-reference-targets.js +114 -0
  154. package/dist/esm/openapi/api-reference-targets.js.map +1 -0
  155. package/dist/esm/openapi/index.d.ts +20 -0
  156. package/dist/esm/openapi/index.d.ts.map +1 -0
  157. package/dist/esm/openapi/index.js +20 -0
  158. package/dist/esm/openapi/index.js.map +1 -0
  159. package/dist/esm/openapi/openapi-generation-output.schemas.d.ts +80 -0
  160. package/dist/esm/openapi/openapi-generation-output.schemas.d.ts.map +1 -0
  161. package/dist/esm/openapi/openapi-generation-output.schemas.js +76 -0
  162. package/dist/esm/openapi/openapi-generation-output.schemas.js.map +1 -0
  163. package/dist/esm/openapi-reference-model.exports.d.ts +10 -0
  164. package/dist/esm/openapi-reference-model.exports.d.ts.map +1 -0
  165. package/dist/esm/openapi-reference-model.exports.js +10 -0
  166. package/dist/esm/openapi-reference-model.exports.js.map +1 -0
  167. package/dist/esm/runtime/AuthExchangePage.d.ts +84 -0
  168. package/dist/esm/runtime/AuthExchangePage.d.ts.map +1 -0
  169. package/dist/esm/runtime/AuthExchangePage.js +188 -0
  170. package/dist/esm/runtime/AuthExchangePage.js.map +1 -0
  171. package/dist/esm/runtime/DocsAuthContext.d.ts +119 -0
  172. package/dist/esm/runtime/DocsAuthContext.d.ts.map +1 -0
  173. package/dist/esm/runtime/DocsAuthContext.js +171 -0
  174. package/dist/esm/runtime/DocsAuthContext.js.map +1 -0
  175. package/dist/esm/runtime/decode-jwt-claims.d.ts +39 -0
  176. package/dist/esm/runtime/decode-jwt-claims.d.ts.map +1 -0
  177. package/dist/esm/runtime/decode-jwt-claims.js +86 -0
  178. package/dist/esm/runtime/decode-jwt-claims.js.map +1 -0
  179. package/dist/esm/runtime/docs-auth-client.d.ts +193 -0
  180. package/dist/esm/runtime/docs-auth-client.d.ts.map +1 -0
  181. package/dist/esm/runtime/docs-auth-client.js +211 -0
  182. package/dist/esm/runtime/docs-auth-client.js.map +1 -0
  183. package/dist/esm/runtime/docs-auth-session.schemas.d.ts +77 -0
  184. package/dist/esm/runtime/docs-auth-session.schemas.d.ts.map +1 -0
  185. package/dist/esm/runtime/docs-auth-session.schemas.js +50 -0
  186. package/dist/esm/runtime/docs-auth-session.schemas.js.map +1 -0
  187. package/dist/esm/runtime/frontend-provider-registry.techdoc.d.ts +17 -0
  188. package/dist/esm/runtime/frontend-provider-registry.techdoc.d.ts.map +1 -0
  189. package/dist/esm/runtime/frontend-provider-registry.techdoc.js +23 -0
  190. package/dist/esm/runtime/frontend-provider-registry.techdoc.js.map +1 -0
  191. package/dist/esm/runtime/index.d.ts +57 -0
  192. package/dist/esm/runtime/index.d.ts.map +1 -0
  193. package/dist/esm/runtime/index.js +76 -0
  194. package/dist/esm/runtime/index.js.map +1 -0
  195. package/dist/esm/runtime/openapi-reference-conservation.d.ts +20 -0
  196. package/dist/esm/runtime/openapi-reference-conservation.d.ts.map +1 -0
  197. package/dist/esm/runtime/openapi-reference-conservation.js +102 -0
  198. package/dist/esm/runtime/openapi-reference-conservation.js.map +1 -0
  199. package/dist/esm/runtime/openapi-reference-model.d.ts +224 -0
  200. package/dist/esm/runtime/openapi-reference-model.d.ts.map +1 -0
  201. package/dist/esm/runtime/openapi-reference-model.js +579 -0
  202. package/dist/esm/runtime/openapi-reference-model.js.map +1 -0
  203. package/dist/esm/runtime/openapi-reference-view.d.ts +13 -0
  204. package/dist/esm/runtime/openapi-reference-view.d.ts.map +1 -0
  205. package/dist/esm/runtime/openapi-reference-view.js +284 -0
  206. package/dist/esm/runtime/openapi-reference-view.js.map +1 -0
  207. package/dist/esm/runtime/use-docs-auth-session.d.ts +26 -0
  208. package/dist/esm/runtime/use-docs-auth-session.d.ts.map +1 -0
  209. package/dist/esm/runtime/use-docs-auth-session.js +34 -0
  210. package/dist/esm/runtime/use-docs-auth-session.js.map +1 -0
  211. package/dist/esm/runtime/use-docs-frontend-provider-registry.d.ts +3 -0
  212. package/dist/esm/runtime/use-docs-frontend-provider-registry.d.ts.map +1 -0
  213. package/dist/esm/runtime/use-docs-frontend-provider-registry.js +5 -0
  214. package/dist/esm/runtime/use-docs-frontend-provider-registry.js.map +1 -0
  215. package/dist/tsconfig.build.tsbuildinfo +1 -0
  216. package/package.json +117 -0
@@ -0,0 +1,1865 @@
1
+ import { canonicalizeTechnicalDocumentationJson, TechnicalDocumentationAccessClass, TechnicalDocumentationApiReferenceSection, TechnicalDocumentationApiReferenceTargetKind, TechnicalDocumentationApplicabilityEvidenceAxis, TechnicalDocumentationApplicabilityEvidenceStatus, TechnicalDocumentationEditorialStatus, TechnicalDocumentationEvidenceSubjectRef, TechnicalDocumentationLinkKind, TechnicalDocumentationReaderAudience, TechnicalDocumentationSourceClassification, TechnicalDocumentationSourceOwnership, TechnicalDocumentationUnitKind, createTechnicalDocumentationUnitV1, } from '@wildo-ai/saas-specifications/technical-documentation';
2
+ import { EngineDocumentationSpecificationFamilyRef, } from '@wildo-ai/saas-specifications/companion';
3
+ import { APPLICATION_CONSUMER_DOCUMENTATION_CONSUMER_FACT_SOURCE_PREFIX, APPLICATION_CONSUMER_DOCUMENTATION_ENGINE_CONTENT_SOURCE_PREFIX, } from '../../content/application-consumer-documentation-content-manifest.schemas.js';
4
+ import { APPLICATION_ORGANIZATION_ROLES_DOCUMENTATION_SOURCE_REF } from './application-organization-role-documentation.js';
5
+ import { APPLICATION_ORGANIZATION_UNIT_RESOURCES_DOCUMENTATION_SOURCE_REF, } from './application-organization-unit-resource-documentation.js';
6
+ const PROVEN = [TechnicalDocumentationApplicabilityEvidenceStatus.PROVEN];
7
+ /**
8
+ * Every page in the webhook journey describes the same conditional product
9
+ * surface. Keep that condition at the journey boundary so a child task can
10
+ * never be published after its landing has correctly failed applicability.
11
+ */
12
+ const OUTBOUND_WEBHOOK_APPLICABILITY_REQUIREMENTS = [
13
+ {
14
+ axis: TechnicalDocumentationApplicabilityEvidenceAxis.EXPOSED_API_SURFACE,
15
+ subjectRef: TechnicalDocumentationEvidenceSubjectRef.OUTBOUND_M2M_DELIVERY,
16
+ acceptableStatuses: [...PROVEN],
17
+ },
18
+ {
19
+ axis: TechnicalDocumentationApplicabilityEvidenceAxis.ENGINE_SUPPORT,
20
+ subjectRef: TechnicalDocumentationEvidenceSubjectRef.OUTBOUND_M2M_SIGNATURE,
21
+ acceptableStatuses: [...PROVEN],
22
+ },
23
+ ];
24
+ const ORGANIZATION_SIEM_EXPORT_APPLICABILITY_REQUIREMENTS = [{
25
+ axis: TechnicalDocumentationApplicabilityEvidenceAxis.EXPOSED_API_SURFACE,
26
+ subjectRef: TechnicalDocumentationEvidenceSubjectRef.ORGANIZATION_SIEM_EXPORT,
27
+ acceptableStatuses: [...PROVEN],
28
+ }];
29
+ const ORGANIZATION_SIEM_RECOVERY_APPLICABILITY_REQUIREMENTS = [{
30
+ axis: TechnicalDocumentationApplicabilityEvidenceAxis.EXPOSED_API_SURFACE,
31
+ subjectRef: TechnicalDocumentationEvidenceSubjectRef.ORGANIZATION_SIEM_DELIVERY_RECOVERY,
32
+ acceptableStatuses: [...PROVEN],
33
+ }];
34
+ /** Billing is one operational journey; every page requires the admitted account and subscription surfaces. */
35
+ const ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS = [{
36
+ axis: TechnicalDocumentationApplicabilityEvidenceAxis.EXPOSED_API_SURFACE,
37
+ subjectRef: TechnicalDocumentationEvidenceSubjectRef.ORGANIZATION_BILLING_ADMINISTRATION,
38
+ acceptableStatuses: [...PROVEN],
39
+ }];
40
+ const MCP_INTEGRATION_APPLICABILITY_REQUIREMENTS = [{
41
+ axis: TechnicalDocumentationApplicabilityEvidenceAxis.CONFIGURED_ACTIVATION,
42
+ subjectRef: TechnicalDocumentationEvidenceSubjectRef.APPLICATION_MCP_TOOL_SURFACE,
43
+ acceptableStatuses: [...PROVEN],
44
+ }];
45
+ const A2A_INTEGRATION_APPLICABILITY_REQUIREMENTS = [{
46
+ axis: TechnicalDocumentationApplicabilityEvidenceAxis.CONFIGURED_ACTIVATION,
47
+ subjectRef: TechnicalDocumentationEvidenceSubjectRef.APPLICATION_A2A_AGENT_SURFACE,
48
+ acceptableStatuses: [...PROVEN],
49
+ }];
50
+ const CONSUMER_FACT_TOKEN_PATTERN = /\{\{CONSUMER_FACT:([^#}]+)#([^}]+)\}\}/g;
51
+ const APPLICATION_ORGANIZATION_ROLES_TOKEN = '{{APPLICATION_ORGANIZATION_ROLES}}';
52
+ const APPLICATION_ORGANIZATION_UNIT_RESOURCES_TOKEN = '{{APPLICATION_ORGANIZATION_UNIT_RESOURCES}}';
53
+ /**
54
+ * Build one semantic guide-to-reference link without embedding a Docusaurus
55
+ * route. The verified OpenAPI link index resolves the resource only when the
56
+ * application actually publishes it, so a task page cannot drift into a
57
+ * second, hand-maintained endpoint catalogue.
58
+ */
59
+ function resourceApiReferenceTarget(label, resourceIdentifier) {
60
+ const target = {
61
+ section: TechnicalDocumentationApiReferenceSection.API_REFERENCE,
62
+ kind: TechnicalDocumentationApiReferenceTargetKind.RESOURCE,
63
+ resourceRef: `technical-documentation:resource/${resourceIdentifier}`,
64
+ };
65
+ return Object.freeze({
66
+ label,
67
+ target,
68
+ });
69
+ }
70
+ function applicationAdministrationResourceApiReferenceTarget(label, resourceIdentifier) {
71
+ const target = {
72
+ section: TechnicalDocumentationApiReferenceSection.APPLICATION_ADMINISTRATION_API_REFERENCE,
73
+ kind: TechnicalDocumentationApiReferenceTargetKind.RESOURCE,
74
+ resourceRef: `technical-documentation:resource/${resourceIdentifier}`,
75
+ };
76
+ return Object.freeze({
77
+ label,
78
+ target,
79
+ });
80
+ }
81
+ function operationFamilyApiReferenceTarget(label, resourceIdentifier, operationFamilyIdentifier) {
82
+ const target = {
83
+ section: TechnicalDocumentationApiReferenceSection.API_REFERENCE,
84
+ kind: TechnicalDocumentationApiReferenceTargetKind.OPERATION_FAMILY,
85
+ operationFamilyRef: `technical-documentation:resource/${resourceIdentifier}/operation-family/${operationFamilyIdentifier}`,
86
+ };
87
+ return Object.freeze({ label, target });
88
+ }
89
+ const organizationMembersApiReferenceTarget = () => resourceApiReferenceTarget('Organization members API reference', 'organizationMembers');
90
+ const organizationUnitsApiReferenceTarget = () => resourceApiReferenceTarget('Organization units API reference', 'organizationUnits');
91
+ const organizationUnitMembersApiReferenceTarget = () => resourceApiReferenceTarget('Organization-unit members API reference', 'organizationUnitMembers');
92
+ const scimProvisioningConfigApiReferenceTarget = () => resourceApiReferenceTarget('SCIM provisioning configuration API reference', 'organizationScimProvisioningConfig');
93
+ const auditLogsApiReferenceTarget = () => resourceApiReferenceTarget('Audit records API reference', 'auditLogs');
94
+ const organizationSiemExportConfigApiReferenceTarget = () => resourceApiReferenceTarget('Organization SIEM export configuration API reference', 'organizationSiemExportConfig');
95
+ const organizationSiemDeliveryDlqApiReferenceTarget = () => resourceApiReferenceTarget('Organization SIEM delivery recovery API reference', 'organizationSiemDeliveryDlq');
96
+ const organizationBillingAccountApiReferenceTarget = () => resourceApiReferenceTarget('Organization billing account API reference', 'organizationBillingAccounts');
97
+ const organizationSubscriptionsApiReferenceTarget = () => resourceApiReferenceTarget('Organization subscriptions API reference', 'organizationSubscriptions');
98
+ const organizationInvoiceRefsApiReferenceTarget = () => resourceApiReferenceTarget('Organization invoice summaries API reference', 'organizationInvoiceRefs');
99
+ const organizationUsageRecordsApiReferenceTarget = () => resourceApiReferenceTarget('Organization usage records API reference', 'organizationUsageRecords');
100
+ /**
101
+ * The engine-owned editorial topology: each verified authored unit has one
102
+ * consumer-documentation role and an explicit set of reader destinations.
103
+ *
104
+ * This is deliberately separate from Markdown. Markdown owns the narrative
105
+ * and title; this map owns type, audience, publication posture and navigation
106
+ * relationships, allowing the projector to reject a mismatched content set.
107
+ */
108
+ export const ENGINE_CONTENT_UNIT_DEFINITIONS = Object.freeze({
109
+ 'technical-documentation:unit/application-orientation': {
110
+ kind: TechnicalDocumentationUnitKind.ORIENTATION,
111
+ readerAudiences: [
112
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
113
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
114
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
115
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
116
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
117
+ ],
118
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
119
+ applicabilityRequirements: [],
120
+ relatedUnitRefs: [
121
+ 'technical-documentation:unit/authentication',
122
+ 'technical-documentation:unit/api-keys',
123
+ 'technical-documentation:unit/first-request',
124
+ ],
125
+ },
126
+ 'technical-documentation:unit/authentication': {
127
+ kind: TechnicalDocumentationUnitKind.ORIENTATION,
128
+ readerAudiences: [
129
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
130
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
131
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
132
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
133
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
134
+ ],
135
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
136
+ // D14: engine-generic API guidance is applicable because the application
137
+ // declares an API, not because a live process was observed serving one.
138
+ // The former RUNTIME_AUTHORIZATION requirement on APPLICATION_API could only ever be
139
+ // satisfied by a runtime receipt, which no longer exists.
140
+ applicabilityRequirements: [],
141
+ relatedUnitRefs: [
142
+ 'technical-documentation:unit/sign-in-and-mfa',
143
+ 'technical-documentation:unit/single-sign-on',
144
+ 'technical-documentation:unit/api-keys',
145
+ 'technical-documentation:unit/oauth-provider',
146
+ 'technical-documentation:unit/first-request',
147
+ ],
148
+ },
149
+ 'technical-documentation:unit/sign-in-and-mfa': {
150
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
151
+ readerAudiences: [
152
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
153
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
154
+ ],
155
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
156
+ applicabilityRequirements: [],
157
+ relatedUnitRefs: [
158
+ 'technical-documentation:unit/complete-sign-in',
159
+ 'technical-documentation:unit/mfa-enrollment-and-recovery',
160
+ 'technical-documentation:unit/sign-in-troubleshoot',
161
+ ],
162
+ },
163
+ 'technical-documentation:unit/complete-sign-in': {
164
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
165
+ readerAudiences: [
166
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
167
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
168
+ ],
169
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
170
+ applicabilityRequirements: [],
171
+ relatedUnitRefs: [
172
+ 'technical-documentation:unit/sign-in-and-mfa',
173
+ 'technical-documentation:unit/mfa-enrollment-and-recovery',
174
+ 'technical-documentation:unit/sign-in-troubleshoot',
175
+ ],
176
+ },
177
+ 'technical-documentation:unit/mfa-enrollment-and-recovery': {
178
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
179
+ readerAudiences: [
180
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
181
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
182
+ ],
183
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
184
+ applicabilityRequirements: [],
185
+ relatedUnitRefs: [
186
+ 'technical-documentation:unit/sign-in-and-mfa',
187
+ 'technical-documentation:unit/complete-sign-in',
188
+ 'technical-documentation:unit/sign-in-troubleshoot',
189
+ ],
190
+ },
191
+ 'technical-documentation:unit/sign-in-troubleshoot': {
192
+ kind: TechnicalDocumentationUnitKind.TROUBLESHOOTING,
193
+ readerAudiences: [
194
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
195
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
196
+ ],
197
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
198
+ applicabilityRequirements: [],
199
+ relatedUnitRefs: [
200
+ 'technical-documentation:unit/sign-in-and-mfa',
201
+ 'technical-documentation:unit/complete-sign-in',
202
+ 'technical-documentation:unit/mfa-enrollment-and-recovery',
203
+ 'technical-documentation:unit/troubleshoot-user-access',
204
+ ],
205
+ },
206
+ 'technical-documentation:unit/single-sign-on': {
207
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
208
+ readerAudiences: [
209
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
210
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
211
+ ],
212
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
213
+ applicabilityRequirements: [],
214
+ relatedUnitRefs: [
215
+ 'technical-documentation:unit/sso-configure',
216
+ 'technical-documentation:unit/sso-rollout-and-recovery',
217
+ 'technical-documentation:unit/sso-troubleshoot',
218
+ ],
219
+ },
220
+ 'technical-documentation:unit/sso-configure': {
221
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
222
+ readerAudiences: [
223
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
224
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
225
+ ],
226
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
227
+ applicabilityRequirements: [],
228
+ relatedUnitRefs: [
229
+ 'technical-documentation:unit/single-sign-on',
230
+ 'technical-documentation:unit/sso-rollout-and-recovery',
231
+ 'technical-documentation:unit/sso-troubleshoot',
232
+ ],
233
+ },
234
+ 'technical-documentation:unit/sso-rollout-and-recovery': {
235
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
236
+ readerAudiences: [
237
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
238
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
239
+ ],
240
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
241
+ applicabilityRequirements: [],
242
+ relatedUnitRefs: [
243
+ 'technical-documentation:unit/single-sign-on',
244
+ 'technical-documentation:unit/sso-configure',
245
+ 'technical-documentation:unit/sso-troubleshoot',
246
+ ],
247
+ },
248
+ 'technical-documentation:unit/sso-troubleshoot': {
249
+ kind: TechnicalDocumentationUnitKind.TROUBLESHOOTING,
250
+ readerAudiences: [
251
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
252
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
253
+ ],
254
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
255
+ applicabilityRequirements: [],
256
+ relatedUnitRefs: [
257
+ 'technical-documentation:unit/single-sign-on',
258
+ 'technical-documentation:unit/sso-configure',
259
+ 'technical-documentation:unit/sso-rollout-and-recovery',
260
+ 'technical-documentation:unit/troubleshoot-user-access',
261
+ ],
262
+ },
263
+ 'technical-documentation:unit/api-keys': {
264
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
265
+ readerAudiences: [
266
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
267
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
268
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
269
+ ],
270
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
271
+ applicabilityRequirements: [],
272
+ relatedUnitRefs: [
273
+ 'technical-documentation:unit/api-keys-create-and-store',
274
+ 'technical-documentation:unit/api-keys-lifecycle',
275
+ 'technical-documentation:unit/api-keys-troubleshoot',
276
+ ],
277
+ apiReferenceTargets: [{
278
+ label: 'Organization API keys API reference',
279
+ target: {
280
+ section: TechnicalDocumentationApiReferenceSection.API_REFERENCE,
281
+ kind: TechnicalDocumentationApiReferenceTargetKind.RESOURCE,
282
+ resourceRef: 'technical-documentation:resource/organizationApiKeys',
283
+ },
284
+ }],
285
+ },
286
+ 'technical-documentation:unit/api-keys-create-and-store': {
287
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
288
+ readerAudiences: [
289
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
290
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
291
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
292
+ ],
293
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
294
+ applicabilityRequirements: [],
295
+ relatedUnitRefs: [
296
+ 'technical-documentation:unit/api-keys',
297
+ 'technical-documentation:unit/api-keys-lifecycle',
298
+ 'technical-documentation:unit/first-request',
299
+ ],
300
+ apiReferenceTargets: [
301
+ operationFamilyApiReferenceTarget('Create an organization API key', 'organizationApiKeys', 'create'),
302
+ ],
303
+ },
304
+ 'technical-documentation:unit/api-keys-lifecycle': {
305
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
306
+ readerAudiences: [
307
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
308
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
309
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
310
+ ],
311
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
312
+ applicabilityRequirements: [],
313
+ relatedUnitRefs: [
314
+ 'technical-documentation:unit/api-keys',
315
+ 'technical-documentation:unit/api-keys-create-and-store',
316
+ 'technical-documentation:unit/api-keys-troubleshoot',
317
+ ],
318
+ apiReferenceTargets: [
319
+ operationFamilyApiReferenceTarget('Rotate an organization API key', 'organizationApiKeys', 'rotate'),
320
+ operationFamilyApiReferenceTarget('Deactivate an organization API key', 'organizationApiKeys', 'deactivate'),
321
+ operationFamilyApiReferenceTarget('Reactivate an organization API key', 'organizationApiKeys', 'reactivate'),
322
+ operationFamilyApiReferenceTarget('Extend an organization API key expiry', 'organizationApiKeys', 'extend_expiry'),
323
+ ],
324
+ },
325
+ 'technical-documentation:unit/api-keys-troubleshoot': {
326
+ kind: TechnicalDocumentationUnitKind.TROUBLESHOOTING,
327
+ readerAudiences: [
328
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
329
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
330
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
331
+ ],
332
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
333
+ applicabilityRequirements: [],
334
+ relatedUnitRefs: [
335
+ 'technical-documentation:unit/api-keys',
336
+ 'technical-documentation:unit/api-keys-create-and-store',
337
+ 'technical-documentation:unit/common-rest-api',
338
+ ],
339
+ apiReferenceTargets: [resourceApiReferenceTarget('Organization API keys API reference', 'organizationApiKeys')],
340
+ },
341
+ 'technical-documentation:unit/oauth-provider': {
342
+ kind: TechnicalDocumentationUnitKind.CONCEPT,
343
+ readerAudiences: [
344
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
345
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
346
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
347
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
348
+ ],
349
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
350
+ applicabilityRequirements: [],
351
+ relatedUnitRefs: [
352
+ 'technical-documentation:unit/oauth-register-client',
353
+ 'technical-documentation:unit/oauth-authorize-delegated-access',
354
+ 'technical-documentation:unit/oauth-operate-and-revoke',
355
+ ],
356
+ },
357
+ 'technical-documentation:unit/oauth-register-client': {
358
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
359
+ readerAudiences: [
360
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
361
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
362
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
363
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
364
+ ],
365
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
366
+ applicabilityRequirements: [],
367
+ relatedUnitRefs: [
368
+ 'technical-documentation:unit/oauth-provider',
369
+ 'technical-documentation:unit/oauth-authorize-delegated-access',
370
+ 'technical-documentation:unit/oauth-operate-and-revoke',
371
+ ],
372
+ apiReferenceTargets: [
373
+ applicationAdministrationResourceApiReferenceTarget('Organization OAuth clients API reference', 'organizationOAuthClients'),
374
+ ],
375
+ },
376
+ 'technical-documentation:unit/oauth-authorize-delegated-access': {
377
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
378
+ readerAudiences: [
379
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
380
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
381
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
382
+ ],
383
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
384
+ applicabilityRequirements: [],
385
+ relatedUnitRefs: [
386
+ 'technical-documentation:unit/oauth-provider',
387
+ 'technical-documentation:unit/oauth-register-client',
388
+ 'technical-documentation:unit/oauth-operate-and-revoke',
389
+ ],
390
+ },
391
+ 'technical-documentation:unit/oauth-operate-and-revoke': {
392
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
393
+ readerAudiences: [
394
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
395
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
396
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
397
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
398
+ ],
399
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
400
+ applicabilityRequirements: [],
401
+ relatedUnitRefs: [
402
+ 'technical-documentation:unit/oauth-provider',
403
+ 'technical-documentation:unit/oauth-register-client',
404
+ 'technical-documentation:unit/oauth-authorize-delegated-access',
405
+ 'technical-documentation:unit/api-keys-lifecycle',
406
+ ],
407
+ apiReferenceTargets: [
408
+ applicationAdministrationResourceApiReferenceTarget('Organization OAuth clients API reference', 'organizationOAuthClients'),
409
+ ],
410
+ },
411
+ 'technical-documentation:unit/user-administration': {
412
+ kind: TechnicalDocumentationUnitKind.ORIENTATION,
413
+ readerAudiences: [
414
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
415
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
416
+ ],
417
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
418
+ applicabilityRequirements: [],
419
+ relatedUnitRefs: [
420
+ 'technical-documentation:unit/manage-users-manually',
421
+ 'technical-documentation:unit/authentication',
422
+ 'technical-documentation:unit/scim',
423
+ 'technical-documentation:unit/audit-and-siem',
424
+ ],
425
+ },
426
+ 'technical-documentation:unit/manage-users-manually': {
427
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
428
+ readerAudiences: [
429
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
430
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
431
+ ],
432
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
433
+ applicabilityRequirements: [],
434
+ relatedUnitRefs: [
435
+ 'technical-documentation:unit/invite-and-onboard-user',
436
+ 'technical-documentation:unit/change-user-access',
437
+ 'technical-documentation:unit/suspend-or-remove-user',
438
+ 'technical-documentation:unit/scim',
439
+ ],
440
+ },
441
+ 'technical-documentation:unit/invite-and-onboard-user': {
442
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
443
+ readerAudiences: [
444
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
445
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
446
+ ],
447
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
448
+ applicabilityRequirements: [],
449
+ relatedUnitRefs: [
450
+ 'technical-documentation:unit/manage-users-manually',
451
+ 'technical-documentation:unit/organization-roles',
452
+ 'technical-documentation:unit/suspend-or-remove-user',
453
+ ],
454
+ apiReferenceTargets: [
455
+ operationFamilyApiReferenceTarget('Invite a member', 'organizationMembers', 'create'),
456
+ operationFamilyApiReferenceTarget('Resend a pending invitation', 'organizationMembers', 'resend'),
457
+ operationFamilyApiReferenceTarget('Revoke a pending invitation', 'organizationMembers', 'revoke'),
458
+ ],
459
+ },
460
+ 'technical-documentation:unit/organization-roles': {
461
+ kind: TechnicalDocumentationUnitKind.CONCEPT,
462
+ readerAudiences: [
463
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
464
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
465
+ ],
466
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
467
+ applicabilityRequirements: [],
468
+ relatedUnitRefs: [
469
+ 'technical-documentation:unit/change-user-access',
470
+ 'technical-documentation:unit/manage-organization-units',
471
+ 'technical-documentation:unit/audit-and-siem',
472
+ ],
473
+ apiReferenceTargets: [{
474
+ label: 'Organization members API reference',
475
+ target: {
476
+ section: TechnicalDocumentationApiReferenceSection.API_REFERENCE,
477
+ kind: TechnicalDocumentationApiReferenceTargetKind.RESOURCE,
478
+ resourceRef: 'technical-documentation:resource/organizationMembers',
479
+ },
480
+ }],
481
+ },
482
+ 'technical-documentation:unit/change-user-access': {
483
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
484
+ readerAudiences: [
485
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
486
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
487
+ ],
488
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
489
+ applicabilityRequirements: [],
490
+ relatedUnitRefs: [
491
+ 'technical-documentation:unit/organization-roles',
492
+ 'technical-documentation:unit/suspend-or-remove-user',
493
+ 'technical-documentation:unit/manage-organization-units',
494
+ 'technical-documentation:unit/audit-and-siem',
495
+ ],
496
+ apiReferenceTargets: [
497
+ operationFamilyApiReferenceTarget('Update an organization membership', 'organizationMembers', 'update'),
498
+ organizationUnitMembersApiReferenceTarget(),
499
+ ],
500
+ },
501
+ 'technical-documentation:unit/manage-organization-units': {
502
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
503
+ readerAudiences: [
504
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
505
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
506
+ ],
507
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
508
+ applicabilityRequirements: [],
509
+ relatedUnitRefs: [
510
+ 'technical-documentation:unit/user-administration',
511
+ 'technical-documentation:unit/design-organization-unit-hierarchy',
512
+ 'technical-documentation:unit/assign-organization-unit-access',
513
+ 'technical-documentation:unit/operate-organization-units',
514
+ ],
515
+ apiReferenceTargets: [
516
+ operationFamilyApiReferenceTarget('Create an organization unit', 'organizationUnits', 'create'),
517
+ organizationUnitsApiReferenceTarget(),
518
+ ],
519
+ },
520
+ 'technical-documentation:unit/design-organization-unit-hierarchy': {
521
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
522
+ readerAudiences: [
523
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
524
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
525
+ ],
526
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
527
+ applicabilityRequirements: [],
528
+ relatedUnitRefs: [
529
+ 'technical-documentation:unit/manage-organization-units',
530
+ 'technical-documentation:unit/assign-organization-unit-access',
531
+ 'technical-documentation:unit/operate-organization-units',
532
+ ],
533
+ apiReferenceTargets: [
534
+ operationFamilyApiReferenceTarget('Create an organization unit', 'organizationUnits', 'create'),
535
+ operationFamilyApiReferenceTarget('Move an organization unit', 'organizationUnits', 'move'),
536
+ ],
537
+ },
538
+ 'technical-documentation:unit/assign-organization-unit-access': {
539
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
540
+ readerAudiences: [
541
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
542
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
543
+ ],
544
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
545
+ applicabilityRequirements: [],
546
+ relatedUnitRefs: [
547
+ 'technical-documentation:unit/manage-organization-units',
548
+ 'technical-documentation:unit/design-organization-unit-hierarchy',
549
+ 'technical-documentation:unit/organization-roles',
550
+ ],
551
+ apiReferenceTargets: [
552
+ operationFamilyApiReferenceTarget('List organization-unit members', 'organizationUnitMembers', 'list'),
553
+ operationFamilyApiReferenceTarget('Assign an organization-unit member', 'organizationUnitMembers', 'create'),
554
+ operationFamilyApiReferenceTarget('Change an organization-unit assignment', 'organizationUnitMembers', 'update'),
555
+ operationFamilyApiReferenceTarget('Remove an organization-unit assignment', 'organizationUnitMembers', 'delete'),
556
+ ],
557
+ },
558
+ 'technical-documentation:unit/operate-organization-units': {
559
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
560
+ readerAudiences: [
561
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
562
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
563
+ ],
564
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
565
+ applicabilityRequirements: [],
566
+ relatedUnitRefs: [
567
+ 'technical-documentation:unit/manage-organization-units',
568
+ 'technical-documentation:unit/assign-organization-unit-access',
569
+ 'technical-documentation:unit/scim-map-profile-and-units',
570
+ ],
571
+ apiReferenceTargets: [
572
+ operationFamilyApiReferenceTarget('Move an organization unit', 'organizationUnits', 'move'),
573
+ operationFamilyApiReferenceTarget('Archive an organization unit', 'organizationUnits', 'archive'),
574
+ operationFamilyApiReferenceTarget('Restore an organization unit', 'organizationUnits', 'restore'),
575
+ operationFamilyApiReferenceTarget('Delete an organization unit', 'organizationUnits', 'delete'),
576
+ ],
577
+ },
578
+ 'technical-documentation:unit/suspend-or-remove-user': {
579
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
580
+ readerAudiences: [
581
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
582
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
583
+ ],
584
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
585
+ applicabilityRequirements: [],
586
+ relatedUnitRefs: [
587
+ 'technical-documentation:unit/manage-users-manually',
588
+ 'technical-documentation:unit/scim',
589
+ 'technical-documentation:unit/audit-and-siem',
590
+ ],
591
+ apiReferenceTargets: [
592
+ operationFamilyApiReferenceTarget('Revoke a pending invitation', 'organizationMembers', 'revoke'),
593
+ operationFamilyApiReferenceTarget('Suspend an organization membership', 'organizationMembers', 'suspend'),
594
+ operationFamilyApiReferenceTarget('Reactivate an organization membership', 'organizationMembers', 'reactivate'),
595
+ operationFamilyApiReferenceTarget('Remove an organization membership', 'organizationMembers', 'delete'),
596
+ ],
597
+ },
598
+ 'technical-documentation:unit/review-users-and-access': {
599
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
600
+ readerAudiences: [
601
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
602
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
603
+ ],
604
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
605
+ applicabilityRequirements: [],
606
+ relatedUnitRefs: [
607
+ 'technical-documentation:unit/user-administration',
608
+ 'technical-documentation:unit/organization-roles',
609
+ 'technical-documentation:unit/manage-organization-units',
610
+ 'technical-documentation:unit/audit-and-siem',
611
+ ],
612
+ apiReferenceTargets: [
613
+ operationFamilyApiReferenceTarget('List organization members', 'organizationMembers', 'list'),
614
+ operationFamilyApiReferenceTarget('List organization-unit members', 'organizationUnitMembers', 'list'),
615
+ ],
616
+ },
617
+ 'technical-documentation:unit/troubleshoot-user-access': {
618
+ kind: TechnicalDocumentationUnitKind.TROUBLESHOOTING,
619
+ readerAudiences: [
620
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
621
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
622
+ ],
623
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
624
+ applicabilityRequirements: [],
625
+ relatedUnitRefs: [
626
+ 'technical-documentation:unit/user-administration',
627
+ 'technical-documentation:unit/sign-in-and-mfa',
628
+ 'technical-documentation:unit/organization-roles',
629
+ 'technical-documentation:unit/scim-operate-and-troubleshoot',
630
+ ],
631
+ },
632
+ 'technical-documentation:unit/scim': {
633
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
634
+ readerAudiences: [
635
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
636
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
637
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
638
+ ],
639
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
640
+ applicabilityRequirements: [],
641
+ relatedUnitRefs: [
642
+ 'technical-documentation:unit/user-administration',
643
+ 'technical-documentation:unit/scim-protocol-and-payloads',
644
+ 'technical-documentation:unit/scim-configure',
645
+ 'technical-documentation:unit/scim-microsoft-entra',
646
+ 'technical-documentation:unit/scim-okta',
647
+ 'technical-documentation:unit/scim-ldap-and-active-directory',
648
+ 'technical-documentation:unit/scim-map-profile-and-units',
649
+ 'technical-documentation:unit/scim-validate-and-roll-out',
650
+ 'technical-documentation:unit/scim-operate-and-troubleshoot',
651
+ ],
652
+ apiReferenceTargets: [
653
+ scimProvisioningConfigApiReferenceTarget(),
654
+ operationFamilyApiReferenceTarget('List SCIM tokens', 'organizationScimTokens', 'list'),
655
+ operationFamilyApiReferenceTarget('Generate a SCIM token', 'organizationScimTokens', 'generateToken'),
656
+ ],
657
+ },
658
+ 'technical-documentation:unit/scim-protocol-and-payloads': {
659
+ kind: TechnicalDocumentationUnitKind.CONCEPT,
660
+ readerAudiences: [
661
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
662
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
663
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
664
+ ],
665
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
666
+ applicabilityRequirements: [],
667
+ relatedUnitRefs: [
668
+ 'technical-documentation:unit/scim',
669
+ 'technical-documentation:unit/scim-configure',
670
+ 'technical-documentation:unit/scim-microsoft-entra',
671
+ 'technical-documentation:unit/scim-okta',
672
+ 'technical-documentation:unit/scim-ldap-and-active-directory',
673
+ 'technical-documentation:unit/scim-operate-and-troubleshoot',
674
+ ],
675
+ apiReferenceTargets: [
676
+ scimProvisioningConfigApiReferenceTarget(),
677
+ operationFamilyApiReferenceTarget('List SCIM tokens', 'organizationScimTokens', 'list'),
678
+ ],
679
+ },
680
+ 'technical-documentation:unit/scim-configure': {
681
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
682
+ readerAudiences: [
683
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
684
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
685
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
686
+ ],
687
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
688
+ applicabilityRequirements: [],
689
+ relatedUnitRefs: [
690
+ 'technical-documentation:unit/scim',
691
+ 'technical-documentation:unit/single-sign-on',
692
+ 'technical-documentation:unit/scim-protocol-and-payloads',
693
+ 'technical-documentation:unit/scim-microsoft-entra',
694
+ 'technical-documentation:unit/scim-okta',
695
+ 'technical-documentation:unit/scim-ldap-and-active-directory',
696
+ 'technical-documentation:unit/scim-map-profile-and-units',
697
+ 'technical-documentation:unit/scim-validate-and-roll-out',
698
+ ],
699
+ apiReferenceTargets: [
700
+ scimProvisioningConfigApiReferenceTarget(),
701
+ operationFamilyApiReferenceTarget('Generate a SCIM token', 'organizationScimTokens', 'generateToken'),
702
+ ],
703
+ },
704
+ 'technical-documentation:unit/scim-microsoft-entra': {
705
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
706
+ readerAudiences: [
707
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
708
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
709
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
710
+ ],
711
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
712
+ applicabilityRequirements: [],
713
+ relatedUnitRefs: [
714
+ 'technical-documentation:unit/scim',
715
+ 'technical-documentation:unit/scim-configure',
716
+ 'technical-documentation:unit/scim-protocol-and-payloads',
717
+ 'technical-documentation:unit/scim-map-profile-and-units',
718
+ 'technical-documentation:unit/scim-validate-and-roll-out',
719
+ ],
720
+ apiReferenceTargets: [
721
+ scimProvisioningConfigApiReferenceTarget(),
722
+ operationFamilyApiReferenceTarget('Generate a SCIM token', 'organizationScimTokens', 'generateToken'),
723
+ organizationMembersApiReferenceTarget(),
724
+ ],
725
+ },
726
+ 'technical-documentation:unit/scim-okta': {
727
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
728
+ readerAudiences: [
729
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
730
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
731
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
732
+ ],
733
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
734
+ applicabilityRequirements: [],
735
+ relatedUnitRefs: [
736
+ 'technical-documentation:unit/scim',
737
+ 'technical-documentation:unit/scim-configure',
738
+ 'technical-documentation:unit/scim-protocol-and-payloads',
739
+ 'technical-documentation:unit/scim-map-profile-and-units',
740
+ 'technical-documentation:unit/scim-validate-and-roll-out',
741
+ ],
742
+ apiReferenceTargets: [
743
+ scimProvisioningConfigApiReferenceTarget(),
744
+ operationFamilyApiReferenceTarget('Generate a SCIM token', 'organizationScimTokens', 'generateToken'),
745
+ organizationMembersApiReferenceTarget(),
746
+ ],
747
+ },
748
+ 'technical-documentation:unit/scim-ldap-and-active-directory': {
749
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
750
+ readerAudiences: [
751
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
752
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
753
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
754
+ ],
755
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
756
+ applicabilityRequirements: [],
757
+ relatedUnitRefs: [
758
+ 'technical-documentation:unit/scim',
759
+ 'technical-documentation:unit/scim-configure',
760
+ 'technical-documentation:unit/scim-protocol-and-payloads',
761
+ 'technical-documentation:unit/scim-map-profile-and-units',
762
+ 'technical-documentation:unit/scim-validate-and-roll-out',
763
+ ],
764
+ apiReferenceTargets: [
765
+ scimProvisioningConfigApiReferenceTarget(),
766
+ operationFamilyApiReferenceTarget('Generate a SCIM token', 'organizationScimTokens', 'generateToken'),
767
+ organizationMembersApiReferenceTarget(),
768
+ ],
769
+ },
770
+ 'technical-documentation:unit/scim-map-profile-and-units': {
771
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
772
+ readerAudiences: [
773
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
774
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
775
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
776
+ ],
777
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
778
+ applicabilityRequirements: [],
779
+ relatedUnitRefs: [
780
+ 'technical-documentation:unit/scim',
781
+ 'technical-documentation:unit/manage-organization-units',
782
+ 'technical-documentation:unit/scim-validate-and-roll-out',
783
+ ],
784
+ apiReferenceTargets: [
785
+ scimProvisioningConfigApiReferenceTarget(),
786
+ organizationUnitsApiReferenceTarget(),
787
+ ],
788
+ },
789
+ 'technical-documentation:unit/scim-validate-and-roll-out': {
790
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
791
+ readerAudiences: [
792
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
793
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
794
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
795
+ ],
796
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
797
+ applicabilityRequirements: [],
798
+ relatedUnitRefs: [
799
+ 'technical-documentation:unit/scim',
800
+ 'technical-documentation:unit/scim-configure',
801
+ 'technical-documentation:unit/scim-map-profile-and-units',
802
+ 'technical-documentation:unit/scim-operate-and-troubleshoot',
803
+ ],
804
+ apiReferenceTargets: [
805
+ scimProvisioningConfigApiReferenceTarget(),
806
+ organizationMembersApiReferenceTarget(),
807
+ ],
808
+ },
809
+ 'technical-documentation:unit/scim-operate-and-troubleshoot': {
810
+ kind: TechnicalDocumentationUnitKind.TROUBLESHOOTING,
811
+ readerAudiences: [
812
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
813
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
814
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
815
+ ],
816
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
817
+ applicabilityRequirements: [],
818
+ relatedUnitRefs: [
819
+ 'technical-documentation:unit/scim',
820
+ 'technical-documentation:unit/scim-configure',
821
+ 'technical-documentation:unit/scim-validate-and-roll-out',
822
+ 'technical-documentation:unit/audit-and-siem',
823
+ ],
824
+ apiReferenceTargets: [
825
+ scimProvisioningConfigApiReferenceTarget(),
826
+ operationFamilyApiReferenceTarget('List SCIM tokens', 'organizationScimTokens', 'list'),
827
+ operationFamilyApiReferenceTarget('Generate a SCIM token', 'organizationScimTokens', 'generateToken'),
828
+ operationFamilyApiReferenceTarget('Revoke a SCIM token', 'organizationScimTokens', 'revokeToken'),
829
+ operationFamilyApiReferenceTarget('Rotate a SCIM token', 'organizationScimTokens', 'rotateToken'),
830
+ ],
831
+ },
832
+ 'technical-documentation:unit/audit-and-siem': {
833
+ kind: TechnicalDocumentationUnitKind.ORIENTATION,
834
+ readerAudiences: [
835
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
836
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
837
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
838
+ ],
839
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
840
+ applicabilityRequirements: [],
841
+ relatedUnitRefs: [
842
+ 'technical-documentation:unit/investigate-audit-event',
843
+ 'technical-documentation:unit/review-privileged-and-access-changes',
844
+ 'technical-documentation:unit/export-audit-records',
845
+ 'technical-documentation:unit/configure-siem-export',
846
+ 'technical-documentation:unit/siem-splunk',
847
+ 'technical-documentation:unit/siem-microsoft-sentinel',
848
+ 'technical-documentation:unit/siem-elastic',
849
+ 'technical-documentation:unit/operate-and-troubleshoot-siem-delivery',
850
+ 'technical-documentation:unit/protect-and-retain-audit-evidence',
851
+ 'technical-documentation:unit/user-administration',
852
+ 'technical-documentation:unit/scim',
853
+ ],
854
+ apiReferenceTargets: [auditLogsApiReferenceTarget()],
855
+ },
856
+ 'technical-documentation:unit/investigate-audit-event': {
857
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
858
+ readerAudiences: [
859
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
860
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
861
+ ],
862
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
863
+ applicabilityRequirements: [],
864
+ relatedUnitRefs: [
865
+ 'technical-documentation:unit/audit-and-siem',
866
+ 'technical-documentation:unit/review-privileged-and-access-changes',
867
+ 'technical-documentation:unit/export-audit-records',
868
+ ],
869
+ apiReferenceTargets: [auditLogsApiReferenceTarget()],
870
+ },
871
+ 'technical-documentation:unit/review-privileged-and-access-changes': {
872
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
873
+ readerAudiences: [
874
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
875
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
876
+ ],
877
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
878
+ applicabilityRequirements: [],
879
+ relatedUnitRefs: [
880
+ 'technical-documentation:unit/audit-and-siem',
881
+ 'technical-documentation:unit/investigate-audit-event',
882
+ 'technical-documentation:unit/review-users-and-access',
883
+ ],
884
+ apiReferenceTargets: [auditLogsApiReferenceTarget()],
885
+ },
886
+ 'technical-documentation:unit/export-audit-records': {
887
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
888
+ readerAudiences: [
889
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
890
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
891
+ ],
892
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
893
+ applicabilityRequirements: [],
894
+ relatedUnitRefs: [
895
+ 'technical-documentation:unit/audit-and-siem',
896
+ 'technical-documentation:unit/investigate-audit-event',
897
+ 'technical-documentation:unit/protect-and-retain-audit-evidence',
898
+ ],
899
+ apiReferenceTargets: [
900
+ operationFamilyApiReferenceTarget('Export audit records', 'auditLogs', 'exportAuditLogs'),
901
+ ],
902
+ },
903
+ 'technical-documentation:unit/configure-siem-export': {
904
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
905
+ readerAudiences: [
906
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
907
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
908
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
909
+ ],
910
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
911
+ applicabilityRequirements: ORGANIZATION_SIEM_EXPORT_APPLICABILITY_REQUIREMENTS,
912
+ relatedUnitRefs: [
913
+ 'technical-documentation:unit/audit-and-siem',
914
+ 'technical-documentation:unit/siem-splunk',
915
+ 'technical-documentation:unit/siem-microsoft-sentinel',
916
+ 'technical-documentation:unit/siem-elastic',
917
+ 'technical-documentation:unit/operate-and-troubleshoot-siem-delivery',
918
+ 'technical-documentation:unit/protect-and-retain-audit-evidence',
919
+ ],
920
+ apiReferenceTargets: [organizationSiemExportConfigApiReferenceTarget()],
921
+ },
922
+ 'technical-documentation:unit/siem-splunk': {
923
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
924
+ readerAudiences: [
925
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
926
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
927
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
928
+ ],
929
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
930
+ applicabilityRequirements: ORGANIZATION_SIEM_EXPORT_APPLICABILITY_REQUIREMENTS,
931
+ relatedUnitRefs: [
932
+ 'technical-documentation:unit/configure-siem-export',
933
+ 'technical-documentation:unit/operate-and-troubleshoot-siem-delivery',
934
+ 'technical-documentation:unit/protect-and-retain-audit-evidence',
935
+ ],
936
+ apiReferenceTargets: [organizationSiemExportConfigApiReferenceTarget()],
937
+ },
938
+ 'technical-documentation:unit/siem-microsoft-sentinel': {
939
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
940
+ readerAudiences: [
941
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
942
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
943
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
944
+ ],
945
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
946
+ applicabilityRequirements: ORGANIZATION_SIEM_EXPORT_APPLICABILITY_REQUIREMENTS,
947
+ relatedUnitRefs: [
948
+ 'technical-documentation:unit/configure-siem-export',
949
+ 'technical-documentation:unit/operate-and-troubleshoot-siem-delivery',
950
+ 'technical-documentation:unit/protect-and-retain-audit-evidence',
951
+ ],
952
+ apiReferenceTargets: [organizationSiemExportConfigApiReferenceTarget()],
953
+ },
954
+ 'technical-documentation:unit/siem-elastic': {
955
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
956
+ readerAudiences: [
957
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
958
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
959
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
960
+ ],
961
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
962
+ applicabilityRequirements: ORGANIZATION_SIEM_EXPORT_APPLICABILITY_REQUIREMENTS,
963
+ relatedUnitRefs: [
964
+ 'technical-documentation:unit/configure-siem-export',
965
+ 'technical-documentation:unit/operate-and-troubleshoot-siem-delivery',
966
+ 'technical-documentation:unit/protect-and-retain-audit-evidence',
967
+ ],
968
+ apiReferenceTargets: [organizationSiemExportConfigApiReferenceTarget()],
969
+ },
970
+ 'technical-documentation:unit/operate-and-troubleshoot-siem-delivery': {
971
+ kind: TechnicalDocumentationUnitKind.TROUBLESHOOTING,
972
+ readerAudiences: [
973
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
974
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
975
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
976
+ ],
977
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
978
+ applicabilityRequirements: ORGANIZATION_SIEM_RECOVERY_APPLICABILITY_REQUIREMENTS,
979
+ relatedUnitRefs: [
980
+ 'technical-documentation:unit/audit-and-siem',
981
+ 'technical-documentation:unit/configure-siem-export',
982
+ 'technical-documentation:unit/investigate-audit-event',
983
+ ],
984
+ apiReferenceTargets: [organizationSiemDeliveryDlqApiReferenceTarget()],
985
+ },
986
+ 'technical-documentation:unit/protect-and-retain-audit-evidence': {
987
+ kind: TechnicalDocumentationUnitKind.CONCEPT,
988
+ readerAudiences: [
989
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
990
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
991
+ ],
992
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
993
+ applicabilityRequirements: [],
994
+ relatedUnitRefs: [
995
+ 'technical-documentation:unit/audit-and-siem',
996
+ 'technical-documentation:unit/export-audit-records',
997
+ 'technical-documentation:unit/operate-and-troubleshoot-siem-delivery',
998
+ ],
999
+ apiReferenceTargets: [auditLogsApiReferenceTarget()],
1000
+ },
1001
+ 'technical-documentation:unit/billing': {
1002
+ kind: TechnicalDocumentationUnitKind.ORIENTATION,
1003
+ readerAudiences: [
1004
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1005
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
1006
+ ],
1007
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1008
+ applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1009
+ relatedUnitRefs: [
1010
+ 'technical-documentation:unit/understand-billing-plans-and-access',
1011
+ 'technical-documentation:unit/start-billing-subscription',
1012
+ 'technical-documentation:unit/change-or-end-billing-subscription',
1013
+ 'technical-documentation:unit/billing-records-and-usage',
1014
+ 'technical-documentation:unit/reconcile-billing-and-access',
1015
+ 'technical-documentation:unit/troubleshoot-billing-change',
1016
+ 'technical-documentation:unit/audit-and-siem',
1017
+ ],
1018
+ apiReferenceTargets: [
1019
+ organizationBillingAccountApiReferenceTarget(),
1020
+ organizationSubscriptionsApiReferenceTarget(),
1021
+ ],
1022
+ },
1023
+ 'technical-documentation:unit/understand-billing-plans-and-access': {
1024
+ kind: TechnicalDocumentationUnitKind.CONCEPT,
1025
+ readerAudiences: [
1026
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1027
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
1028
+ ],
1029
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1030
+ applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1031
+ relatedUnitRefs: [
1032
+ 'technical-documentation:unit/billing',
1033
+ 'technical-documentation:unit/start-billing-subscription',
1034
+ 'technical-documentation:unit/reconcile-billing-and-access',
1035
+ ],
1036
+ apiReferenceTargets: [organizationBillingAccountApiReferenceTarget()],
1037
+ },
1038
+ 'technical-documentation:unit/start-billing-subscription': {
1039
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1040
+ readerAudiences: [TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR],
1041
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1042
+ applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1043
+ relatedUnitRefs: [
1044
+ 'technical-documentation:unit/billing',
1045
+ 'technical-documentation:unit/understand-billing-plans-and-access',
1046
+ 'technical-documentation:unit/reconcile-billing-and-access',
1047
+ 'technical-documentation:unit/troubleshoot-billing-change',
1048
+ ],
1049
+ apiReferenceTargets: [
1050
+ operationFamilyApiReferenceTarget('Open an organization checkout', 'organizationBillingAccounts', 'open_checkout'),
1051
+ ],
1052
+ },
1053
+ 'technical-documentation:unit/change-or-end-billing-subscription': {
1054
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1055
+ readerAudiences: [TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR],
1056
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1057
+ applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1058
+ relatedUnitRefs: [
1059
+ 'technical-documentation:unit/billing',
1060
+ 'technical-documentation:unit/understand-billing-plans-and-access',
1061
+ 'technical-documentation:unit/reconcile-billing-and-access',
1062
+ 'technical-documentation:unit/troubleshoot-billing-change',
1063
+ ],
1064
+ apiReferenceTargets: [
1065
+ operationFamilyApiReferenceTarget('Change an organization subscription plan', 'organizationSubscriptions', 'change_plan'),
1066
+ operationFamilyApiReferenceTarget('Cancel an organization subscription', 'organizationSubscriptions', 'cancel'),
1067
+ operationFamilyApiReferenceTarget('Resume an organization subscription', 'organizationSubscriptions', 'resume'),
1068
+ ],
1069
+ },
1070
+ 'technical-documentation:unit/manage-invoices-and-payments': {
1071
+ kind: TechnicalDocumentationUnitKind.CONCEPT,
1072
+ readerAudiences: [
1073
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1074
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
1075
+ ],
1076
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1077
+ applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1078
+ relatedUnitRefs: [
1079
+ 'technical-documentation:unit/billing',
1080
+ 'technical-documentation:unit/billing-records-and-usage',
1081
+ 'technical-documentation:unit/reconcile-billing-and-access',
1082
+ 'technical-documentation:unit/understand-metered-usage',
1083
+ 'technical-documentation:unit/protect-and-retain-audit-evidence',
1084
+ ],
1085
+ apiReferenceTargets: [
1086
+ organizationInvoiceRefsApiReferenceTarget(),
1087
+ operationFamilyApiReferenceTarget('Open the authenticated billing portal', 'organizationBillingAccounts', 'open_portal'),
1088
+ ],
1089
+ },
1090
+ 'technical-documentation:unit/billing-records-and-usage': {
1091
+ kind: TechnicalDocumentationUnitKind.ORIENTATION,
1092
+ readerAudiences: [
1093
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1094
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
1095
+ ],
1096
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1097
+ applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1098
+ relatedUnitRefs: [
1099
+ 'technical-documentation:unit/billing',
1100
+ 'technical-documentation:unit/manage-invoices-and-payments',
1101
+ 'technical-documentation:unit/understand-metered-usage',
1102
+ 'technical-documentation:unit/reconcile-billing-and-access',
1103
+ 'technical-documentation:unit/troubleshoot-billing-change',
1104
+ ],
1105
+ apiReferenceTargets: [
1106
+ organizationInvoiceRefsApiReferenceTarget(),
1107
+ organizationUsageRecordsApiReferenceTarget(),
1108
+ ],
1109
+ },
1110
+ 'technical-documentation:unit/understand-metered-usage': {
1111
+ kind: TechnicalDocumentationUnitKind.CONCEPT,
1112
+ readerAudiences: [
1113
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1114
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
1115
+ ],
1116
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1117
+ applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1118
+ relatedUnitRefs: [
1119
+ 'technical-documentation:unit/billing',
1120
+ 'technical-documentation:unit/billing-records-and-usage',
1121
+ 'technical-documentation:unit/manage-invoices-and-payments',
1122
+ 'technical-documentation:unit/reconcile-billing-and-access',
1123
+ 'technical-documentation:unit/troubleshoot-billing-change',
1124
+ ],
1125
+ apiReferenceTargets: [organizationUsageRecordsApiReferenceTarget()],
1126
+ },
1127
+ 'technical-documentation:unit/reconcile-billing-and-access': {
1128
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1129
+ readerAudiences: [
1130
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1131
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
1132
+ ],
1133
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1134
+ applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1135
+ relatedUnitRefs: [
1136
+ 'technical-documentation:unit/billing',
1137
+ 'technical-documentation:unit/manage-invoices-and-payments',
1138
+ 'technical-documentation:unit/understand-metered-usage',
1139
+ 'technical-documentation:unit/troubleshoot-billing-change',
1140
+ 'technical-documentation:unit/audit-and-siem',
1141
+ ],
1142
+ apiReferenceTargets: [
1143
+ operationFamilyApiReferenceTarget('Read aggregated organization billing state', 'organizationBillingAccounts', 'get_state'),
1144
+ organizationSubscriptionsApiReferenceTarget(),
1145
+ ],
1146
+ },
1147
+ 'technical-documentation:unit/troubleshoot-billing-change': {
1148
+ kind: TechnicalDocumentationUnitKind.TROUBLESHOOTING,
1149
+ readerAudiences: [
1150
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1151
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
1152
+ ],
1153
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1154
+ applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1155
+ relatedUnitRefs: [
1156
+ 'technical-documentation:unit/billing',
1157
+ 'technical-documentation:unit/reconcile-billing-and-access',
1158
+ 'technical-documentation:unit/manage-invoices-and-payments',
1159
+ 'technical-documentation:unit/understand-metered-usage',
1160
+ ],
1161
+ apiReferenceTargets: [
1162
+ organizationBillingAccountApiReferenceTarget(),
1163
+ organizationSubscriptionsApiReferenceTarget(),
1164
+ ],
1165
+ },
1166
+ 'technical-documentation:unit/integrations': {
1167
+ kind: TechnicalDocumentationUnitKind.ORIENTATION,
1168
+ readerAudiences: [
1169
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1170
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1171
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1172
+ ],
1173
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1174
+ applicabilityRequirements: [],
1175
+ relatedUnitRefs: [
1176
+ 'technical-documentation:unit/automation-platforms',
1177
+ 'technical-documentation:unit/ai-coding-tools',
1178
+ 'technical-documentation:unit/first-request',
1179
+ 'technical-documentation:unit/common-rest-api',
1180
+ 'technical-documentation:unit/webhooks',
1181
+ 'technical-documentation:unit/agent-interoperability',
1182
+ ],
1183
+ },
1184
+ 'technical-documentation:unit/automation-platforms': {
1185
+ kind: TechnicalDocumentationUnitKind.ORIENTATION,
1186
+ readerAudiences: [
1187
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1188
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1189
+ ],
1190
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1191
+ applicabilityRequirements: [],
1192
+ relatedUnitRefs: [
1193
+ 'technical-documentation:unit/connect-n8n',
1194
+ 'technical-documentation:unit/connect-zapier',
1195
+ 'technical-documentation:unit/connect-make',
1196
+ 'technical-documentation:unit/first-request',
1197
+ ],
1198
+ },
1199
+ 'technical-documentation:unit/connect-n8n': {
1200
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1201
+ readerAudiences: [TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER],
1202
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1203
+ applicabilityRequirements: [],
1204
+ relatedUnitRefs: [
1205
+ 'technical-documentation:unit/automation-platforms',
1206
+ 'technical-documentation:unit/common-rest-api',
1207
+ 'technical-documentation:unit/webhooks',
1208
+ 'technical-documentation:unit/api-keys',
1209
+ ],
1210
+ },
1211
+ 'technical-documentation:unit/connect-zapier': {
1212
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1213
+ readerAudiences: [TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER],
1214
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1215
+ applicabilityRequirements: [],
1216
+ relatedUnitRefs: [
1217
+ 'technical-documentation:unit/automation-platforms',
1218
+ 'technical-documentation:unit/common-rest-api',
1219
+ 'technical-documentation:unit/webhooks',
1220
+ 'technical-documentation:unit/api-keys',
1221
+ ],
1222
+ },
1223
+ 'technical-documentation:unit/connect-make': {
1224
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1225
+ readerAudiences: [TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER],
1226
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1227
+ applicabilityRequirements: [],
1228
+ relatedUnitRefs: [
1229
+ 'technical-documentation:unit/automation-platforms',
1230
+ 'technical-documentation:unit/common-rest-api',
1231
+ 'technical-documentation:unit/webhooks',
1232
+ 'technical-documentation:unit/api-keys',
1233
+ ],
1234
+ },
1235
+ 'technical-documentation:unit/ai-coding-tools': {
1236
+ kind: TechnicalDocumentationUnitKind.ORIENTATION,
1237
+ readerAudiences: [
1238
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1239
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1240
+ ],
1241
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1242
+ applicabilityRequirements: MCP_INTEGRATION_APPLICABILITY_REQUIREMENTS,
1243
+ relatedUnitRefs: [
1244
+ 'technical-documentation:unit/connect-cursor',
1245
+ 'technical-documentation:unit/connect-codex',
1246
+ 'technical-documentation:unit/connect-claude-code',
1247
+ 'technical-documentation:unit/mcp-integrations',
1248
+ ],
1249
+ },
1250
+ 'technical-documentation:unit/connect-cursor': {
1251
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1252
+ readerAudiences: [TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER],
1253
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1254
+ applicabilityRequirements: MCP_INTEGRATION_APPLICABILITY_REQUIREMENTS,
1255
+ relatedUnitRefs: [
1256
+ 'technical-documentation:unit/ai-coding-tools',
1257
+ 'technical-documentation:unit/mcp-integrations',
1258
+ 'technical-documentation:unit/oauth-provider',
1259
+ ],
1260
+ },
1261
+ 'technical-documentation:unit/connect-codex': {
1262
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1263
+ readerAudiences: [TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER],
1264
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1265
+ applicabilityRequirements: MCP_INTEGRATION_APPLICABILITY_REQUIREMENTS,
1266
+ relatedUnitRefs: [
1267
+ 'technical-documentation:unit/ai-coding-tools',
1268
+ 'technical-documentation:unit/mcp-integrations',
1269
+ 'technical-documentation:unit/oauth-provider',
1270
+ ],
1271
+ },
1272
+ 'technical-documentation:unit/connect-claude-code': {
1273
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1274
+ readerAudiences: [TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER],
1275
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1276
+ applicabilityRequirements: MCP_INTEGRATION_APPLICABILITY_REQUIREMENTS,
1277
+ relatedUnitRefs: [
1278
+ 'technical-documentation:unit/ai-coding-tools',
1279
+ 'technical-documentation:unit/mcp-integrations',
1280
+ 'technical-documentation:unit/oauth-provider',
1281
+ ],
1282
+ },
1283
+ 'technical-documentation:unit/agent-interoperability': {
1284
+ kind: TechnicalDocumentationUnitKind.CONCEPT,
1285
+ readerAudiences: [
1286
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1287
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1288
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1289
+ ],
1290
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1291
+ applicabilityRequirements: [],
1292
+ relatedUnitRefs: [
1293
+ 'technical-documentation:unit/mcp-integrations',
1294
+ 'technical-documentation:unit/a2a-integrations',
1295
+ 'technical-documentation:unit/ai-coding-tools',
1296
+ 'technical-documentation:unit/oauth-provider',
1297
+ ],
1298
+ },
1299
+ 'technical-documentation:unit/mcp-integrations': {
1300
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1301
+ readerAudiences: [
1302
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1303
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1304
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1305
+ ],
1306
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1307
+ applicabilityRequirements: MCP_INTEGRATION_APPLICABILITY_REQUIREMENTS,
1308
+ relatedUnitRefs: [
1309
+ 'technical-documentation:unit/agent-interoperability',
1310
+ 'technical-documentation:unit/oauth-provider',
1311
+ 'technical-documentation:unit/troubleshoot-api-request',
1312
+ ],
1313
+ },
1314
+ 'technical-documentation:unit/a2a-integrations': {
1315
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1316
+ readerAudiences: [
1317
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1318
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1319
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1320
+ ],
1321
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1322
+ applicabilityRequirements: A2A_INTEGRATION_APPLICABILITY_REQUIREMENTS,
1323
+ relatedUnitRefs: [
1324
+ 'technical-documentation:unit/agent-interoperability',
1325
+ 'technical-documentation:unit/oauth-provider',
1326
+ 'technical-documentation:unit/audit-and-siem',
1327
+ ],
1328
+ },
1329
+ 'technical-documentation:unit/first-request': {
1330
+ kind: TechnicalDocumentationUnitKind.QUICKSTART,
1331
+ readerAudiences: [
1332
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1333
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1334
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1335
+ ],
1336
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1337
+ // D14: engine-generic API guidance is applicable because the application
1338
+ // declares an API, not because a live process was observed serving one.
1339
+ // The former runtime-exposure requirement on APPLICATION_API (then named
1340
+ // `RUNTIME_EXPOSURE`, now `EXPOSED_API_SURFACE`) could only ever be satisfied
1341
+ // by a runtime receipt, which no longer exists. The webhook page retains
1342
+ // its own source-derived exposure gate because its contract is conditional.
1343
+ applicabilityRequirements: [],
1344
+ relatedUnitRefs: [
1345
+ 'technical-documentation:unit/integrations',
1346
+ 'technical-documentation:unit/api-keys',
1347
+ 'technical-documentation:unit/common-rest-api',
1348
+ ],
1349
+ },
1350
+ 'technical-documentation:unit/common-rest-api': {
1351
+ kind: TechnicalDocumentationUnitKind.CONCEPT,
1352
+ readerAudiences: [
1353
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1354
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1355
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1356
+ ],
1357
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1358
+ applicabilityRequirements: [],
1359
+ relatedUnitRefs: [
1360
+ 'technical-documentation:unit/send-api-request',
1361
+ 'technical-documentation:unit/work-with-api-collections',
1362
+ 'technical-documentation:unit/write-and-reconcile-api-changes',
1363
+ 'technical-documentation:unit/troubleshoot-api-request',
1364
+ ],
1365
+ apiReferenceTargets: [{
1366
+ label: 'API reference',
1367
+ target: {
1368
+ section: TechnicalDocumentationApiReferenceSection.API_REFERENCE,
1369
+ kind: TechnicalDocumentationApiReferenceTargetKind.ROOT,
1370
+ },
1371
+ }],
1372
+ },
1373
+ 'technical-documentation:unit/send-api-request': {
1374
+ kind: TechnicalDocumentationUnitKind.QUICKSTART,
1375
+ readerAudiences: [
1376
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1377
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1378
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1379
+ ],
1380
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1381
+ applicabilityRequirements: [],
1382
+ relatedUnitRefs: [
1383
+ 'technical-documentation:unit/api-keys',
1384
+ 'technical-documentation:unit/work-with-api-collections',
1385
+ 'technical-documentation:unit/write-and-reconcile-api-changes',
1386
+ ],
1387
+ apiReferenceTargets: [{
1388
+ label: 'API reference',
1389
+ target: {
1390
+ section: TechnicalDocumentationApiReferenceSection.API_REFERENCE,
1391
+ kind: TechnicalDocumentationApiReferenceTargetKind.ROOT,
1392
+ },
1393
+ }],
1394
+ },
1395
+ 'technical-documentation:unit/work-with-api-collections': {
1396
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1397
+ readerAudiences: [
1398
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1399
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1400
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1401
+ ],
1402
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1403
+ applicabilityRequirements: [],
1404
+ relatedUnitRefs: [
1405
+ 'technical-documentation:unit/send-api-request',
1406
+ 'technical-documentation:unit/write-and-reconcile-api-changes',
1407
+ 'technical-documentation:unit/troubleshoot-api-request',
1408
+ ],
1409
+ apiReferenceTargets: [{
1410
+ label: 'API reference',
1411
+ target: {
1412
+ section: TechnicalDocumentationApiReferenceSection.API_REFERENCE,
1413
+ kind: TechnicalDocumentationApiReferenceTargetKind.ROOT,
1414
+ },
1415
+ }],
1416
+ },
1417
+ 'technical-documentation:unit/write-and-reconcile-api-changes': {
1418
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1419
+ readerAudiences: [
1420
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1421
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1422
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1423
+ ],
1424
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1425
+ applicabilityRequirements: [],
1426
+ relatedUnitRefs: [
1427
+ 'technical-documentation:unit/send-api-request',
1428
+ 'technical-documentation:unit/troubleshoot-api-request',
1429
+ 'technical-documentation:unit/audit-and-siem',
1430
+ ],
1431
+ apiReferenceTargets: [{
1432
+ label: 'API reference',
1433
+ target: {
1434
+ section: TechnicalDocumentationApiReferenceSection.API_REFERENCE,
1435
+ kind: TechnicalDocumentationApiReferenceTargetKind.ROOT,
1436
+ },
1437
+ }],
1438
+ },
1439
+ 'technical-documentation:unit/troubleshoot-api-request': {
1440
+ kind: TechnicalDocumentationUnitKind.TROUBLESHOOTING,
1441
+ readerAudiences: [
1442
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1443
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1444
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1445
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1446
+ ],
1447
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1448
+ applicabilityRequirements: [],
1449
+ relatedUnitRefs: [
1450
+ 'technical-documentation:unit/authentication',
1451
+ 'technical-documentation:unit/api-keys-troubleshoot',
1452
+ 'technical-documentation:unit/write-and-reconcile-api-changes',
1453
+ ],
1454
+ apiReferenceTargets: [{
1455
+ label: 'API reference',
1456
+ target: {
1457
+ section: TechnicalDocumentationApiReferenceSection.API_REFERENCE,
1458
+ kind: TechnicalDocumentationApiReferenceTargetKind.ROOT,
1459
+ },
1460
+ }],
1461
+ },
1462
+ 'technical-documentation:unit/webhooks': {
1463
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1464
+ readerAudiences: [
1465
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1466
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1467
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1468
+ ],
1469
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1470
+ // D14 gap RESOLVED 2026-08-08 — and the resolution was to STOP ASKING THE
1471
+ // TENANT QUESTION, not to find a build-time way to answer it.
1472
+ //
1473
+ // The deleted runtime collector reported `featureReady` for
1474
+ // `CoreFeature.M2M_WEBHOOK_DELIVERY`, which is `scopeBoundary: true` over
1475
+ // [APPLICATION, ORGANIZATIONS] — every organization opts in independently, so
1476
+ // that boolean was TENANT STATE gating whether a documentation PAGE exists.
1477
+ // That is a category error: the signature algorithm, payload envelope and
1478
+ // retry policy are code, identical for every tenant. Whether a given
1479
+ // organization has delivery switched on is an entitlement, and entitlements
1480
+ // belong in the prose (see the per-organization note in the unit body), not
1481
+ // in an applicability gate.
1482
+ //
1483
+ // What the gate asks instead is the question documentation can actually
1484
+ // answer: does THIS application expose the outbound-webhook surface at all?
1485
+ // That is source-derived — the resources must be registered and admitted by
1486
+ // the application's declared `apiDocResources` opt-in — and it fails closed
1487
+ // for an application that documents no webhook surface.
1488
+ applicabilityRequirements: OUTBOUND_WEBHOOK_APPLICABILITY_REQUIREMENTS,
1489
+ relatedUnitRefs: [
1490
+ 'technical-documentation:unit/configure-and-test-webhook-endpoint',
1491
+ 'technical-documentation:unit/verify-webhook-delivery',
1492
+ 'technical-documentation:unit/operate-webhook-deliveries',
1493
+ 'technical-documentation:unit/troubleshoot-webhook-deliveries',
1494
+ ],
1495
+ },
1496
+ 'technical-documentation:unit/configure-and-test-webhook-endpoint': {
1497
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1498
+ readerAudiences: [
1499
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1500
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1501
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1502
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1503
+ ],
1504
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1505
+ applicabilityRequirements: OUTBOUND_WEBHOOK_APPLICABILITY_REQUIREMENTS,
1506
+ relatedUnitRefs: [
1507
+ 'technical-documentation:unit/verify-webhook-delivery',
1508
+ 'technical-documentation:unit/operate-webhook-deliveries',
1509
+ 'technical-documentation:unit/troubleshoot-webhook-deliveries',
1510
+ ],
1511
+ },
1512
+ 'technical-documentation:unit/verify-webhook-delivery': {
1513
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1514
+ readerAudiences: [
1515
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1516
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1517
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1518
+ ],
1519
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1520
+ applicabilityRequirements: OUTBOUND_WEBHOOK_APPLICABILITY_REQUIREMENTS,
1521
+ relatedUnitRefs: [
1522
+ 'technical-documentation:unit/configure-and-test-webhook-endpoint',
1523
+ 'technical-documentation:unit/operate-webhook-deliveries',
1524
+ 'technical-documentation:unit/audit-and-siem',
1525
+ ],
1526
+ },
1527
+ 'technical-documentation:unit/operate-webhook-deliveries': {
1528
+ kind: TechnicalDocumentationUnitKind.HOW_TO,
1529
+ readerAudiences: [
1530
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1531
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1532
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1533
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1534
+ ],
1535
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1536
+ applicabilityRequirements: OUTBOUND_WEBHOOK_APPLICABILITY_REQUIREMENTS,
1537
+ relatedUnitRefs: [
1538
+ 'technical-documentation:unit/verify-webhook-delivery',
1539
+ 'technical-documentation:unit/troubleshoot-webhook-deliveries',
1540
+ 'technical-documentation:unit/audit-and-siem',
1541
+ ],
1542
+ },
1543
+ 'technical-documentation:unit/troubleshoot-webhook-deliveries': {
1544
+ kind: TechnicalDocumentationUnitKind.TROUBLESHOOTING,
1545
+ readerAudiences: [
1546
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1547
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
1548
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
1549
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
1550
+ ],
1551
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1552
+ applicabilityRequirements: OUTBOUND_WEBHOOK_APPLICABILITY_REQUIREMENTS,
1553
+ relatedUnitRefs: [
1554
+ 'technical-documentation:unit/configure-and-test-webhook-endpoint',
1555
+ 'technical-documentation:unit/verify-webhook-delivery',
1556
+ 'technical-documentation:unit/operate-webhook-deliveries',
1557
+ ],
1558
+ },
1559
+ });
1560
+ function parseEngineMarkdown(markdown, unitRef) {
1561
+ const lines = markdown.trim().split('\n');
1562
+ const titleLine = lines.shift();
1563
+ if (titleLine === undefined || !titleLine.startsWith('# '))
1564
+ throw new Error(`engine content ${unitRef} must begin with exactly one H1 title`);
1565
+ const title = titleLine.slice(2).trim();
1566
+ const sections = [];
1567
+ let heading = 'Overview';
1568
+ let body = [];
1569
+ const flush = () => {
1570
+ const bodyMarkdown = body.join('\n').trim();
1571
+ if (bodyMarkdown.length > 0)
1572
+ sections.push({ heading, bodyMarkdown });
1573
+ body = [];
1574
+ };
1575
+ for (const line of lines) {
1576
+ if (line.startsWith('## ')) {
1577
+ flush();
1578
+ heading = line.slice(3).trim();
1579
+ }
1580
+ else {
1581
+ body.push(line);
1582
+ }
1583
+ }
1584
+ flush();
1585
+ if (sections.length === 0)
1586
+ throw new Error(`engine content ${unitRef} must contain a non-empty Markdown body`);
1587
+ const firstParagraph = sections[0].bodyMarkdown.split(/\n\s*\n/, 1)[0].replace(/\s+/g, ' ').trim();
1588
+ // The first prose paragraph is deliberately the card/search summary. It is
1589
+ // rendered above the guide body by both output families, so retaining that
1590
+ // paragraph in the implicit `Overview` section would visibly say it twice.
1591
+ // An explicit H2 is not rewritten: its author chose a real section and may
1592
+ // intentionally need the opening paragraph in its body.
1593
+ const [firstSection, ...remainingSections] = sections;
1594
+ if (firstSection !== undefined && firstSection.heading === 'Overview') {
1595
+ const overviewRemainder = firstSection.bodyMarkdown.replace(/^.*?(?:\n\s*\n|$)/s, '').trim();
1596
+ return {
1597
+ title,
1598
+ summary: firstParagraph,
1599
+ sections: overviewRemainder.length === 0
1600
+ ? remainingSections
1601
+ : [{ heading: firstSection.heading, bodyMarkdown: overviewRemainder }, ...remainingSections],
1602
+ };
1603
+ }
1604
+ return { title, summary: firstParagraph, sections };
1605
+ }
1606
+ /**
1607
+ * A related-link label names the reader's destination, not the relationship.
1608
+ *
1609
+ * The renderer supplies the `Related` heading. Repeating a generic phrase in
1610
+ * every list item makes several different navigation choices visually
1611
+ * indistinguishable, while resolving the target's authored title preserves
1612
+ * the exact customer-facing vocabulary in one place.
1613
+ */
1614
+ /**
1615
+ * Resolves related destinations before output links or provenance are built.
1616
+ *
1617
+ * A related link projects the target's authored title into the source unit.
1618
+ * The title's engine-content identity is therefore an input to both the
1619
+ * source unit's output bytes and its digest; it must travel with the link
1620
+ * instead of being silently treated as presentation-only metadata.
1621
+ */
1622
+ function resolveRelatedUnitLinkTargets(unitRef, relatedUnitRefs, targetByUnitRef) {
1623
+ return relatedUnitRefs.map((targetUnitRef) => {
1624
+ const target = targetByUnitRef.get(targetUnitRef);
1625
+ if (target === undefined)
1626
+ throw new Error(`engine content ${unitRef} links to an unknown target ${targetUnitRef}`);
1627
+ return target;
1628
+ });
1629
+ }
1630
+ function relatedLinks(unitRef, relatedTargets) {
1631
+ const sourceSlug = unitRef.slice(unitRef.lastIndexOf('/') + 1);
1632
+ return relatedTargets.map((target) => {
1633
+ const targetSlug = target.targetUnitRef.slice(target.targetUnitRef.lastIndexOf('/') + 1);
1634
+ return {
1635
+ linkRef: `technical-documentation:link/${sourceSlug}-to-${targetSlug}`,
1636
+ kind: TechnicalDocumentationLinkKind.UNIT,
1637
+ label: target.title,
1638
+ targetUnitRef: target.targetUnitRef,
1639
+ targetRef: null,
1640
+ externalUrl: null,
1641
+ apiReferenceTarget: null,
1642
+ };
1643
+ });
1644
+ }
1645
+ function apiReferenceLinks(unitRef, targets) {
1646
+ const sourceSlug = unitRef.slice(unitRef.lastIndexOf('/') + 1);
1647
+ return targets.map((target, index) => ({
1648
+ linkRef: `technical-documentation:link/${sourceSlug}-api-reference-${index + 1}`,
1649
+ kind: TechnicalDocumentationLinkKind.API_REFERENCE,
1650
+ label: target.label,
1651
+ targetUnitRef: null,
1652
+ targetRef: null,
1653
+ externalUrl: null,
1654
+ apiReferenceTarget: target.target,
1655
+ }));
1656
+ }
1657
+ /**
1658
+ * Merges source provenance with the exact title authorities imported through
1659
+ * related links. A source reference has one semantic identity in a rendered
1660
+ * unit: accepting the same ref with divergent digests would make its output
1661
+ * digest ambiguous, so the projector rejects it before the unit schema's
1662
+ * canonicalization hides the conflict.
1663
+ */
1664
+ function mergeProvenance(ownProvenance, relatedTargets) {
1665
+ /*
1666
+ * Compares the WHOLE row, not one field, matching `canonicalizeTechnicalDocumentationRows` — the
1667
+ * idiom this subsystem uses everywhere else for "two rows claim one key and disagree".
1668
+ *
1669
+ * Measured, because the narrower version this replaced could not fail: it compared only
1670
+ * `sourceVersion`, and the two producers feeding this function cannot disagree on that. A
1671
+ * related target's `titleProvenance` is always an `ENGINE_CONTENT`-prefixed ref carrying
1672
+ * `contentBundleVersion`, and own-provenance for that same prefix carries `contentBundleVersion`
1673
+ * too — the curated-fact and companion-projection branches, which carry other versions, use
1674
+ * disjoint ref prefixes and can never collide with a title source. Widening to the full row does
1675
+ * not make today's two producers trip it either; it makes the check meaningful the day a third
1676
+ * producer is added, which is when a silent disagreement would actually cost something.
1677
+ *
1678
+ * The digest form that preceded both was reachable for the wrong reason: it compared
1679
+ * `identity.semanticDigest`, which is the CITING UNIT's identity rather than the source's, so two
1680
+ * units legitimately citing one shared engine-content source disagreed and it threw on a correct
1681
+ * input.
1682
+ */
1683
+ const provenanceBySourceRef = new Map();
1684
+ for (const provenance of [...ownProvenance, ...relatedTargets.map((target) => target.titleProvenance)]) {
1685
+ const existing = provenanceBySourceRef.get(provenance.sourceRef);
1686
+ if (existing !== undefined && canonicalizeTechnicalDocumentationJson(existing) !== canonicalizeTechnicalDocumentationJson(provenance)) {
1687
+ throw new Error(`engine content provenance source ${provenance.sourceRef} is cited with conflicting rows`);
1688
+ }
1689
+ provenanceBySourceRef.set(provenance.sourceRef, provenance);
1690
+ }
1691
+ return [...provenanceBySourceRef.values()].sort((left, right) => left.sourceRef.localeCompare(right.sourceRef, 'en-US'));
1692
+ }
1693
+ function consumerFactPresentation(entry, selector) {
1694
+ if (entry.specificationFamilyRef !== EngineDocumentationSpecificationFamilyRef.CONSUMER_FACT) {
1695
+ throw new Error(`documentation source ${entry.sourceRef} is not a curated consumer fact`);
1696
+ }
1697
+ if (entry.semanticDto === null || typeof entry.semanticDto !== 'object' || Array.isArray(entry.semanticDto)) {
1698
+ throw new Error(`consumer fact ${entry.sourceRef} has no object semantic DTO`);
1699
+ }
1700
+ const presentation = entry.semanticDto[selector];
1701
+ if (typeof presentation !== 'string' || presentation.trim().length === 0) {
1702
+ throw new Error(`consumer fact ${entry.sourceRef} has no ${selector} presentation`);
1703
+ }
1704
+ return presentation;
1705
+ }
1706
+ /**
1707
+ * Resolves only declared, explicitly curated consumer facts into an authored
1708
+ * engine-content unit. Arbitrary catalog entries are not eligible: that is the
1709
+ * safety boundary preventing raw specification fields from entering prose.
1710
+ */
1711
+ function resolveConsumerFactMarkdown(markdown, declaredSourceRefs, catalog) {
1712
+ const declaredFactRefs = declaredSourceRefs.filter((sourceRef) => sourceRef.startsWith(APPLICATION_CONSUMER_DOCUMENTATION_CONSUMER_FACT_SOURCE_PREFIX));
1713
+ const catalogEntriesBySourceRef = new Map(catalog.entries.map((entry) => [entry.sourceRef, entry]));
1714
+ const resolvedFactRefs = new Set();
1715
+ const renderedMarkdown = markdown.replace(CONSUMER_FACT_TOKEN_PATTERN, (_token, sourceRef, selector) => {
1716
+ if (!declaredFactRefs.includes(sourceRef)) {
1717
+ throw new Error(`engine content references undeclared consumer fact ${sourceRef}`);
1718
+ }
1719
+ const entry = catalogEntriesBySourceRef.get(sourceRef);
1720
+ if (entry === undefined)
1721
+ throw new Error(`engine content references unavailable consumer fact ${sourceRef}`);
1722
+ resolvedFactRefs.add(sourceRef);
1723
+ return consumerFactPresentation(entry, selector);
1724
+ });
1725
+ if (renderedMarkdown.includes('{{CONSUMER_FACT:'))
1726
+ throw new Error('engine content contains an invalid consumer-fact token');
1727
+ if (resolvedFactRefs.size !== declaredFactRefs.length) {
1728
+ const missing = declaredFactRefs.filter((sourceRef) => !resolvedFactRefs.has(sourceRef));
1729
+ throw new Error(`engine content declares an unused consumer fact: ${missing.join(', ')}`);
1730
+ }
1731
+ return {
1732
+ markdown: renderedMarkdown,
1733
+ entriesBySourceRef: new Map([...resolvedFactRefs].map((sourceRef) => [sourceRef, catalogEntriesBySourceRef.get(sourceRef)])),
1734
+ };
1735
+ }
1736
+ function resolveApplicationOrganizationRolesMarkdown(markdown, declaredSourceRefs, fact) {
1737
+ const declaredRefs = declaredSourceRefs.filter((sourceRef) => sourceRef === APPLICATION_ORGANIZATION_ROLES_DOCUMENTATION_SOURCE_REF);
1738
+ const tokenCount = markdown.split(APPLICATION_ORGANIZATION_ROLES_TOKEN).length - 1;
1739
+ if (tokenCount === 0) {
1740
+ if (declaredRefs.length > 0)
1741
+ throw new Error(`engine content declares an unused companion projection: ${declaredRefs.join(', ')}`);
1742
+ return { markdown, fact: undefined };
1743
+ }
1744
+ if (tokenCount !== 1 || declaredRefs.length !== 1 || fact === undefined || declaredRefs[0] !== fact.sourceRef) {
1745
+ throw new Error('engine content organization-role projection must declare and resolve exactly one matching companion source');
1746
+ }
1747
+ if (fact.markdown.trim().length === 0)
1748
+ throw new Error('application organization-role projection has no Markdown presentation');
1749
+ return { markdown: markdown.replace(APPLICATION_ORGANIZATION_ROLES_TOKEN, fact.markdown), fact };
1750
+ }
1751
+ function resolveApplicationOrganizationUnitResourcesMarkdown(markdown, declaredSourceRefs, fact) {
1752
+ const declaredRefs = declaredSourceRefs.filter((sourceRef) => sourceRef === APPLICATION_ORGANIZATION_UNIT_RESOURCES_DOCUMENTATION_SOURCE_REF);
1753
+ const tokenCount = markdown.split(APPLICATION_ORGANIZATION_UNIT_RESOURCES_TOKEN).length - 1;
1754
+ if (tokenCount === 0) {
1755
+ if (declaredRefs.length > 0)
1756
+ throw new Error(`engine content declares an unused organization-unit resource projection: ${declaredRefs.join(', ')}`);
1757
+ return { markdown, fact: undefined };
1758
+ }
1759
+ if (tokenCount !== 1 || declaredRefs.length !== 1 || fact === undefined || declaredRefs[0] !== fact.sourceRef) {
1760
+ throw new Error('engine content organization-unit resource projection must declare and resolve exactly one matching companion source');
1761
+ }
1762
+ if (fact.markdown.trim().length === 0)
1763
+ throw new Error('application organization-unit resource projection has no Markdown presentation');
1764
+ return { markdown: markdown.replace(APPLICATION_ORGANIZATION_UNIT_RESOURCES_TOKEN, fact.markdown), fact };
1765
+ }
1766
+ /**
1767
+ * Compiles verified engine content and the two explicit application facts
1768
+ * (organization roles and unit-aware resources) into private documentation.
1769
+ */
1770
+ export function projectEngineApplicationConsumerContentBundle(bundle, engineSpecificationCatalog, unitDefinitions = ENGINE_CONTENT_UNIT_DEFINITIONS, applicationOrganizationRolesFact, applicationOrganizationUnitResourcesFact) {
1771
+ const manifestRefs = bundle.manifest.units.map((unit) => unit.unitRef).sort();
1772
+ const definitionRefs = Object.keys(unitDefinitions).sort();
1773
+ if (manifestRefs.join('\0') !== definitionRefs.join('\0')) {
1774
+ throw new Error('engine content unit definitions do not exactly cover the verified application-consumer content bundle');
1775
+ }
1776
+ const parsedContentByUnitRef = new Map(bundle.manifest.units.map((identity) => {
1777
+ if (identity.managedPaths.length !== 1)
1778
+ throw new Error(`engine content unit ${identity.unitRef} must resolve to exactly one Markdown source`);
1779
+ const authoredMarkdown = new TextDecoder('utf-8', { fatal: true }).decode(bundle.readManagedBytes(identity.managedPaths[0]));
1780
+ const resolvedConsumerFacts = resolveConsumerFactMarkdown(authoredMarkdown, identity.sourceRefs, engineSpecificationCatalog);
1781
+ const resolvedApplicationOrganizationRoles = resolveApplicationOrganizationRolesMarkdown(resolvedConsumerFacts.markdown, identity.sourceRefs, applicationOrganizationRolesFact);
1782
+ const resolvedApplicationOrganizationUnitResources = resolveApplicationOrganizationUnitResourcesMarkdown(resolvedApplicationOrganizationRoles.markdown, identity.sourceRefs, applicationOrganizationUnitResourcesFact);
1783
+ return [identity.unitRef, {
1784
+ parsed: parseEngineMarkdown(resolvedApplicationOrganizationUnitResources.markdown, identity.unitRef),
1785
+ resolvedConsumerFacts,
1786
+ resolvedApplicationOrganizationRoles,
1787
+ resolvedApplicationOrganizationUnitResources,
1788
+ }];
1789
+ }));
1790
+ const relatedTargetByUnitRef = new Map(bundle.manifest.units.map((identity) => {
1791
+ const content = parsedContentByUnitRef.get(identity.unitRef);
1792
+ if (content === undefined)
1793
+ throw new Error(`engine content ${identity.unitRef} has no parsed content`);
1794
+ const titleSourceRef = identity.sourceRefs.find((sourceRef) => sourceRef.startsWith(APPLICATION_CONSUMER_DOCUMENTATION_ENGINE_CONTENT_SOURCE_PREFIX));
1795
+ if (titleSourceRef === undefined)
1796
+ throw new Error(`engine content ${identity.unitRef} has no authored title source`);
1797
+ return [identity.unitRef, {
1798
+ targetUnitRef: identity.unitRef,
1799
+ title: content.parsed.title,
1800
+ titleProvenance: {
1801
+ sourceRef: titleSourceRef,
1802
+ ownership: TechnicalDocumentationSourceOwnership.ENGINE_GENERIC_CONTENT,
1803
+ classification: TechnicalDocumentationSourceClassification.PUBLIC,
1804
+ sourceVersion: bundle.identity.contentBundleVersion,
1805
+ sourceAnchorRef: null,
1806
+ },
1807
+ }];
1808
+ }));
1809
+ return bundle.manifest.units.map((identity) => {
1810
+ const definition = unitDefinitions[identity.unitRef];
1811
+ if (definition === undefined)
1812
+ throw new Error(`unsupported engine application-consumer content unit ${identity.unitRef}`);
1813
+ const content = parsedContentByUnitRef.get(identity.unitRef);
1814
+ if (content === undefined)
1815
+ throw new Error(`engine content ${identity.unitRef} has no parsed content`);
1816
+ const { parsed, resolvedConsumerFacts, resolvedApplicationOrganizationRoles, resolvedApplicationOrganizationUnitResources } = content;
1817
+ const unitSlug = identity.unitRef.slice(identity.unitRef.lastIndexOf('/') + 1);
1818
+ const relatedTargets = resolveRelatedUnitLinkTargets(identity.unitRef, definition.relatedUnitRefs, relatedTargetByUnitRef);
1819
+ const ownProvenance = identity.sourceRefs.map((sourceRef) => {
1820
+ const fact = resolvedConsumerFacts.entriesBySourceRef.get(sourceRef);
1821
+ const applicationProjection = resolvedApplicationOrganizationRoles.fact?.sourceRef === sourceRef
1822
+ ? resolvedApplicationOrganizationRoles.fact
1823
+ : resolvedApplicationOrganizationUnitResources.fact?.sourceRef === sourceRef
1824
+ ? resolvedApplicationOrganizationUnitResources.fact
1825
+ : undefined;
1826
+ return {
1827
+ sourceRef,
1828
+ ownership: applicationProjection === undefined
1829
+ ? TechnicalDocumentationSourceOwnership.ENGINE_GENERIC_CONTENT
1830
+ : TechnicalDocumentationSourceOwnership.APPLICATION_COMPANION_PROJECTION,
1831
+ classification: TechnicalDocumentationSourceClassification.PUBLIC,
1832
+ /*
1833
+ * A companion projection carries its own version; a curated engine fact takes the
1834
+ * catalog projector's; authored engine content takes the content bundle's. All three
1835
+ * were sha256 values until 2026-08-27 and none of them was ever compared to anything
1836
+ * except another copy of itself.
1837
+ */
1838
+ sourceVersion: applicationProjection?.sourceVersion
1839
+ ?? (fact === undefined ? bundle.identity.contentBundleVersion : engineSpecificationCatalog.identity.projectorVersion),
1840
+ sourceAnchorRef: null,
1841
+ };
1842
+ });
1843
+ return createTechnicalDocumentationUnitV1({
1844
+ schemaVersion: 1,
1845
+ unitRef: identity.unitRef,
1846
+ unitVersion: 1,
1847
+ kind: definition.kind,
1848
+ readerAudiences: [...definition.readerAudiences],
1849
+ title: parsed.title,
1850
+ summary: parsed.summary,
1851
+ sections: parsed.sections.map((section, index) => ({
1852
+ sectionRef: `technical-documentation:section/${unitSlug}-${index + 1}`,
1853
+ heading: section.heading,
1854
+ bodyMarkdown: section.bodyMarkdown,
1855
+ })),
1856
+ links: [...relatedLinks(identity.unitRef, relatedTargets), ...apiReferenceLinks(identity.unitRef, definition.apiReferenceTargets ?? [])],
1857
+ provenance: mergeProvenance(ownProvenance, relatedTargets),
1858
+ applicabilityRequirements: [...definition.applicabilityRequirements],
1859
+ accessClass: definition.accessClass,
1860
+ editorialStatus: TechnicalDocumentationEditorialStatus.APPROVED,
1861
+ assetRequests: [],
1862
+ });
1863
+ }).sort((left, right) => left.unitRef.localeCompare(right.unitRef, 'en-US'));
1864
+ }
1865
+ //# sourceMappingURL=technical-documentation-engine-content-bundle.js.map