@wildo-ai/saas-technical-doc 1.1.2 → 1.1.4

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 (130) hide show
  1. package/dist/esm/build/csp-emit.d.ts.map +1 -1
  2. package/dist/esm/build/load-materialized-frontend-providers.d.ts.map +1 -1
  3. package/dist/esm/companion/application-documentation/application-administration-documentation.d.ts.map +1 -1
  4. package/dist/esm/companion/application-documentation/application-administration-documentation.js.map +1 -1
  5. package/dist/esm/companion/application-documentation/application-authentication-documentation.d.ts.map +1 -1
  6. package/dist/esm/companion/application-documentation/application-connection-documentation.d.ts +25 -1
  7. package/dist/esm/companion/application-documentation/application-connection-documentation.d.ts.map +1 -1
  8. package/dist/esm/companion/application-documentation/application-connection-documentation.js +28 -1
  9. package/dist/esm/companion/application-documentation/application-connection-documentation.js.map +1 -1
  10. package/dist/esm/companion/application-documentation/application-domain-documentation.d.ts +133 -0
  11. package/dist/esm/companion/application-documentation/application-domain-documentation.d.ts.map +1 -0
  12. package/dist/esm/companion/application-documentation/application-domain-documentation.js +243 -0
  13. package/dist/esm/companion/application-documentation/application-domain-documentation.js.map +1 -0
  14. package/dist/esm/companion/application-documentation/application-integration-documentation.d.ts.map +1 -1
  15. package/dist/esm/companion/application-documentation/application-integration-documentation.js +23 -0
  16. package/dist/esm/companion/application-documentation/application-integration-documentation.js.map +1 -1
  17. package/dist/esm/companion/application-documentation/application-organization-role-documentation.d.ts +30 -0
  18. package/dist/esm/companion/application-documentation/application-organization-role-documentation.d.ts.map +1 -1
  19. package/dist/esm/companion/application-documentation/application-organization-role-documentation.js +38 -0
  20. package/dist/esm/companion/application-documentation/application-organization-role-documentation.js.map +1 -1
  21. package/dist/esm/companion/application-documentation/application-organization-unit-resource-documentation.d.ts.map +1 -1
  22. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.d.ts +61 -1
  23. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.d.ts.map +1 -1
  24. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.js +255 -218
  25. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.js.map +1 -1
  26. package/dist/esm/companion/application-documentation/technical-documentation-operational-evidence.d.ts.map +1 -1
  27. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.d.ts +2 -0
  28. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.d.ts.map +1 -1
  29. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.js +1 -0
  30. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.js.map +1 -1
  31. package/dist/esm/companion/application-documentation/technical-documentation-publication-policy.d.ts.map +1 -1
  32. package/dist/esm/companion/application-documentation/technical-documentation-publication-policy.js +1 -1
  33. package/dist/esm/companion/application-documentation/technical-documentation-publication-policy.js.map +1 -1
  34. package/dist/esm/companion/content/application-consumer-documentation-content-loader.d.ts.map +1 -1
  35. package/dist/esm/companion/index.d.ts +2 -1
  36. package/dist/esm/companion/index.d.ts.map +1 -1
  37. package/dist/esm/companion/index.js +2 -1
  38. package/dist/esm/companion/index.js.map +1 -1
  39. package/dist/esm/companion/manual-controller-route-projection.d.ts +112 -0
  40. package/dist/esm/companion/manual-controller-route-projection.d.ts.map +1 -0
  41. package/dist/esm/companion/manual-controller-route-projection.js +249 -0
  42. package/dist/esm/companion/manual-controller-route-projection.js.map +1 -0
  43. package/dist/esm/companion/openapi-generator.d.ts +16 -0
  44. package/dist/esm/companion/openapi-generator.d.ts.map +1 -1
  45. package/dist/esm/companion/openapi-generator.js +493 -26
  46. package/dist/esm/companion/openapi-generator.js.map +1 -1
  47. package/dist/esm/companion/operation-projection.schemas.d.ts +44 -0
  48. package/dist/esm/companion/operation-projection.schemas.d.ts.map +1 -1
  49. package/dist/esm/companion/operation-projection.schemas.js +37 -0
  50. package/dist/esm/companion/operation-projection.schemas.js.map +1 -1
  51. package/dist/esm/companion/publish-result.types.d.ts +37 -4
  52. package/dist/esm/companion/publish-result.types.d.ts.map +1 -1
  53. package/dist/esm/companion/publish-result.types.js.map +1 -1
  54. package/dist/esm/companion/rendering/technical-documentation-authorized-bundle-reader.d.ts.map +1 -1
  55. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.d.ts +7 -1
  56. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.d.ts.map +1 -1
  57. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.js +34 -18
  58. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.js.map +1 -1
  59. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.d.ts.map +1 -1
  60. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.js +8 -1
  61. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.js.map +1 -1
  62. package/dist/esm/companion/rendering/technical-documentation-openapi-renderer.d.ts.map +1 -1
  63. package/dist/esm/companion/rendering/technical-documentation-render-model.d.ts.map +1 -1
  64. package/dist/esm/companion/rendering/technical-documentation-render-model.js +30 -13
  65. package/dist/esm/companion/rendering/technical-documentation-render-model.js.map +1 -1
  66. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.d.ts +10 -0
  67. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.d.ts.map +1 -1
  68. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.js +10 -15
  69. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.js.map +1 -1
  70. package/dist/esm/companion/technical-documentation-asset-path.d.ts.map +1 -1
  71. package/dist/esm/companion/technical-documentation-capture-execution-port.d.ts +27 -1
  72. package/dist/esm/companion/technical-documentation-capture-execution-port.d.ts.map +1 -1
  73. package/dist/esm/companion/technical-documentation-capture-execution-port.js.map +1 -1
  74. package/dist/esm/companion/technical-documentation-diagram-definitions.d.ts +33 -0
  75. package/dist/esm/companion/technical-documentation-diagram-definitions.d.ts.map +1 -0
  76. package/dist/esm/companion/technical-documentation-diagram-definitions.js +54 -0
  77. package/dist/esm/companion/technical-documentation-diagram-definitions.js.map +1 -0
  78. package/dist/esm/companion/technical-documentation-diagram-materializer.d.ts +10 -18
  79. package/dist/esm/companion/technical-documentation-diagram-materializer.d.ts.map +1 -1
  80. package/dist/esm/companion/technical-documentation-diagram-materializer.js +9 -39
  81. package/dist/esm/companion/technical-documentation-diagram-materializer.js.map +1 -1
  82. package/dist/esm/companion/technical-documentation-placeholder-materializer.d.ts.map +1 -1
  83. package/dist/esm/companion/zod-to-openapi.d.ts.map +1 -1
  84. package/dist/esm/companion-exports.d.ts.map +1 -1
  85. package/dist/esm/config/define-tech-doc-config.d.ts.map +1 -1
  86. package/dist/esm/config/index.d.ts.map +1 -1
  87. package/dist/esm/config/wildo-tech-doc-config.schemas.d.ts +8 -4
  88. package/dist/esm/config/wildo-tech-doc-config.schemas.d.ts.map +1 -1
  89. package/dist/esm/config/wildo-tech-doc-config.schemas.js +8 -4
  90. package/dist/esm/config/wildo-tech-doc-config.schemas.js.map +1 -1
  91. package/dist/esm/content/application-consumer-documentation-content-manifest.schemas.d.ts.map +1 -1
  92. package/dist/esm/content/application-consumer-documentation-content.techdoc.d.ts +42 -64
  93. package/dist/esm/content/application-consumer-documentation-content.techdoc.d.ts.map +1 -1
  94. package/dist/esm/content/application-consumer-documentation-content.techdoc.js +164 -925
  95. package/dist/esm/content/application-consumer-documentation-content.techdoc.js.map +1 -1
  96. package/dist/esm/content.exports.d.ts.map +1 -1
  97. package/dist/esm/index.d.ts.map +1 -1
  98. package/dist/esm/openapi/api-reference-link-index.d.ts.map +1 -1
  99. package/dist/esm/openapi/index.d.ts.map +1 -1
  100. package/dist/esm/openapi/openapi-generation-output.schemas.d.ts.map +1 -1
  101. package/dist/esm/openapi-reference-model.exports.d.ts.map +1 -1
  102. package/dist/esm/runtime/AuthExchangePage.d.ts.map +1 -1
  103. package/dist/esm/runtime/DocsAuthContext.d.ts +16 -1
  104. package/dist/esm/runtime/DocsAuthContext.d.ts.map +1 -1
  105. package/dist/esm/runtime/DocsAuthContext.js +18 -2
  106. package/dist/esm/runtime/DocsAuthContext.js.map +1 -1
  107. package/dist/esm/runtime/decode-jwt-claims.d.ts.map +1 -1
  108. package/dist/esm/runtime/docs-auth-client.d.ts.map +1 -1
  109. package/dist/esm/runtime/docs-auth-session.schemas.d.ts.map +1 -1
  110. package/dist/esm/runtime/frontend-provider-registry.techdoc.d.ts +35 -13
  111. package/dist/esm/runtime/frontend-provider-registry.techdoc.d.ts.map +1 -1
  112. package/dist/esm/runtime/frontend-provider-registry.techdoc.js +28 -19
  113. package/dist/esm/runtime/frontend-provider-registry.techdoc.js.map +1 -1
  114. package/dist/esm/runtime/index.d.ts +1 -0
  115. package/dist/esm/runtime/index.d.ts.map +1 -1
  116. package/dist/esm/runtime/index.js +1 -0
  117. package/dist/esm/runtime/index.js.map +1 -1
  118. package/dist/esm/runtime/openapi-reference-conservation.d.ts.map +1 -1
  119. package/dist/esm/runtime/use-docs-auth-session.d.ts.map +1 -1
  120. package/dist/esm/runtime/use-docs-frontend-provider-registry.d.ts.map +1 -1
  121. package/dist/esm/runtime/use-docs-provider-sdks.d.ts +21 -0
  122. package/dist/esm/runtime/use-docs-provider-sdks.d.ts.map +1 -0
  123. package/dist/esm/runtime/use-docs-provider-sdks.js +49 -0
  124. package/dist/esm/runtime/use-docs-provider-sdks.js.map +1 -0
  125. package/dist/tsconfig.build.tsbuildinfo +1 -1
  126. package/package.json +6 -5
  127. package/dist/esm/companion/rendering/technical-documentation-markdown-renderer.d.ts +0 -9
  128. package/dist/esm/companion/rendering/technical-documentation-markdown-renderer.d.ts.map +0 -1
  129. package/dist/esm/companion/rendering/technical-documentation-markdown-renderer.js +0 -111
  130. package/dist/esm/companion/rendering/technical-documentation-markdown-renderer.js.map +0 -1
