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

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 (96) hide show
  1. package/dist/esm/companion/application-documentation/application-connection-documentation.d.ts +25 -1
  2. package/dist/esm/companion/application-documentation/application-connection-documentation.d.ts.map +1 -1
  3. package/dist/esm/companion/application-documentation/application-connection-documentation.js +28 -1
  4. package/dist/esm/companion/application-documentation/application-connection-documentation.js.map +1 -1
  5. package/dist/esm/companion/application-documentation/application-domain-documentation.d.ts +133 -0
  6. package/dist/esm/companion/application-documentation/application-domain-documentation.d.ts.map +1 -0
  7. package/dist/esm/companion/application-documentation/application-domain-documentation.js +243 -0
  8. package/dist/esm/companion/application-documentation/application-domain-documentation.js.map +1 -0
  9. package/dist/esm/companion/application-documentation/application-integration-documentation.d.ts.map +1 -1
  10. package/dist/esm/companion/application-documentation/application-integration-documentation.js +23 -0
  11. package/dist/esm/companion/application-documentation/application-integration-documentation.js.map +1 -1
  12. package/dist/esm/companion/application-documentation/application-organization-role-documentation.d.ts +30 -0
  13. package/dist/esm/companion/application-documentation/application-organization-role-documentation.d.ts.map +1 -1
  14. package/dist/esm/companion/application-documentation/application-organization-role-documentation.js +38 -0
  15. package/dist/esm/companion/application-documentation/application-organization-role-documentation.js.map +1 -1
  16. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.d.ts +61 -1
  17. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.d.ts.map +1 -1
  18. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.js +255 -218
  19. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.js.map +1 -1
  20. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.d.ts +2 -0
  21. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.d.ts.map +1 -1
  22. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.js +1 -0
  23. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.js.map +1 -1
  24. package/dist/esm/companion/application-documentation/technical-documentation-publication-policy.js +1 -1
  25. package/dist/esm/companion/application-documentation/technical-documentation-publication-policy.js.map +1 -1
  26. package/dist/esm/companion/index.d.ts +2 -1
  27. package/dist/esm/companion/index.d.ts.map +1 -1
  28. package/dist/esm/companion/index.js +2 -1
  29. package/dist/esm/companion/index.js.map +1 -1
  30. package/dist/esm/companion/manual-controller-route-projection.d.ts +112 -0
  31. package/dist/esm/companion/manual-controller-route-projection.d.ts.map +1 -0
  32. package/dist/esm/companion/manual-controller-route-projection.js +249 -0
  33. package/dist/esm/companion/manual-controller-route-projection.js.map +1 -0
  34. package/dist/esm/companion/openapi-generator.d.ts +16 -0
  35. package/dist/esm/companion/openapi-generator.d.ts.map +1 -1
  36. package/dist/esm/companion/openapi-generator.js +489 -26
  37. package/dist/esm/companion/openapi-generator.js.map +1 -1
  38. package/dist/esm/companion/operation-projection.schemas.d.ts +44 -0
  39. package/dist/esm/companion/operation-projection.schemas.d.ts.map +1 -1
  40. package/dist/esm/companion/operation-projection.schemas.js +37 -0
  41. package/dist/esm/companion/operation-projection.schemas.js.map +1 -1
  42. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.d.ts +7 -1
  43. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.d.ts.map +1 -1
  44. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.js +34 -18
  45. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.js.map +1 -1
  46. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.d.ts.map +1 -1
  47. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.js +8 -1
  48. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.js.map +1 -1
  49. package/dist/esm/companion/rendering/technical-documentation-markdown-renderer.d.ts +0 -9
  50. package/dist/esm/companion/rendering/technical-documentation-markdown-renderer.d.ts.map +0 -1
  51. package/dist/esm/companion/rendering/technical-documentation-markdown-renderer.js +0 -111
  52. package/dist/esm/companion/rendering/technical-documentation-markdown-renderer.js.map +0 -1
  53. package/dist/esm/companion/rendering/technical-documentation-render-model.d.ts.map +1 -1
  54. package/dist/esm/companion/rendering/technical-documentation-render-model.js +30 -13
  55. package/dist/esm/companion/rendering/technical-documentation-render-model.js.map +1 -1
  56. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.d.ts +10 -0
  57. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.d.ts.map +1 -1
  58. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.js +10 -15
  59. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.js.map +1 -1
  60. package/dist/esm/companion/technical-documentation-capture-execution-port.d.ts +27 -1
  61. package/dist/esm/companion/technical-documentation-capture-execution-port.d.ts.map +1 -1
  62. package/dist/esm/companion/technical-documentation-capture-execution-port.js.map +1 -1
  63. package/dist/esm/companion/technical-documentation-diagram-definitions.d.ts +33 -0
  64. package/dist/esm/companion/technical-documentation-diagram-definitions.d.ts.map +1 -0
  65. package/dist/esm/companion/technical-documentation-diagram-definitions.js +54 -0
  66. package/dist/esm/companion/technical-documentation-diagram-definitions.js.map +1 -0
  67. package/dist/esm/companion/technical-documentation-diagram-materializer.d.ts +10 -18
  68. package/dist/esm/companion/technical-documentation-diagram-materializer.d.ts.map +1 -1
  69. package/dist/esm/companion/technical-documentation-diagram-materializer.js +9 -39
  70. package/dist/esm/companion/technical-documentation-diagram-materializer.js.map +1 -1
  71. package/dist/esm/config/wildo-tech-doc-config.schemas.d.ts +8 -4
  72. package/dist/esm/config/wildo-tech-doc-config.schemas.d.ts.map +1 -1
  73. package/dist/esm/config/wildo-tech-doc-config.schemas.js +8 -4
  74. package/dist/esm/config/wildo-tech-doc-config.schemas.js.map +1 -1
  75. package/dist/esm/content/application-consumer-documentation-content.techdoc.d.ts +42 -64
  76. package/dist/esm/content/application-consumer-documentation-content.techdoc.d.ts.map +1 -1
  77. package/dist/esm/content/application-consumer-documentation-content.techdoc.js +164 -925
  78. package/dist/esm/content/application-consumer-documentation-content.techdoc.js.map +1 -1
  79. package/dist/esm/runtime/DocsAuthContext.d.ts +16 -1
  80. package/dist/esm/runtime/DocsAuthContext.d.ts.map +1 -1
  81. package/dist/esm/runtime/DocsAuthContext.js +18 -2
  82. package/dist/esm/runtime/DocsAuthContext.js.map +1 -1
  83. package/dist/esm/runtime/frontend-provider-registry.techdoc.d.ts +35 -13
  84. package/dist/esm/runtime/frontend-provider-registry.techdoc.d.ts.map +1 -1
  85. package/dist/esm/runtime/frontend-provider-registry.techdoc.js +28 -19
  86. package/dist/esm/runtime/frontend-provider-registry.techdoc.js.map +1 -1
  87. package/dist/esm/runtime/index.d.ts +1 -0
  88. package/dist/esm/runtime/index.d.ts.map +1 -1
  89. package/dist/esm/runtime/index.js +1 -0
  90. package/dist/esm/runtime/index.js.map +1 -1
  91. package/dist/esm/runtime/use-docs-provider-sdks.d.ts +21 -0
  92. package/dist/esm/runtime/use-docs-provider-sdks.d.ts.map +1 -0
  93. package/dist/esm/runtime/use-docs-provider-sdks.js +49 -0
  94. package/dist/esm/runtime/use-docs-provider-sdks.js.map +1 -0
  95. package/dist/tsconfig.build.tsbuildinfo +1 -1
  96. package/package.json +6 -5
