{"version":"2.1.269","anchor":"hooksjson-surface-field-removed-in-favor-of-inline-client","canonical_anchor":"hooksjson-surface-field-removed-in-favor-of-inline-client","heading":"Plugin hooks.json surface field replaced by per-module surfaceModules","tier":"notice","area":"Plugin Hooks","scope":null,"heads_up":null,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.269\/e\/hooksjson-surface-field-removed-in-favor-of-inline-client","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.269","markdown":"### Plugin hooks.json surface field replaced by per-module surfaceModules\n\nPlugin hooks.json no longer has a top-level surface field; each Client element now names its own module, and multiple surfaceModules can load at once\n\n**What**\n\n- The `hooks.json` schema for plugins no longer accepts a top-level `surface` key. Instead, each `Client` element in the config must name its own module. Using the old `surface` field now produces a hard schema error.\n\n- The runtime error shown when a plugin has no drawable Client now checks `surfaceModules` from the hooks module's own exports, instead of looking for a `surface` entry in `hooks.json`.\n\n- The code that resolves a plugin's hooks module used to also resolve and validate a separate `surface` path (checking for path traversal and that the file exists) and store it as `surfacePath`; that check is now removed, and the code just sets `modulePath`.\n\n- Elsewhere, the surface-environment loader was changed from loading a single `surface` module to loading an array of `surfaceModules`, and its logging now lists all the loaded module names instead of just one.\n\n**Why**\n\nThis lets a plugin provide multiple UI-drawing ('surface') modules instead of just one, with each Client referencing its own module directly rather than all of them sharing a single top-level `surface` path.\n\n- Area: Plugin Hooks\n- Names: `surfaceModules`\n- Tier: You'll notice\n- Useful: 2\/5\n- Signal: 2\/5"}