@deepseek-harness-tui/dsh-tui 0.8.4 → 0.8.5

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 (174) hide show
  1. package/bin/dsh-tui.js +0 -0
  2. package/dsh-ecosystem-spec/protocols/profile-definitions.d.ts +13 -13
  3. package/dsh-ecosystem-spec/protocols/profile-definitions.js +59 -59
  4. package/dsh-ecosystem-spec/protocols/tui-channel-http.d.ts +15 -15
  5. package/dsh-ecosystem-spec/protocols/tui-channel-http.js +32 -32
  6. package/dsh-ecosystem-spec/protocols/tui-channel.d.ts +59 -59
  7. package/dsh-ecosystem-spec/protocols/tui-channel.js +166 -166
  8. package/dsh-ecosystem-spec/protocols/tui-contributions.d.ts +42 -42
  9. package/dsh-ecosystem-spec/protocols/tui-contributions.js +143 -143
  10. package/dsh-ecosystem-spec/registry/README.md +14 -14
  11. package/dsh-ecosystem-spec/registry/host-descriptor.tui.example.json +56 -56
  12. package/dsh-ecosystem-spec/registry/permissions-0.1.json +13 -13
  13. package/dsh-ecosystem-spec/registry/registry-0.15.json +149 -149
  14. package/lib/types/activityPrefs.d.ts +10 -0
  15. package/lib/types/activityPrefs.d.ts.map +1 -1
  16. package/lib/types/activityPrefs.js +17 -0
  17. package/lib/types/components/MessageList.d.ts +4 -1
  18. package/lib/types/components/MessageList.d.ts.map +1 -1
  19. package/lib/types/components/MessageList.js +4 -4
  20. package/lib/types/components/SplitDiffView.d.ts +3 -1
  21. package/lib/types/components/SplitDiffView.d.ts.map +1 -1
  22. package/lib/types/components/SplitDiffView.js +12 -5
  23. package/lib/types/components/StreamingMarkdown.d.ts.map +1 -1
  24. package/lib/types/components/StreamingMarkdown.js +10 -2
  25. package/lib/types/components/activityFrames.d.ts +7 -28
  26. package/lib/types/components/activityFrames.d.ts.map +1 -1
  27. package/lib/types/components/activityFrames.js +7 -94
  28. package/lib/types/components/messages/AssistantThinkingMessage.d.ts.map +1 -1
  29. package/lib/types/components/messages/AssistantThinkingMessage.js +1 -1
  30. package/lib/types/components/messages/AssistantToolUseMessage.d.ts +4 -1
  31. package/lib/types/components/messages/AssistantToolUseMessage.d.ts.map +1 -1
  32. package/lib/types/components/messages/AssistantToolUseMessage.js +14 -3
  33. package/lib/types/dsh-adapter/channel.d.ts +17 -0
  34. package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
  35. package/lib/types/dsh-adapter/channel.js +161 -19
  36. package/lib/types/dsh-adapter/index.d.ts +5 -0
  37. package/lib/types/dsh-adapter/index.d.ts.map +1 -1
  38. package/lib/types/dsh-adapter/index.js +19 -0
  39. package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
  40. package/lib/types/dsh-adapter/plugin.js +176 -4
  41. package/lib/types/dsh-adapter/settings-sections.d.ts +13 -0
  42. package/lib/types/dsh-adapter/settings-sections.d.ts.map +1 -1
  43. package/lib/types/dsh-adapter/settings-sections.js +31 -6
  44. package/lib/types/ink/ink.d.ts +9 -0
  45. package/lib/types/ink/ink.d.ts.map +1 -1
  46. package/lib/types/ink/ink.js +24 -1
  47. package/lib/types/screens/Chat.d.ts.map +1 -1
  48. package/lib/types/screens/Chat.js +34 -4
  49. package/lib/types/screens/Settings.d.ts.map +1 -1
  50. package/lib/types/screens/Settings.js +109 -50
  51. package/lib/types/screens/StatusLine.d.ts +8 -0
  52. package/lib/types/screens/StatusLine.d.ts.map +1 -1
  53. package/lib/types/screens/StatusLine.js +62 -39
  54. package/lib/types/settings-sections.d.ts +1 -1
  55. package/lib/types/settings-sections.d.ts.map +1 -1
  56. package/lib/types/tips.js +2 -2
  57. package/lib/types/tuiDisplayPrefs.d.ts +47 -0
  58. package/lib/types/tuiDisplayPrefs.d.ts.map +1 -0
  59. package/lib/types/tuiDisplayPrefs.js +60 -0
  60. package/node_modules/@dsh-std/command/CHANGELOG.md +8 -8
  61. package/node_modules/@dsh-std/command/LICENSE +21 -21
  62. package/node_modules/@dsh-std/command/README.md +26 -26
  63. package/node_modules/@dsh-std/command/README.zh.md +28 -28
  64. package/node_modules/@dsh-std/command/lib/index.js.map +1 -1
  65. package/node_modules/@dsh-std/command/package.json +22 -22
  66. package/node_modules/@dsh-std/connection/CHANGELOG.md +8 -8
  67. package/node_modules/@dsh-std/connection/LICENSE +21 -21
  68. package/node_modules/@dsh-std/connection/README.md +42 -42
  69. package/node_modules/@dsh-std/connection/README.zh.md +42 -42
  70. package/node_modules/@dsh-std/connection/lib/index.js.map +1 -1
  71. package/node_modules/@dsh-std/connection/lib/memory.js.map +1 -1
  72. package/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -1
  73. package/node_modules/@dsh-std/connection/package.json +20 -20
  74. package/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
  75. package/node_modules/@dsh-std/core/LICENSE +21 -21
  76. package/node_modules/@dsh-std/core/README.md +13 -13
  77. package/node_modules/@dsh-std/core/README.zh.md +13 -13
  78. package/node_modules/@dsh-std/core/lib/index.js.map +1 -1
  79. package/node_modules/@dsh-std/core/package.json +21 -21
  80. package/node_modules/@dsh-std/manifest/CHANGELOG.md +9 -9
  81. package/node_modules/@dsh-std/manifest/LICENSE +21 -21
  82. package/node_modules/@dsh-std/manifest/README.md +5 -5
  83. package/node_modules/@dsh-std/manifest/README.zh.md +5 -5
  84. package/node_modules/@dsh-std/manifest/lib/index.js.map +1 -1
  85. package/node_modules/@dsh-std/manifest/package.json +20 -20
  86. package/node_modules/@dsh-std/manifest/schema/dsh-plugin-0.15.schema.json +144 -144
  87. package/node_modules/@dsh-std/messages/CHANGELOG.md +8 -8
  88. package/node_modules/@dsh-std/messages/LICENSE +21 -21
  89. package/node_modules/@dsh-std/messages/README.md +5 -5
  90. package/node_modules/@dsh-std/messages/README.zh.md +7 -7
  91. package/node_modules/@dsh-std/messages/lib/index.js.map +1 -1
  92. package/node_modules/@dsh-std/messages/package.json +20 -20
  93. package/node_modules/@dsh-std/messages/schema/message-observer-envelope-0.15.schema.json +54 -54
  94. package/node_modules/@dsh-std/presentation/CHANGELOG.md +9 -9
  95. package/node_modules/@dsh-std/presentation/LICENSE +21 -21
  96. package/node_modules/@dsh-std/presentation/README.md +27 -27
  97. package/node_modules/@dsh-std/presentation/README.zh.md +29 -29
  98. package/node_modules/@dsh-std/presentation/lib/callback.js.map +1 -1
  99. package/node_modules/@dsh-std/presentation/lib/index.js.map +1 -1
  100. package/node_modules/@dsh-std/presentation/package.json +25 -25
  101. package/node_modules/@dsh-std/storage/CHANGELOG.md +8 -8
  102. package/node_modules/@dsh-std/storage/LICENSE +21 -21
  103. package/node_modules/@dsh-std/storage/README.md +5 -5
  104. package/node_modules/@dsh-std/storage/README.zh.md +7 -7
  105. package/node_modules/@dsh-std/storage/lib/index.js.map +1 -1
  106. package/node_modules/@dsh-std/storage/package.json +20 -20
  107. package/node_modules/@dsh-std/storage/schema/local-storage-0.15.schema.json +56 -56
  108. package/package.json +6 -3
  109. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/CHANGELOG.md +8 -8
  110. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/LICENSE +21 -21
  111. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/README.md +42 -42
  112. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/README.zh.md +42 -42
  113. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/index.js.map +1 -1
  114. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/memory.js.map +1 -1
  115. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -1
  116. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/package.json +20 -20
  117. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
  118. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/LICENSE +21 -21
  119. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/README.md +13 -13
  120. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/README.zh.md +13 -13
  121. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/lib/index.js.map +1 -1
  122. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/package.json +21 -21
  123. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/CHANGELOG.md +9 -9
  124. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/LICENSE +21 -21
  125. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/README.md +5 -5
  126. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/README.zh.md +5 -5
  127. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/lib/index.js.map +1 -1
  128. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/package.json +20 -20
  129. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/schema/dsh-plugin-0.15.schema.json +144 -144
  130. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/CHANGELOG.md +9 -9
  131. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/LICENSE +21 -21
  132. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/README.md +27 -27
  133. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/README.zh.md +29 -29
  134. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/callback.js.map +1 -1
  135. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/index.js.map +1 -1
  136. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/package.json +25 -25
  137. package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
  138. package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/LICENSE +21 -21
  139. package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/README.md +13 -13
  140. package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/README.zh.md +13 -13
  141. package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/lib/index.js.map +1 -1
  142. package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/package.json +21 -21
  143. package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
  144. package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/LICENSE +21 -21
  145. package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/README.md +13 -13
  146. package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/README.zh.md +13 -13
  147. package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/lib/index.js.map +1 -1
  148. package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/package.json +21 -21
  149. package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
  150. package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/LICENSE +21 -21
  151. package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/README.md +13 -13
  152. package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/README.zh.md +13 -13
  153. package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/lib/index.js.map +1 -1
  154. package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/package.json +21 -21
  155. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/CHANGELOG.md +8 -8
  156. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/LICENSE +21 -21
  157. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/README.md +42 -42
  158. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/README.zh.md +42 -42
  159. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/index.js.map +1 -1
  160. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/memory.js.map +1 -1
  161. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -1
  162. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/package.json +20 -20
  163. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
  164. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/LICENSE +21 -21
  165. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/README.md +13 -13
  166. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/README.zh.md +13 -13
  167. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/lib/index.js.map +1 -1
  168. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/package.json +21 -21
  169. package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
  170. package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/LICENSE +21 -21
  171. package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/README.md +13 -13
  172. package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/README.zh.md +13 -13
  173. package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/lib/index.js.map +1 -1
  174. package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/package.json +21 -21
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import {\n ProtocolCatalog,\n protocolKey,\n validateApiReference,\n type ApiReference,\n type ProtocolRequirement,\n type ProtocolSupport,\n type VersionRange,\n assertVersionRange,\n parseSemanticVersion,\n} from '@dsh-std/core'\nexport const COMMUNITY_V015_MANIFEST_VERSION = '0.15'\nexport const COMPONENT_API_VERSION = 'manifest.dsh/internal/v1alpha1'\nexport const COMMUNITY_PERMISSION_API_VERSION = 'community.dsh/v1alpha1'\nexport const COMMUNITY_PERMISSION_KIND = 'Permission'\n\nconst COMPONENT_ID = /^[a-z][a-z0-9]*(?:[.-][a-z0-9][a-z0-9-]*)+$/u\nconst LOCAL_NAME = /^[a-z][a-z0-9]*(?:[.-][a-z0-9][a-z0-9-]*)*$/u\n\nexport interface CommunityContractReference extends ApiReference {\n readonly optional?: boolean\n readonly fallback?: string\n}\n\nexport interface CommunityPermissionRequest {\n readonly name: string\n readonly scope: string\n readonly reason?: string\n}\n\nexport interface CommunityCommandContribution {\n readonly id: string\n readonly title: string\n readonly description?: string\n}\n\nexport type CommunitySubscription = string | (ApiReference & { readonly scope?: string })\n\nexport interface CommunityPluginManifestV015 {\n /** Draft schema identifier. It is not fetched while loading the plugin. */\n readonly $schema: string\n readonly manifestVersion: typeof COMMUNITY_V015_MANIFEST_VERSION\n readonly id: string\n readonly name: string\n readonly version: string\n readonly facets: {\n readonly host: { readonly entry: string; readonly apiVersion: string }\n }\n readonly requires: {\n readonly contracts: readonly CommunityContractReference[]\n readonly services?: readonly never[]\n }\n readonly permissions: readonly CommunityPermissionRequest[]\n readonly contributes: {\n readonly commands: readonly CommunityCommandContribution[]\n readonly panels?: readonly never[]\n } & Readonly<Record<string, readonly unknown[]>>\n readonly subscriptions: readonly CommunitySubscription[]\n readonly license?: string\n readonly source?: { readonly repository: string; readonly revision?: string }\n readonly artifact?: { readonly digest: string; readonly algorithm: 'sha256'; readonly path: string }\n readonly compat?: { readonly hosts?: readonly string[] }\n readonly overrides?: readonly {\n readonly target: string\n readonly kind: 'patch' | 'native' | 'build'\n readonly description?: string\n }[]\n}\n\nexport type PluginManifest = CommunityPluginManifestV015\n\nexport interface ComponentRelationships {\n readonly depends?: Readonly<Record<string, VersionRange>>\n readonly recommends?: Readonly<Record<string, VersionRange>>\n readonly conflicts?: Readonly<Record<string, VersionRange>>\n readonly breaks?: Readonly<Record<string, VersionRange>>\n}\n\nexport interface ActivationObject<Spec = unknown> extends ApiReference {\n readonly spec: Spec\n}\n\nexport interface ExtensionMetadata {\n readonly name: string\n readonly labels?: Readonly<Record<string, string>>\n}\n\nexport interface ManifestExtension<Spec = unknown> extends ApiReference {\n readonly metadata: ExtensionMetadata\n readonly spec: Spec\n}\n\nexport interface PermissionRequest<Spec = unknown> extends ApiReference {\n readonly action: string\n readonly optional?: boolean\n readonly reason?: string\n readonly spec?: Spec\n}\n\nexport interface ComponentFacet {\n readonly name: string\n readonly activation?: ActivationObject\n readonly protocols?: {\n readonly requires?: readonly ProtocolRequirement[]\n readonly supports?: readonly ProtocolSupport[]\n }\n readonly extensions?: readonly ManifestExtension[]\n readonly permissions?: readonly PermissionRequest[]\n}\n\nexport interface ComponentManifest {\n /** Host-internal projection. Portable packages publish PluginManifest instead. */\n readonly apiVersion: typeof COMPONENT_API_VERSION\n readonly kind: 'Component'\n readonly metadata: {\n readonly name: string\n readonly version: string\n readonly displayName?: string\n }\n readonly spec: {\n readonly facets: readonly ComponentFacet[]\n readonly relationships?: ComponentRelationships\n }\n}\n\nexport interface FacetIdentity {\n readonly component: string\n readonly version: string\n readonly facet: string\n}\n\nexport interface ManifestObjectDefinition<Spec = unknown> extends ApiReference {\n validateSpec(spec: unknown): Spec\n /** Extension-owned identity validation. Activation definitions leave this undefined. */\n validateMetadata?(metadata: ExtensionMetadata): void\n}\n\nexport interface ManifestValidationIssue {\n readonly code: 'unknown-protocol' | 'unknown-activation' | 'unknown-extension' | 'invalid-activation' | 'invalid-extension'\n readonly severity: 'error' | 'warning'\n readonly path: string\n readonly message: string\n}\n\nexport interface ManifestValidationReport {\n readonly apiVersion: 'manifest.dsh/report/v1alpha1'\n readonly validator: { readonly name: string; readonly version: string }\n readonly source: string\n readonly digest: string\n readonly manifest: { readonly name: string; readonly version: string }\n readonly compatible: boolean\n readonly issues: readonly ManifestValidationIssue[]\n}\n\nexport class ManifestDefinitionCatalog {\n private readonly activations = new Map<string, ManifestObjectDefinition>()\n private readonly extensions = new Map<string, ManifestObjectDefinition>()\n\n constructor(readonly validator = Object.freeze({ name: '@dsh-std/manifest', version: '0.1.0' })) {\n nonEmpty(validator.name, 'validator.name')\n nonEmpty(validator.version, 'validator.version')\n }\n\n registerActivation(definition: ManifestObjectDefinition): () => void {\n return registerDefinition(this.activations, definition, 'activation')\n }\n\n registerExtension(definition: ManifestObjectDefinition): () => void {\n return registerDefinition(this.extensions, definition, 'extension')\n }\n\n activation(reference: ApiReference): ManifestObjectDefinition | undefined {\n return this.activations.get(protocolKey(reference))\n }\n\n extension(reference: ApiReference): ManifestObjectDefinition | undefined {\n return this.extensions.get(protocolKey(reference))\n }\n\n validate(\n manifestValue: ComponentManifest,\n protocols?: ProtocolCatalog,\n options: { readonly source?: string; readonly digest?: string } = {},\n ): ManifestValidationReport {\n const manifest = defineComponentManifest(manifestValue)\n const issues: ManifestValidationIssue[] = []\n for (const [facetIndex, facet] of manifest.spec.facets.entries()) {\n const base = `/spec/facets/${facetIndex}`\n if (facet.activation !== undefined) {\n const definition = this.activation(facet.activation)\n if (definition === undefined) {\n issues.push(issue('unknown-activation', 'warning', `${base}/activation`, 'activation definition is not installed'))\n } else {\n try { definition.validateSpec(facet.activation.spec) } catch (error) {\n issues.push(issue('invalid-activation', 'error', `${base}/activation/spec`, errorMessage(error)))\n }\n }\n }\n for (const direction of ['requires', 'supports'] as const) {\n for (const [index, row] of (facet.protocols?.[direction] ?? []).entries()) {\n if (protocols !== undefined && !protocols.understands(row)) {\n issues.push(issue('unknown-protocol', 'warning', `${base}/protocols/${direction}/${index}`, `protocol ${row.apiVersion} ${row.kind} is unknown`))\n }\n }\n }\n for (const [index, extension] of (facet.extensions ?? []).entries()) {\n const definition = this.extension(extension)\n if (definition === undefined) {\n issues.push(issue('unknown-extension', 'warning', `${base}/extensions/${index}`, 'extension definition is not installed'))\n } else {\n try {\n definition.validateMetadata?.(extension.metadata)\n definition.validateSpec(extension.spec)\n } catch (error) {\n issues.push(issue('invalid-extension', 'error', `${base}/extensions/${index}`, errorMessage(error)))\n }\n }\n }\n }\n return Object.freeze({\n apiVersion: 'manifest.dsh/report/v1alpha1',\n validator: Object.freeze({ ...this.validator }),\n source: options.source ?? 'memory:',\n digest: options.digest ?? manifestDigest(manifest),\n manifest: Object.freeze({ name: manifest.metadata.name, version: manifest.metadata.version }),\n compatible: !issues.some(row => row.severity === 'error'),\n issues: Object.freeze(issues),\n })\n }\n}\n\nexport interface ParseManifestOptions {\n readonly source?: string\n}\n\n/** Parse the package-root dsh-plugin.json without executing plugin code or fetching a schema. */\nexport function parseManifest(source: string, options: ParseManifestOptions = {}): PluginManifest {\n if (typeof source !== 'string') throw new TypeError('manifest source must be a string')\n let value: unknown\n try { value = JSON.parse(source) } catch (error) {\n throw new SyntaxError(`${options.source ?? 'dsh-plugin.json'}: ${errorMessage(error)}`, { cause: error })\n }\n try { return defineManifest(value as PluginManifest) } catch (error) {\n throw new TypeError(`${options.source ?? 'dsh-plugin.json'}: ${errorMessage(error)}`, { cause: error })\n }\n}\n\nexport function defineManifest<const T extends PluginManifest>(manifest: T): T {\n validateManifest(manifest)\n return deepFreeze(structuredClone(manifest))\n}\n\nexport function validateManifest(value: unknown): asserts value is PluginManifest {\n if (!record(value)) throw new TypeError('plugin manifest must be an object')\n if (value.manifestVersion === COMMUNITY_V015_MANIFEST_VERSION) {\n validateCommunityManifest(value)\n return\n }\n throw new TypeError(`unsupported plugin manifest $schema ${JSON.stringify(value.$schema)} and manifestVersion ${JSON.stringify(value.manifestVersion)}`)\n}\n\nfunction validateCommunityManifest(value: Record<string, unknown>): void {\n exact(value, [\n '$schema', 'manifestVersion', 'id', 'name', 'version', 'facets', 'requires', 'permissions',\n 'contributes', 'subscriptions', 'license', 'source', 'artifact', 'compat', 'overrides',\n ], 'community v0.15 plugin manifest')\n validateSchemaIdentifier(value.$schema, 'community v0.15 manifest.$schema')\n if (value.manifestVersion !== COMMUNITY_V015_MANIFEST_VERSION) {\n throw new TypeError(`unsupported Community v0.15 manifestVersion ${JSON.stringify(value.manifestVersion)}`)\n }\n namespaced(value.id, 'community v0.15 manifest.id')\n nonEmpty(value.name, 'community v0.15 manifest.name')\n nonEmpty(value.version, 'community v0.15 manifest.version')\n parseSemanticVersion(value.version as string)\n validateCommunityFacets(value.facets)\n validateCommunityRequirements(value.requires)\n validateCommunityPermissions(value.permissions)\n validateCommunityContributions(value.contributes)\n validateCommunitySubscriptions(value.subscriptions)\n if (value.license !== undefined) nonEmpty(value.license, 'community v0.15 manifest.license')\n if (value.source !== undefined) validateCommunitySource(value.source)\n if (value.artifact !== undefined) validateCommunityArtifact(value.artifact)\n if (value.compat !== undefined) validateCommunityCompat(value.compat)\n if (value.overrides !== undefined) validateCommunityOverrides(value.overrides)\n}\n\n/** Validate a host-internal Component/Facet projection. */\nexport function defineComponentManifest<const T extends ComponentManifest>(manifest: T): T {\n validateComponentManifest(manifest)\n return deepFreeze(structuredClone(manifest))\n}\n\nexport function validateComponentManifest(value: unknown): asserts value is ComponentManifest {\n if (!record(value)) throw new TypeError('component manifest must be an object')\n exact(value, ['apiVersion', 'kind', 'metadata', 'spec'], 'component manifest')\n if (value.apiVersion !== COMPONENT_API_VERSION) throw new TypeError(`unsupported component manifest apiVersion ${JSON.stringify(value.apiVersion)}`)\n if (value.kind !== 'Component') throw new TypeError('component manifest kind must be \"Component\"')\n if (!record(value.metadata)) throw new TypeError('component metadata must be an object')\n exact(value.metadata, ['name', 'version', 'displayName'], 'component metadata')\n namespaced(value.metadata.name, 'component metadata.name')\n nonEmpty(value.metadata.version, 'component metadata.version')\n parseSemanticVersion(value.metadata.version as string)\n if (value.metadata.displayName !== undefined) nonEmpty(value.metadata.displayName, 'component metadata.displayName')\n if (!record(value.spec)) throw new TypeError('component spec must be an object')\n exact(value.spec, ['facets', 'relationships'], 'component spec')\n if (!Array.isArray(value.spec.facets) || value.spec.facets.length === 0) throw new TypeError('component spec.facets must be a non-empty array')\n const names = new Set<string>()\n for (const [index, facet] of value.spec.facets.entries()) {\n validateFacet(facet, index)\n const name = (facet as ComponentFacet).name\n if (names.has(name)) throw new TypeError(`duplicate facet name ${JSON.stringify(name)}`)\n names.add(name)\n }\n if (value.spec.relationships !== undefined) validateRelationships(value.spec.relationships, value.metadata.name as string)\n}\n\n/** Project a supported package manifest version into the common host composition model. */\nexport function projectManifest(manifestValue: PluginManifest): ComponentManifest {\n const manifest = defineManifest(manifestValue)\n return projectCommunityManifest(manifest)\n}\n\nfunction projectCommunityManifest(manifest: CommunityPluginManifestV015): ComponentManifest {\n const extensions: ManifestExtension[] = manifest.contributes.commands.map(row => Object.freeze({\n apiVersion: 'commands.dsh/v1alpha1',\n kind: 'Command',\n metadata: Object.freeze({\n name: localContributionName(row.id),\n labels: Object.freeze({ 'dsh.std/contribution-id': row.id }),\n }),\n spec: Object.freeze({\n title: row.title,\n ...(row.description === undefined ? {} : { description: row.description }),\n }),\n }))\n for (const [point, contributions] of Object.entries(manifest.contributes)) {\n if (!point.startsWith('x-')) continue\n for (const contribution of contributions) {\n if (!record(contribution)\n || typeof contribution.apiVersion !== 'string'\n || typeof contribution.kind !== 'string'\n || typeof contribution.id !== 'string'\n || typeof contribution.name !== 'string'\n || !Object.hasOwn(contribution, 'spec')) continue\n extensions.push(Object.freeze({\n apiVersion: contribution.apiVersion,\n kind: contribution.kind,\n metadata: Object.freeze({\n name: contribution.name,\n labels: Object.freeze({ 'dsh.std/contribution-id': contribution.id }),\n }),\n spec: contribution.spec,\n }))\n }\n }\n const requirements = manifest.requires.contracts.map(communityRequirement)\n const permissions: PermissionRequest[] = manifest.permissions.map(permission => Object.freeze({\n apiVersion: COMMUNITY_PERMISSION_API_VERSION,\n kind: COMMUNITY_PERMISSION_KIND,\n action: permission.name,\n ...(permission.reason === undefined ? {} : { reason: permission.reason }),\n spec: Object.freeze({ scope: permission.scope }),\n }))\n return defineComponentManifest({\n apiVersion: COMPONENT_API_VERSION,\n kind: 'Component',\n metadata: { name: manifest.id, displayName: manifest.name, version: manifest.version },\n spec: {\n facets: [{\n name: 'host',\n activation: {\n apiVersion: 'lifecycle.dsh/v1alpha1',\n kind: 'FacetModule',\n spec: { module: manifest.facets.host.entry },\n },\n ...(requirements.length === 0 ? {} : { protocols: { requires: requirements } }),\n ...(extensions.length === 0 ? {} : { extensions }),\n ...(permissions.length === 0 ? {} : { permissions }),\n }],\n },\n })\n}\n\nfunction communityRequirement(reference: CommunityContractReference): ProtocolRequirement {\n return Object.freeze({\n apiVersion: reference.apiVersion,\n kind: reference.kind,\n ...(reference.optional === undefined ? {} : { optional: reference.optional }),\n ...(reference.fallback === undefined ? {} : { 'x-community-fallback': reference.fallback }),\n })\n}\n\nexport function facetIdentity(manifest: ComponentManifest, facet: ComponentFacet): FacetIdentity {\n if (!(manifest.spec.facets as readonly ComponentFacet[]).includes(facet)) {\n const found = manifest.spec.facets.find(candidate => candidate.name === facet.name)\n if (found === undefined) throw new TypeError(`facet ${JSON.stringify(facet.name)} does not belong to component`)\n }\n return Object.freeze({ component: manifest.metadata.name, version: manifest.metadata.version, facet: facet.name })\n}\n\nexport function facetKey(identity: FacetIdentity): string {\n return `${identity.component}@${identity.version}#${identity.facet}`\n}\n\nexport function findFacet(manifest: ComponentManifest, name: string): ComponentFacet | undefined {\n return manifest.spec.facets.find(facet => facet.name === name)\n}\n\nfunction validateCommunityFacets(value: unknown): void {\n const label = 'community v0.15 manifest.facets'\n if (!record(value)) throw new TypeError(`${label} must be an object`)\n exact(value, ['host'], label, false)\n if (!record(value.host)) throw new TypeError(`${label}.host must be an object`)\n exact(value.host, ['entry', 'apiVersion'], `${label}.host`, false)\n validatePackageRelative(value.host.entry, `${label}.host.entry`)\n if (typeof value.host.apiVersion !== 'string'\n || !/^v[1-9][0-9]*(?:(?:alpha|beta)[1-9][0-9]*)?$/u.test(value.host.apiVersion)) {\n throw new TypeError(`${label}.host.apiVersion is invalid`)\n }\n}\n\nfunction validateCommunityRequirements(value: unknown): void {\n const label = 'community v0.15 manifest.requires'\n if (!record(value)) throw new TypeError(`${label} must be an object`)\n exact(value, ['contracts', 'services'], label, false)\n if (!Array.isArray(value.contracts)) throw new TypeError(`${label}.contracts must be an array`)\n const seen = new Set<string>()\n for (const [index, referenceValue] of value.contracts.entries()) {\n const rowLabel = `${label}.contracts[${index}]`\n validateApiReference(referenceValue, rowLabel)\n const reference = referenceValue as unknown as Record<string, unknown>\n exact(reference, ['apiVersion', 'kind', 'optional', 'fallback'], rowLabel, false)\n if (reference.optional !== undefined && typeof reference.optional !== 'boolean') {\n throw new TypeError(`${rowLabel}.optional must be boolean`)\n }\n if (reference.fallback !== undefined) nonEmpty(reference.fallback, `${rowLabel}.fallback`)\n const key = protocolKey(reference as unknown as ApiReference)\n if (seen.has(key)) throw new TypeError(`${label}.contracts contains duplicate contract ${JSON.stringify(key)}`)\n seen.add(key)\n }\n if (value.services !== undefined && (!Array.isArray(value.services) || value.services.length !== 0)) {\n throw new TypeError(`${label}.services must be an empty array in v0.15`)\n }\n}\n\nfunction validateCommunityPermissions(value: unknown): void {\n const label = 'community v0.15 manifest.permissions'\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\n const seen = new Set<string>()\n for (const [index, permissionValue] of value.entries()) {\n const rowLabel = `${label}[${index}]`\n if (!record(permissionValue)) throw new TypeError(`${rowLabel} must be an object`)\n exact(permissionValue, ['name', 'scope', 'reason'], rowLabel, false)\n capabilityId(permissionValue.name, `${rowLabel}.name`)\n nonEmpty(permissionValue.scope, `${rowLabel}.scope`)\n if (permissionValue.reason !== undefined) nonEmpty(permissionValue.reason, `${rowLabel}.reason`)\n const key = `${String(permissionValue.name)}\\0${String(permissionValue.scope)}`\n if (seen.has(key)) throw new TypeError(`${label} contains duplicate permission ${JSON.stringify(key)}`)\n seen.add(key)\n }\n}\n\nfunction validateCommunityContributions(value: unknown): void {\n const label = 'community v0.15 manifest.contributes'\n if (!record(value)) throw new TypeError(`${label} must be an object`)\n const unknown = Object.keys(value).filter(point => point !== 'commands' && point !== 'panels' && !point.startsWith('x-'))\n if (unknown.length > 0) throw new TypeError(`${label} contains unknown contribution point ${JSON.stringify(unknown[0])}`)\n if (!Array.isArray(value.commands)) throw new TypeError(`${label}.commands must be an array`)\n const ids = new Set<string>()\n for (const [index, commandValue] of value.commands.entries()) {\n const rowLabel = `${label}.commands[${index}]`\n if (!record(commandValue)) throw new TypeError(`${rowLabel} must be an object`)\n exact(commandValue, ['id', 'title', 'description'], rowLabel, false)\n namespaced(commandValue.id, `${rowLabel}.id`)\n nonEmpty(commandValue.title, `${rowLabel}.title`)\n if (commandValue.description !== undefined) nonEmpty(commandValue.description, `${rowLabel}.description`)\n if (ids.has(commandValue.id)) throw new TypeError(`${label}.commands contains duplicate id ${JSON.stringify(commandValue.id)}`)\n ids.add(commandValue.id)\n }\n if (value.panels !== undefined && (!Array.isArray(value.panels) || value.panels.length !== 0)) {\n throw new TypeError(`${label}.panels must be an empty array in v0.15`)\n }\n for (const [point, contributions] of Object.entries(value)) {\n if (!point.startsWith('x-')) continue\n if (!Array.isArray(contributions)) throw new TypeError(`${label}.${point} must be an array`)\n }\n}\n\nfunction validateCommunitySubscriptions(value: unknown): void {\n const label = 'community v0.15 manifest.subscriptions'\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\n const seen = new Set<string>()\n for (const [index, subscriptionValue] of value.entries()) {\n const rowLabel = `${label}[${index}]`\n let key: string\n if (typeof subscriptionValue === 'string') {\n nonEmpty(subscriptionValue, rowLabel)\n key = `legacy\\0${subscriptionValue}`\n } else {\n validateApiReference(subscriptionValue, rowLabel)\n const subscription = subscriptionValue as unknown as Record<string, unknown>\n exact(subscription, ['apiVersion', 'kind', 'scope'], rowLabel, false)\n if (subscription.scope !== undefined) nonEmpty(subscription.scope, `${rowLabel}.scope`)\n key = `${protocolKey(subscription as unknown as ApiReference)}\\0${String(subscription.scope ?? '')}`\n }\n if (seen.has(key)) throw new TypeError(`${label} contains duplicate subscription ${JSON.stringify(key)}`)\n seen.add(key)\n }\n}\n\nfunction validateCommunitySource(value: unknown): void {\n const label = 'community v0.15 manifest.source'\n if (!record(value)) throw new TypeError(`${label} must be an object`)\n exact(value, ['repository', 'revision'], label, false)\n validateSchemaIdentifier(value.repository, `${label}.repository`)\n if (value.revision !== undefined) nonEmpty(value.revision, `${label}.revision`)\n}\n\nfunction validateCommunityArtifact(value: unknown): void {\n const label = 'community v0.15 manifest.artifact'\n if (!record(value)) throw new TypeError(`${label} must be an object`)\n exact(value, ['digest', 'algorithm', 'path'], label, false)\n if (value.algorithm !== 'sha256') throw new TypeError(`${label}.algorithm must be \"sha256\"`)\n if (typeof value.digest !== 'string' || !/^sha256:[a-f0-9]{64}$/u.test(value.digest)) {\n throw new TypeError(`${label}.digest must be a SHA-256 digest`)\n }\n validatePackageRelative(value.path, `${label}.path`)\n}\n\nfunction validateCommunityCompat(value: unknown): void {\n const label = 'community v0.15 manifest.compat'\n if (!record(value)) throw new TypeError(`${label} must be an object`)\n exact(value, ['hosts'], label, false)\n if (value.hosts === undefined) return\n if (!Array.isArray(value.hosts)) throw new TypeError(`${label}.hosts must be an array`)\n const seen = new Set<string>()\n for (const [index, host] of value.hosts.entries()) {\n nonEmpty(host, `${label}.hosts[${index}]`)\n if (seen.has(host)) throw new TypeError(`${label}.hosts contains duplicate ${JSON.stringify(host)}`)\n seen.add(host)\n }\n}\n\nfunction validateCommunityOverrides(value: unknown): void {\n const label = 'community v0.15 manifest.overrides'\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\n for (const [index, overrideValue] of value.entries()) {\n const rowLabel = `${label}[${index}]`\n if (!record(overrideValue)) throw new TypeError(`${rowLabel} must be an object`)\n exact(overrideValue, ['target', 'kind', 'description'], rowLabel, false)\n nonEmpty(overrideValue.target, `${rowLabel}.target`)\n if (overrideValue.kind !== 'patch' && overrideValue.kind !== 'native' && overrideValue.kind !== 'build') {\n throw new TypeError(`${rowLabel}.kind is invalid`)\n }\n if (overrideValue.description !== undefined) nonEmpty(overrideValue.description, `${rowLabel}.description`)\n }\n}\n\nfunction validatePackageRelative(value: unknown, label: string): asserts value is string {\n nonEmpty(value, label)\n if (value.startsWith('/') || value.startsWith('\\\\') || /^[a-zA-Z]:[\\\\/]/u.test(value)) {\n throw new TypeError(`${label} must be package-relative`)\n }\n const segments = value.replaceAll('\\\\', '/').split('/')\n if (segments.includes('..')) throw new TypeError(`${label} must remain inside the package`)\n}\n\nfunction capabilityId(value: unknown, label: string): asserts value is string {\n if (value === 'commands' || value === 'storage.local' || value === 'messages.observe') return\n if (typeof value !== 'string' || !/^(?:x-[a-z0-9][a-z0-9.-]*\\.)?[a-z][a-z0-9]*(?:[.-][a-z0-9][a-z0-9-]*)+$/u.test(value)) {\n throw new TypeError(`${label} must be a namespaced capability identifier`)\n }\n}\n\nfunction localContributionName(id: string): string {\n const name = id.split('.').at(-1) ?? id\n localName(name, 'contribution local name')\n return name\n}\n\nfunction validateFacet(value: unknown, index: number): void {\n const label = `component spec.facets[${index}]`\n if (!record(value)) throw new TypeError(`${label} must be an object`)\n exact(value, ['name', 'activation', 'protocols', 'extensions', 'permissions'], label)\n localName(value.name, `${label}.name`)\n if (value.activation !== undefined) validateActivation(value.activation, `${label}.activation`)\n if (value.protocols !== undefined) validateProtocols(value.protocols, `${label}.protocols`)\n if (value.extensions !== undefined) validateExtensions(value.extensions, `${label}.extensions`)\n if (value.permissions !== undefined) validatePermissions(value.permissions, `${label}.permissions`)\n if (value.activation === undefined && value.protocols === undefined && value.extensions === undefined && value.permissions === undefined) {\n throw new TypeError(`${label} must declare activation, protocols, extensions, or permissions`)\n }\n}\n\nfunction validateActivation(value: unknown, label: string): void {\n validateApiReference(value, label)\n const row = value as unknown as Record<string, unknown>\n exact(row, ['apiVersion', 'kind', 'spec'], label)\n if (!Object.hasOwn(row, 'spec')) throw new TypeError(`${label}.spec is required`)\n}\n\nfunction validateProtocols(value: unknown, label: string): void {\n if (!record(value)) throw new TypeError(`${label} must be an object`)\n exact(value, ['requires', 'supports'], label)\n validateProtocolRows(value.requires, true, `${label}.requires`)\n validateProtocolRows(value.supports, false, `${label}.supports`)\n}\n\nfunction validateProtocolRows(value: unknown, requirement: boolean, label: string): void {\n if (value === undefined) return\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\n const seen = new Set<string>()\n for (const [index, rowValue] of value.entries()) {\n const rowLabel = `${label}[${index}]`\n validateApiReference(rowValue, rowLabel)\n const row = rowValue as unknown as Record<string, unknown>\n exact(row, requirement ? ['apiVersion', 'kind', 'optional', 'spec'] : ['apiVersion', 'kind', 'spec'], rowLabel)\n if (requirement && row.optional !== undefined && typeof row.optional !== 'boolean') throw new TypeError(`${rowLabel}.optional must be boolean`)\n const key = protocolKey(row as unknown as ApiReference)\n if (seen.has(key)) throw new TypeError(`${label} contains duplicate protocol ${JSON.stringify(key)}`)\n seen.add(key)\n }\n}\n\nfunction validateExtensions(value: unknown, label: string): void {\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\n const seen = new Set<string>()\n for (const [index, extensionValue] of value.entries()) {\n const rowLabel = `${label}[${index}]`\n validateApiReference(extensionValue, rowLabel)\n const extension = extensionValue as unknown as Record<string, unknown>\n exact(extension, ['apiVersion', 'kind', 'metadata', 'spec'], rowLabel)\n if (!record(extension.metadata)) throw new TypeError(`${rowLabel}.metadata must be an object`)\n exact(extension.metadata, ['name', 'labels'], `${rowLabel}.metadata`)\n nonEmpty(extension.metadata.name, `${rowLabel}.metadata.name`)\n if (extension.metadata.labels !== undefined) validateLabels(extension.metadata.labels, `${rowLabel}.metadata.labels`)\n if (!Object.hasOwn(extension, 'spec')) throw new TypeError(`${rowLabel}.spec is required`)\n if (Object.hasOwn(extension, 'status')) throw new TypeError(`${rowLabel}.status is runtime-owned`)\n const key = `${protocolKey(extension as unknown as ApiReference)}\\0${String(extension.metadata.name)}`\n if (seen.has(key)) throw new TypeError(`${label} contains duplicate extension ${JSON.stringify(key)}`)\n seen.add(key)\n }\n}\n\nfunction validatePermissions(value: unknown, label: string): void {\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\n const seen = new Set<string>()\n for (const [index, permissionValue] of value.entries()) {\n const rowLabel = `${label}[${index}]`\n validateApiReference(permissionValue, rowLabel)\n const permission = permissionValue as unknown as Record<string, unknown>\n exact(permission, ['apiVersion', 'kind', 'action', 'optional', 'reason', 'spec'], rowLabel)\n localName(permission.action, `${rowLabel}.action`)\n if (permission.optional !== undefined && typeof permission.optional !== 'boolean') throw new TypeError(`${rowLabel}.optional must be boolean`)\n if (permission.reason !== undefined) nonEmpty(permission.reason, `${rowLabel}.reason`)\n const key = `${protocolKey(permission as unknown as ApiReference)}\\0${String(permission.action)}`\n if (seen.has(key)) throw new TypeError(`${label} contains duplicate permission ${JSON.stringify(key)}`)\n seen.add(key)\n }\n}\n\nfunction validateRelationships(value: unknown, component: string): void {\n if (!record(value)) throw new TypeError('component relationships must be an object')\n exact(value, ['depends', 'recommends', 'conflicts', 'breaks'], 'component relationships', false)\n for (const kind of ['depends', 'recommends', 'conflicts', 'breaks'] as const) {\n const rows = value[kind]\n if (rows === undefined) continue\n if (!record(rows)) throw new TypeError(`component relationships.${kind} must be an object`)\n for (const [target, range] of Object.entries(rows)) {\n namespaced(target, `component relationships.${kind} target`)\n if (target === component) throw new TypeError(`component cannot declare ${kind} on itself`)\n assertVersionRange(range as VersionRange)\n }\n }\n}\n\nfunction registerDefinition(\n target: Map<string, ManifestObjectDefinition>,\n definition: ManifestObjectDefinition,\n label: string,\n): () => void {\n validateApiReference(definition, `${label} definition`)\n if (typeof definition.validateSpec !== 'function') throw new TypeError(`${label} definition.validateSpec must be a function`)\n const key = protocolKey(definition)\n if (target.has(key)) throw new Error(`${label} definition ${definition.apiVersion} ${definition.kind} is already registered`)\n const stored = Object.freeze({ ...definition })\n target.set(key, stored)\n return () => { if (target.get(key) === stored) target.delete(key) }\n}\n\nfunction issue(\n code: ManifestValidationIssue['code'], severity: ManifestValidationIssue['severity'], path: string, message: string,\n): ManifestValidationIssue {\n return Object.freeze({ code, severity, path, message })\n}\n\nfunction validateLabels(value: unknown, label: string): void {\n if (!record(value)) throw new TypeError(`${label} must be an object`)\n for (const [key, item] of Object.entries(value)) {\n nonEmpty(key, `${label} key`)\n if (typeof item !== 'string') throw new TypeError(`${label}.${key} must be a string`)\n }\n}\n\nfunction namespaced(value: unknown, label: string): asserts value is string {\n if (typeof value !== 'string' || !COMPONENT_ID.test(value)) throw new TypeError(`${label} must be namespaced`)\n}\n\nfunction localName(value: unknown, label: string): asserts value is string {\n if (typeof value !== 'string' || !LOCAL_NAME.test(value)) throw new TypeError(`${label} is invalid`)\n}\n\nfunction nonEmpty(value: unknown, label: string): asserts value is string {\n if (typeof value !== 'string' || value.trim() === '') throw new TypeError(`${label} must be a non-empty string`)\n}\n\nfunction validateSchemaIdentifier(value: unknown, label: string): asserts value is string {\n nonEmpty(value, label)\n try { new URL(value) } catch (error) {\n throw new TypeError(`${label} must be an absolute URI`, { cause: error })\n }\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction exact(value: Record<string, unknown>, allowed: readonly string[], label: string, extensions = true): void {\n const unknown = Object.keys(value).filter(key => !allowed.includes(key) && !(extensions && key.startsWith('x-')))\n if (unknown.length > 0) throw new TypeError(`${label} contains unknown field ${JSON.stringify(unknown[0])}`)\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== 'object' || value === null || Object.isFrozen(value)) return value\n Object.freeze(value)\n for (const child of Object.values(value)) deepFreeze(child)\n return value\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nfunction manifestDigest(manifest: ComponentManifest): string {\n const input = canonical(manifest)\n let hash = 2166136261\n for (let index = 0; index < input.length; index += 1) hash = Math.imul(hash ^ input.charCodeAt(index), 16777619)\n return `fnv1a32:${(hash >>> 0).toString(16).padStart(8, '0')}`\n}\n\nfunction canonical(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(canonical).join(',')}]`\n if (record(value)) {\n return `{${Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, item]) => `${JSON.stringify(key)}:${canonical(item)}`).join(',')}}`\n }\n return JSON.stringify(value) ?? 'null'\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import {\r\n ProtocolCatalog,\r\n protocolKey,\r\n validateApiReference,\r\n type ApiReference,\r\n type ProtocolRequirement,\r\n type ProtocolSupport,\r\n type VersionRange,\r\n assertVersionRange,\r\n parseSemanticVersion,\r\n} from '@dsh-std/core'\r\nexport const COMMUNITY_V015_MANIFEST_VERSION = '0.15'\r\nexport const COMPONENT_API_VERSION = 'manifest.dsh/internal/v1alpha1'\r\nexport const COMMUNITY_PERMISSION_API_VERSION = 'community.dsh/v1alpha1'\r\nexport const COMMUNITY_PERMISSION_KIND = 'Permission'\r\n\r\nconst COMPONENT_ID = /^[a-z][a-z0-9]*(?:[.-][a-z0-9][a-z0-9-]*)+$/u\r\nconst LOCAL_NAME = /^[a-z][a-z0-9]*(?:[.-][a-z0-9][a-z0-9-]*)*$/u\r\n\r\nexport interface CommunityContractReference extends ApiReference {\r\n readonly optional?: boolean\r\n readonly fallback?: string\r\n}\r\n\r\nexport interface CommunityPermissionRequest {\r\n readonly name: string\r\n readonly scope: string\r\n readonly reason?: string\r\n}\r\n\r\nexport interface CommunityCommandContribution {\r\n readonly id: string\r\n readonly title: string\r\n readonly description?: string\r\n}\r\n\r\nexport type CommunitySubscription = string | (ApiReference & { readonly scope?: string })\r\n\r\nexport interface CommunityPluginManifestV015 {\r\n /** Draft schema identifier. It is not fetched while loading the plugin. */\r\n readonly $schema: string\r\n readonly manifestVersion: typeof COMMUNITY_V015_MANIFEST_VERSION\r\n readonly id: string\r\n readonly name: string\r\n readonly version: string\r\n readonly facets: {\r\n readonly host: { readonly entry: string; readonly apiVersion: string }\r\n }\r\n readonly requires: {\r\n readonly contracts: readonly CommunityContractReference[]\r\n readonly services?: readonly never[]\r\n }\r\n readonly permissions: readonly CommunityPermissionRequest[]\r\n readonly contributes: {\r\n readonly commands: readonly CommunityCommandContribution[]\r\n readonly panels?: readonly never[]\r\n } & Readonly<Record<string, readonly unknown[]>>\r\n readonly subscriptions: readonly CommunitySubscription[]\r\n readonly license?: string\r\n readonly source?: { readonly repository: string; readonly revision?: string }\r\n readonly artifact?: { readonly digest: string; readonly algorithm: 'sha256'; readonly path: string }\r\n readonly compat?: { readonly hosts?: readonly string[] }\r\n readonly overrides?: readonly {\r\n readonly target: string\r\n readonly kind: 'patch' | 'native' | 'build'\r\n readonly description?: string\r\n }[]\r\n}\r\n\r\nexport type PluginManifest = CommunityPluginManifestV015\r\n\r\nexport interface ComponentRelationships {\r\n readonly depends?: Readonly<Record<string, VersionRange>>\r\n readonly recommends?: Readonly<Record<string, VersionRange>>\r\n readonly conflicts?: Readonly<Record<string, VersionRange>>\r\n readonly breaks?: Readonly<Record<string, VersionRange>>\r\n}\r\n\r\nexport interface ActivationObject<Spec = unknown> extends ApiReference {\r\n readonly spec: Spec\r\n}\r\n\r\nexport interface ExtensionMetadata {\r\n readonly name: string\r\n readonly labels?: Readonly<Record<string, string>>\r\n}\r\n\r\nexport interface ManifestExtension<Spec = unknown> extends ApiReference {\r\n readonly metadata: ExtensionMetadata\r\n readonly spec: Spec\r\n}\r\n\r\nexport interface PermissionRequest<Spec = unknown> extends ApiReference {\r\n readonly action: string\r\n readonly optional?: boolean\r\n readonly reason?: string\r\n readonly spec?: Spec\r\n}\r\n\r\nexport interface ComponentFacet {\r\n readonly name: string\r\n readonly activation?: ActivationObject\r\n readonly protocols?: {\r\n readonly requires?: readonly ProtocolRequirement[]\r\n readonly supports?: readonly ProtocolSupport[]\r\n }\r\n readonly extensions?: readonly ManifestExtension[]\r\n readonly permissions?: readonly PermissionRequest[]\r\n}\r\n\r\nexport interface ComponentManifest {\r\n /** Host-internal projection. Portable packages publish PluginManifest instead. */\r\n readonly apiVersion: typeof COMPONENT_API_VERSION\r\n readonly kind: 'Component'\r\n readonly metadata: {\r\n readonly name: string\r\n readonly version: string\r\n readonly displayName?: string\r\n }\r\n readonly spec: {\r\n readonly facets: readonly ComponentFacet[]\r\n readonly relationships?: ComponentRelationships\r\n }\r\n}\r\n\r\nexport interface FacetIdentity {\r\n readonly component: string\r\n readonly version: string\r\n readonly facet: string\r\n}\r\n\r\nexport interface ManifestObjectDefinition<Spec = unknown> extends ApiReference {\r\n validateSpec(spec: unknown): Spec\r\n /** Extension-owned identity validation. Activation definitions leave this undefined. */\r\n validateMetadata?(metadata: ExtensionMetadata): void\r\n}\r\n\r\nexport interface ManifestValidationIssue {\r\n readonly code: 'unknown-protocol' | 'unknown-activation' | 'unknown-extension' | 'invalid-activation' | 'invalid-extension'\r\n readonly severity: 'error' | 'warning'\r\n readonly path: string\r\n readonly message: string\r\n}\r\n\r\nexport interface ManifestValidationReport {\r\n readonly apiVersion: 'manifest.dsh/report/v1alpha1'\r\n readonly validator: { readonly name: string; readonly version: string }\r\n readonly source: string\r\n readonly digest: string\r\n readonly manifest: { readonly name: string; readonly version: string }\r\n readonly compatible: boolean\r\n readonly issues: readonly ManifestValidationIssue[]\r\n}\r\n\r\nexport class ManifestDefinitionCatalog {\r\n private readonly activations = new Map<string, ManifestObjectDefinition>()\r\n private readonly extensions = new Map<string, ManifestObjectDefinition>()\r\n\r\n constructor(readonly validator = Object.freeze({ name: '@dsh-std/manifest', version: '0.1.0' })) {\r\n nonEmpty(validator.name, 'validator.name')\r\n nonEmpty(validator.version, 'validator.version')\r\n }\r\n\r\n registerActivation(definition: ManifestObjectDefinition): () => void {\r\n return registerDefinition(this.activations, definition, 'activation')\r\n }\r\n\r\n registerExtension(definition: ManifestObjectDefinition): () => void {\r\n return registerDefinition(this.extensions, definition, 'extension')\r\n }\r\n\r\n activation(reference: ApiReference): ManifestObjectDefinition | undefined {\r\n return this.activations.get(protocolKey(reference))\r\n }\r\n\r\n extension(reference: ApiReference): ManifestObjectDefinition | undefined {\r\n return this.extensions.get(protocolKey(reference))\r\n }\r\n\r\n validate(\r\n manifestValue: ComponentManifest,\r\n protocols?: ProtocolCatalog,\r\n options: { readonly source?: string; readonly digest?: string } = {},\r\n ): ManifestValidationReport {\r\n const manifest = defineComponentManifest(manifestValue)\r\n const issues: ManifestValidationIssue[] = []\r\n for (const [facetIndex, facet] of manifest.spec.facets.entries()) {\r\n const base = `/spec/facets/${facetIndex}`\r\n if (facet.activation !== undefined) {\r\n const definition = this.activation(facet.activation)\r\n if (definition === undefined) {\r\n issues.push(issue('unknown-activation', 'warning', `${base}/activation`, 'activation definition is not installed'))\r\n } else {\r\n try { definition.validateSpec(facet.activation.spec) } catch (error) {\r\n issues.push(issue('invalid-activation', 'error', `${base}/activation/spec`, errorMessage(error)))\r\n }\r\n }\r\n }\r\n for (const direction of ['requires', 'supports'] as const) {\r\n for (const [index, row] of (facet.protocols?.[direction] ?? []).entries()) {\r\n if (protocols !== undefined && !protocols.understands(row)) {\r\n issues.push(issue('unknown-protocol', 'warning', `${base}/protocols/${direction}/${index}`, `protocol ${row.apiVersion} ${row.kind} is unknown`))\r\n }\r\n }\r\n }\r\n for (const [index, extension] of (facet.extensions ?? []).entries()) {\r\n const definition = this.extension(extension)\r\n if (definition === undefined) {\r\n issues.push(issue('unknown-extension', 'warning', `${base}/extensions/${index}`, 'extension definition is not installed'))\r\n } else {\r\n try {\r\n definition.validateMetadata?.(extension.metadata)\r\n definition.validateSpec(extension.spec)\r\n } catch (error) {\r\n issues.push(issue('invalid-extension', 'error', `${base}/extensions/${index}`, errorMessage(error)))\r\n }\r\n }\r\n }\r\n }\r\n return Object.freeze({\r\n apiVersion: 'manifest.dsh/report/v1alpha1',\r\n validator: Object.freeze({ ...this.validator }),\r\n source: options.source ?? 'memory:',\r\n digest: options.digest ?? manifestDigest(manifest),\r\n manifest: Object.freeze({ name: manifest.metadata.name, version: manifest.metadata.version }),\r\n compatible: !issues.some(row => row.severity === 'error'),\r\n issues: Object.freeze(issues),\r\n })\r\n }\r\n}\r\n\r\nexport interface ParseManifestOptions {\r\n readonly source?: string\r\n}\r\n\r\n/** Parse the package-root dsh-plugin.json without executing plugin code or fetching a schema. */\r\nexport function parseManifest(source: string, options: ParseManifestOptions = {}): PluginManifest {\r\n if (typeof source !== 'string') throw new TypeError('manifest source must be a string')\r\n let value: unknown\r\n try { value = JSON.parse(source) } catch (error) {\r\n throw new SyntaxError(`${options.source ?? 'dsh-plugin.json'}: ${errorMessage(error)}`, { cause: error })\r\n }\r\n try { return defineManifest(value as PluginManifest) } catch (error) {\r\n throw new TypeError(`${options.source ?? 'dsh-plugin.json'}: ${errorMessage(error)}`, { cause: error })\r\n }\r\n}\r\n\r\nexport function defineManifest<const T extends PluginManifest>(manifest: T): T {\r\n validateManifest(manifest)\r\n return deepFreeze(structuredClone(manifest))\r\n}\r\n\r\nexport function validateManifest(value: unknown): asserts value is PluginManifest {\r\n if (!record(value)) throw new TypeError('plugin manifest must be an object')\r\n if (value.manifestVersion === COMMUNITY_V015_MANIFEST_VERSION) {\r\n validateCommunityManifest(value)\r\n return\r\n }\r\n throw new TypeError(`unsupported plugin manifest $schema ${JSON.stringify(value.$schema)} and manifestVersion ${JSON.stringify(value.manifestVersion)}`)\r\n}\r\n\r\nfunction validateCommunityManifest(value: Record<string, unknown>): void {\r\n exact(value, [\r\n '$schema', 'manifestVersion', 'id', 'name', 'version', 'facets', 'requires', 'permissions',\r\n 'contributes', 'subscriptions', 'license', 'source', 'artifact', 'compat', 'overrides',\r\n ], 'community v0.15 plugin manifest')\r\n validateSchemaIdentifier(value.$schema, 'community v0.15 manifest.$schema')\r\n if (value.manifestVersion !== COMMUNITY_V015_MANIFEST_VERSION) {\r\n throw new TypeError(`unsupported Community v0.15 manifestVersion ${JSON.stringify(value.manifestVersion)}`)\r\n }\r\n namespaced(value.id, 'community v0.15 manifest.id')\r\n nonEmpty(value.name, 'community v0.15 manifest.name')\r\n nonEmpty(value.version, 'community v0.15 manifest.version')\r\n parseSemanticVersion(value.version as string)\r\n validateCommunityFacets(value.facets)\r\n validateCommunityRequirements(value.requires)\r\n validateCommunityPermissions(value.permissions)\r\n validateCommunityContributions(value.contributes)\r\n validateCommunitySubscriptions(value.subscriptions)\r\n if (value.license !== undefined) nonEmpty(value.license, 'community v0.15 manifest.license')\r\n if (value.source !== undefined) validateCommunitySource(value.source)\r\n if (value.artifact !== undefined) validateCommunityArtifact(value.artifact)\r\n if (value.compat !== undefined) validateCommunityCompat(value.compat)\r\n if (value.overrides !== undefined) validateCommunityOverrides(value.overrides)\r\n}\r\n\r\n/** Validate a host-internal Component/Facet projection. */\r\nexport function defineComponentManifest<const T extends ComponentManifest>(manifest: T): T {\r\n validateComponentManifest(manifest)\r\n return deepFreeze(structuredClone(manifest))\r\n}\r\n\r\nexport function validateComponentManifest(value: unknown): asserts value is ComponentManifest {\r\n if (!record(value)) throw new TypeError('component manifest must be an object')\r\n exact(value, ['apiVersion', 'kind', 'metadata', 'spec'], 'component manifest')\r\n if (value.apiVersion !== COMPONENT_API_VERSION) throw new TypeError(`unsupported component manifest apiVersion ${JSON.stringify(value.apiVersion)}`)\r\n if (value.kind !== 'Component') throw new TypeError('component manifest kind must be \"Component\"')\r\n if (!record(value.metadata)) throw new TypeError('component metadata must be an object')\r\n exact(value.metadata, ['name', 'version', 'displayName'], 'component metadata')\r\n namespaced(value.metadata.name, 'component metadata.name')\r\n nonEmpty(value.metadata.version, 'component metadata.version')\r\n parseSemanticVersion(value.metadata.version as string)\r\n if (value.metadata.displayName !== undefined) nonEmpty(value.metadata.displayName, 'component metadata.displayName')\r\n if (!record(value.spec)) throw new TypeError('component spec must be an object')\r\n exact(value.spec, ['facets', 'relationships'], 'component spec')\r\n if (!Array.isArray(value.spec.facets) || value.spec.facets.length === 0) throw new TypeError('component spec.facets must be a non-empty array')\r\n const names = new Set<string>()\r\n for (const [index, facet] of value.spec.facets.entries()) {\r\n validateFacet(facet, index)\r\n const name = (facet as ComponentFacet).name\r\n if (names.has(name)) throw new TypeError(`duplicate facet name ${JSON.stringify(name)}`)\r\n names.add(name)\r\n }\r\n if (value.spec.relationships !== undefined) validateRelationships(value.spec.relationships, value.metadata.name as string)\r\n}\r\n\r\n/** Project a supported package manifest version into the common host composition model. */\r\nexport function projectManifest(manifestValue: PluginManifest): ComponentManifest {\r\n const manifest = defineManifest(manifestValue)\r\n return projectCommunityManifest(manifest)\r\n}\r\n\r\nfunction projectCommunityManifest(manifest: CommunityPluginManifestV015): ComponentManifest {\r\n const extensions: ManifestExtension[] = manifest.contributes.commands.map(row => Object.freeze({\r\n apiVersion: 'commands.dsh/v1alpha1',\r\n kind: 'Command',\r\n metadata: Object.freeze({\r\n name: localContributionName(row.id),\r\n labels: Object.freeze({ 'dsh.std/contribution-id': row.id }),\r\n }),\r\n spec: Object.freeze({\r\n title: row.title,\r\n ...(row.description === undefined ? {} : { description: row.description }),\r\n }),\r\n }))\r\n for (const [point, contributions] of Object.entries(manifest.contributes)) {\r\n if (!point.startsWith('x-')) continue\r\n for (const contribution of contributions) {\r\n if (!record(contribution)\r\n || typeof contribution.apiVersion !== 'string'\r\n || typeof contribution.kind !== 'string'\r\n || typeof contribution.id !== 'string'\r\n || typeof contribution.name !== 'string'\r\n || !Object.hasOwn(contribution, 'spec')) continue\r\n extensions.push(Object.freeze({\r\n apiVersion: contribution.apiVersion,\r\n kind: contribution.kind,\r\n metadata: Object.freeze({\r\n name: contribution.name,\r\n labels: Object.freeze({ 'dsh.std/contribution-id': contribution.id }),\r\n }),\r\n spec: contribution.spec,\r\n }))\r\n }\r\n }\r\n const requirements = manifest.requires.contracts.map(communityRequirement)\r\n const permissions: PermissionRequest[] = manifest.permissions.map(permission => Object.freeze({\r\n apiVersion: COMMUNITY_PERMISSION_API_VERSION,\r\n kind: COMMUNITY_PERMISSION_KIND,\r\n action: permission.name,\r\n ...(permission.reason === undefined ? {} : { reason: permission.reason }),\r\n spec: Object.freeze({ scope: permission.scope }),\r\n }))\r\n return defineComponentManifest({\r\n apiVersion: COMPONENT_API_VERSION,\r\n kind: 'Component',\r\n metadata: { name: manifest.id, displayName: manifest.name, version: manifest.version },\r\n spec: {\r\n facets: [{\r\n name: 'host',\r\n activation: {\r\n apiVersion: 'lifecycle.dsh/v1alpha1',\r\n kind: 'FacetModule',\r\n spec: { module: manifest.facets.host.entry },\r\n },\r\n ...(requirements.length === 0 ? {} : { protocols: { requires: requirements } }),\r\n ...(extensions.length === 0 ? {} : { extensions }),\r\n ...(permissions.length === 0 ? {} : { permissions }),\r\n }],\r\n },\r\n })\r\n}\r\n\r\nfunction communityRequirement(reference: CommunityContractReference): ProtocolRequirement {\r\n return Object.freeze({\r\n apiVersion: reference.apiVersion,\r\n kind: reference.kind,\r\n ...(reference.optional === undefined ? {} : { optional: reference.optional }),\r\n ...(reference.fallback === undefined ? {} : { 'x-community-fallback': reference.fallback }),\r\n })\r\n}\r\n\r\nexport function facetIdentity(manifest: ComponentManifest, facet: ComponentFacet): FacetIdentity {\r\n if (!(manifest.spec.facets as readonly ComponentFacet[]).includes(facet)) {\r\n const found = manifest.spec.facets.find(candidate => candidate.name === facet.name)\r\n if (found === undefined) throw new TypeError(`facet ${JSON.stringify(facet.name)} does not belong to component`)\r\n }\r\n return Object.freeze({ component: manifest.metadata.name, version: manifest.metadata.version, facet: facet.name })\r\n}\r\n\r\nexport function facetKey(identity: FacetIdentity): string {\r\n return `${identity.component}@${identity.version}#${identity.facet}`\r\n}\r\n\r\nexport function findFacet(manifest: ComponentManifest, name: string): ComponentFacet | undefined {\r\n return manifest.spec.facets.find(facet => facet.name === name)\r\n}\r\n\r\nfunction validateCommunityFacets(value: unknown): void {\r\n const label = 'community v0.15 manifest.facets'\r\n if (!record(value)) throw new TypeError(`${label} must be an object`)\r\n exact(value, ['host'], label, false)\r\n if (!record(value.host)) throw new TypeError(`${label}.host must be an object`)\r\n exact(value.host, ['entry', 'apiVersion'], `${label}.host`, false)\r\n validatePackageRelative(value.host.entry, `${label}.host.entry`)\r\n if (typeof value.host.apiVersion !== 'string'\r\n || !/^v[1-9][0-9]*(?:(?:alpha|beta)[1-9][0-9]*)?$/u.test(value.host.apiVersion)) {\r\n throw new TypeError(`${label}.host.apiVersion is invalid`)\r\n }\r\n}\r\n\r\nfunction validateCommunityRequirements(value: unknown): void {\r\n const label = 'community v0.15 manifest.requires'\r\n if (!record(value)) throw new TypeError(`${label} must be an object`)\r\n exact(value, ['contracts', 'services'], label, false)\r\n if (!Array.isArray(value.contracts)) throw new TypeError(`${label}.contracts must be an array`)\r\n const seen = new Set<string>()\r\n for (const [index, referenceValue] of value.contracts.entries()) {\r\n const rowLabel = `${label}.contracts[${index}]`\r\n validateApiReference(referenceValue, rowLabel)\r\n const reference = referenceValue as unknown as Record<string, unknown>\r\n exact(reference, ['apiVersion', 'kind', 'optional', 'fallback'], rowLabel, false)\r\n if (reference.optional !== undefined && typeof reference.optional !== 'boolean') {\r\n throw new TypeError(`${rowLabel}.optional must be boolean`)\r\n }\r\n if (reference.fallback !== undefined) nonEmpty(reference.fallback, `${rowLabel}.fallback`)\r\n const key = protocolKey(reference as unknown as ApiReference)\r\n if (seen.has(key)) throw new TypeError(`${label}.contracts contains duplicate contract ${JSON.stringify(key)}`)\r\n seen.add(key)\r\n }\r\n if (value.services !== undefined && (!Array.isArray(value.services) || value.services.length !== 0)) {\r\n throw new TypeError(`${label}.services must be an empty array in v0.15`)\r\n }\r\n}\r\n\r\nfunction validateCommunityPermissions(value: unknown): void {\r\n const label = 'community v0.15 manifest.permissions'\r\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\r\n const seen = new Set<string>()\r\n for (const [index, permissionValue] of value.entries()) {\r\n const rowLabel = `${label}[${index}]`\r\n if (!record(permissionValue)) throw new TypeError(`${rowLabel} must be an object`)\r\n exact(permissionValue, ['name', 'scope', 'reason'], rowLabel, false)\r\n capabilityId(permissionValue.name, `${rowLabel}.name`)\r\n nonEmpty(permissionValue.scope, `${rowLabel}.scope`)\r\n if (permissionValue.reason !== undefined) nonEmpty(permissionValue.reason, `${rowLabel}.reason`)\r\n const key = `${String(permissionValue.name)}\\0${String(permissionValue.scope)}`\r\n if (seen.has(key)) throw new TypeError(`${label} contains duplicate permission ${JSON.stringify(key)}`)\r\n seen.add(key)\r\n }\r\n}\r\n\r\nfunction validateCommunityContributions(value: unknown): void {\r\n const label = 'community v0.15 manifest.contributes'\r\n if (!record(value)) throw new TypeError(`${label} must be an object`)\r\n const unknown = Object.keys(value).filter(point => point !== 'commands' && point !== 'panels' && !point.startsWith('x-'))\r\n if (unknown.length > 0) throw new TypeError(`${label} contains unknown contribution point ${JSON.stringify(unknown[0])}`)\r\n if (!Array.isArray(value.commands)) throw new TypeError(`${label}.commands must be an array`)\r\n const ids = new Set<string>()\r\n for (const [index, commandValue] of value.commands.entries()) {\r\n const rowLabel = `${label}.commands[${index}]`\r\n if (!record(commandValue)) throw new TypeError(`${rowLabel} must be an object`)\r\n exact(commandValue, ['id', 'title', 'description'], rowLabel, false)\r\n namespaced(commandValue.id, `${rowLabel}.id`)\r\n nonEmpty(commandValue.title, `${rowLabel}.title`)\r\n if (commandValue.description !== undefined) nonEmpty(commandValue.description, `${rowLabel}.description`)\r\n if (ids.has(commandValue.id)) throw new TypeError(`${label}.commands contains duplicate id ${JSON.stringify(commandValue.id)}`)\r\n ids.add(commandValue.id)\r\n }\r\n if (value.panels !== undefined && (!Array.isArray(value.panels) || value.panels.length !== 0)) {\r\n throw new TypeError(`${label}.panels must be an empty array in v0.15`)\r\n }\r\n for (const [point, contributions] of Object.entries(value)) {\r\n if (!point.startsWith('x-')) continue\r\n if (!Array.isArray(contributions)) throw new TypeError(`${label}.${point} must be an array`)\r\n }\r\n}\r\n\r\nfunction validateCommunitySubscriptions(value: unknown): void {\r\n const label = 'community v0.15 manifest.subscriptions'\r\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\r\n const seen = new Set<string>()\r\n for (const [index, subscriptionValue] of value.entries()) {\r\n const rowLabel = `${label}[${index}]`\r\n let key: string\r\n if (typeof subscriptionValue === 'string') {\r\n nonEmpty(subscriptionValue, rowLabel)\r\n key = `legacy\\0${subscriptionValue}`\r\n } else {\r\n validateApiReference(subscriptionValue, rowLabel)\r\n const subscription = subscriptionValue as unknown as Record<string, unknown>\r\n exact(subscription, ['apiVersion', 'kind', 'scope'], rowLabel, false)\r\n if (subscription.scope !== undefined) nonEmpty(subscription.scope, `${rowLabel}.scope`)\r\n key = `${protocolKey(subscription as unknown as ApiReference)}\\0${String(subscription.scope ?? '')}`\r\n }\r\n if (seen.has(key)) throw new TypeError(`${label} contains duplicate subscription ${JSON.stringify(key)}`)\r\n seen.add(key)\r\n }\r\n}\r\n\r\nfunction validateCommunitySource(value: unknown): void {\r\n const label = 'community v0.15 manifest.source'\r\n if (!record(value)) throw new TypeError(`${label} must be an object`)\r\n exact(value, ['repository', 'revision'], label, false)\r\n validateSchemaIdentifier(value.repository, `${label}.repository`)\r\n if (value.revision !== undefined) nonEmpty(value.revision, `${label}.revision`)\r\n}\r\n\r\nfunction validateCommunityArtifact(value: unknown): void {\r\n const label = 'community v0.15 manifest.artifact'\r\n if (!record(value)) throw new TypeError(`${label} must be an object`)\r\n exact(value, ['digest', 'algorithm', 'path'], label, false)\r\n if (value.algorithm !== 'sha256') throw new TypeError(`${label}.algorithm must be \"sha256\"`)\r\n if (typeof value.digest !== 'string' || !/^sha256:[a-f0-9]{64}$/u.test(value.digest)) {\r\n throw new TypeError(`${label}.digest must be a SHA-256 digest`)\r\n }\r\n validatePackageRelative(value.path, `${label}.path`)\r\n}\r\n\r\nfunction validateCommunityCompat(value: unknown): void {\r\n const label = 'community v0.15 manifest.compat'\r\n if (!record(value)) throw new TypeError(`${label} must be an object`)\r\n exact(value, ['hosts'], label, false)\r\n if (value.hosts === undefined) return\r\n if (!Array.isArray(value.hosts)) throw new TypeError(`${label}.hosts must be an array`)\r\n const seen = new Set<string>()\r\n for (const [index, host] of value.hosts.entries()) {\r\n nonEmpty(host, `${label}.hosts[${index}]`)\r\n if (seen.has(host)) throw new TypeError(`${label}.hosts contains duplicate ${JSON.stringify(host)}`)\r\n seen.add(host)\r\n }\r\n}\r\n\r\nfunction validateCommunityOverrides(value: unknown): void {\r\n const label = 'community v0.15 manifest.overrides'\r\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\r\n for (const [index, overrideValue] of value.entries()) {\r\n const rowLabel = `${label}[${index}]`\r\n if (!record(overrideValue)) throw new TypeError(`${rowLabel} must be an object`)\r\n exact(overrideValue, ['target', 'kind', 'description'], rowLabel, false)\r\n nonEmpty(overrideValue.target, `${rowLabel}.target`)\r\n if (overrideValue.kind !== 'patch' && overrideValue.kind !== 'native' && overrideValue.kind !== 'build') {\r\n throw new TypeError(`${rowLabel}.kind is invalid`)\r\n }\r\n if (overrideValue.description !== undefined) nonEmpty(overrideValue.description, `${rowLabel}.description`)\r\n }\r\n}\r\n\r\nfunction validatePackageRelative(value: unknown, label: string): asserts value is string {\r\n nonEmpty(value, label)\r\n if (value.startsWith('/') || value.startsWith('\\\\') || /^[a-zA-Z]:[\\\\/]/u.test(value)) {\r\n throw new TypeError(`${label} must be package-relative`)\r\n }\r\n const segments = value.replaceAll('\\\\', '/').split('/')\r\n if (segments.includes('..')) throw new TypeError(`${label} must remain inside the package`)\r\n}\r\n\r\nfunction capabilityId(value: unknown, label: string): asserts value is string {\r\n if (value === 'commands' || value === 'storage.local' || value === 'messages.observe') return\r\n if (typeof value !== 'string' || !/^(?:x-[a-z0-9][a-z0-9.-]*\\.)?[a-z][a-z0-9]*(?:[.-][a-z0-9][a-z0-9-]*)+$/u.test(value)) {\r\n throw new TypeError(`${label} must be a namespaced capability identifier`)\r\n }\r\n}\r\n\r\nfunction localContributionName(id: string): string {\r\n const name = id.split('.').at(-1) ?? id\r\n localName(name, 'contribution local name')\r\n return name\r\n}\r\n\r\nfunction validateFacet(value: unknown, index: number): void {\r\n const label = `component spec.facets[${index}]`\r\n if (!record(value)) throw new TypeError(`${label} must be an object`)\r\n exact(value, ['name', 'activation', 'protocols', 'extensions', 'permissions'], label)\r\n localName(value.name, `${label}.name`)\r\n if (value.activation !== undefined) validateActivation(value.activation, `${label}.activation`)\r\n if (value.protocols !== undefined) validateProtocols(value.protocols, `${label}.protocols`)\r\n if (value.extensions !== undefined) validateExtensions(value.extensions, `${label}.extensions`)\r\n if (value.permissions !== undefined) validatePermissions(value.permissions, `${label}.permissions`)\r\n if (value.activation === undefined && value.protocols === undefined && value.extensions === undefined && value.permissions === undefined) {\r\n throw new TypeError(`${label} must declare activation, protocols, extensions, or permissions`)\r\n }\r\n}\r\n\r\nfunction validateActivation(value: unknown, label: string): void {\r\n validateApiReference(value, label)\r\n const row = value as unknown as Record<string, unknown>\r\n exact(row, ['apiVersion', 'kind', 'spec'], label)\r\n if (!Object.hasOwn(row, 'spec')) throw new TypeError(`${label}.spec is required`)\r\n}\r\n\r\nfunction validateProtocols(value: unknown, label: string): void {\r\n if (!record(value)) throw new TypeError(`${label} must be an object`)\r\n exact(value, ['requires', 'supports'], label)\r\n validateProtocolRows(value.requires, true, `${label}.requires`)\r\n validateProtocolRows(value.supports, false, `${label}.supports`)\r\n}\r\n\r\nfunction validateProtocolRows(value: unknown, requirement: boolean, label: string): void {\r\n if (value === undefined) return\r\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\r\n const seen = new Set<string>()\r\n for (const [index, rowValue] of value.entries()) {\r\n const rowLabel = `${label}[${index}]`\r\n validateApiReference(rowValue, rowLabel)\r\n const row = rowValue as unknown as Record<string, unknown>\r\n exact(row, requirement ? ['apiVersion', 'kind', 'optional', 'spec'] : ['apiVersion', 'kind', 'spec'], rowLabel)\r\n if (requirement && row.optional !== undefined && typeof row.optional !== 'boolean') throw new TypeError(`${rowLabel}.optional must be boolean`)\r\n const key = protocolKey(row as unknown as ApiReference)\r\n if (seen.has(key)) throw new TypeError(`${label} contains duplicate protocol ${JSON.stringify(key)}`)\r\n seen.add(key)\r\n }\r\n}\r\n\r\nfunction validateExtensions(value: unknown, label: string): void {\r\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\r\n const seen = new Set<string>()\r\n for (const [index, extensionValue] of value.entries()) {\r\n const rowLabel = `${label}[${index}]`\r\n validateApiReference(extensionValue, rowLabel)\r\n const extension = extensionValue as unknown as Record<string, unknown>\r\n exact(extension, ['apiVersion', 'kind', 'metadata', 'spec'], rowLabel)\r\n if (!record(extension.metadata)) throw new TypeError(`${rowLabel}.metadata must be an object`)\r\n exact(extension.metadata, ['name', 'labels'], `${rowLabel}.metadata`)\r\n nonEmpty(extension.metadata.name, `${rowLabel}.metadata.name`)\r\n if (extension.metadata.labels !== undefined) validateLabels(extension.metadata.labels, `${rowLabel}.metadata.labels`)\r\n if (!Object.hasOwn(extension, 'spec')) throw new TypeError(`${rowLabel}.spec is required`)\r\n if (Object.hasOwn(extension, 'status')) throw new TypeError(`${rowLabel}.status is runtime-owned`)\r\n const key = `${protocolKey(extension as unknown as ApiReference)}\\0${String(extension.metadata.name)}`\r\n if (seen.has(key)) throw new TypeError(`${label} contains duplicate extension ${JSON.stringify(key)}`)\r\n seen.add(key)\r\n }\r\n}\r\n\r\nfunction validatePermissions(value: unknown, label: string): void {\r\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\r\n const seen = new Set<string>()\r\n for (const [index, permissionValue] of value.entries()) {\r\n const rowLabel = `${label}[${index}]`\r\n validateApiReference(permissionValue, rowLabel)\r\n const permission = permissionValue as unknown as Record<string, unknown>\r\n exact(permission, ['apiVersion', 'kind', 'action', 'optional', 'reason', 'spec'], rowLabel)\r\n localName(permission.action, `${rowLabel}.action`)\r\n if (permission.optional !== undefined && typeof permission.optional !== 'boolean') throw new TypeError(`${rowLabel}.optional must be boolean`)\r\n if (permission.reason !== undefined) nonEmpty(permission.reason, `${rowLabel}.reason`)\r\n const key = `${protocolKey(permission as unknown as ApiReference)}\\0${String(permission.action)}`\r\n if (seen.has(key)) throw new TypeError(`${label} contains duplicate permission ${JSON.stringify(key)}`)\r\n seen.add(key)\r\n }\r\n}\r\n\r\nfunction validateRelationships(value: unknown, component: string): void {\r\n if (!record(value)) throw new TypeError('component relationships must be an object')\r\n exact(value, ['depends', 'recommends', 'conflicts', 'breaks'], 'component relationships', false)\r\n for (const kind of ['depends', 'recommends', 'conflicts', 'breaks'] as const) {\r\n const rows = value[kind]\r\n if (rows === undefined) continue\r\n if (!record(rows)) throw new TypeError(`component relationships.${kind} must be an object`)\r\n for (const [target, range] of Object.entries(rows)) {\r\n namespaced(target, `component relationships.${kind} target`)\r\n if (target === component) throw new TypeError(`component cannot declare ${kind} on itself`)\r\n assertVersionRange(range as VersionRange)\r\n }\r\n }\r\n}\r\n\r\nfunction registerDefinition(\r\n target: Map<string, ManifestObjectDefinition>,\r\n definition: ManifestObjectDefinition,\r\n label: string,\r\n): () => void {\r\n validateApiReference(definition, `${label} definition`)\r\n if (typeof definition.validateSpec !== 'function') throw new TypeError(`${label} definition.validateSpec must be a function`)\r\n const key = protocolKey(definition)\r\n if (target.has(key)) throw new Error(`${label} definition ${definition.apiVersion} ${definition.kind} is already registered`)\r\n const stored = Object.freeze({ ...definition })\r\n target.set(key, stored)\r\n return () => { if (target.get(key) === stored) target.delete(key) }\r\n}\r\n\r\nfunction issue(\r\n code: ManifestValidationIssue['code'], severity: ManifestValidationIssue['severity'], path: string, message: string,\r\n): ManifestValidationIssue {\r\n return Object.freeze({ code, severity, path, message })\r\n}\r\n\r\nfunction validateLabels(value: unknown, label: string): void {\r\n if (!record(value)) throw new TypeError(`${label} must be an object`)\r\n for (const [key, item] of Object.entries(value)) {\r\n nonEmpty(key, `${label} key`)\r\n if (typeof item !== 'string') throw new TypeError(`${label}.${key} must be a string`)\r\n }\r\n}\r\n\r\nfunction namespaced(value: unknown, label: string): asserts value is string {\r\n if (typeof value !== 'string' || !COMPONENT_ID.test(value)) throw new TypeError(`${label} must be namespaced`)\r\n}\r\n\r\nfunction localName(value: unknown, label: string): asserts value is string {\r\n if (typeof value !== 'string' || !LOCAL_NAME.test(value)) throw new TypeError(`${label} is invalid`)\r\n}\r\n\r\nfunction nonEmpty(value: unknown, label: string): asserts value is string {\r\n if (typeof value !== 'string' || value.trim() === '') throw new TypeError(`${label} must be a non-empty string`)\r\n}\r\n\r\nfunction validateSchemaIdentifier(value: unknown, label: string): asserts value is string {\r\n nonEmpty(value, label)\r\n try { new URL(value) } catch (error) {\r\n throw new TypeError(`${label} must be an absolute URI`, { cause: error })\r\n }\r\n}\r\n\r\nfunction record(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value)\r\n}\r\n\r\nfunction exact(value: Record<string, unknown>, allowed: readonly string[], label: string, extensions = true): void {\r\n const unknown = Object.keys(value).filter(key => !allowed.includes(key) && !(extensions && key.startsWith('x-')))\r\n if (unknown.length > 0) throw new TypeError(`${label} contains unknown field ${JSON.stringify(unknown[0])}`)\r\n}\r\n\r\nfunction deepFreeze<T>(value: T): T {\r\n if (typeof value !== 'object' || value === null || Object.isFrozen(value)) return value\r\n Object.freeze(value)\r\n for (const child of Object.values(value)) deepFreeze(child)\r\n return value\r\n}\r\n\r\nfunction errorMessage(error: unknown): string {\r\n return error instanceof Error ? error.message : String(error)\r\n}\r\n\r\nfunction manifestDigest(manifest: ComponentManifest): string {\r\n const input = canonical(manifest)\r\n let hash = 2166136261\r\n for (let index = 0; index < input.length; index += 1) hash = Math.imul(hash ^ input.charCodeAt(index), 16777619)\r\n return `fnv1a32:${(hash >>> 0).toString(16).padStart(8, '0')}`\r\n}\r\n\r\nfunction canonical(value: unknown): string {\r\n if (Array.isArray(value)) return `[${value.map(canonical).join(',')}]`\r\n if (record(value)) {\r\n return `{${Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, item]) => `${JSON.stringify(key)}:${canonical(item)}`).join(',')}}`\r\n }\r\n return JSON.stringify(value) ?? 'null'\r\n}\r\n"],"mappings":"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"}
@@ -1,20 +1,20 @@
1
- {
2
- "name": "@dsh-std/manifest",
3
- "version": "0.1.0",
4
- "license": "MIT",
5
- "type": "module",
6
- "main": "lib/index.js",
7
- "types": "lib/index.d.ts",
8
- "exports": {
9
- ".": { "types": "./lib/index.d.ts", "default": "./lib/index.js" },
10
- "./schema/dsh-plugin-0.15.schema.json": "./schema/dsh-plugin-0.15.schema.json"
11
- },
12
- "files": ["lib", "schema", "CHANGELOG.md"],
13
- "scripts": {
14
- "build": "pnpm run typecheck && tsdown",
15
- "typecheck": "tsc -p tsconfig.json --noEmit",
16
- "test": "vitest run"
17
- },
18
- "dependencies": { "@dsh-std/core": "workspace:*" },
19
- "engines": { "node": "^22.19 || >=24" }
20
- }
1
+ {
2
+ "name": "@dsh-std/manifest",
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "lib/index.js",
7
+ "types": "lib/index.d.ts",
8
+ "exports": {
9
+ ".": { "types": "./lib/index.d.ts", "default": "./lib/index.js" },
10
+ "./schema/dsh-plugin-0.15.schema.json": "./schema/dsh-plugin-0.15.schema.json"
11
+ },
12
+ "files": ["lib", "schema", "CHANGELOG.md"],
13
+ "scripts": {
14
+ "build": "pnpm run typecheck && tsdown",
15
+ "typecheck": "tsc -p tsconfig.json --noEmit",
16
+ "test": "vitest run"
17
+ },
18
+ "dependencies": { "@dsh-std/core": "workspace:*" },
19
+ "engines": { "node": "^22.19 || >=24" }
20
+ }
@@ -1,144 +1,144 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "title": "DSH Plugin Manifest Community Draft v0.15",
4
- "type": "object",
5
- "additionalProperties": false,
6
- "required": ["$schema", "manifestVersion", "id", "name", "version", "facets", "requires", "permissions", "contributes", "subscriptions"],
7
- "properties": {
8
- "$schema": { "type": "string", "format": "uri" },
9
- "manifestVersion": { "const": "0.15" },
10
- "id": { "$ref": "#/$defs/namespacedId" },
11
- "name": { "type": "string", "minLength": 1 },
12
- "version": { "type": "string", "minLength": 1 },
13
- "facets": {
14
- "type": "object",
15
- "additionalProperties": false,
16
- "required": ["host"],
17
- "properties": {
18
- "host": {
19
- "type": "object",
20
- "additionalProperties": false,
21
- "required": ["entry", "apiVersion"],
22
- "properties": {
23
- "entry": { "type": "string", "minLength": 1, "pattern": "^(?![\\\\/])(?![A-Za-z]:[\\\\/])(?!.*(?:^|[\\\\/])\\.\\.(?:[\\\\/]|$)).+$" },
24
- "apiVersion": { "type": "string", "pattern": "^v[1-9][0-9]*(?:(?:alpha|beta)[1-9][0-9]*)?$" }
25
- }
26
- }
27
- }
28
- },
29
- "requires": {
30
- "type": "object",
31
- "additionalProperties": false,
32
- "required": ["contracts"],
33
- "properties": {
34
- "contracts": { "type": "array", "items": { "$ref": "#/$defs/contract" } },
35
- "services": { "type": "array", "maxItems": 0 }
36
- }
37
- },
38
- "permissions": { "type": "array", "items": { "$ref": "#/$defs/permission" } },
39
- "contributes": {
40
- "type": "object",
41
- "required": ["commands"],
42
- "properties": {
43
- "commands": { "type": "array", "items": { "$ref": "#/$defs/command" } },
44
- "panels": { "type": "array", "maxItems": 0 }
45
- },
46
- "patternProperties": { "^x-": { "type": "array" } },
47
- "additionalProperties": false
48
- },
49
- "subscriptions": {
50
- "type": "array",
51
- "items": {
52
- "oneOf": [
53
- { "type": "string", "minLength": 1 },
54
- { "$ref": "#/$defs/subscription" }
55
- ]
56
- }
57
- },
58
- "license": { "type": "string", "minLength": 1 },
59
- "source": {
60
- "type": "object",
61
- "additionalProperties": false,
62
- "required": ["repository"],
63
- "properties": {
64
- "repository": { "type": "string", "format": "uri" },
65
- "revision": { "type": "string", "minLength": 1 }
66
- }
67
- },
68
- "artifact": {
69
- "type": "object",
70
- "additionalProperties": false,
71
- "required": ["digest", "algorithm", "path"],
72
- "properties": {
73
- "digest": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
74
- "algorithm": { "const": "sha256" },
75
- "path": { "type": "string", "minLength": 1 }
76
- }
77
- },
78
- "compat": {
79
- "type": "object",
80
- "additionalProperties": false,
81
- "properties": { "hosts": { "type": "array", "items": { "type": "string", "minLength": 1 } } }
82
- },
83
- "overrides": {
84
- "type": "array",
85
- "items": {
86
- "type": "object",
87
- "additionalProperties": false,
88
- "required": ["target", "kind"],
89
- "properties": {
90
- "target": { "type": "string", "minLength": 1 },
91
- "kind": { "enum": ["patch", "native", "build"] },
92
- "description": { "type": "string", "minLength": 1 }
93
- }
94
- }
95
- }
96
- },
97
- "patternProperties": { "^x-": {} },
98
- "$defs": {
99
- "namespacedId": { "type": "string", "pattern": "^[a-z][a-z0-9]*(?:[.-][a-z0-9][a-z0-9-]*)+$" },
100
- "apiVersion": { "type": "string", "pattern": "^[a-z][a-z0-9.-]*/v[1-9][0-9]*(?:(?:alpha|beta)[1-9][0-9]*)?$" },
101
- "kind": { "type": "string", "pattern": "^[A-Z][A-Za-z0-9]*$" },
102
- "contract": {
103
- "type": "object",
104
- "additionalProperties": false,
105
- "required": ["apiVersion", "kind"],
106
- "properties": {
107
- "apiVersion": { "$ref": "#/$defs/apiVersion" },
108
- "kind": { "$ref": "#/$defs/kind" },
109
- "optional": { "type": "boolean" },
110
- "fallback": { "type": "string", "minLength": 1 }
111
- }
112
- },
113
- "permission": {
114
- "type": "object",
115
- "additionalProperties": false,
116
- "required": ["name", "scope"],
117
- "properties": {
118
- "name": { "$ref": "#/$defs/namespacedId" },
119
- "scope": { "type": "string", "minLength": 1 },
120
- "reason": { "type": "string", "minLength": 1 }
121
- }
122
- },
123
- "command": {
124
- "type": "object",
125
- "additionalProperties": false,
126
- "required": ["id", "title"],
127
- "properties": {
128
- "id": { "$ref": "#/$defs/namespacedId" },
129
- "title": { "type": "string", "minLength": 1 },
130
- "description": { "type": "string", "minLength": 1 }
131
- }
132
- },
133
- "subscription": {
134
- "type": "object",
135
- "additionalProperties": false,
136
- "required": ["apiVersion", "kind"],
137
- "properties": {
138
- "apiVersion": { "$ref": "#/$defs/apiVersion" },
139
- "kind": { "$ref": "#/$defs/kind" },
140
- "scope": { "type": "string", "minLength": 1 }
141
- }
142
- }
143
- }
144
- }
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "DSH Plugin Manifest Community Draft v0.15",
4
+ "type": "object",
5
+ "additionalProperties": false,
6
+ "required": ["$schema", "manifestVersion", "id", "name", "version", "facets", "requires", "permissions", "contributes", "subscriptions"],
7
+ "properties": {
8
+ "$schema": { "type": "string", "format": "uri" },
9
+ "manifestVersion": { "const": "0.15" },
10
+ "id": { "$ref": "#/$defs/namespacedId" },
11
+ "name": { "type": "string", "minLength": 1 },
12
+ "version": { "type": "string", "minLength": 1 },
13
+ "facets": {
14
+ "type": "object",
15
+ "additionalProperties": false,
16
+ "required": ["host"],
17
+ "properties": {
18
+ "host": {
19
+ "type": "object",
20
+ "additionalProperties": false,
21
+ "required": ["entry", "apiVersion"],
22
+ "properties": {
23
+ "entry": { "type": "string", "minLength": 1, "pattern": "^(?![\\\\/])(?![A-Za-z]:[\\\\/])(?!.*(?:^|[\\\\/])\\.\\.(?:[\\\\/]|$)).+$" },
24
+ "apiVersion": { "type": "string", "pattern": "^v[1-9][0-9]*(?:(?:alpha|beta)[1-9][0-9]*)?$" }
25
+ }
26
+ }
27
+ }
28
+ },
29
+ "requires": {
30
+ "type": "object",
31
+ "additionalProperties": false,
32
+ "required": ["contracts"],
33
+ "properties": {
34
+ "contracts": { "type": "array", "items": { "$ref": "#/$defs/contract" } },
35
+ "services": { "type": "array", "maxItems": 0 }
36
+ }
37
+ },
38
+ "permissions": { "type": "array", "items": { "$ref": "#/$defs/permission" } },
39
+ "contributes": {
40
+ "type": "object",
41
+ "required": ["commands"],
42
+ "properties": {
43
+ "commands": { "type": "array", "items": { "$ref": "#/$defs/command" } },
44
+ "panels": { "type": "array", "maxItems": 0 }
45
+ },
46
+ "patternProperties": { "^x-": { "type": "array" } },
47
+ "additionalProperties": false
48
+ },
49
+ "subscriptions": {
50
+ "type": "array",
51
+ "items": {
52
+ "oneOf": [
53
+ { "type": "string", "minLength": 1 },
54
+ { "$ref": "#/$defs/subscription" }
55
+ ]
56
+ }
57
+ },
58
+ "license": { "type": "string", "minLength": 1 },
59
+ "source": {
60
+ "type": "object",
61
+ "additionalProperties": false,
62
+ "required": ["repository"],
63
+ "properties": {
64
+ "repository": { "type": "string", "format": "uri" },
65
+ "revision": { "type": "string", "minLength": 1 }
66
+ }
67
+ },
68
+ "artifact": {
69
+ "type": "object",
70
+ "additionalProperties": false,
71
+ "required": ["digest", "algorithm", "path"],
72
+ "properties": {
73
+ "digest": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
74
+ "algorithm": { "const": "sha256" },
75
+ "path": { "type": "string", "minLength": 1 }
76
+ }
77
+ },
78
+ "compat": {
79
+ "type": "object",
80
+ "additionalProperties": false,
81
+ "properties": { "hosts": { "type": "array", "items": { "type": "string", "minLength": 1 } } }
82
+ },
83
+ "overrides": {
84
+ "type": "array",
85
+ "items": {
86
+ "type": "object",
87
+ "additionalProperties": false,
88
+ "required": ["target", "kind"],
89
+ "properties": {
90
+ "target": { "type": "string", "minLength": 1 },
91
+ "kind": { "enum": ["patch", "native", "build"] },
92
+ "description": { "type": "string", "minLength": 1 }
93
+ }
94
+ }
95
+ }
96
+ },
97
+ "patternProperties": { "^x-": {} },
98
+ "$defs": {
99
+ "namespacedId": { "type": "string", "pattern": "^[a-z][a-z0-9]*(?:[.-][a-z0-9][a-z0-9-]*)+$" },
100
+ "apiVersion": { "type": "string", "pattern": "^[a-z][a-z0-9.-]*/v[1-9][0-9]*(?:(?:alpha|beta)[1-9][0-9]*)?$" },
101
+ "kind": { "type": "string", "pattern": "^[A-Z][A-Za-z0-9]*$" },
102
+ "contract": {
103
+ "type": "object",
104
+ "additionalProperties": false,
105
+ "required": ["apiVersion", "kind"],
106
+ "properties": {
107
+ "apiVersion": { "$ref": "#/$defs/apiVersion" },
108
+ "kind": { "$ref": "#/$defs/kind" },
109
+ "optional": { "type": "boolean" },
110
+ "fallback": { "type": "string", "minLength": 1 }
111
+ }
112
+ },
113
+ "permission": {
114
+ "type": "object",
115
+ "additionalProperties": false,
116
+ "required": ["name", "scope"],
117
+ "properties": {
118
+ "name": { "$ref": "#/$defs/namespacedId" },
119
+ "scope": { "type": "string", "minLength": 1 },
120
+ "reason": { "type": "string", "minLength": 1 }
121
+ }
122
+ },
123
+ "command": {
124
+ "type": "object",
125
+ "additionalProperties": false,
126
+ "required": ["id", "title"],
127
+ "properties": {
128
+ "id": { "$ref": "#/$defs/namespacedId" },
129
+ "title": { "type": "string", "minLength": 1 },
130
+ "description": { "type": "string", "minLength": 1 }
131
+ }
132
+ },
133
+ "subscription": {
134
+ "type": "object",
135
+ "additionalProperties": false,
136
+ "required": ["apiVersion", "kind"],
137
+ "properties": {
138
+ "apiVersion": { "$ref": "#/$defs/apiVersion" },
139
+ "kind": { "$ref": "#/$defs/kind" },
140
+ "scope": { "type": "string", "minLength": 1 }
141
+ }
142
+ }
143
+ }
144
+ }
@@ -1,9 +1,9 @@
1
- # Changelog
2
-
3
- Changes to `@dsh-std/presentation` are recorded here.
4
-
5
- ## 0.1.0 (draft)
6
-
7
- - Defined invocation-scoped `OpenExternal`, `CopyText`, `Notification`, `UserInteraction`, and `ExternalRedirect` capabilities.
8
- - Added typed question, approval, secret-input, and one-shot loopback redirect flows.
9
- - Added optional exact loopback callback URIs with explicit-port validation, no-substitution semantics, and address-in-use failure reporting.
1
+ # Changelog
2
+
3
+ Changes to `@dsh-std/presentation` are recorded here.
4
+
5
+ ## 0.1.0 (draft)
6
+
7
+ - Defined invocation-scoped `OpenExternal`, `CopyText`, `Notification`, `UserInteraction`, and `ExternalRedirect` capabilities.
8
+ - Added typed question, approval, secret-input, and one-shot loopback redirect flows.
9
+ - Added optional exact loopback callback URIs with explicit-port validation, no-substitution semantics, and address-in-use failure reporting.