@@ -1 +1 @@
1
- {"version":3,"file":"technical-documentation-render-model.js","sourceRoot":"","sources":["../../../../../src/companion/rendering/technical-documentation-render-model.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\n\nimport {\n createTechnicalDocumentationRenderOutputManifestV1,\n canonicalizeTechnicalDocumentationJson,\n TechnicalDocumentationOutputKind,\n TechnicalDocumentationNormalizedRelativePathSchema,\n TechnicalDocumentationRendererKind,\n type TechnicalDocumentationAuthorizedBundleManifestV1,\n type TechnicalDocumentationRenderOutputManifestV1,\n type TechnicalDocumentationRendererExecutionV1,\n type TechnicalDocumentationVersionedIdentityV1,\n type TechnicalDocumentationResolvedAssetBundleManifestV1,\n type TechnicalDocumentationSupportedApiVersion,\n type TechnicalDocumentationUnitV1,\n} from '@wildo-ai/saas-specifications/technical-documentation';\n\n/**\n * Names opaque emitted bytes, and detects their corruption when a reader compares this against the\n * bytes it actually loaded. That two-sided check is why it survived the 2026-08-27 digest\n * demolition; its string-hashing sibling did not, because every caller of that one was recording\n * agreement between two parts of the repository rather than naming content.\n */\nexport function technicalDocumentationSha256Bytes(bytes: Uint8Array): string {\n return `sha256:${createHash('sha256').update(bytes).digest('hex')}`;\n}\n\nexport interface TechnicalDocumentationRenderModel {\n readonly authorizedBundleIdentity: TechnicalDocumentationVersionedIdentityV1;\n readonly channel: TechnicalDocumentationAuthorizedBundleManifestV1['channel'];\n readonly units: readonly TechnicalDocumentationUnitV1[];\n readonly unitPathByRef: ReadonlyMap<string, string>;\n}\n\nexport interface TechnicalDocumentationRenderedFile {\n readonly outputRef: string;\n readonly rendererRef: string;\n readonly outputKind: TechnicalDocumentationOutputKind;\n readonly sourceUnitRefs: readonly string[];\n readonly normalizedRelativePath: string;\n readonly mediaType: string;\n readonly bytes: Uint8Array;\n}\n\nexport interface TechnicalDocumentationRendererResult {\n readonly execution: TechnicalDocumentationRendererExecutionV1;\n readonly files: readonly TechnicalDocumentationRenderedFile[];\n}\n\nexport function createTechnicalDocumentationRendererExecution(input: {\n readonly rendererKind: TechnicalDocumentationRendererKind;\n readonly rendererRef: string;\n readonly rendererVersion: number;\n /** Names the renderer's configuration. `rendererRef@rendererVersion` names the implementation. */\n readonly configurationRef: string;\n}): TechnicalDocumentationRendererExecutionV1 {\n /*\n * This built two sha256 fields until 2026-08-27: one over the renderer's own function bodies\n * (`Function.prototype.toString()`), one over its configuration object. Neither was ever compared\n * to anything — they rode into the manifest beside the `rendererRef` and `rendererVersion` that\n * already say which renderer ran, in a form a reader can act on.\n */\n return {\n rendererKind: input.rendererKind,\n rendererRef: input.rendererRef,\n rendererVersion: input.rendererVersion,\n configurationRef: input.configurationRef,\n };\n}\n\nfunction slugForUnit(unit: TechnicalDocumentationUnitV1): string {\n const source = unit.unitRef.split('/').at(-1) ?? unit.unitRef;\n const slug = source.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n if (slug.length === 0) throw new Error(`technical-documentation unit ${unit.unitRef} cannot produce a stable path`);\n return slug;\n}\n\n/**\n * Every route the engine content module owns, keyed by unit slug. Exported as a SET so the\n * renderers can tell a gated page this application does not publish (flatten the link) from a\n * misspelled route (leave it for the managed-tree validator).\n */\nconst ENGINE_UNIT_PATH_BY_SLUG: Readonly<Record<string, string>> = {\n 'application-orientation': 'get-started',\n authentication: 'access-and-identity/overview',\n 'sign-in-and-mfa': 'access-and-identity/sign-in-and-mfa',\n 'complete-sign-in': 'access-and-identity/complete-sign-in',\n 'mfa-enrollment-and-recovery': 'access-and-identity/mfa-enrollment-and-recovery',\n 'sign-in-troubleshoot': 'access-and-identity/sign-in-troubleshoot',\n 'single-sign-on': 'access-and-identity/single-sign-on',\n 'sso-configure': 'access-and-identity/sso-configure',\n 'sso-rollout-and-recovery': 'access-and-identity/sso-rollout-and-recovery',\n 'sso-troubleshoot': 'access-and-identity/sso-troubleshoot',\n 'api-keys': 'access-and-identity/api-keys',\n 'api-keys-create-and-store': 'access-and-identity/api-keys-create-and-store',\n 'api-keys-lifecycle': 'access-and-identity/api-keys-lifecycle',\n 'api-keys-troubleshoot': 'access-and-identity/api-keys-troubleshoot',\n 'oauth-provider': 'access-and-identity/oauth-provider',\n 'oauth-register-client': 'access-and-identity/oauth-register-client',\n 'oauth-authorize-delegated-access': 'access-and-identity/oauth-authorize-delegated-access',\n 'oauth-operate-and-revoke': 'access-and-identity/oauth-operate-and-revoke',\n 'user-administration': 'user-administration',\n 'manage-users-manually': 'user-administration/manage-users-manually',\n 'invite-and-onboard-user': 'user-administration/invite-and-onboard-user',\n 'organization-roles': 'user-administration/roles-and-permissions',\n 'change-user-access': 'user-administration/change-user-access',\n 'manage-organization-units': 'user-administration/manage-organization-units',\n 'design-organization-unit-hierarchy': 'user-administration/design-organization-unit-hierarchy',\n 'assign-organization-unit-access': 'user-administration/assign-organization-unit-access',\n 'operate-organization-units': 'user-administration/operate-organization-units',\n 'suspend-or-remove-user': 'user-administration/suspend-or-remove-user',\n 'review-users-and-access': 'user-administration/review-users-and-access',\n 'troubleshoot-user-access': 'user-administration/troubleshoot-user-access',\n scim: 'user-administration/scim-provisioning',\n 'scim-protocol-and-payloads': 'user-administration/scim-protocol-and-payloads',\n 'scim-configure': 'user-administration/scim-configure',\n 'scim-microsoft-entra': 'user-administration/scim-microsoft-entra',\n 'scim-okta': 'user-administration/scim-okta',\n 'scim-ldap-and-active-directory': 'user-administration/scim-ldap-and-active-directory',\n 'scim-map-profile-and-units': 'user-administration/scim-map-profile-and-units',\n 'scim-validate-and-roll-out': 'user-administration/scim-validate-and-roll-out',\n 'scim-operate-and-troubleshoot': 'user-administration/scim-operate-and-troubleshoot',\n 'audit-and-siem': 'security-and-audit',\n 'investigate-audit-event': 'security-and-audit/investigate-event',\n 'review-privileged-and-access-changes': 'security-and-audit/review-access-changes',\n 'export-audit-records': 'security-and-audit/export-audit-records',\n 'configure-siem-export': 'security-and-audit/configure-siem',\n 'siem-splunk': 'security-and-audit/siem-splunk',\n 'siem-microsoft-sentinel': 'security-and-audit/siem-microsoft-sentinel',\n 'siem-elastic': 'security-and-audit/siem-elastic',\n 'operate-and-troubleshoot-siem-delivery': 'security-and-audit/operate-siem',\n 'protect-and-retain-audit-evidence': 'security-and-audit/protect-evidence',\n billing: 'billing-and-subscriptions',\n 'understand-billing-plans-and-access': 'billing-and-subscriptions/plans-and-access',\n 'start-billing-subscription': 'billing-and-subscriptions/start-subscription',\n 'change-or-end-billing-subscription': 'billing-and-subscriptions/change-or-end-subscription',\n 'billing-records-and-usage': 'billing-and-subscriptions/billing-records',\n 'manage-invoices-and-payments': 'billing-and-subscriptions/invoices-and-payments',\n 'understand-metered-usage': 'billing-and-subscriptions/metered-usage',\n 'reconcile-billing-and-access': 'billing-and-subscriptions/reconcile-access',\n 'troubleshoot-billing-change': 'billing-and-subscriptions/troubleshoot',\n integrations: 'integrations',\n 'automation-platforms': 'integrations/automation-platforms',\n 'connect-n8n': 'integrations/automation/n8n',\n 'connect-zapier': 'integrations/automation/zapier',\n 'connect-make': 'integrations/automation/make',\n 'ai-coding-tools': 'integrations/ai-coding-tools',\n 'connect-cursor': 'integrations/ai-tools/cursor',\n 'connect-codex': 'integrations/ai-tools/codex',\n 'connect-claude-code': 'integrations/ai-tools/claude-code',\n 'agent-interoperability': 'integrations/agents',\n 'mcp-integrations': 'integrations/mcp',\n 'a2a-integrations': 'integrations/a2a',\n 'first-request': 'integrations/create-your-own-integration',\n 'common-rest-api': 'integrations/rest-api',\n 'rest-api-conventions': 'integrations/rest/conventions',\n 'send-api-request': 'integrations/rest/send-request',\n 'work-with-api-collections': 'integrations/rest/read-collections',\n 'write-and-reconcile-api-changes': 'integrations/rest/write-and-reconcile',\n 'troubleshoot-api-request': 'integrations/rest/troubleshoot',\n webhooks: 'integrations/webhooks',\n 'configure-and-test-webhook-endpoint': 'integrations/webhooks/configure-and-test',\n 'verify-webhook-delivery': 'integrations/webhooks/verify-delivery',\n 'operate-webhook-deliveries': 'integrations/webhooks/operate-deliveries',\n 'troubleshoot-webhook-deliveries': 'integrations/webhooks/troubleshoot',\n};\n\nexport const ENGINE_UNIT_ROUTES: ReadonlySet<string> = new Set(Object.values(ENGINE_UNIT_PATH_BY_SLUG));\n\n/**\n * Maps a published semantic unit to its consumer navigation home.\n *\n * This is deliberately renderer-owned rather than inferred from Markdown file\n * names: the semantic unit is the stable composition input, while a renderer\n * owns audience-facing URLs. The route table is deliberately organized by a\n * customer's product responsibility—not the internal framework that implements\n * it—so readers can find access, organization, security, billing and\n * integration material without learning Wildo vocabulary. Application-domain\n * use cases remain deferred to the app-creator flow, so an application-owned\n * unit fails closed instead of acquiring an implicit route.\n */\nfunction pathForUnit(unit: TechnicalDocumentationUnitV1): string {\n const slug = slugForUnit(unit);\n if (unit.unitRef.startsWith('technical-documentation:unit/')) {\n const path = ENGINE_UNIT_PATH_BY_SLUG[slug];\n if (path !== undefined) return path;\n throw new Error(`technical-documentation framework unit ${unit.unitRef} has no consumer navigation path`);\n }\n throw new Error(`technical-documentation unit ${unit.unitRef} has no consumer navigation category`);\n}\n\nexport function createTechnicalDocumentationRenderModel(\n authorizedBundle: TechnicalDocumentationAuthorizedBundleManifestV1,\n): TechnicalDocumentationRenderModel {\n const unitPathByRef = new Map<string, string>();\n const occupiedPaths = new Set<string>();\n for (const unit of authorizedBundle.units) {\n const path = pathForUnit(unit);\n if (occupiedPaths.has(path)) throw new Error(`technical-documentation units collide on renderer path ${path}`);\n occupiedPaths.add(path);\n unitPathByRef.set(unit.unitRef, path);\n }\n return Object.freeze({\n authorizedBundleIdentity: Object.freeze({ ref: authorizedBundle.bundleRef, version: authorizedBundle.bundleVersion }),\n channel: authorizedBundle.channel,\n units: Object.freeze([...authorizedBundle.units]),\n unitPathByRef,\n });\n}\n\nexport function createTechnicalDocumentationAggregateRenderManifest(input: {\n readonly authorizedBundle: TechnicalDocumentationAuthorizedBundleManifestV1;\n readonly resolvedAssetBundle: TechnicalDocumentationResolvedAssetBundleManifestV1;\n readonly supportedApiVersion: TechnicalDocumentationSupportedApiVersion;\n readonly rendererResults: readonly TechnicalDocumentationRendererResult[];\n /** This render's own identity; the publication pointer selects a render by it. */\n readonly renderRef: string;\n readonly renderVersion: number;\n}): TechnicalDocumentationRenderOutputManifestV1 {\n const rendererExecutions = input.rendererResults.map((result) => result.execution);\n const outputs = input.rendererResults.flatMap((result) => result.files.map((file) => ({\n outputRef: file.outputRef,\n rendererRef: file.rendererRef,\n outputKind: file.outputKind,\n sourceUnitRefs: [...file.sourceUnitRefs],\n normalizedRelativePath: TechnicalDocumentationNormalizedRelativePathSchema.parse(file.normalizedRelativePath),\n mediaType: file.mediaType,\n byteLength: file.bytes.byteLength,\n byteDigest: technicalDocumentationSha256Bytes(file.bytes),\n })));\n return createTechnicalDocumentationRenderOutputManifestV1({\n schemaVersion: 1,\n renderRef: input.renderRef,\n renderVersion: input.renderVersion,\n authorizedBundleIdentity: { ref: input.authorizedBundle.bundleRef, version: input.authorizedBundle.bundleVersion },\n resolvedAssetBundleIdentity: { ref: input.resolvedAssetBundle.assetBundleRef, version: input.resolvedAssetBundle.assetBundleVersion },\n supportedApiVersion: input.supportedApiVersion,\n rendererExecutions,\n outputs,\n });\n}\n"]}
1
+ {"version":3,"file":"technical-documentation-render-model.js","sourceRoot":"","sources":["../../../../../src/companion/rendering/technical-documentation-render-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,gDAAgD,EAAE,MAAM,4EAA4E,CAAC;AAE9I,OAAO,EACL,kDAAkD,EAGlD,kDAAkD,GASnD,MAAM,uDAAuD,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,UAAU,iCAAiC,CAAC,KAAiB;IACjE,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACtE,CAAC;AAwBD,MAAM,UAAU,6CAA6C,CAAC,KAM7D;IACC;;;;;OAKG;IACH,OAAO;QACL,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;KACzC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAkC;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACpF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,OAAO,+BAA+B,CAAC,CAAC;IACpH,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,wBAAwB,GAAqC;IAC/D,yBAAyB,EAAE,aAAa;IACxC,+BAA+B,EAAE,+BAA+B;IAChE,cAAc,EAAE,8BAA8B;IAC9C,iBAAiB,EAAE,qCAAqC;IACxD,kBAAkB,EAAE,sCAAsC;IAC1D,6BAA6B,EAAE,iDAAiD;IAChF,sBAAsB,EAAE,0CAA0C;IAClE,gBAAgB,EAAE,oCAAoC;IACtD,eAAe,EAAE,mCAAmC;IACpD,0BAA0B,EAAE,8CAA8C;IAC1E,kBAAkB,EAAE,sCAAsC;IAC1D,UAAU,EAAE,8BAA8B;IAC1C,2BAA2B,EAAE,+CAA+C;IAC5E,oBAAoB,EAAE,wCAAwC;IAC9D,uBAAuB,EAAE,2CAA2C;IACpE,gBAAgB,EAAE,oCAAoC;IACtD,uBAAuB,EAAE,2CAA2C;IACpE,kCAAkC,EAAE,sDAAsD;IAC1F,0BAA0B,EAAE,8CAA8C;IAC1E,qBAAqB,EAAE,qBAAqB;IAC5C,uBAAuB,EAAE,2CAA2C;IACpE,yBAAyB,EAAE,6CAA6C;IACxE,oBAAoB,EAAE,2CAA2C;IACjE,oBAAoB,EAAE,wCAAwC;IAC9D,2BAA2B,EAAE,+CAA+C;IAC5E,oCAAoC,EAAE,wDAAwD;IAC9F,iCAAiC,EAAE,qDAAqD;IACxF,4BAA4B,EAAE,gDAAgD;IAC9E,wBAAwB,EAAE,4CAA4C;IACtE,yBAAyB,EAAE,6CAA6C;IACxE,0BAA0B,EAAE,8CAA8C;IAC1E,IAAI,EAAE,uCAAuC;IAC7C,4BAA4B,EAAE,gDAAgD;IAC9E,gBAAgB,EAAE,oCAAoC;IACtD,sBAAsB,EAAE,0CAA0C;IAClE,WAAW,EAAE,+BAA+B;IAC5C,gCAAgC,EAAE,oDAAoD;IACtF,4BAA4B,EAAE,gDAAgD;IAC9E,4BAA4B,EAAE,gDAAgD;IAC9E,+BAA+B,EAAE,mDAAmD;IACpF,gBAAgB,EAAE,oBAAoB;IACtC,yBAAyB,EAAE,sCAAsC;IACjE,sCAAsC,EAAE,0CAA0C;IAClF,sBAAsB,EAAE,yCAAyC;IACjE,uBAAuB,EAAE,mCAAmC;IAC5D,aAAa,EAAE,gCAAgC;IAC/C,yBAAyB,EAAE,4CAA4C;IACvE,cAAc,EAAE,iCAAiC;IACjD,wCAAwC,EAAE,iCAAiC;IAC3E,8BAA8B,EAAE,iDAAiD;IACjF,mCAAmC,EAAE,qCAAqC;IAC1E,YAAY,EAAE,cAAc;IAC5B,sBAAsB,EAAE,mCAAmC;IAC3D,aAAa,EAAE,6BAA6B;IAC5C,gBAAgB,EAAE,gCAAgC;IAClD,cAAc,EAAE,8BAA8B;IAC9C,iBAAiB,EAAE,8BAA8B;IACjD,gBAAgB,EAAE,8BAA8B;IAChD,eAAe,EAAE,6BAA6B;IAC9C,qBAAqB,EAAE,mCAAmC;IAC1D,wBAAwB,EAAE,qBAAqB;IAC/C,kBAAkB,EAAE,kBAAkB;IACtC,kBAAkB,EAAE,kBAAkB;IACtC,eAAe,EAAE,0CAA0C;IAC3D,iBAAiB,EAAE,uBAAuB;IAC1C,sBAAsB,EAAE,+BAA+B;IACvD,kBAAkB,EAAE,gCAAgC;IACpD,2BAA2B,EAAE,oCAAoC;IACjE,iCAAiC,EAAE,uCAAuC;IAC1E,0BAA0B,EAAE,gCAAgC;IAC5D,QAAQ,EAAE,uBAAuB;IACjC,qCAAqC,EAAE,0CAA0C;IACjF,yBAAyB,EAAE,uCAAuC;IAClE,4BAA4B,EAAE,0CAA0C;IACxE,iCAAiC,EAAE,oCAAoC;CAC1E,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;AAExG;;;;;;;;;;;;;;GAcG;AACH,SAAS,WAAW,CAAC,IAAkC;IACrD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B;;;;;;;;;;;;OAYG;IACH,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,gDAAgD,CAAC,EAAE,CAAC;QAC9E,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,MAAM,CAAC,CAAC;QACvG,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,KAAK,CAAC,mDAAmD,IAAI,CAAC,OAAO,4CAA4C,CAAC,CAAC;QAC/H,CAAC;QACD,OAAO,GAAG,wBAAwB,CAAC,+BAA+B,CAAC,IAAI,kBAAkB,EAAE,CAAC;IAC9F,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,+BAA+B,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,CAAC,OAAO,kCAAkC,CAAC,CAAC;IAC5G,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,OAAO,sCAAsC,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,uCAAuC,CACrD,gBAAkE;IAElE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,IAAI,EAAE,CAAC,CAAC;QAC/G,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxB,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,wBAAwB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,gBAAgB,CAAC,aAAa,EAAE,CAAC;QACrH,OAAO,EAAE,gBAAgB,CAAC,OAAO;QACjC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACjD,aAAa;KACd,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mDAAmD,CAAC,KAQnE;IACC,MAAM,kBAAkB,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpF,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;QACxC,sBAAsB,EAAE,kDAAkD,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC;QAC7G,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;QACjC,UAAU,EAAE,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC;KAC1D,CAAC,CAAC,CAAC,CAAC;IACL,OAAO,kDAAkD,CAAC;QACxD,aAAa,EAAE,CAAC;QAChB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,wBAAwB,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,gBAAgB,CAAC,aAAa,EAAE;QAClH,2BAA2B,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,mBAAmB,CAAC,cAAc,EAAE,OAAO,EAAE,KAAK,CAAC,mBAAmB,CAAC,kBAAkB,EAAE;QACrI,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,kBAAkB;QAClB,OAAO;KACR,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { createHash } from 'node:crypto';\n\nimport { APPLICATION_DOMAIN_RESOURCE_PAGE_UNIT_REF_PREFIX } from '../application-documentation/technical-documentation-engine-content-bundle';\n\nimport {\n createTechnicalDocumentationRenderOutputManifestV1,\n canonicalizeTechnicalDocumentationJson,\n TechnicalDocumentationOutputKind,\n TechnicalDocumentationNormalizedRelativePathSchema,\n TechnicalDocumentationRendererKind,\n type TechnicalDocumentationAuthorizedBundleManifestV1,\n type TechnicalDocumentationRenderOutputManifestV1,\n type TechnicalDocumentationRendererExecutionV1,\n type TechnicalDocumentationVersionedIdentityV1,\n type TechnicalDocumentationResolvedAssetBundleManifestV1,\n type TechnicalDocumentationSupportedApiVersion,\n type TechnicalDocumentationUnitV1,\n} from '@wildo-ai/saas-specifications/technical-documentation';\n\n/**\n * Names opaque emitted bytes, and detects their corruption when a reader compares this against the\n * bytes it actually loaded. That two-sided check is why it survived the 2026-08-27 digest\n * demolition; its string-hashing sibling did not, because every caller of that one was recording\n * agreement between two parts of the repository rather than naming content.\n */\nexport function technicalDocumentationSha256Bytes(bytes: Uint8Array): string {\n return `sha256:${createHash('sha256').update(bytes).digest('hex')}`;\n}\n\nexport interface TechnicalDocumentationRenderModel {\n readonly authorizedBundleIdentity: TechnicalDocumentationVersionedIdentityV1;\n readonly channel: TechnicalDocumentationAuthorizedBundleManifestV1['channel'];\n readonly units: readonly TechnicalDocumentationUnitV1[];\n readonly unitPathByRef: ReadonlyMap<string, string>;\n}\n\nexport interface TechnicalDocumentationRenderedFile {\n readonly outputRef: string;\n readonly rendererRef: string;\n readonly outputKind: TechnicalDocumentationOutputKind;\n readonly sourceUnitRefs: readonly string[];\n readonly normalizedRelativePath: string;\n readonly mediaType: string;\n readonly bytes: Uint8Array;\n}\n\nexport interface TechnicalDocumentationRendererResult {\n readonly execution: TechnicalDocumentationRendererExecutionV1;\n readonly files: readonly TechnicalDocumentationRenderedFile[];\n}\n\nexport function createTechnicalDocumentationRendererExecution(input: {\n readonly rendererKind: TechnicalDocumentationRendererKind;\n readonly rendererRef: string;\n readonly rendererVersion: number;\n /** Names the renderer's configuration. `rendererRef@rendererVersion` names the implementation. */\n readonly configurationRef: string;\n}): TechnicalDocumentationRendererExecutionV1 {\n /*\n * This built two sha256 fields until 2026-08-27: one over the renderer's own function bodies\n * (`Function.prototype.toString()`), one over its configuration object. Neither was ever compared\n * to anything — they rode into the manifest beside the `rendererRef` and `rendererVersion` that\n * already say which renderer ran, in a form a reader can act on.\n */\n return {\n rendererKind: input.rendererKind,\n rendererRef: input.rendererRef,\n rendererVersion: input.rendererVersion,\n configurationRef: input.configurationRef,\n };\n}\n\nfunction slugForUnit(unit: TechnicalDocumentationUnitV1): string {\n const source = unit.unitRef.split('/').at(-1) ?? unit.unitRef;\n const slug = source.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n if (slug.length === 0) throw new Error(`technical-documentation unit ${unit.unitRef} cannot produce a stable path`);\n return slug;\n}\n\n/**\n * Every route the engine content module owns, keyed by unit slug. Exported as a SET so the\n * renderers can tell a gated page this application does not publish (flatten the link) from a\n * misspelled route (leave it for the managed-tree validator).\n */\nconst ENGINE_UNIT_PATH_BY_SLUG: Readonly<Record<string, string>> = {\n 'application-orientation': 'get-started',\n 'what-this-application-manages': 'what-this-application-manages',\n authentication: 'access-and-identity/overview',\n 'sign-in-and-mfa': 'access-and-identity/sign-in-and-mfa',\n 'complete-sign-in': 'access-and-identity/complete-sign-in',\n 'mfa-enrollment-and-recovery': 'access-and-identity/mfa-enrollment-and-recovery',\n 'sign-in-troubleshoot': 'access-and-identity/sign-in-troubleshoot',\n 'single-sign-on': 'access-and-identity/single-sign-on',\n 'sso-configure': 'access-and-identity/sso-configure',\n 'sso-rollout-and-recovery': 'access-and-identity/sso-rollout-and-recovery',\n 'sso-troubleshoot': 'access-and-identity/sso-troubleshoot',\n 'api-keys': 'access-and-identity/api-keys',\n 'api-keys-create-and-store': 'access-and-identity/api-keys-create-and-store',\n 'api-keys-lifecycle': 'access-and-identity/api-keys-lifecycle',\n 'api-keys-troubleshoot': 'access-and-identity/api-keys-troubleshoot',\n 'oauth-provider': 'access-and-identity/oauth-provider',\n 'oauth-register-client': 'access-and-identity/oauth-register-client',\n 'oauth-authorize-delegated-access': 'access-and-identity/oauth-authorize-delegated-access',\n 'oauth-operate-and-revoke': 'access-and-identity/oauth-operate-and-revoke',\n 'user-administration': 'user-administration',\n 'manage-users-manually': 'user-administration/manage-users-manually',\n 'invite-and-onboard-user': 'user-administration/invite-and-onboard-user',\n 'organization-roles': 'user-administration/roles-and-permissions',\n 'change-user-access': 'user-administration/change-user-access',\n 'manage-organization-units': 'user-administration/manage-organization-units',\n 'design-organization-unit-hierarchy': 'user-administration/design-organization-unit-hierarchy',\n 'assign-organization-unit-access': 'user-administration/assign-organization-unit-access',\n 'operate-organization-units': 'user-administration/operate-organization-units',\n 'suspend-or-remove-user': 'user-administration/suspend-or-remove-user',\n 'review-users-and-access': 'user-administration/review-users-and-access',\n 'troubleshoot-user-access': 'user-administration/troubleshoot-user-access',\n scim: 'user-administration/scim-provisioning',\n 'scim-protocol-and-payloads': 'user-administration/scim-protocol-and-payloads',\n 'scim-configure': 'user-administration/scim-configure',\n 'scim-microsoft-entra': 'user-administration/scim-microsoft-entra',\n 'scim-okta': 'user-administration/scim-okta',\n 'scim-ldap-and-active-directory': 'user-administration/scim-ldap-and-active-directory',\n 'scim-map-profile-and-units': 'user-administration/scim-map-profile-and-units',\n 'scim-validate-and-roll-out': 'user-administration/scim-validate-and-roll-out',\n 'scim-operate-and-troubleshoot': 'user-administration/scim-operate-and-troubleshoot',\n 'audit-and-siem': 'security-and-audit',\n 'investigate-audit-event': 'security-and-audit/investigate-event',\n 'review-privileged-and-access-changes': 'security-and-audit/review-access-changes',\n 'export-audit-records': 'security-and-audit/export-audit-records',\n 'configure-siem-export': 'security-and-audit/configure-siem',\n 'siem-splunk': 'security-and-audit/siem-splunk',\n 'siem-microsoft-sentinel': 'security-and-audit/siem-microsoft-sentinel',\n 'siem-elastic': 'security-and-audit/siem-elastic',\n 'operate-and-troubleshoot-siem-delivery': 'security-and-audit/operate-siem',\n 'respond-to-leaked-credential': 'security-and-audit/respond-to-leaked-credential',\n 'protect-and-retain-audit-evidence': 'security-and-audit/protect-evidence',\n integrations: 'integrations',\n 'automation-platforms': 'integrations/automation-platforms',\n 'connect-n8n': 'integrations/automation/n8n',\n 'connect-zapier': 'integrations/automation/zapier',\n 'connect-make': 'integrations/automation/make',\n 'ai-coding-tools': 'integrations/ai-coding-tools',\n 'connect-cursor': 'integrations/ai-tools/cursor',\n 'connect-codex': 'integrations/ai-tools/codex',\n 'connect-claude-code': 'integrations/ai-tools/claude-code',\n 'agent-interoperability': 'integrations/agents',\n 'mcp-integrations': 'integrations/mcp',\n 'a2a-integrations': 'integrations/a2a',\n 'first-request': 'integrations/create-your-own-integration',\n 'common-rest-api': 'integrations/rest-api',\n 'rest-api-conventions': 'integrations/rest/conventions',\n 'send-api-request': 'integrations/rest/send-request',\n 'work-with-api-collections': 'integrations/rest/read-collections',\n 'write-and-reconcile-api-changes': 'integrations/rest/write-and-reconcile',\n 'troubleshoot-api-request': 'integrations/rest/troubleshoot',\n webhooks: 'integrations/webhooks',\n 'configure-and-test-webhook-endpoint': 'integrations/webhooks/configure-and-test',\n 'verify-webhook-delivery': 'integrations/webhooks/verify-delivery',\n 'operate-webhook-deliveries': 'integrations/webhooks/operate-deliveries',\n 'troubleshoot-webhook-deliveries': 'integrations/webhooks/troubleshoot',\n};\n\nexport const ENGINE_UNIT_ROUTES: ReadonlySet<string> = new Set(Object.values(ENGINE_UNIT_PATH_BY_SLUG));\n\n/**\n * Maps a published semantic unit to its consumer navigation home.\n *\n * This is deliberately renderer-owned rather than inferred from Markdown file\n * names: the semantic unit is the stable composition input, while a renderer\n * owns audience-facing URLs. The route table is deliberately organized by a\n * customer's product responsibility—not the internal framework that implements\n * it—so readers can find access, organization, security and integration\n * material without learning Wildo vocabulary.\n *\n * One namespace is DERIVED rather than listed — `unit/manages/<resource>`, the page per\n * application resource — because those units cannot be enumerated when this file is written. An\n * application-OWNED unit still fails closed instead of acquiring an implicit route; that refusal\n * is what this table is for, and it is untouched.\n */\nfunction pathForUnit(unit: TechnicalDocumentationUnitV1): string {\n const slug = slugForUnit(unit);\n /*\n * ONE derived branch, and it is deliberately narrow.\n *\n * Every other route in this table is a constant, because a renderer owns audience-facing URLs\n * and an authored page's URL is a decision somebody made. A page per application resource cannot\n * work that way — the resources are not known when this file is written — so its route is\n * DERIVED from the reserved `unit/manages/` namespace the projector emits.\n *\n * What has NOT changed is the refusal below. A unit an application named still fails closed; the\n * generated pages are engine units carrying an application subject, which is why they can be\n * routed at all. Anything outside both the fixed table and this one namespace is still a\n * missing decision rather than an implicit URL.\n */\n if (unit.unitRef.startsWith(APPLICATION_DOMAIN_RESOURCE_PAGE_UNIT_REF_PREFIX)) {\n const resourceIdentifier = unit.unitRef.slice(APPLICATION_DOMAIN_RESOURCE_PAGE_UNIT_REF_PREFIX.length);\n if (resourceIdentifier.length === 0 || resourceIdentifier.includes('/')) {\n throw new Error(`technical-documentation generated resource unit ${unit.unitRef} has no single-segment resource identifier`);\n }\n return `${ENGINE_UNIT_PATH_BY_SLUG['what-this-application-manages']}/${resourceIdentifier}`;\n }\n if (unit.unitRef.startsWith('technical-documentation:unit/')) {\n const path = ENGINE_UNIT_PATH_BY_SLUG[slug];\n if (path !== undefined) return path;\n throw new Error(`technical-documentation framework unit ${unit.unitRef} has no consumer navigation path`);\n }\n throw new Error(`technical-documentation unit ${unit.unitRef} has no consumer navigation category`);\n}\n\nexport function createTechnicalDocumentationRenderModel(\n authorizedBundle: TechnicalDocumentationAuthorizedBundleManifestV1,\n): TechnicalDocumentationRenderModel {\n const unitPathByRef = new Map<string, string>();\n const occupiedPaths = new Set<string>();\n for (const unit of authorizedBundle.units) {\n const path = pathForUnit(unit);\n if (occupiedPaths.has(path)) throw new Error(`technical-documentation units collide on renderer path ${path}`);\n occupiedPaths.add(path);\n unitPathByRef.set(unit.unitRef, path);\n }\n return Object.freeze({\n authorizedBundleIdentity: Object.freeze({ ref: authorizedBundle.bundleRef, version: authorizedBundle.bundleVersion }),\n channel: authorizedBundle.channel,\n units: Object.freeze([...authorizedBundle.units]),\n unitPathByRef,\n });\n}\n\nexport function createTechnicalDocumentationAggregateRenderManifest(input: {\n readonly authorizedBundle: TechnicalDocumentationAuthorizedBundleManifestV1;\n readonly resolvedAssetBundle: TechnicalDocumentationResolvedAssetBundleManifestV1;\n readonly supportedApiVersion: TechnicalDocumentationSupportedApiVersion;\n readonly rendererResults: readonly TechnicalDocumentationRendererResult[];\n /** This render's own identity; the publication pointer selects a render by it. */\n readonly renderRef: string;\n readonly renderVersion: number;\n}): TechnicalDocumentationRenderOutputManifestV1 {\n const rendererExecutions = input.rendererResults.map((result) => result.execution);\n const outputs = input.rendererResults.flatMap((result) => result.files.map((file) => ({\n outputRef: file.outputRef,\n rendererRef: file.rendererRef,\n outputKind: file.outputKind,\n sourceUnitRefs: [...file.sourceUnitRefs],\n normalizedRelativePath: TechnicalDocumentationNormalizedRelativePathSchema.parse(file.normalizedRelativePath),\n mediaType: file.mediaType,\n byteLength: file.bytes.byteLength,\n byteDigest: technicalDocumentationSha256Bytes(file.bytes),\n })));\n return createTechnicalDocumentationRenderOutputManifestV1({\n schemaVersion: 1,\n renderRef: input.renderRef,\n renderVersion: input.renderVersion,\n authorizedBundleIdentity: { ref: input.authorizedBundle.bundleRef, version: input.authorizedBundle.bundleVersion },\n resolvedAssetBundleIdentity: { ref: input.resolvedAssetBundle.assetBundleRef, version: input.resolvedAssetBundle.assetBundleVersion },\n supportedApiVersion: input.supportedApiVersion,\n rendererExecutions,\n outputs,\n });\n}\n"]}
@@ -1,3 +1,13 @@
1
1
  import { type TechnicalDocumentationRenderModel, type TechnicalDocumentationRendererResult } from './technical-documentation-render-model';