@@ -2,10 +2,14 @@ import { IMPLICIT_LEAD_SECTION_HEADING } from '../rendering/technical-documentat
2
2
  import { APPLICATION_CONNECTION_DOCUMENTATION_SOURCE_REF, } from './application-connection-documentation.js';
3
3
  import { APPLICATION_AUTHENTICATION_DOCUMENTATION_SOURCE_REF, } from './application-authentication-documentation.js';
4
4
  import { APPLICATION_INTEGRATION_DOCUMENTATION_SOURCE_REF, } from './application-integration-documentation.js';
5
+ import { APPLICATION_DOMAIN_DOCUMENTATION_SOURCE_REF, } from './application-domain-documentation.js';
5
6
  import { APPLICATION_ADMINISTRATION_DOCUMENTATION_SOURCE_REF, } from './application-administration-documentation.js';
6
7
  import { canonicalizeTechnicalDocumentationJson, TechnicalDocumentationAccessClass, TechnicalDocumentationApiReferenceSection, TechnicalDocumentationApiReferenceTargetKind, TechnicalDocumentationApplicabilityEvidenceAxis, TechnicalDocumentationApplicabilityEvidenceStatus, TechnicalDocumentationEditorialStatus, TechnicalDocumentationEvidenceSubjectRef, TechnicalDocumentationLinkKind, TechnicalDocumentationReaderAudience, TechnicalDocumentationSourceClassification, TechnicalDocumentationSourceOwnership, TechnicalDocumentationUnitKind, createTechnicalDocumentationUnitV1, } from '@wildo-ai/saas-specifications/technical-documentation';
7
8
  import { EngineDocumentationSpecificationFamilyRef, } from '@wildo-ai/saas-specifications/companion';