2
+ /**
3
+ * The ONE index the site reads: `indexes/search.json`, imported by the application's own
4
+ * `src/pages/search.tsx`.
5
+ *
6
+ * A second `indexes/navigation.json` was emitted here and read by nothing — measured with a positive
7
+ * control, so the empty result is a real absence rather than a bad probe. The site's navigation is
8
+ * the Docusaurus sidebar, which the Docusaurus renderer emits; a second navigation index was a
9
+ * record with no reader (#274, and `application-creation-directive.md`: if we write a record,
10
+ * something reads it).
11
+ */
2
12
  export declare function renderTechnicalDocumentationSearchIndexes(model: TechnicalDocumentationRenderModel): TechnicalDocumentationRendererResult;
3
13
  //# sourceMappingURL=technical-documentation-search-index-renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"technical-documentation-search-index-renderer.d.ts","sourceRoot":"","sources":["../../../../../src/companion/rendering/technical-documentation-search-index-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,iCAAiC,EACtC,KAAK,oCAAoC,EAC1C,MAAM,wCAAwC,CAAC;AAIhD,wBAAgB,yCAAyC,CAAC,KAAK,EAAE,iCAAiC,GAAG,oCAAoC,CA4CxI"}
1
+ {"version":3,"file":"technical-documentation-search-index-renderer.d.ts","sourceRoot":"","sources":["../../../../../src/companion/rendering/technical-documentation-search-index-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,iCAAiC,EACtC,KAAK,oCAAoC,EAC1C,MAAM,wCAAwC,CAAC;AAIhD;;;;;;;;;GASG;AACH,wBAAgB,yCAAyC,CAAC,KAAK,EAAE,iCAAiC,GAAG,oCAAoC,CA6BxI"}
@@ -1,14 +1,18 @@
1
1
  import { TechnicalDocumentationOutputKind, TechnicalDocumentationRendererKind } from '@wildo-ai/saas-specifications/technical-documentation';
2
2
  import { createTechnicalDocumentationRendererExecution, } from './technical-documentation-render-model.js';
3
3
  const SEARCH_RENDERER_REF = 'technical-documentation:renderer/search-index';
4
+ /**
5
+ * The ONE index the site reads: `indexes/search.json`, imported by the application's own
6
+ * `src/pages/search.tsx`.
7
+ *
8
+ * A second `indexes/navigation.json` was emitted here and read by nothing — measured with a positive
9
+ * control, so the empty result is a real absence rather than a bad probe. The site's navigation is
10
+ * the Docusaurus sidebar, which the Docusaurus renderer emits; a second navigation index was a
11
+ * record with no reader (#274, and `application-creation-directive.md`: if we write a record,
12
+ * something reads it).
13
+ */
4
14
  export function renderTechnicalDocumentationSearchIndexes(model) {
5
15
  const sourceUnitRefs = model.units.map((unit) => unit.unitRef);
6
- const navigation = model.units.map((unit) => ({
7
- unitRef: unit.unitRef,
8
- title: unit.title,
9
- kind: unit.kind,
10
- path: `/${model.unitPathByRef.get(unit.unitRef)}`,
11
- }));
12
16
  const search = model.units.map((unit) => ({
13
17
  unitRef: unit.unitRef,
14
18
  title: unit.title,
@@ -25,15 +29,6 @@ export function renderTechnicalDocumentationSearchIndexes(model) {
25
29
  configurationRef: 'technical-documentation:renderer-configuration/search-index-json-v1',
26
30
  }),
27
31
  files: [
28
- {
29
- outputRef: 'technical-documentation:output/navigation-index',
30
- rendererRef: SEARCH_RENDERER_REF,
31
- outputKind: TechnicalDocumentationOutputKind.NAVIGATION_INDEX,
32
- sourceUnitRefs,
33
- normalizedRelativePath: 'indexes/navigation.json',
34
- mediaType: 'application/json',
35
- bytes: Buffer.from(`${JSON.stringify({ schemaVersion: 1, units: navigation }, null, 2)}\n`, 'utf8'),
36
- },
37
32
  {
38
33
  outputRef: 'technical-documentation:output/search-index',
39
34
  rendererRef: SEARCH_RENDERER_REF,
@@ -1 +1 @@
1
- {"version":3,"file":"technical-documentation-search-index-renderer.js","sourceRoot":"","sources":["../../../../../src/companion/rendering/technical-documentation-search-index-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,kCAAkC,EAAE,MAAM,uDAAuD,CAAC;AAE7I,OAAO,EACL,6CAA6C,GAG9C,MAAM,wCAAwC,CAAC;AAEhD,MAAM,mBAAmB,GAAG,+CAA+C,CAAC;AAE5E,MAAM,UAAU,yCAAyC,CAAC,KAAwC;IAChG,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5C,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;KAClD,CAAC,CAAC,CAAC;IACJ,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;QACzD,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,IAAI,EAAE,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;KAClD,CAAC,CAAC,CAAC;IACJ,OAAO;QACL,SAAS,EAAE,6CAA6C,CAAC;YACvD,YAAY,EAAE,kCAAkC,CAAC,QAAQ;YACzD,WAAW,EAAE,mBAAmB;YAChC,eAAe,EAAE,CAAC;YAClB,gBAAgB,EAAE,qEAAqE;SACxF,CAAC;QACF,KAAK,EAAE;YACL;gBACE,SAAS,EAAE,iDAAiD;gBAC5D,WAAW,EAAE,mBAAmB;gBAChC,UAAU,EAAE,gCAAgC,CAAC,gBAAgB;gBAC7D,cAAc;gBACd,sBAAsB,EAAE,yBAAyB;gBACjD,SAAS,EAAE,kBAAkB;gBAC7B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;aACpG;YACD;gBACE,SAAS,EAAE,6CAA6C;gBACxD,WAAW,EAAE,mBAAmB;gBAChC,UAAU,EAAE,gCAAgC,CAAC,gBAAgB;gBAC7D,cAAc;gBACd,sBAAsB,EAAE,qBAAqB;gBAC7C,SAAS,EAAE,kBAAkB;gBAC7B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;aAChG;SACF;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { TechnicalDocumentationOutputKind, TechnicalDocumentationRendererKind } from '@wildo-ai/saas-specifications/technical-documentation';\n\nimport {\n createTechnicalDocumentationRendererExecution,\n type TechnicalDocumentationRenderModel,\n type TechnicalDocumentationRendererResult,\n} from './technical-documentation-render-model';\n\nconst SEARCH_RENDERER_REF = 'technical-documentation:renderer/search-index';\n\nexport function renderTechnicalDocumentationSearchIndexes(model: TechnicalDocumentationRenderModel): TechnicalDocumentationRendererResult {\n const sourceUnitRefs = model.units.map((unit) => unit.unitRef);\n const navigation = model.units.map((unit) => ({\n unitRef: unit.unitRef,\n title: unit.title,\n kind: unit.kind,\n path: `/${model.unitPathByRef.get(unit.unitRef)}`,\n }));\n const search = model.units.map((unit) => ({\n unitRef: unit.unitRef,\n title: unit.title,\n summary: unit.summary,\n headings: unit.sections.map((section) => section.heading),\n readerAudiences: unit.readerAudiences,\n path: `/${model.unitPathByRef.get(unit.unitRef)}`,\n }));\n return {\n execution: createTechnicalDocumentationRendererExecution({\n rendererKind: TechnicalDocumentationRendererKind.MARKDOWN,\n rendererRef: SEARCH_RENDERER_REF,\n rendererVersion: 1,\n configurationRef: 'technical-documentation:renderer-configuration/search-index-json-v1',\n }),\n files: [\n {\n outputRef: 'technical-documentation:output/navigation-index',\n rendererRef: SEARCH_RENDERER_REF,\n outputKind: TechnicalDocumentationOutputKind.NAVIGATION_INDEX,\n sourceUnitRefs,\n normalizedRelativePath: 'indexes/navigation.json',\n mediaType: 'application/json',\n bytes: Buffer.from(`${JSON.stringify({ schemaVersion: 1, units: navigation }, null, 2)}\\n`, 'utf8'),\n },\n {\n outputRef: 'technical-documentation:output/search-index',\n rendererRef: SEARCH_RENDERER_REF,\n outputKind: TechnicalDocumentationOutputKind.NAVIGATION_INDEX,\n sourceUnitRefs,\n normalizedRelativePath: 'indexes/search.json',\n mediaType: 'application/json',\n bytes: Buffer.from(`${JSON.stringify({ schemaVersion: 1, units: search }, null, 2)}\\n`, 'utf8'),\n },\n ],\n };\n}\n"]}
1
+ {"version":3,"file":"technical-documentation-search-index-renderer.js","sourceRoot":"","sources":["../../../../../src/companion/rendering/technical-documentation-search-index-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,kCAAkC,EAAE,MAAM,uDAAuD,CAAC;AAE7I,OAAO,EACL,6CAA6C,GAG9C,MAAM,wCAAwC,CAAC;AAEhD,MAAM,mBAAmB,GAAG,+CAA+C,CAAC;AAE5E;;;;;;;;;GASG;AACH,MAAM,UAAU,yCAAyC,CAAC,KAAwC;IAChG,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;QACzD,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,IAAI,EAAE,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;KAClD,CAAC,CAAC,CAAC;IACJ,OAAO;QACL,SAAS,EAAE,6CAA6C,CAAC;YACvD,YAAY,EAAE,kCAAkC,CAAC,QAAQ;YACzD,WAAW,EAAE,mBAAmB;YAChC,eAAe,EAAE,CAAC;YAClB,gBAAgB,EAAE,qEAAqE;SACxF,CAAC;QACF,KAAK,EAAE;YACL;gBACE,SAAS,EAAE,6CAA6C;gBACxD,WAAW,EAAE,mBAAmB;gBAChC,UAAU,EAAE,gCAAgC,CAAC,gBAAgB;gBAC7D,cAAc;gBACd,sBAAsB,EAAE,qBAAqB;gBAC7C,SAAS,EAAE,kBAAkB;gBAC7B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;aAChG;SACF;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { TechnicalDocumentationOutputKind, TechnicalDocumentationRendererKind } from '@wildo-ai/saas-specifications/technical-documentation';\n\nimport {\n createTechnicalDocumentationRendererExecution,\n type TechnicalDocumentationRenderModel,\n type TechnicalDocumentationRendererResult,\n} from './technical-documentation-render-model';\n\nconst SEARCH_RENDERER_REF = 'technical-documentation:renderer/search-index';\n\n/**\n * The ONE index the site reads: `indexes/search.json`, imported by the application's own\n * `src/pages/search.tsx`.\n *\n * A second `indexes/navigation.json` was emitted here and read by nothing — measured with a positive\n * control, so the empty result is a real absence rather than a bad probe. The site's navigation is\n * the Docusaurus sidebar, which the Docusaurus renderer emits; a second navigation index was a\n * record with no reader (#274, and `application-creation-directive.md`: if we write a record,\n * something reads it).\n */\nexport function renderTechnicalDocumentationSearchIndexes(model: TechnicalDocumentationRenderModel): TechnicalDocumentationRendererResult {\n const sourceUnitRefs = model.units.map((unit) => unit.unitRef);\n const search = model.units.map((unit) => ({\n unitRef: unit.unitRef,\n title: unit.title,\n summary: unit.summary,\n headings: unit.sections.map((section) => section.heading),\n readerAudiences: unit.readerAudiences,\n path: `/${model.unitPathByRef.get(unit.unitRef)}`,\n }));\n return {\n execution: createTechnicalDocumentationRendererExecution({\n rendererKind: TechnicalDocumentationRendererKind.MARKDOWN,\n rendererRef: SEARCH_RENDERER_REF,\n rendererVersion: 1,\n configurationRef: 'technical-documentation:renderer-configuration/search-index-json-v1',\n }),\n files: [\n {\n outputRef: 'technical-documentation:output/search-index',\n rendererRef: SEARCH_RENDERER_REF,\n outputKind: TechnicalDocumentationOutputKind.NAVIGATION_INDEX,\n sourceUnitRefs,\n normalizedRelativePath: 'indexes/search.json',\n mediaType: 'application/json',\n bytes: Buffer.from(`${JSON.stringify({ schemaVersion: 1, units: search }, null, 2)}\\n`, 'utf8'),\n },\n ],\n };\n}\n"]}
@@ -7,7 +7,33 @@ export interface TechnicalDocumentationCaptureExecutionResult {
7
7
  readonly receipt: TechnicalDocumentationCaptureReceiptV1;
8
8
  readonly outputBytes: Uint8Array;
9
9
  }
10
- /** Production-neutral execution port implemented by the Node-only Playwright capture package. */
10
+ /**
11
+ * Production-neutral execution port implemented by the Node-only Playwright capture package.
12
+ *
13
+ * ## Nothing in this repository injects an implementation, and that is a DECISION
14
+ *
15
+ * `@wildo-ai/technical-documentation-capture` implements this port, is built, and is tested in CI —
16
+ * and no package declares a dependency on it. Read as an orphan that is an oversight; it is not.
17
+ *
18
+ * - **It carries Playwright.** The companion is delivered as a dist artifact into every generated
19
+ * application, so wiring the implementation there would put a browser download into every
20
+ * application that never captures anything.
21
+ * `technical-documentation-capture-dependency-closure.test.ts` pins the quarantine from the other
22
+ * side: the package must stay absent from every engine and generated-application runtime manifest.
23
+ * - **The port is the cheap half.** A capture needs six APPLICATION-owned bindings
24
+ * (`TechnicalDocumentationPlaywrightCaptureBindings`): a base URL, a semantic-target path, an
25
+ * authenticated storage state, a landmark, a font profile and an allowed-origin set. That is a
26
+ * live stack, a provisioned tenant and a logged-in session — an environment, not an import.
27
+ *
28
+ * So an unavailable capture SKIPS rather than blocks: the pilot assets resolver ships a PLACEHOLDER
29
+ * for a `PRODUCT_SCREENSHOT`/`PLAYWRIGHT_CAPTURE` request, the asset stays REQUIRED, and whether
30
+ * provisional imagery may actually ship is decided at publication by the environment
31
+ * (`--refuse-provisional-assets`), never here. Framework-owned figures do not depend on any of this
32
+ * — a `DIAGRAM`/`DETERMINISTIC_RENDER` request materializes real SVG bytes with no browser at all.
33
+ *
34
+ * When an application does bind a capture, it constructs the implementation itself and hands it in.
35
+ * That is the seam this interface exists for; do not "fix" the missing dependency by adding one.
36
+ */
11
37
  export interface TechnicalDocumentationCaptureExecutionPort {
12
38
  execute(request: TechnicalDocumentationCaptureExecutionRequestV1): Promise<TechnicalDocumentationCaptureExecutionResult>;
13
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"technical-documentation-capture-execution-port.d.ts","sourceRoot":"","sources":["../../../../src/companion/technical-documentation-capture-execution-port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,+CAA+C,EAC/C,sCAAsC,EACvC,MAAM,uDAAuD,CAAC;AAE/D;;;GAGG;AACH,MAAM,WAAW,4CAA4C;IAC3D,QAAQ,CAAC,OAAO,EAAE,sCAAsC,CAAC;IACzD,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;CAClC;AAED,iGAAiG;AACjG,MAAM,WAAW,0CAA0C;IACzD,OAAO,CAAC,OAAO,EAAE,+CAA+C,GAAG,OAAO,CAAC,4CAA4C,CAAC,CAAC;CAC1H"}
1
+ {"version":3,"file":"technical-documentation-capture-execution-port.d.ts","sourceRoot":"","sources":["../../../../src/companion/technical-documentation-capture-execution-port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,+CAA+C,EAC/C,sCAAsC,EACvC,MAAM,uDAAuD,CAAC;AAE/D;;;GAGG;AACH,MAAM,WAAW,4CAA4C;IAC3D,QAAQ,CAAC,OAAO,EAAE,sCAAsC,CAAC;IACzD,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,0CAA0C;IACzD,OAAO,CAAC,OAAO,EAAE,+CAA+C,GAAG,OAAO,CAAC,4CAA4C,CAAC,CAAC;CAC1H"}
@@ -1 +1 @@
1
- {"version":3,"file":"technical-documentation-capture-execution-port.js","sourceRoot":"","sources":["../../../../src/companion/technical-documentation-capture-execution-port.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n TechnicalDocumentationCaptureExecutionRequestV1,\n TechnicalDocumentationCaptureReceiptV1,\n} from '@wildo-ai/saas-specifications/technical-documentation';\n\n/**\n * Result returned before the application-owned publication transaction writes any byte. Keeping bytes in memory at this seam prevents the reusable capture\n * implementation from choosing an application output root or bypassing complete-tree staging.\n */\nexport interface TechnicalDocumentationCaptureExecutionResult {\n readonly receipt: TechnicalDocumentationCaptureReceiptV1;\n readonly outputBytes: Uint8Array;\n}\n\n/** Production-neutral execution port implemented by the Node-only Playwright capture package. */\nexport interface TechnicalDocumentationCaptureExecutionPort {\n execute(request: TechnicalDocumentationCaptureExecutionRequestV1): Promise<TechnicalDocumentationCaptureExecutionResult>;\n}\n"]}
1
+ {"version":3,"file":"technical-documentation-capture-execution-port.js","sourceRoot":"","sources":["../../../../src/companion/technical-documentation-capture-execution-port.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n TechnicalDocumentationCaptureExecutionRequestV1,\n TechnicalDocumentationCaptureReceiptV1,\n} from '@wildo-ai/saas-specifications/technical-documentation';\n\n/**\n * Result returned before the application-owned publication transaction writes any byte. Keeping bytes in memory at this seam prevents the reusable capture\n * implementation from choosing an application output root or bypassing complete-tree staging.\n */\nexport interface TechnicalDocumentationCaptureExecutionResult {\n readonly receipt: TechnicalDocumentationCaptureReceiptV1;\n readonly outputBytes: Uint8Array;\n}\n\n/**\n * Production-neutral execution port implemented by the Node-only Playwright capture package.\n *\n * ## Nothing in this repository injects an implementation, and that is a DECISION\n *\n * `@wildo-ai/technical-documentation-capture` implements this port, is built, and is tested in CI —\n * and no package declares a dependency on it. Read as an orphan that is an oversight; it is not.\n *\n * - **It carries Playwright.** The companion is delivered as a dist artifact into every generated\n * application, so wiring the implementation there would put a browser download into every\n * application that never captures anything.\n * `technical-documentation-capture-dependency-closure.test.ts` pins the quarantine from the other\n * side: the package must stay absent from every engine and generated-application runtime manifest.\n * - **The port is the cheap half.** A capture needs six APPLICATION-owned bindings\n * (`TechnicalDocumentationPlaywrightCaptureBindings`): a base URL, a semantic-target path, an\n * authenticated storage state, a landmark, a font profile and an allowed-origin set. That is a\n * live stack, a provisioned tenant and a logged-in session — an environment, not an import.\n *\n * So an unavailable capture SKIPS rather than blocks: the pilot assets resolver ships a PLACEHOLDER\n * for a `PRODUCT_SCREENSHOT`/`PLAYWRIGHT_CAPTURE` request, the asset stays REQUIRED, and whether\n * provisional imagery may actually ship is decided at publication by the environment\n * (`--refuse-provisional-assets`), never here. Framework-owned figures do not depend on any of this\n * — a `DIAGRAM`/`DETERMINISTIC_RENDER` request materializes real SVG bytes with no browser at all.\n *\n * When an application does bind a capture, it constructs the implementation itself and hands it in.\n * That is the seam this interface exists for; do not \"fix\" the missing dependency by adding one.\n */\nexport interface TechnicalDocumentationCaptureExecutionPort {\n execute(request: TechnicalDocumentationCaptureExecutionRequestV1): Promise<TechnicalDocumentationCaptureExecutionResult>;\n}\n"]}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Diagram DECLARATIONS — what a diagram IS, and the asset request that asks for one.
3
+ *
4
+ * Split out of `technical-documentation-diagram-materializer.ts` on 2026-09-08 to break a genuine
5
+ * import cycle, and the split is the right shape independently of it. The materializer needs
6
+ * `technicalDocumentationSha256Bytes` from the render model; the render model imports the engine
7
+ * content bundle; and the content bundle now names a diagram in a unit definition it builds AT
8
+ * MODULE LOAD (#474). That closes the loop, and the symptom was not a resolution error but
9
+ * `createTechnicalDocumentationApplicationRequestDiagramAssetRequest is not a function` — the
10
+ * factory evaluated as `undefined` several frames from the cause.
11
+ *
12
+ * So: DECLARING a diagram needs nothing but the specifications vocabulary, and MATERIALIZING one
13
+ * needs a hash. Only the second belongs downstream of the render model.
14
+ */
15
+ import { type TechnicalDocumentationAssetRequestV1 } from '@wildo-ai/saas-specifications/technical-documentation';
16
+ export interface TechnicalDocumentationDiagramNode {
17
+ readonly nodeRef: string;
18
+ readonly label: string;
19
+ }
20
+ export interface TechnicalDocumentationDiagramEdge {
21
+ readonly fromNodeRef: string;
22
+ readonly toNodeRef: string;
23
+ readonly label: string;
24
+ }
25
+ export interface TechnicalDocumentationDiagramDefinition {
26
+ readonly diagramRef: string;
27
+ readonly title: string;
28
+ readonly nodes: readonly TechnicalDocumentationDiagramNode[];
29
+ readonly edges: readonly TechnicalDocumentationDiagramEdge[];
30
+ }
31
+ export declare const TECHNICAL_DOCUMENTATION_APPLICATION_REQUEST_DIAGRAM_V1: TechnicalDocumentationDiagramDefinition;
32
+ export declare function createTechnicalDocumentationApplicationRequestDiagramAssetRequest(): TechnicalDocumentationAssetRequestV1;
33
+ //# sourceMappingURL=technical-documentation-diagram-definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"technical-documentation-diagram-definitions.d.ts","sourceRoot":"","sources":["../../../../src/companion/technical-documentation-diagram-definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAML,KAAK,oCAAoC,EAC1C,MAAM,uDAAuD,CAAC;AAE/D,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uCAAuC;IACtD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,iCAAiC,EAAE,CAAC;IAC7D,QAAQ,CAAC,KAAK,EAAE,SAAS,iCAAiC,EAAE,CAAC;CAC9D;AAED,eAAO,MAAM,sDAAsD,EAAE,uCAYnE,CAAC;AAEH,wBAAgB,iEAAiE,IAAI,oCAAoC,CAwBxH"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Diagram DECLARATIONS — what a diagram IS, and the asset request that asks for one.
3
+ *
4
+ * Split out of `technical-documentation-diagram-materializer.ts` on 2026-09-08 to break a genuine
5
+ * import cycle, and the split is the right shape independently of it. The materializer needs
6
+ * `technicalDocumentationSha256Bytes` from the render model; the render model imports the engine
7
+ * content bundle; and the content bundle now names a diagram in a unit definition it builds AT
8
+ * MODULE LOAD (#474). That closes the loop, and the symptom was not a resolution error but
9
+ * `createTechnicalDocumentationApplicationRequestDiagramAssetRequest is not a function` — the
10
+ * factory evaluated as `undefined` several frames from the cause.
11
+ *
12
+ * So: DECLARING a diagram needs nothing but the specifications vocabulary, and MATERIALIZING one
13
+ * needs a hash. Only the second belongs downstream of the render model.
14
+ */
15
+ import { TechnicalDocumentationAssetAccessClass, TechnicalDocumentationAssetKind, TechnicalDocumentationAssetOrigin, TechnicalDocumentationAssetRequiredness, TechnicalDocumentationAssetRightsBasis, } from '@wildo-ai/saas-specifications/technical-documentation';
16
+ export const TECHNICAL_DOCUMENTATION_APPLICATION_REQUEST_DIAGRAM_V1 = Object.freeze({
17
+ diagramRef: 'technical-documentation:diagram/application-api-request',
18
+ title: 'From client to application API',
19
+ nodes: Object.freeze([
20
+ { nodeRef: 'technical-documentation:diagram-node/client', label: 'Client or service' },
21
+ { nodeRef: 'technical-documentation:diagram-node/application-api', label: 'Application API' },
22
+ { nodeRef: 'technical-documentation:diagram-node/resource', label: 'Documented resource' },
23
+ ]),
24
+ edges: Object.freeze([
25
+ { fromNodeRef: 'technical-documentation:diagram-node/client', toNodeRef: 'technical-documentation:diagram-node/application-api', label: 'Authenticated request' },
26
+ { fromNodeRef: 'technical-documentation:diagram-node/application-api', toNodeRef: 'technical-documentation:diagram-node/resource', label: 'Authorized operation' },
27
+ ]),
28
+ });
29
+ export function createTechnicalDocumentationApplicationRequestDiagramAssetRequest() {
30
+ return {
31
+ assetRef: 'technical-documentation:asset/application-api-request-diagram',
32
+ kind: TechnicalDocumentationAssetKind.DIAGRAM,
33
+ origin: TechnicalDocumentationAssetOrigin.DETERMINISTIC_RENDER,
34
+ accessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,
35
+ requiredness: TechnicalDocumentationAssetRequiredness.REQUIRED,
36
+ rights: {
37
+ basis: TechnicalDocumentationAssetRightsBasis.ENGINE_AUTHORED,
38
+ authorityRef: 'technical-documentation:rights/engine-authored-diagram',
39
+ },
40
+ sourceAccessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,
41
+ viewedTenantAccessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,
42
+ roleAccessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,
43
+ captureOrRenderProfileRef: 'technical-documentation:renderer/deterministic-svg-v1',
44
+ /*
45
+ * The definition this diagram depicts, NAMED. It was a sha256 of the definition until
46
+ * 2026-08-27 — computed here by calling the materializer, then compared by the pilot against
47
+ * the value the same materializer returned over the same frozen constant. A value compared
48
+ * with itself.
49
+ */
50
+ semanticInputRef: TECHNICAL_DOCUMENTATION_APPLICATION_REQUEST_DIAGRAM_V1.diagramRef,
51
+ altText: 'A client sends an authenticated request through the application API to a documented resource.',
52
+ };
53
+ }
54
+ //# sourceMappingURL=technical-documentation-diagram-definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"technical-documentation-diagram-definitions.js","sourceRoot":"","sources":["../../../../src/companion/technical-documentation-diagram-definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EACL,sCAAsC,EACtC,+BAA+B,EAC/B,iCAAiC,EACjC,uCAAuC,EACvC,sCAAsC,GAEvC,MAAM,uDAAuD,CAAC;AAoB/D,MAAM,CAAC,MAAM,sDAAsD,GAA4C,MAAM,CAAC,MAAM,CAAC;IAC3H,UAAU,EAAE,yDAAyD;IACrE,KAAK,EAAE,gCAAgC;IACvC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,OAAO,EAAE,6CAA6C,EAAE,KAAK,EAAE,mBAAmB,EAAE;QACtF,EAAE,OAAO,EAAE,sDAAsD,EAAE,KAAK,EAAE,iBAAiB,EAAE;QAC7F,EAAE,OAAO,EAAE,+CAA+C,EAAE,KAAK,EAAE,qBAAqB,EAAE;KAC3F,CAAC;IACF,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,WAAW,EAAE,6CAA6C,EAAE,SAAS,EAAE,sDAAsD,EAAE,KAAK,EAAE,uBAAuB,EAAE;QACjK,EAAE,WAAW,EAAE,sDAAsD,EAAE,SAAS,EAAE,+CAA+C,EAAE,KAAK,EAAE,sBAAsB,EAAE;KACnK,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,UAAU,iEAAiE;IAC/E,OAAO;QACL,QAAQ,EAAE,+DAA+D;QACzE,IAAI,EAAE,+BAA+B,CAAC,OAAO;QAC7C,MAAM,EAAE,iCAAiC,CAAC,oBAAoB;QAC9D,WAAW,EAAE,sCAAsC,CAAC,MAAM;QAC1D,YAAY,EAAE,uCAAuC,CAAC,QAAQ;QAC9D,MAAM,EAAE;YACN,KAAK,EAAE,sCAAsC,CAAC,eAAe;YAC7D,YAAY,EAAE,wDAAwD;SACvE;QACD,iBAAiB,EAAE,sCAAsC,CAAC,MAAM;QAChE,uBAAuB,EAAE,sCAAsC,CAAC,MAAM;QACtE,eAAe,EAAE,sCAAsC,CAAC,MAAM;QAC9D,yBAAyB,EAAE,uDAAuD;QAClF;;;;;WAKG;QACH,gBAAgB,EAAE,sDAAsD,CAAC,UAAU;QACnF,OAAO,EAAE,+FAA+F;KACzG,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Diagram DECLARATIONS — what a diagram IS, and the asset request that asks for one.\n *\n * Split out of `technical-documentation-diagram-materializer.ts` on 2026-09-08 to break a genuine\n * import cycle, and the split is the right shape independently of it. The materializer needs\n * `technicalDocumentationSha256Bytes` from the render model; the render model imports the engine\n * content bundle; and the content bundle now names a diagram in a unit definition it builds AT\n * MODULE LOAD (#474). That closes the loop, and the symptom was not a resolution error but\n * `createTechnicalDocumentationApplicationRequestDiagramAssetRequest is not a function` — the\n * factory evaluated as `undefined` several frames from the cause.\n *\n * So: DECLARING a diagram needs nothing but the specifications vocabulary, and MATERIALIZING one\n * needs a hash. Only the second belongs downstream of the render model.\n */\nimport {\n TechnicalDocumentationAssetAccessClass,\n TechnicalDocumentationAssetKind,\n TechnicalDocumentationAssetOrigin,\n TechnicalDocumentationAssetRequiredness,\n TechnicalDocumentationAssetRightsBasis,\n type TechnicalDocumentationAssetRequestV1,\n} from '@wildo-ai/saas-specifications/technical-documentation';\n\nexport interface TechnicalDocumentationDiagramNode {\n readonly nodeRef: string;\n readonly label: string;\n}\n\nexport interface TechnicalDocumentationDiagramEdge {\n readonly fromNodeRef: string;\n readonly toNodeRef: string;\n readonly label: string;\n}\n\nexport interface TechnicalDocumentationDiagramDefinition {\n readonly diagramRef: string;\n readonly title: string;\n readonly nodes: readonly TechnicalDocumentationDiagramNode[];\n readonly edges: readonly TechnicalDocumentationDiagramEdge[];\n}\n\nexport const TECHNICAL_DOCUMENTATION_APPLICATION_REQUEST_DIAGRAM_V1: TechnicalDocumentationDiagramDefinition = Object.freeze({\n diagramRef: 'technical-documentation:diagram/application-api-request',\n title: 'From client to application API',\n nodes: Object.freeze([\n { nodeRef: 'technical-documentation:diagram-node/client', label: 'Client or service' },\n { nodeRef: 'technical-documentation:diagram-node/application-api', label: 'Application API' },\n { nodeRef: 'technical-documentation:diagram-node/resource', label: 'Documented resource' },\n ]),\n edges: Object.freeze([\n { fromNodeRef: 'technical-documentation:diagram-node/client', toNodeRef: 'technical-documentation:diagram-node/application-api', label: 'Authenticated request' },\n { fromNodeRef: 'technical-documentation:diagram-node/application-api', toNodeRef: 'technical-documentation:diagram-node/resource', label: 'Authorized operation' },\n ]),\n});\n\nexport function createTechnicalDocumentationApplicationRequestDiagramAssetRequest(): TechnicalDocumentationAssetRequestV1 {\n return {\n assetRef: 'technical-documentation:asset/application-api-request-diagram',\n kind: TechnicalDocumentationAssetKind.DIAGRAM,\n origin: TechnicalDocumentationAssetOrigin.DETERMINISTIC_RENDER,\n accessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,\n requiredness: TechnicalDocumentationAssetRequiredness.REQUIRED,\n rights: {\n basis: TechnicalDocumentationAssetRightsBasis.ENGINE_AUTHORED,\n authorityRef: 'technical-documentation:rights/engine-authored-diagram',\n },\n sourceAccessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,\n viewedTenantAccessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,\n roleAccessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,\n captureOrRenderProfileRef: 'technical-documentation:renderer/deterministic-svg-v1',\n /*\n * The definition this diagram depicts, NAMED. It was a sha256 of the definition until\n * 2026-08-27 — computed here by calling the materializer, then compared by the pilot against\n * the value the same materializer returned over the same frozen constant. A value compared\n * with itself.\n */\n semanticInputRef: TECHNICAL_DOCUMENTATION_APPLICATION_REQUEST_DIAGRAM_V1.diagramRef,\n altText: 'A client sends an authenticated request through the application API to a documented resource.',\n };\n}\n\n"]}
@@ -1,21 +1,13 @@
1
- import { type TechnicalDocumentationAssetRequestV1 } from '@wildo-ai/saas-specifications/technical-documentation';
2
- export interface TechnicalDocumentationDiagramNode {
3
- readonly nodeRef: string;
4
- readonly label: string;
5
- }
6
- export interface TechnicalDocumentationDiagramEdge {
7
- readonly fromNodeRef: string;
8
- readonly toNodeRef: string;
9
- readonly label: string;
10
- }
11
- export interface TechnicalDocumentationDiagramDefinition {
12
- readonly diagramRef: string;
13
- readonly title: string;
14
- readonly nodes: readonly TechnicalDocumentationDiagramNode[];
15
- readonly edges: readonly TechnicalDocumentationDiagramEdge[];
16
- }
17
- export declare const TECHNICAL_DOCUMENTATION_APPLICATION_REQUEST_DIAGRAM_V1: TechnicalDocumentationDiagramDefinition;
18
- export declare function createTechnicalDocumentationApplicationRequestDiagramAssetRequest(): TechnicalDocumentationAssetRequestV1;
1
+ /**
2
+ * Deterministic diagram MATERIALIZATION — declaration in, SVG bytes out.
3
+ *
4
+ * The declarations themselves live in `./technical-documentation-diagram-definitions`, which this
5
+ * module re-exports so every existing consumer and the package barrel are unchanged. See that
6
+ * file's header for why they were split: this one imports the render model for hashing, the render
7
+ * model imports the engine content bundle, and the content bundle names a diagram at module load.
8
+ */
9
+ import type { TechnicalDocumentationDiagramDefinition } from './technical-documentation-diagram-definitions';
10
+ export * from './technical-documentation-diagram-definitions';
19
11
  /** A dependency-free deterministic SVG materializer; no layout engine or runtime font metrics participate in its bytes. */
20
12
  export declare function materializeTechnicalDocumentationDiagram(definition: TechnicalDocumentationDiagramDefinition): {
21
13
  readonly bytes: Uint8Array;
@@ -1 +1 @@
1
- {"version":3,"file":"technical-documentation-diagram-materializer.d.ts","sourceRoot":"","sources":["../../../../src/companion/technical-documentation-diagram-materializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,oCAAoC,EAC1C,MAAM,uDAAuD,CAAC;AAI/D,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uCAAuC;IACtD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,iCAAiC,EAAE,CAAC;IAC7D,QAAQ,CAAC,KAAK,EAAE,SAAS,iCAAiC,EAAE,CAAC;CAC9D;AAED,eAAO,MAAM,sDAAsD,EAAE,uCAYnE,CAAC;AAEH,wBAAgB,iEAAiE,IAAI,oCAAoC,CAwBxH;AAMD,2HAA2H;AAC3H,wBAAgB,wCAAwC,CAAC,UAAU,EAAE,uCAAuC,GAAG;IAC7G,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;CACrC,CA+BA"}
1
+ {"version":3,"file":"technical-documentation-diagram-materializer.d.ts","sourceRoot":"","sources":["../../../../src/companion/technical-documentation-diagram-materializer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,+CAA+C,CAAC;AAE7G,cAAc,+CAA+C,CAAC;AAM9D,2HAA2H;AAC3H,wBAAgB,wCAAwC,CAAC,UAAU,EAAE,uCAAuC,GAAG;IAC7G,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;CACrC,CA+BA"}
@@ -1,43 +1,13 @@
1
- import { TechnicalDocumentationAssetAccessClass, TechnicalDocumentationAssetKind, TechnicalDocumentationAssetOrigin, TechnicalDocumentationAssetRequiredness, TechnicalDocumentationAssetRightsBasis, } from '@wildo-ai/saas-specifications/technical-documentation';
1
+ /**
2
+ * Deterministic diagram MATERIALIZATION — declaration in, SVG bytes out.
3
+ *
4
+ * The declarations themselves live in `./technical-documentation-diagram-definitions`, which this
5
+ * module re-exports so every existing consumer and the package barrel are unchanged. See that
6
+ * file's header for why they were split: this one imports the render model for hashing, the render
7
+ * model imports the engine content bundle, and the content bundle names a diagram at module load.
8
+ */
2
9
  import { technicalDocumentationSha256Bytes } from './rendering/technical-documentation-render-model.js';
3
- export const TECHNICAL_DOCUMENTATION_APPLICATION_REQUEST_DIAGRAM_V1 = Object.freeze({
4
- diagramRef: 'technical-documentation:diagram/application-api-request',
5
- title: 'From client to application API',
6
- nodes: Object.freeze([
7
- { nodeRef: 'technical-documentation:diagram-node/client', label: 'Client or service' },
8
- { nodeRef: 'technical-documentation:diagram-node/application-api', label: 'Application API' },
9
- { nodeRef: 'technical-documentation:diagram-node/resource', label: 'Documented resource' },
10
- ]),
11
- edges: Object.freeze([
12
- { fromNodeRef: 'technical-documentation:diagram-node/client', toNodeRef: 'technical-documentation:diagram-node/application-api', label: 'Authenticated request' },
13
- { fromNodeRef: 'technical-documentation:diagram-node/application-api', toNodeRef: 'technical-documentation:diagram-node/resource', label: 'Authorized operation' },
14
- ]),
15
- });
16
- export function createTechnicalDocumentationApplicationRequestDiagramAssetRequest() {
17
- return {
18
- assetRef: 'technical-documentation:asset/application-api-request-diagram',
19
- kind: TechnicalDocumentationAssetKind.DIAGRAM,
20
- origin: TechnicalDocumentationAssetOrigin.DETERMINISTIC_RENDER,
21
- accessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,
22
- requiredness: TechnicalDocumentationAssetRequiredness.REQUIRED,
23
- rights: {
24
- basis: TechnicalDocumentationAssetRightsBasis.ENGINE_AUTHORED,
25
- authorityRef: 'technical-documentation:rights/engine-authored-diagram',
26
- },
27
- sourceAccessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,
28
- viewedTenantAccessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,
29
- roleAccessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,
30
- captureOrRenderProfileRef: 'technical-documentation:renderer/deterministic-svg-v1',
31
- /*
32
- * The definition this diagram depicts, NAMED. It was a sha256 of the definition until
33
- * 2026-08-27 — computed here by calling the materializer, then compared by the pilot against
34
- * the value the same materializer returned over the same frozen constant. A value compared
35
- * with itself.
36
- */
37
- semanticInputRef: TECHNICAL_DOCUMENTATION_APPLICATION_REQUEST_DIAGRAM_V1.diagramRef,
38
- altText: 'A client sends an authenticated request through the application API to a documented resource.',
39
- };
40
- }
10
+ export * from './technical-documentation-diagram-definitions.js';
41
11
  function escapeXml(value) {
42
12
  return value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;').replaceAll("'", '&apos;');
43
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"technical-documentation-diagram-materializer.js","sourceRoot":"","sources":["../../../../src/companion/technical-documentation-diagram-materializer.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n TechnicalDocumentationAssetAccessClass,\n TechnicalDocumentationAssetKind,\n TechnicalDocumentationAssetOrigin,\n TechnicalDocumentationAssetRequiredness,\n TechnicalDocumentationAssetRightsBasis,\n type TechnicalDocumentationAssetRequestV1,\n} from '@wildo-ai/saas-specifications/technical-documentation';\n\nimport { technicalDocumentationSha256Bytes } from './rendering/technical-documentation-render-model';\n\nexport interface TechnicalDocumentationDiagramNode {\n readonly nodeRef: string;\n readonly label: string;\n}\n\nexport interface TechnicalDocumentationDiagramEdge {\n readonly fromNodeRef: string;\n readonly toNodeRef: string;\n readonly label: string;\n}\n\nexport interface TechnicalDocumentationDiagramDefinition {\n readonly diagramRef: string;\n readonly title: string;\n readonly nodes: readonly TechnicalDocumentationDiagramNode[];\n readonly edges: readonly TechnicalDocumentationDiagramEdge[];\n}\n\nexport const TECHNICAL_DOCUMENTATION_APPLICATION_REQUEST_DIAGRAM_V1: TechnicalDocumentationDiagramDefinition = Object.freeze({\n diagramRef: 'technical-documentation:diagram/application-api-request',\n title: 'From client to application API',\n nodes: Object.freeze([\n { nodeRef: 'technical-documentation:diagram-node/client', label: 'Client or service' },\n { nodeRef: 'technical-documentation:diagram-node/application-api', label: 'Application API' },\n { nodeRef: 'technical-documentation:diagram-node/resource', label: 'Documented resource' },\n ]),\n edges: Object.freeze([\n { fromNodeRef: 'technical-documentation:diagram-node/client', toNodeRef: 'technical-documentation:diagram-node/application-api', label: 'Authenticated request' },\n { fromNodeRef: 'technical-documentation:diagram-node/application-api', toNodeRef: 'technical-documentation:diagram-node/resource', label: 'Authorized operation' },\n ]),\n});\n\nexport function createTechnicalDocumentationApplicationRequestDiagramAssetRequest(): TechnicalDocumentationAssetRequestV1 {\n return {\n assetRef: 'technical-documentation:asset/application-api-request-diagram',\n kind: TechnicalDocumentationAssetKind.DIAGRAM,\n origin: TechnicalDocumentationAssetOrigin.DETERMINISTIC_RENDER,\n accessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,\n requiredness: TechnicalDocumentationAssetRequiredness.REQUIRED,\n rights: {\n basis: TechnicalDocumentationAssetRightsBasis.ENGINE_AUTHORED,\n authorityRef: 'technical-documentation:rights/engine-authored-diagram',\n },\n sourceAccessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,\n viewedTenantAccessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,\n roleAccessClass: TechnicalDocumentationAssetAccessClass.PUBLIC,\n captureOrRenderProfileRef: 'technical-documentation:renderer/deterministic-svg-v1',\n /*\n * The definition this diagram depicts, NAMED. It was a sha256 of the definition until\n * 2026-08-27 — computed here by calling the materializer, then compared by the pilot against\n * the value the same materializer returned over the same frozen constant. A value compared\n * with itself.\n */\n semanticInputRef: TECHNICAL_DOCUMENTATION_APPLICATION_REQUEST_DIAGRAM_V1.diagramRef,\n altText: 'A client sends an authenticated request through the application API to a documented resource.',\n };\n}\n\nfunction escapeXml(value: string): string {\n return value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('\"', '&quot;').replaceAll(\"'\", '&apos;');\n}\n\n/** A dependency-free deterministic SVG materializer; no layout engine or runtime font metrics participate in its bytes. */\nexport function materializeTechnicalDocumentationDiagram(definition: TechnicalDocumentationDiagramDefinition): {\n readonly bytes: Uint8Array;\n readonly byteDigest: string;\n readonly mediaType: 'image/svg+xml';\n} {\n if (definition.nodes.length < 2) throw new Error('technical-documentation diagram requires at least two nodes');\n const nodes = [...definition.nodes].sort((left, right) => left.nodeRef.localeCompare(right.nodeRef));\n const nodeRefs = nodes.map((node) => node.nodeRef);\n if (new Set(nodeRefs).size !== nodeRefs.length) throw new Error('technical-documentation diagram node refs must be unique');\n const nodeRefSet = new Set(nodeRefs);\n const edges = [...definition.edges].sort((left, right) => `${left.fromNodeRef}\\0${left.toNodeRef}\\0${left.label}`.localeCompare(`${right.fromNodeRef}\\0${right.toNodeRef}\\0${right.label}`));\n for (const edge of edges) {\n if (!nodeRefSet.has(edge.fromNodeRef) || !nodeRefSet.has(edge.toNodeRef)) throw new Error('technical-documentation diagram edge references an unknown node');\n }\n const width = 960;\n const nodeWidth = 180;\n const gap = (width - nodes.length * nodeWidth) / (nodes.length + 1);\n const xByRef = new Map(nodes.map((node, index) => [node.nodeRef, Math.round(gap + index * (nodeWidth + gap))]));\n const nodeSvg = nodes.map((node) => {\n const x = xByRef.get(node.nodeRef) as number;\n return `<g><rect x=\"${x}\" y=\"96\" width=\"${nodeWidth}\" height=\"72\" rx=\"12\" fill=\"#f7f8fb\" stroke=\"#263247\" stroke-width=\"2\"/><text x=\"${x + nodeWidth / 2}\" y=\"138\" text-anchor=\"middle\" font-family=\"system-ui,sans-serif\" font-size=\"16\" fill=\"#172033\">${escapeXml(node.label)}</text></g>`;\n }).join('');\n const edgeSvg = edges.map((edge, index) => {\n const fromX = (xByRef.get(edge.fromNodeRef) as number) + nodeWidth;\n const toX = xByRef.get(edge.toNodeRef) as number;\n const y = 112 + index * 14;\n return `<g><path d=\"M ${fromX} ${y} L ${toX} ${y}\" stroke=\"#54657e\" stroke-width=\"2\" marker-end=\"url(#arrow)\"/><text x=\"${Math.round((fromX + toX) / 2)}\" y=\"${y - 6}\" text-anchor=\"middle\" font-family=\"system-ui,sans-serif\" font-size=\"12\" fill=\"#34445d\">${escapeXml(edge.label)}</text></g>`;\n }).join('');\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"240\" viewBox=\"0 0 ${width} 240\" role=\"img\" aria-labelledby=\"title\"><title id=\"title\">${escapeXml(definition.title)}</title><defs><marker id=\"arrow\" markerWidth=\"8\" markerHeight=\"8\" refX=\"7\" refY=\"4\" orient=\"auto\"><path d=\"M0,0 L8,4 L0,8 z\" fill=\"#54657e\"/></marker></defs><text x=\"480\" y=\"42\" text-anchor=\"middle\" font-family=\"system-ui,sans-serif\" font-size=\"22\" font-weight=\"600\" fill=\"#172033\">${escapeXml(definition.title)}</text>${edgeSvg}${nodeSvg}</svg>\\n`;\n const bytes = Buffer.from(svg, 'utf8');\n return Object.freeze({\n bytes,\n byteDigest: technicalDocumentationSha256Bytes(bytes),\n mediaType: 'image/svg+xml' as const,\n });\n}\n\n/*\n * `technicalDocumentationDiagramProducerImplementationDigest()` lived here until 2026-08-27. It\n * hashed `escapeXml.toString()` and this materializer's own source text, and rode into every\n * resolved asset as `producerImplementationDigest`. Nothing compared it; the producer is named by\n * `producerRef` + `producerVersion`, which a reader can act on.\n */\n"]}
1
+ {"version":3,"file":"technical-documentation-diagram-materializer.js","sourceRoot":"","sources":["../../../../src/companion/technical-documentation-diagram-materializer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Deterministic diagram MATERIALIZATION — declaration in, SVG bytes out.\n *\n * The declarations themselves live in `./technical-documentation-diagram-definitions`, which this\n * module re-exports so every existing consumer and the package barrel are unchanged. See that\n * file's header for why they were split: this one imports the render model for hashing, the render\n * model imports the engine content bundle, and the content bundle names a diagram at module load.\n */\n\nimport { technicalDocumentationSha256Bytes } from './rendering/technical-documentation-render-model';\n\nimport type { TechnicalDocumentationDiagramDefinition } from './technical-documentation-diagram-definitions';\n\nexport * from './technical-documentation-diagram-definitions';\n\nfunction escapeXml(value: string): string {\n return value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('\"', '&quot;').replaceAll(\"'\", '&apos;');\n}\n\n/** A dependency-free deterministic SVG materializer; no layout engine or runtime font metrics participate in its bytes. */\nexport function materializeTechnicalDocumentationDiagram(definition: TechnicalDocumentationDiagramDefinition): {\n readonly bytes: Uint8Array;\n readonly byteDigest: string;\n readonly mediaType: 'image/svg+xml';\n} {\n if (definition.nodes.length < 2) throw new Error('technical-documentation diagram requires at least two nodes');\n const nodes = [...definition.nodes].sort((left, right) => left.nodeRef.localeCompare(right.nodeRef));\n const nodeRefs = nodes.map((node) => node.nodeRef);\n if (new Set(nodeRefs).size !== nodeRefs.length) throw new Error('technical-documentation diagram node refs must be unique');\n const nodeRefSet = new Set(nodeRefs);\n const edges = [...definition.edges].sort((left, right) => `${left.fromNodeRef}\\0${left.toNodeRef}\\0${left.label}`.localeCompare(`${right.fromNodeRef}\\0${right.toNodeRef}\\0${right.label}`));\n for (const edge of edges) {\n if (!nodeRefSet.has(edge.fromNodeRef) || !nodeRefSet.has(edge.toNodeRef)) throw new Error('technical-documentation diagram edge references an unknown node');\n }\n const width = 960;\n const nodeWidth = 180;\n const gap = (width - nodes.length * nodeWidth) / (nodes.length + 1);\n const xByRef = new Map(nodes.map((node, index) => [node.nodeRef, Math.round(gap + index * (nodeWidth + gap))]));\n const nodeSvg = nodes.map((node) => {\n const x = xByRef.get(node.nodeRef) as number;\n return `<g><rect x=\"${x}\" y=\"96\" width=\"${nodeWidth}\" height=\"72\" rx=\"12\" fill=\"#f7f8fb\" stroke=\"#263247\" stroke-width=\"2\"/><text x=\"${x + nodeWidth / 2}\" y=\"138\" text-anchor=\"middle\" font-family=\"system-ui,sans-serif\" font-size=\"16\" fill=\"#172033\">${escapeXml(node.label)}</text></g>`;\n }).join('');\n const edgeSvg = edges.map((edge, index) => {\n const fromX = (xByRef.get(edge.fromNodeRef) as number) + nodeWidth;\n const toX = xByRef.get(edge.toNodeRef) as number;\n const y = 112 + index * 14;\n return `<g><path d=\"M ${fromX} ${y} L ${toX} ${y}\" stroke=\"#54657e\" stroke-width=\"2\" marker-end=\"url(#arrow)\"/><text x=\"${Math.round((fromX + toX) / 2)}\" y=\"${y - 6}\" text-anchor=\"middle\" font-family=\"system-ui,sans-serif\" font-size=\"12\" fill=\"#34445d\">${escapeXml(edge.label)}</text></g>`;\n }).join('');\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"240\" viewBox=\"0 0 ${width} 240\" role=\"img\" aria-labelledby=\"title\"><title id=\"title\">${escapeXml(definition.title)}</title><defs><marker id=\"arrow\" markerWidth=\"8\" markerHeight=\"8\" refX=\"7\" refY=\"4\" orient=\"auto\"><path d=\"M0,0 L8,4 L0,8 z\" fill=\"#54657e\"/></marker></defs><text x=\"480\" y=\"42\" text-anchor=\"middle\" font-family=\"system-ui,sans-serif\" font-size=\"22\" font-weight=\"600\" fill=\"#172033\">${escapeXml(definition.title)}</text>${edgeSvg}${nodeSvg}</svg>\\n`;\n const bytes = Buffer.from(svg, 'utf8');\n return Object.freeze({\n bytes,\n byteDigest: technicalDocumentationSha256Bytes(bytes),\n mediaType: 'image/svg+xml' as const,\n });\n}\n\n/*\n * `technicalDocumentationDiagramProducerImplementationDigest()` lived here until 2026-08-27. It\n * hashed `escapeXml.toString()` and this materializer's own source text, and rode into every\n * resolved asset as `producerImplementationDigest`. Nothing compared it; the producer is named by\n * `producerRef` + `producerVersion`, which a reader can act on.\n */\n"]}
@@ -103,10 +103,14 @@ export declare const WildoTechnicalDocConfigSchema: z.ZodObject<{
103
103
  * - `CoreResourceType[]` — a curated subset (e.g. `[CoreResourceType.ORGANIZATIONS,
104
104
  * CoreResourceType.ORGANIZATION_MEMBERS, CoreResourceType.FILES]`).
105
105
  *
106
- * Omitted (default): only the app's own resources are documented. Org-scoped
107
- * core resources land in the (auth-gated) Organization API section; any
108
- * anonymous ones in the Application API section — the existing section split
109
- * by operation access level is unchanged.
106
+ * Omitted (default): only the app's own resources are documented.
107
+ *
108
+ * There is no organizational section. `OpenApiSection` has exactly two members,
109
+ * `API_REFERENCE` and `APPLICATION_ADMINISTRATION_API_REFERENCE`, neither of which is scoped to
110
+ * an organization. The split is made per OPERATION, from the `consumerApiSection` the source
111
+ * projector resolves, so a selected core resource's operations may land in either. Nothing the
112
+ * docs site emits is auth-gated; see `docs-auth-session.schemas.ts` for why the decoded role axis
113
+ * is not a control.
110
114
  */
111
115
  apiDocResources: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodEnum<typeof CoreResourceType>>, z.ZodLiteral<"all">]>>;
112
116
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"wildo-tech-doc-config.schemas.d.ts","sourceRoot":"","sources":["../../../../src/config/wildo-tech-doc-config.schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAG,KAAc,CAAC;AAEpD;;;;;;GAMG;AACH,eAAO,MAAM,4CAA4C;;;;;kBAEvD,CAAC;AACH,MAAM,MAAM,sCAAsC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4CAA4C,CAAC,CAAC;AAElH;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,6BAA6B;IACxC;;;;;OAKG;;IAGH;;;;;;;;OAQG;;;;;;IASH;;;;;;;;;;OAUG;;IAGH;;;;OAIG;;IAGH;;;;;;;;;;;;;;;;;;OAkBG;;IAMH;;;;;;;;OAQG;;;;;;;IAGH;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;;;;;IAGH;;;;;;;;;;;;;;;OAeG;;IAGH;;;;;;;;;;;;;;;;;;OAkBG;;;;;;;;kBAEH,CAAC;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACzF,8DAA8D"}
1
+ {"version":3,"file":"wildo-tech-doc-config.schemas.d.ts","sourceRoot":"","sources":["../../../../src/config/wildo-tech-doc-config.schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAG,KAAc,CAAC;AAEpD;;;;;;GAMG;AACH,eAAO,MAAM,4CAA4C;;;;;kBAEvD,CAAC;AACH,MAAM,MAAM,sCAAsC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4CAA4C,CAAC,CAAC;AAElH;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,6BAA6B;IACxC;;;;;OAKG;;IAGH;;;;;;;;OAQG;;;;;;IASH;;;;;;;;;;OAUG;;IAGH;;;;OAIG;;IAGH;;;;;;;;;;;;;;;;;;;;;;OAsBG;;IAMH;;;;;;;;OAQG;;;;;;;IAGH;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;;;;;IAGH;;;;;;;;;;;;;;;OAeG;;IAGH;;;;;;;;;;;;;;;;;;OAkBG;;;;;;;;kBAEH,CAAC;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACzF,8DAA8D"}
@@ -104,10 +104,14 @@ export const WildoTechnicalDocConfigSchema = z.strictObject({
104
104
  * - `CoreResourceType[]` — a curated subset (e.g. `[CoreResourceType.ORGANIZATIONS,
105
105
  * CoreResourceType.ORGANIZATION_MEMBERS, CoreResourceType.FILES]`).
106
106
  *
107
- * Omitted (default): only the app's own resources are documented. Org-scoped
108
- * core resources land in the (auth-gated) Organization API section; any
109
- * anonymous ones in the Application API section — the existing section split
110
- * by operation access level is unchanged.
107
+ * Omitted (default): only the app's own resources are documented.
108
+ *
109
+ * There is no organizational section. `OpenApiSection` has exactly two members,
110
+ * `API_REFERENCE` and `APPLICATION_ADMINISTRATION_API_REFERENCE`, neither of which is scoped to
111
+ * an organization. The split is made per OPERATION, from the `consumerApiSection` the source
112
+ * projector resolves, so a selected core resource's operations may land in either. Nothing the
113
+ * docs site emits is auth-gated; see `docs-auth-session.schemas.ts` for why the decoded role axis
114
+ * is not a control.
111
115
  */
112
116
  apiDocResources: z.union([
113
117
  z.array(z.enum(CoreResourceType)),