8
9
  import { APPLICATION_CONSUMER_DOCUMENTATION_CONSUMER_FACT_SOURCE_PREFIX, APPLICATION_CONSUMER_DOCUMENTATION_ENGINE_CONTENT_SOURCE_PREFIX, } from '../../content/application-consumer-documentation-content-manifest.schemas.js';
10
+ // From the DECLARATIONS module, never the materializer: the materializer imports the render model,
11
+ // which imports this file, and naming a diagram here at module load closes that cycle (#474).
12
+ import { createTechnicalDocumentationApplicationRequestDiagramAssetRequest } from '../technical-documentation-diagram-definitions.js';
9
13
  import { APPLICATION_ORGANIZATION_ROLES_DOCUMENTATION_SOURCE_REF } from './application-organization-role-documentation.js';
10
14
  import { APPLICATION_ORGANIZATION_UNIT_RESOURCES_DOCUMENTATION_SOURCE_REF, } from './application-organization-unit-resource-documentation.js';
11
15
  const PROVEN = [TechnicalDocumentationApplicabilityEvidenceStatus.PROVEN];
@@ -36,12 +40,6 @@ const ORGANIZATION_SIEM_RECOVERY_APPLICABILITY_REQUIREMENTS = [{
36
40
  subjectRef: TechnicalDocumentationEvidenceSubjectRef.ORGANIZATION_SIEM_DELIVERY_RECOVERY,
37
41
  acceptableStatuses: [...PROVEN],
38
42
  }];
39
- /** Billing is one operational journey; every page requires the admitted account and subscription surfaces. */
40
- const ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS = [{
41
- axis: TechnicalDocumentationApplicabilityEvidenceAxis.EXPOSED_API_SURFACE,
42
- subjectRef: TechnicalDocumentationEvidenceSubjectRef.ORGANIZATION_BILLING_ADMINISTRATION,
43
- acceptableStatuses: [...PROVEN],
44
- }];
45
43
  const MCP_INTEGRATION_APPLICABILITY_REQUIREMENTS = [{
46
44
  axis: TechnicalDocumentationApplicabilityEvidenceAxis.CONFIGURED_ACTIVATION,
47
45
  subjectRef: TechnicalDocumentationEvidenceSubjectRef.APPLICATION_MCP_TOOL_SURFACE,
@@ -69,6 +67,7 @@ const APPLICATION_AUTHENTICATION_TOKEN_PATTERN = /\{\{APPLICATION_AUTHENTICATION
69
67
  const APPLICATION_ADMINISTRATION_TOKEN_PATTERN = /\{\{APPLICATION_ADMINISTRATION:([A-Za-z0-9]+)\}\}/g;
70
68
  /** Same shape again for the tools and events this application publishes. */
71
69
  const APPLICATION_INTEGRATION_TOKEN_PATTERN = /\{\{APPLICATION_INTEGRATION:([A-Za-z0-9]+)\}\}/g;
70
+ const APPLICATION_DOMAIN_TOKEN_PATTERN = /\{\{APPLICATION_DOMAIN:([A-Za-z0-9]+)\}\}/g;
72
71
  /**
73
72
  * Build one semantic guide-to-reference link without embedding a Docusaurus
74
73
  * route. The verified OpenAPI link index resolves the resource only when the
@@ -112,7 +111,6 @@ const scimProvisioningConfigApiReferenceTarget = () => resourceApiReferenceTarge
112
111
  const auditLogsApiReferenceTarget = () => resourceApiReferenceTarget('Audit records API reference', 'auditLogs');
113
112
  const organizationSiemExportConfigApiReferenceTarget = () => resourceApiReferenceTarget('Organization SIEM export configuration API reference', 'organizationSiemExportConfig');
114
113
  const organizationSiemDeliveryDlqApiReferenceTarget = () => resourceApiReferenceTarget('Organization SIEM delivery recovery API reference', 'organizationSiemDeliveryDlq');
115
- const organizationBillingAccountApiReferenceTarget = () => resourceApiReferenceTarget('Organization billing account API reference', 'organizationBillingAccounts');
116
114
  const organizationSubscriptionsApiReferenceTarget = () => resourceApiReferenceTarget('Organization subscriptions API reference', 'organizationSubscriptions');
117
115
  const organizationInvoiceRefsApiReferenceTarget = () => resourceApiReferenceTarget('Organization invoice summaries API reference', 'organizationInvoiceRefs');
118
116
  const organizationUsageRecordsApiReferenceTarget = () => resourceApiReferenceTarget('Organization usage records API reference', 'organizationUsageRecords');
@@ -124,6 +122,74 @@ const organizationUsageRecordsApiReferenceTarget = () => resourceApiReferenceTar
124
122
  * and title; this map owns type, audience, publication posture and navigation
125
123
  * relationships, allowing the projector to reject a mismatched content set.
126
124
  */
125
+ /**
126
+ * The unit-ref namespace generated resource pages live in, and the only place its shape is written.
127
+ *
128
+ * `technical-documentation:unit/manages/<resource>` — an ENGINE ref with a reserved segment, not an
129
+ * application-owned one. The distinction is load-bearing: `pathForUnit` still refuses a unit an
130
+ * application named, and these are engine units whose subject happens to come from the application.
131
+ */
132
+ export function applicationDomainResourcePageUnitRef(resourceIdentifier) {
133
+ return `technical-documentation:unit/manages/${resourceIdentifier}`;
134
+ }
135
+ /** The unit-ref prefix a renderer matches to recognise a generated resource page. */
136
+ export const APPLICATION_DOMAIN_RESOURCE_PAGE_UNIT_REF_PREFIX = 'technical-documentation:unit/manages/';
137
+ /**
138
+ * One definition shared by every generated resource page.
139
+ *
140
+ * A per-resource entry in `ENGINE_CONTENT_UNIT_DEFINITIONS` is impossible by construction — the
141
+ * resources are not known when this module is written — and it would be the wrong shape anyway:
142
+ * these pages differ only in subject, so a per-resource definition would be N copies of one answer
143
+ * with N chances to drift.
144
+ */
145
+ const GENERATED_RESOURCE_UNIT_DEFINITION = Object.freeze({
146
+ kind: TechnicalDocumentationUnitKind.REFERENCE,
147
+ readerAudiences: [
148
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
149
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
150
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
151
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
152
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
153
+ ],
154
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
155
+ /*
156
+ * APPROVED, explicitly. A generated per-resource page is emitted only for a resource the
157
+ * application actually publishes, so there is no draft state for it to be in — but the value is
158
+ * declared rather than defaulted because the authored tier can now say otherwise, and a reader
159
+ * comparing the two tiers should see the answer rather than infer it from an absence.
160
+ */
161
+ editorialStatus: TechnicalDocumentationEditorialStatus.APPROVED,
162
+ /*
163
+ * No assets. A generated per-resource page describes ONE application resource, and there is no
164
+ * engine-authored picture of a resource the engine has never seen — a diagram here would depict
165
+ * the framework's idea of a resource rather than this one. Declared empty rather than omitted so
166
+ * the absence reads as a decision beside the authored tier, which does request one.
167
+ */
168
+ assetRequests: [],
169
+ });
170
+ /**
171
+ * Unit kinds this catalog deliberately produces NO unit for, each with the reason.
172
+ *
173
+ * The vocabulary has eight members and, until 2026-09-09, two of them had no producer at all — a
174
+ * silent gap, because a kind nobody authors looks exactly like a kind nobody needed (#474). RUNBOOK
175
+ * now has one. CHANGE does not, and the reason is structural rather than editorial:
176
+ *
177
+ * A CHANGE unit is a record of what changed in ONE application, so only that application could
178
+ * author it — and an application-authored unit cannot be routed. `pathForUnit` admits engine-
179
+ * namespaced slugs and the reserved `unit/manages/` namespace, and refuses everything else with
180
+ * "has no consumer navigation category". Application material reaches the site only as an ENGINE
181
+ * unit carrying application-projected facts, never as an application-authored page. So the engine
182
+ * cannot write a changelog it has no knowledge of, and the party that could has no door.
183
+ *
184
+ * The member is therefore kept rather than retired: what is missing is a route for
185
+ * application-authored units, not the concept. When that route exists, this entry is removed in the
186
+ * same change — and `technical-documentation-engine-content-bundle.test.ts` fails until it is,
187
+ * because the partition below is asserted total over the enum.
188
+ */
189
+ export const ENGINE_CONTENT_UNIT_KINDS_WITHOUT_PRODUCER = {
190
+ [TechnicalDocumentationUnitKind.CHANGE]: 'A change record belongs to one application, and an application-authored unit has no route — `pathForUnit` '
191
+ + 'admits only engine-namespaced slugs and the reserved `unit/manages/` namespace. Blocked on routing, not on authoring.',
192
+ };
127
193
  export const ENGINE_CONTENT_UNIT_DEFINITIONS = Object.freeze({
128
194
  'technical-documentation:unit/application-orientation': {
129
195
  kind: TechnicalDocumentationUnitKind.ORIENTATION,
@@ -142,6 +208,34 @@ export const ENGINE_CONTENT_UNIT_DEFINITIONS = Object.freeze({
142
208
  'technical-documentation:unit/first-request',
143
209
  ],
144
210
  },
211
+ 'technical-documentation:unit/what-this-application-manages': {
212
+ kind: TechnicalDocumentationUnitKind.ORIENTATION,
213
+ /*
214
+ * Every audience, because this is the one page that answers "what IS this?" — the question
215
+ * that comes before the reason any of them opened the documentation. An operator, an
216
+ * integrator and an organization administrator all need it, and none of them should have to
217
+ * infer the product from the pages about administering it.
218
+ */
219
+ readerAudiences: [
220
+ TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
221
+ TechnicalDocumentationReaderAudience.CONSUMING_INTERNAL_SERVICE,
222
+ TechnicalDocumentationReaderAudience.EXTERNAL_INTEGRATION_DEVELOPER,
223
+ TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
224
+ TechnicalDocumentationReaderAudience.ORGANIZATION_INTEGRATION_DEVELOPER,
225
+ ],
226
+ accessClass: TechnicalDocumentationAccessClass.PUBLIC,
227
+ /*
228
+ * No applicability requirement. An application with no resources of its own still publishes
229
+ * this page, and the projection says so in a sentence — suppressing it would leave a reader
230
+ * unable to tell "manages nothing through its API" from "nobody wrote this page".
231
+ */
232
+ applicabilityRequirements: [],
233
+ relatedUnitRefs: [
234
+ 'technical-documentation:unit/first-request',
235
+ 'technical-documentation:unit/webhooks',
236
+ 'technical-documentation:unit/organization-roles',
237
+ ],
238
+ },
145
239
  'technical-documentation:unit/authentication': {
146
240
  kind: TechnicalDocumentationUnitKind.ORIENTATION,
147
241
  readerAudiences: [
@@ -1002,8 +1096,18 @@ export const ENGINE_CONTENT_UNIT_DEFINITIONS = Object.freeze({
1002
1096
  ],
1003
1097
  apiReferenceTargets: [organizationSiemDeliveryDlqApiReferenceTarget()],
1004
1098
  },
1005
- 'technical-documentation:unit/protect-and-retain-audit-evidence': {
1006
- kind: TechnicalDocumentationUnitKind.CONCEPT,
1099
+ /*
1100
+ * The catalog's first RUNBOOK, and the kind had no producer until 2026-09-09 (#474).
1101
+ *
1102
+ * It is not a re-labelled HOW_TO. Every other page in this section explains ONE capability;
1103
+ * `operate-webhook-deliveries` was checked first and is genuinely explanatory — statuses, a retry
1104
+ * ladder, monitoring advice — which is why re-kinding it to fill the vocabulary was rejected. A
1105
+ * RUNBOOK is an ORDER under time pressure, and the ordering is the content: contain before you
1106
+ * assess, assess before you recover, and loop back to contain when the assessment finds a change.
1107
+ * No existing page says what to do FIRST.
1108
+ */
1109
+ 'technical-documentation:unit/respond-to-leaked-credential': {
1110
+ kind: TechnicalDocumentationUnitKind.RUNBOOK,
1007
1111
  readerAudiences: [
1008
1112
  TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1009
1113
  TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
@@ -1011,176 +1115,29 @@ export const ENGINE_CONTENT_UNIT_DEFINITIONS = Object.freeze({
1011
1115
  accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1012
1116
  applicabilityRequirements: [],
1013
1117
  relatedUnitRefs: [
1014
- 'technical-documentation:unit/audit-and-siem',
1118
+ 'technical-documentation:unit/api-keys-lifecycle',
1119
+ 'technical-documentation:unit/oauth-operate-and-revoke',
1120
+ 'technical-documentation:unit/suspend-or-remove-user',
1121
+ 'technical-documentation:unit/investigate-audit-event',
1122
+ 'technical-documentation:unit/review-privileged-and-access-changes',
1015
1123
  'technical-documentation:unit/export-audit-records',
1016
- 'technical-documentation:unit/operate-and-troubleshoot-siem-delivery',
1017
- ],
1018
- apiReferenceTargets: [auditLogsApiReferenceTarget()],
1019
- },
1020
- 'technical-documentation:unit/billing': {
1021
- kind: TechnicalDocumentationUnitKind.ORIENTATION,
1022
- readerAudiences: [
1023
- TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1024
- TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
1025
- ],
1026
- accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1027
- applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1028
- relatedUnitRefs: [
1029
- 'technical-documentation:unit/understand-billing-plans-and-access',
1030
- 'technical-documentation:unit/start-billing-subscription',
1031
- 'technical-documentation:unit/change-or-end-billing-subscription',
1032
- 'technical-documentation:unit/billing-records-and-usage',
1033
- 'technical-documentation:unit/reconcile-billing-and-access',
1034
- 'technical-documentation:unit/troubleshoot-billing-change',
1035
- 'technical-documentation:unit/audit-and-siem',
1036
- ],
1037
- apiReferenceTargets: [
1038
- organizationBillingAccountApiReferenceTarget(),
1039
- organizationSubscriptionsApiReferenceTarget(),
1040
- ],
1041
- },
1042
- 'technical-documentation:unit/understand-billing-plans-and-access': {
1043
- kind: TechnicalDocumentationUnitKind.CONCEPT,
1044
- readerAudiences: [
1045
- TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1046
- TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
1047
- ],
1048
- accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1049
- applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1050
- relatedUnitRefs: [
1051
- 'technical-documentation:unit/billing',
1052
- 'technical-documentation:unit/start-billing-subscription',
1053
- 'technical-documentation:unit/reconcile-billing-and-access',
1054
- ],
1055
- apiReferenceTargets: [organizationBillingAccountApiReferenceTarget()],
1056
- },
1057
- 'technical-documentation:unit/start-billing-subscription': {
1058
- kind: TechnicalDocumentationUnitKind.HOW_TO,
1059
- readerAudiences: [TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR],
1060
- accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1061
- applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1062
- relatedUnitRefs: [
1063
- 'technical-documentation:unit/billing',
1064
- 'technical-documentation:unit/understand-billing-plans-and-access',
1065
- 'technical-documentation:unit/reconcile-billing-and-access',
1066
- 'technical-documentation:unit/troubleshoot-billing-change',
1067
- ],
1068
- apiReferenceTargets: [
1069
- operationFamilyApiReferenceTarget('Open an organization checkout', 'organizationBillingAccounts', 'open_checkout'),
1070
- ],
1071
- },
1072
- 'technical-documentation:unit/change-or-end-billing-subscription': {
1073
- kind: TechnicalDocumentationUnitKind.HOW_TO,
1074
- readerAudiences: [TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR],
1075
- accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1076
- applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1077
- relatedUnitRefs: [
1078
- 'technical-documentation:unit/billing',
1079
- 'technical-documentation:unit/understand-billing-plans-and-access',
1080
- 'technical-documentation:unit/reconcile-billing-and-access',
1081
- 'technical-documentation:unit/troubleshoot-billing-change',
1082
- ],
1083
- apiReferenceTargets: [
1084
- operationFamilyApiReferenceTarget('Change an organization subscription plan', 'organizationSubscriptions', 'change_plan'),
1085
- operationFamilyApiReferenceTarget('Cancel an organization subscription', 'organizationSubscriptions', 'cancel'),
1086
- operationFamilyApiReferenceTarget('Resume an organization subscription', 'organizationSubscriptions', 'resume'),
1087
- ],
1088
- },
1089
- 'technical-documentation:unit/manage-invoices-and-payments': {
1090
- kind: TechnicalDocumentationUnitKind.CONCEPT,
1091
- readerAudiences: [
1092
- TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1093
- TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
1094
- ],
1095
- accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1096
- applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1097
- relatedUnitRefs: [
1098
- 'technical-documentation:unit/billing',
1099
- 'technical-documentation:unit/billing-records-and-usage',
1100
- 'technical-documentation:unit/reconcile-billing-and-access',
1101
- 'technical-documentation:unit/understand-metered-usage',
1102
1124
  'technical-documentation:unit/protect-and-retain-audit-evidence',
1103
1125
  ],
1104
- apiReferenceTargets: [
1105
- organizationInvoiceRefsApiReferenceTarget(),
1106
- operationFamilyApiReferenceTarget('Open the authenticated billing portal', 'organizationBillingAccounts', 'open_portal'),
1107
- ],
1108
- },
1109
- 'technical-documentation:unit/billing-records-and-usage': {
1110
- kind: TechnicalDocumentationUnitKind.ORIENTATION,
1111
- readerAudiences: [
1112
- TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1113
- TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
1114
- ],
1115
- accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1116
- applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1117
- relatedUnitRefs: [
1118
- 'technical-documentation:unit/billing',
1119
- 'technical-documentation:unit/manage-invoices-and-payments',
1120
- 'technical-documentation:unit/understand-metered-usage',
1121
- 'technical-documentation:unit/reconcile-billing-and-access',
1122
- 'technical-documentation:unit/troubleshoot-billing-change',
1123
- ],
1124
- apiReferenceTargets: [
1125
- organizationInvoiceRefsApiReferenceTarget(),
1126
- organizationUsageRecordsApiReferenceTarget(),
1127
- ],
1128
1126
  },
1129
- 'technical-documentation:unit/understand-metered-usage': {
1127
+ 'technical-documentation:unit/protect-and-retain-audit-evidence': {
1130
1128
  kind: TechnicalDocumentationUnitKind.CONCEPT,
1131
1129
  readerAudiences: [
1132
1130
  TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1133
1131
  TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
1134
1132
  ],
1135
1133
  accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1136
- applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1137
- relatedUnitRefs: [
1138
- 'technical-documentation:unit/billing',
1139
- 'technical-documentation:unit/billing-records-and-usage',
1140
- 'technical-documentation:unit/manage-invoices-and-payments',
1141
- 'technical-documentation:unit/reconcile-billing-and-access',
1142
- 'technical-documentation:unit/troubleshoot-billing-change',
1143
- ],
1144
- apiReferenceTargets: [organizationUsageRecordsApiReferenceTarget()],
1145
- },
1146
- 'technical-documentation:unit/reconcile-billing-and-access': {
1147
- kind: TechnicalDocumentationUnitKind.HOW_TO,
1148
- readerAudiences: [
1149
- TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1150
- TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
1151
- ],
1152
- accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1153
- applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1134
+ applicabilityRequirements: [],
1154
1135
  relatedUnitRefs: [
1155
- 'technical-documentation:unit/billing',
1156
- 'technical-documentation:unit/manage-invoices-and-payments',
1157
- 'technical-documentation:unit/understand-metered-usage',
1158
- 'technical-documentation:unit/troubleshoot-billing-change',
1159
1136
  'technical-documentation:unit/audit-and-siem',
1137
+ 'technical-documentation:unit/export-audit-records',
1138
+ 'technical-documentation:unit/operate-and-troubleshoot-siem-delivery',
1160
1139
  ],
1161
- apiReferenceTargets: [
1162
- operationFamilyApiReferenceTarget('Read aggregated organization billing state', 'organizationBillingAccounts', 'get_state'),
1163
- organizationSubscriptionsApiReferenceTarget(),
1164
- ],
1165
- },
1166
- 'technical-documentation:unit/troubleshoot-billing-change': {
1167
- kind: TechnicalDocumentationUnitKind.TROUBLESHOOTING,
1168
- readerAudiences: [
1169
- TechnicalDocumentationReaderAudience.APPLICATION_OPERATIONS_STAFF,
1170
- TechnicalDocumentationReaderAudience.ORGANIZATION_ADMINISTRATOR,
1171
- ],
1172
- accessClass: TechnicalDocumentationAccessClass.PUBLIC,
1173
- applicabilityRequirements: ORGANIZATION_BILLING_APPLICABILITY_REQUIREMENTS,
1174
- relatedUnitRefs: [
1175
- 'technical-documentation:unit/billing',
1176
- 'technical-documentation:unit/reconcile-billing-and-access',
1177
- 'technical-documentation:unit/manage-invoices-and-payments',
1178
- 'technical-documentation:unit/understand-metered-usage',
1179
- ],
1180
- apiReferenceTargets: [
1181
- organizationBillingAccountApiReferenceTarget(),
1182
- organizationSubscriptionsApiReferenceTarget(),
1183
- ],
1140
+ apiReferenceTargets: [auditLogsApiReferenceTarget()],
1184
1141
  },
1185
1142
  'technical-documentation:unit/integrations': {
1186
1143
  kind: TechnicalDocumentationUnitKind.ORIENTATION,
@@ -1365,6 +1322,17 @@ export const ENGINE_CONTENT_UNIT_DEFINITIONS = Object.freeze({
1365
1322
  'technical-documentation:unit/api-keys',
1366
1323
  'technical-documentation:unit/common-rest-api',
1367
1324
  ],
1325
+ /*
1326
+ * The FIRST asset any engine page has ever requested (#474), and deliberately the deterministic
1327
+ * one rather than a screenshot: it materializes offline, from a frozen definition, with no
1328
+ * browser, no provisioned tenant and no live stack — so the asset path is exercised on every
1329
+ * publication rather than only where a capture happens to be available.
1330
+ *
1331
+ * It belongs on this page because the diagram IS this page: a client sending an authenticated
1332
+ * request through the application API to a documented resource is what "send your first
1333
+ * request" describes in prose.
1334
+ */
1335
+ assetRequests: [createTechnicalDocumentationApplicationRequestDiagramAssetRequest()],
1368
1336
  },
1369
1337
  'technical-documentation:unit/common-rest-api': {
1370
1338
  kind: TechnicalDocumentationUnitKind.CONCEPT,
@@ -1863,6 +1831,18 @@ function resolveApplicationIntegrationMarkdown(markdown, declaredSourceRefs, fac
1863
1831
  presentationFor: (resolved, selector) => resolved.presentations[selector],
1864
1832
  });
1865
1833
  }
1834
+ /** What this application is FOR: its own resources, grouped as it groups them. Presentations only. */
1835
+ function resolveApplicationDomainMarkdown(markdown, declaredSourceRefs, fact) {
1836
+ return resolveSelectorProjectionMarkdown({
1837
+ markdown,
1838
+ declaredSourceRefs,
1839
+ sourceRef: APPLICATION_DOMAIN_DOCUMENTATION_SOURCE_REF,
1840
+ label: 'application-domain',
1841
+ fact,
1842
+ selectorPattern: APPLICATION_DOMAIN_TOKEN_PATTERN,
1843
+ presentationFor: (resolved, selector) => resolved.presentations[selector],
1844
+ });
1845
+ }
1866
1846
  /** Who may perform each administrative action here. Presentations only. */
1867
1847
  function resolveApplicationAdministrationMarkdown(markdown, declaredSourceRefs, fact) {
1868
1848
  return resolveSelectorProjectionMarkdown({
@@ -1926,8 +1906,9 @@ export function projectEngineApplicationConsumerContentBundle(bundle, engineSpec
1926
1906
  const resolvedApplicationAuthentication = resolveApplicationAuthenticationMarkdown(resolvedApplicationConnection.markdown, identity.sourceRefs, applicationFacts.authentication);
1927
1907
  const resolvedApplicationAdministration = resolveApplicationAdministrationMarkdown(resolvedApplicationAuthentication.markdown, identity.sourceRefs, applicationFacts.administration);
1928
1908
  const resolvedApplicationIntegration = resolveApplicationIntegrationMarkdown(resolvedApplicationAdministration.markdown, identity.sourceRefs, applicationFacts.integration);
1909
+ const resolvedApplicationDomain = resolveApplicationDomainMarkdown(resolvedApplicationIntegration.markdown, identity.sourceRefs, applicationFacts.domain);
1929
1910
  return [identity.unitRef, {
1930
- parsed: parseEngineMarkdown(resolvedApplicationIntegration.markdown, identity.unitRef),
1911
+ parsed: parseEngineMarkdown(resolvedApplicationDomain.markdown, identity.unitRef),
1931
1912
  resolvedConsumerFacts,
1932
1913
  resolvedApplicationOrganizationRoles,
1933
1914
  resolvedApplicationOrganizationUnitResources,
@@ -1935,6 +1916,7 @@ export function projectEngineApplicationConsumerContentBundle(bundle, engineSpec
1935
1916
  resolvedApplicationAuthentication,
1936
1917
  resolvedApplicationAdministration,
1937
1918
  resolvedApplicationIntegration,
1919
+ resolvedApplicationDomain,
1938
1920
  }];
1939
1921
  }));
1940
1922
  const relatedTargetByUnitRef = new Map(bundle.manifest.units.map((identity) => {
@@ -1956,66 +1938,121 @@ export function projectEngineApplicationConsumerContentBundle(bundle, engineSpec
1956
1938
  },
1957
1939
  }];
1958
1940
  }));
1959
- return bundle.manifest.units.map((identity) => {
1960
- const definition = unitDefinitions[identity.unitRef];
1961
- if (definition === undefined)
1962
- throw new Error(`unsupported engine application-consumer content unit ${identity.unitRef}`);
1963
- const content = parsedContentByUnitRef.get(identity.unitRef);
1964
- if (content === undefined)
1965
- throw new Error(`engine content ${identity.unitRef} has no parsed content`);
1966
- const { parsed, resolvedConsumerFacts, resolvedApplicationOrganizationRoles, resolvedApplicationOrganizationUnitResources, resolvedApplicationConnection, resolvedApplicationAuthentication, resolvedApplicationAdministration, resolvedApplicationIntegration } = content;
1967
- const unitSlug = identity.unitRef.slice(identity.unitRef.lastIndexOf('/') + 1);
1968
- const relatedTargets = resolveRelatedUnitLinkTargets(identity.unitRef, definition.relatedUnitRefs, relatedTargetByUnitRef);
1969
- const ownProvenance = identity.sourceRefs.map((sourceRef) => {
1970
- const fact = resolvedConsumerFacts.entriesBySourceRef.get(sourceRef);
1971
- const applicationProjection = resolvedApplicationOrganizationRoles.fact?.sourceRef === sourceRef
1972
- ? resolvedApplicationOrganizationRoles.fact
1973
- : resolvedApplicationOrganizationUnitResources.fact?.sourceRef === sourceRef
1974
- ? resolvedApplicationOrganizationUnitResources.fact
1975
- : resolvedApplicationConnection.fact?.sourceRef === sourceRef
1976
- ? resolvedApplicationConnection.fact
1977
- : resolvedApplicationAuthentication.fact?.sourceRef === sourceRef
1978
- ? resolvedApplicationAuthentication.fact
1979
- : resolvedApplicationAdministration.fact?.sourceRef === sourceRef
1980
- ? resolvedApplicationAdministration.fact
1981
- : undefined;
1982
- return {
1983
- sourceRef,
1984
- ownership: applicationProjection === undefined
1985
- ? TechnicalDocumentationSourceOwnership.ENGINE_GENERIC_CONTENT
1986
- : TechnicalDocumentationSourceOwnership.APPLICATION_COMPANION_PROJECTION,
1987
- classification: TechnicalDocumentationSourceClassification.PUBLIC,
1988
- /*
1989
- * A companion projection carries its own version; a curated engine fact takes the
1990
- * catalog projector's; authored engine content takes the content bundle's. All three
1991
- * were sha256 values until 2026-08-27 and none of them was ever compared to anything
1992
- * except another copy of itself.
1993
- */
1994
- sourceVersion: applicationProjection?.sourceVersion
1995
- ?? (fact === undefined ? bundle.identity.contentBundleVersion : engineSpecificationCatalog.identity.projectorVersion),
1996
- sourceAnchorRef: null,
1997
- };
1998
- });
1941
+ /*
1942
+ * The generated tier.
1943
+ *
1944
+ * Every unit above is AUTHORED: a Markdown file in the content module, a definition beside it,
1945
+ * and a fixed route. That is the right shape for a page whose text an engine owns, and the wrong
1946
+ * one for a page PER RESOURCE — the resources belong to the application, and an engine that
1947
+ * authored a page for each possible one would be authoring the application.
1948
+ *
1949
+ * So these units are projected whole, from the same domain fact the overview page uses. They are
1950
+ * still ENGINE units, and deliberately: the engine owns the page's shape, its sections and its
1951
+ * words, while the application supplies only the subject. That is what keeps `pathForUnit`'s
1952
+ * refusal of application-owned units intact — nothing here asks it to route a unit an
1953
+ * application named.
1954
+ */
1955
+ const generatedResourceUnits = (applicationFacts.domain?.resourcePages ?? []).map((page) => {
1956
+ const unitRef = applicationDomainResourcePageUnitRef(page.resourceIdentifier);
1957
+ const parsed = parseEngineMarkdown(page.markdown, unitRef);
1958
+ const unitSlug = page.resourceIdentifier;
1999
1959
  return createTechnicalDocumentationUnitV1({
2000
1960
  schemaVersion: 1,
2001
- unitRef: identity.unitRef,
1961
+ unitRef,
2002
1962
  unitVersion: 1,
2003
- kind: definition.kind,
2004
- readerAudiences: [...definition.readerAudiences],
1963
+ kind: GENERATED_RESOURCE_UNIT_DEFINITION.kind,
1964
+ readerAudiences: [...GENERATED_RESOURCE_UNIT_DEFINITION.readerAudiences],
2005
1965
  title: parsed.title,
2006
1966
  summary: parsed.summary,
2007
1967
  sections: parsed.sections.map((section, index) => ({
2008
- sectionRef: `technical-documentation:section/${unitSlug}-${index + 1}`,
1968
+ sectionRef: `technical-documentation:section/manages-${unitSlug}-${index + 1}`,
2009
1969
  heading: section.heading,
2010
1970
  bodyMarkdown: section.bodyMarkdown,
2011
1971
  })),
2012
- links: [...relatedLinks(identity.unitRef, relatedTargets), ...apiReferenceLinks(identity.unitRef, definition.apiReferenceTargets ?? [])],
2013
- provenance: mergeProvenance(ownProvenance, relatedTargets),
2014
- applicabilityRequirements: [...definition.applicabilityRequirements],
2015
- accessClass: definition.accessClass,
2016
- editorialStatus: TechnicalDocumentationEditorialStatus.APPROVED,
2017
- assetRequests: [],
1972
+ links: [],
1973
+ /*
1974
+ * Wholly application-projected: unlike an authored page carrying a token, there is no engine
1975
+ * Markdown behind this one. Recording it as engine content would misattribute the only thing
1976
+ * a reader might want to trace — where the words about their product came from.
1977
+ */
1978
+ provenance: [{
1979
+ sourceRef: APPLICATION_DOMAIN_DOCUMENTATION_SOURCE_REF,
1980
+ ownership: TechnicalDocumentationSourceOwnership.APPLICATION_COMPANION_PROJECTION,
1981
+ classification: TechnicalDocumentationSourceClassification.PUBLIC,
1982
+ sourceVersion: applicationFacts.domain?.sourceVersion ?? 1,
1983
+ sourceAnchorRef: null,
1984
+ }],
1985
+ /*
1986
+ * No applicability requirement, because the unit's EXISTENCE is the evidence: it is emitted
1987
+ * only for a resource the application actually publishes. A requirement here would be a
1988
+ * second, weaker statement of the same fact.
1989
+ */
1990
+ applicabilityRequirements: [],
1991
+ accessClass: GENERATED_RESOURCE_UNIT_DEFINITION.accessClass,
1992
+ editorialStatus: GENERATED_RESOURCE_UNIT_DEFINITION.editorialStatus ?? TechnicalDocumentationEditorialStatus.APPROVED,
1993
+ assetRequests: [...GENERATED_RESOURCE_UNIT_DEFINITION.assetRequests ?? []],
2018
1994
  });
2019
- }).sort((left, right) => left.unitRef.localeCompare(right.unitRef, 'en-US'));
1995
+ });
1996
+ return [...bundle.manifest.units.map((identity) => {
1997
+ const definition = unitDefinitions[identity.unitRef];
1998
+ if (definition === undefined)
1999
+ throw new Error(`unsupported engine application-consumer content unit ${identity.unitRef}`);
2000
+ const content = parsedContentByUnitRef.get(identity.unitRef);
2001
+ if (content === undefined)
2002
+ throw new Error(`engine content ${identity.unitRef} has no parsed content`);
2003
+ const { parsed, resolvedConsumerFacts, resolvedApplicationOrganizationRoles, resolvedApplicationOrganizationUnitResources, resolvedApplicationConnection, resolvedApplicationAuthentication, resolvedApplicationAdministration, resolvedApplicationIntegration, resolvedApplicationDomain } = content;
2004
+ const unitSlug = identity.unitRef.slice(identity.unitRef.lastIndexOf('/') + 1);
2005
+ const relatedTargets = resolveRelatedUnitLinkTargets(identity.unitRef, definition.relatedUnitRefs, relatedTargetByUnitRef);
2006
+ const ownProvenance = identity.sourceRefs.map((sourceRef) => {
2007
+ const fact = resolvedConsumerFacts.entriesBySourceRef.get(sourceRef);
2008
+ const applicationProjection = resolvedApplicationOrganizationRoles.fact?.sourceRef === sourceRef
2009
+ ? resolvedApplicationOrganizationRoles.fact
2010
+ : resolvedApplicationOrganizationUnitResources.fact?.sourceRef === sourceRef
2011
+ ? resolvedApplicationOrganizationUnitResources.fact
2012
+ : resolvedApplicationConnection.fact?.sourceRef === sourceRef
2013
+ ? resolvedApplicationConnection.fact
2014
+ : resolvedApplicationAuthentication.fact?.sourceRef === sourceRef
2015
+ ? resolvedApplicationAuthentication.fact
2016
+ : resolvedApplicationAdministration.fact?.sourceRef === sourceRef
2017
+ ? resolvedApplicationAdministration.fact
2018
+ : undefined;
2019
+ return {
2020
+ sourceRef,
2021
+ ownership: applicationProjection === undefined
2022
+ ? TechnicalDocumentationSourceOwnership.ENGINE_GENERIC_CONTENT
2023
+ : TechnicalDocumentationSourceOwnership.APPLICATION_COMPANION_PROJECTION,
2024
+ classification: TechnicalDocumentationSourceClassification.PUBLIC,
2025
+ /*
2026
+ * A companion projection carries its own version; a curated engine fact takes the
2027
+ * catalog projector's; authored engine content takes the content bundle's. All three
2028
+ * were sha256 values until 2026-08-27 and none of them was ever compared to anything
2029
+ * except another copy of itself.
2030
+ */
2031
+ sourceVersion: applicationProjection?.sourceVersion
2032
+ ?? (fact === undefined ? bundle.identity.contentBundleVersion : engineSpecificationCatalog.identity.projectorVersion),
2033
+ sourceAnchorRef: null,
2034
+ };
2035
+ });
2036
+ return createTechnicalDocumentationUnitV1({
2037
+ schemaVersion: 1,
2038
+ unitRef: identity.unitRef,
2039
+ unitVersion: 1,
2040
+ kind: definition.kind,
2041
+ readerAudiences: [...definition.readerAudiences],
2042
+ title: parsed.title,
2043
+ summary: parsed.summary,
2044
+ sections: parsed.sections.map((section, index) => ({
2045
+ sectionRef: `technical-documentation:section/${unitSlug}-${index + 1}`,
2046
+ heading: section.heading,
2047
+ bodyMarkdown: section.bodyMarkdown,
2048
+ })),
2049
+ links: [...relatedLinks(identity.unitRef, relatedTargets), ...apiReferenceLinks(identity.unitRef, definition.apiReferenceTargets ?? [])],
2050
+ provenance: mergeProvenance(ownProvenance, relatedTargets),
2051
+ applicabilityRequirements: [...definition.applicabilityRequirements],
2052
+ accessClass: definition.accessClass,
2053
+ editorialStatus: definition.editorialStatus ?? TechnicalDocumentationEditorialStatus.APPROVED,
2054
+ assetRequests: [...definition.assetRequests ?? []],
2055
+ });
2056
+ }), ...generatedResourceUnits].sort((left, right) => left.unitRef.localeCompare(right.unitRef, 'en-US'));
2020
2057
  }
2021
2058
  //# sourceMappingURL=technical-documentation-engine-content-bundle.js.map