@aglyn/plugins-marketplace 1.0.0-beta.269 → 1.0.0-beta.270

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aglyn/plugins-marketplace",
3
- "version": "1.0.0-beta.269",
3
+ "version": "1.0.0-beta.270",
4
4
  "license": "Apache-2.0",
5
5
  "homepage": "https://aglyn.com",
6
6
  "repository": {
@@ -25,19 +25,19 @@
25
25
  "./package.json": "./package.json"
26
26
  },
27
27
  "dependencies": {
28
- "@aglyn/aglyn": "1.0.0-beta.269",
29
- "@aglyn/aglyn-markdown-editor": "1.0.0-beta.269",
30
- "@aglyn/shared-data-enums": "1.0.0-beta.269",
31
- "@aglyn/shared-data-mdi": "1.0.0-beta.269",
32
- "@aglyn/shared-ui-jsx": "1.0.0-beta.269",
33
- "@aglyn/shared-ui-next": "1.0.0-beta.269",
34
- "@aglyn/shared-ui-snackstack": "1.0.0-beta.269",
35
- "@aglyn/shared-util-email": "1.0.0-beta.269",
36
- "@aglyn/shared-util-http": "1.0.0-beta.269",
37
- "@aglyn/shared-util-timestamp": "1.0.0-beta.269",
38
- "@aglyn/tenant-data-admin": "1.0.0-beta.269",
39
- "@aglyn/tenant-feature-instance": "1.0.0-beta.269",
40
- "@aglyn/tenant-runtime": "1.0.0-beta.269",
28
+ "@aglyn/aglyn": "1.0.0-beta.270",
29
+ "@aglyn/aglyn-markdown-editor": "1.0.0-beta.270",
30
+ "@aglyn/shared-data-enums": "1.0.0-beta.270",
31
+ "@aglyn/shared-data-mdi": "1.0.0-beta.270",
32
+ "@aglyn/shared-ui-jsx": "1.0.0-beta.270",
33
+ "@aglyn/shared-ui-next": "1.0.0-beta.270",
34
+ "@aglyn/shared-ui-snackstack": "1.0.0-beta.270",
35
+ "@aglyn/shared-util-email": "1.0.0-beta.270",
36
+ "@aglyn/shared-util-http": "1.0.0-beta.270",
37
+ "@aglyn/shared-util-timestamp": "1.0.0-beta.270",
38
+ "@aglyn/tenant-data-admin": "1.0.0-beta.270",
39
+ "@aglyn/tenant-feature-instance": "1.0.0-beta.270",
40
+ "@aglyn/tenant-runtime": "1.0.0-beta.270",
41
41
  "@swc/helpers": "0.5.23"
42
42
  },
43
43
  "peerDependencies": {
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * The Marketplace hub's Licenses section id, as the console addresses it
19
+ * (`/[orgSlug]/marketplace/{id}`) and Stripe's checkout returns to it
20
+ * (`purchase` lands there). A stored value, not a word: the label is
21
+ * American (*Licenses*), the id is kept as shipped, so a link anybody holds
22
+ * still lands. Held here once, for the hub's declaration and the native nav.
23
+ */
24
+ export declare const MARKETPLACE_LICENSES_SECTION_ID = "licences";
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ /**
17
+ * The Marketplace hub's Licenses section id, as the console addresses it
18
+ * (`/[orgSlug]/marketplace/{id}`) and Stripe's checkout returns to it
19
+ * (`purchase` lands there). A stored value, not a word: the label is
20
+ * American (*Licenses*), the id is kept as shipped, so a link anybody holds
21
+ * still lands. Held here once, for the hub's declaration and the native nav.
22
+ */ export const MARKETPLACE_LICENSES_SECTION_ID = 'licences';
23
+
24
+ //# sourceMappingURL=marketplace-section-ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/marketplace/src/lib/model/marketplace-section-ids.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The Marketplace hub's Licenses section id, as the console addresses it\n * (`/[orgSlug]/marketplace/{id}`) and Stripe's checkout returns to it\n * (`purchase` lands there). A stored value, not a word: the label is\n * American (*Licenses*), the id is kept as shipped, so a link anybody holds\n * still lands. Held here once, for the hub's declaration and the native nav.\n */\nexport const MARKETPLACE_LICENSES_SECTION_ID = 'licences'\n"],"names":["MARKETPLACE_LICENSES_SECTION_ID"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;CAMC,GACD,OAAO,MAAMA,kCAAkC,WAAU"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { type NativeNavContribution } from '@aglyn/aglyn/app-utils/native-nav';
18
+ /**
19
+ * The Marketplace in the native apps' navigation (AGL-3943): the rows this plugin
20
+ * adds to the manifest the shells draw, placed into the core's lists by
21
+ * `order` (`assembleNativeNav`, `generate:native-contracts`). Labels are the
22
+ * console's words, held by `apps/console/specs/native-nav-manifest.spec.ts`.
23
+ *
24
+ * Imports only the core's plain nav module and the hub's section id, so the
25
+ * native contracts read it.
26
+ */
27
+ export declare const NATIVE_NAV_ROWS: readonly NativeNavContribution[];
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ import { nativeNavHubSection, nativeNavIcon, nativeNavRef } from "@aglyn/aglyn/app-utils/native-nav";
17
+ import { MARKETPLACE_LICENSES_SECTION_ID } from "./model/marketplace-section-ids.js";
18
+ /**
19
+ * The Marketplace in the native apps' navigation (AGL-3943): the rows this plugin
20
+ * adds to the manifest the shells draw, placed into the core's lists by
21
+ * `order` (`assembleNativeNav`, `generate:native-contracts`). Labels are the
22
+ * console's words, held by `apps/console/specs/native-nav-manifest.spec.ts`.
23
+ *
24
+ * Imports only the core's plain nav module and the hub's section id, so the
25
+ * native contracts read it.
26
+ */ export const NATIVE_NAV_ROWS = [
27
+ {
28
+ list: 'workspace',
29
+ group: 'workspace',
30
+ row: {
31
+ id: 'marketplace',
32
+ label: 'Marketplace',
33
+ icon: nativeNavIcon('storefront', 'storefront'),
34
+ screen: 'marketplace.browse',
35
+ pluginId: 'marketplace',
36
+ order: 110,
37
+ sections: [
38
+ nativeNavHubSection('org', '/marketplace', 'browse', 'Browse All', 'marketplace.browse'),
39
+ nativeNavHubSection('org', '/marketplace', 'installed', 'Installed', 'marketplace.installed'),
40
+ nativeNavHubSection('org', '/marketplace', MARKETPLACE_LICENSES_SECTION_ID, 'Licenses', 'marketplace.licenses')
41
+ ],
42
+ docs: '/developers/plugins/overview',
43
+ console: nativeNavRef('orgPluginTab', '/marketplace')
44
+ }
45
+ }
46
+ ];
47
+
48
+ //# sourceMappingURL=native-nav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../libs/plugins/marketplace/src/lib/native-nav.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n nativeNavHubSection,\n nativeNavIcon,\n nativeNavRef,\n type NativeNavContribution,\n} from '@aglyn/aglyn/app-utils/native-nav'\nimport { MARKETPLACE_LICENSES_SECTION_ID } from './model/marketplace-section-ids'\n\n/**\n * The Marketplace in the native apps' navigation (AGL-3943): the rows this plugin\n * adds to the manifest the shells draw, placed into the core's lists by\n * `order` (`assembleNativeNav`, `generate:native-contracts`). Labels are the\n * console's words, held by `apps/console/specs/native-nav-manifest.spec.ts`.\n *\n * Imports only the core's plain nav module and the hub's section id, so the\n * native contracts read it.\n */\n\nexport const NATIVE_NAV_ROWS: readonly NativeNavContribution[] = [\n {\n list: 'workspace',\n group: 'workspace',\n row: {\n id: 'marketplace',\n label: 'Marketplace',\n icon: nativeNavIcon('storefront', 'storefront'),\n screen: 'marketplace.browse',\n pluginId: 'marketplace',\n order: 110,\n sections: [\n nativeNavHubSection('org', '/marketplace', 'browse', 'Browse All', 'marketplace.browse'),\n nativeNavHubSection('org', '/marketplace', 'installed', 'Installed', 'marketplace.installed'),\n nativeNavHubSection('org', '/marketplace', MARKETPLACE_LICENSES_SECTION_ID, 'Licenses', 'marketplace.licenses'),\n ],\n docs: '/developers/plugins/overview',\n console: nativeNavRef('orgPluginTab', '/marketplace'),\n },\n },\n]\n"],"names":["nativeNavHubSection","nativeNavIcon","nativeNavRef","MARKETPLACE_LICENSES_SECTION_ID","NATIVE_NAV_ROWS","list","group","row","id","label","icon","screen","pluginId","order","sections","docs","console"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,SACEA,mBAAmB,EACnBC,aAAa,EACbC,YAAY,QAEP,oCAAmC;AAC1C,SAASC,+BAA+B,QAAQ,qCAAiC;AAEjF;;;;;;;;CAQC,GAED,OAAO,MAAMC,kBAAoD;IAC/D;QACEC,MAAM;QACNC,OAAO;QACPC,KAAK;YACHC,IAAI;YACJC,OAAO;YACPC,MAAMT,cAAc,cAAc;YAClCU,QAAQ;YACRC,UAAU;YACVC,OAAO;YACPC,UAAU;gBACRd,oBAAoB,OAAO,gBAAgB,UAAU,cAAc;gBACnEA,oBAAoB,OAAO,gBAAgB,aAAa,aAAa;gBACrEA,oBAAoB,OAAO,gBAAgBG,iCAAiC,YAAY;aACzF;YACDY,MAAM;YACNC,SAASd,aAAa,gBAAgB;QACxC;IACF;CACD,CAAA"}
package/src/lib/plugin.js CHANGED
@@ -28,6 +28,7 @@ import TemplateGalleryShelf from "./components/template-gallery-shelf.component.
28
28
  import TemplateInstallStatus from "./components/template-install-status.component.js";
29
29
  import PublishArtifactDialog from "./components/publish-artifact-dialog.component.js";
30
30
  import { BUNDLE_ID } from "./constants/bundle-common.js";
31
+ import { MARKETPLACE_LICENSES_SECTION_ID } from "./model/marketplace-section-ids.js";
31
32
  import { RATING_FIELD } from "./model/rating-field.js";
32
33
  import RatingInput from "./components/rating-input.component.js";
33
34
  /**
@@ -174,7 +175,7 @@ import RatingInput from "./components/rating-input.component.js";
174
175
  * and holds the URL, and a buyer coming back wants what they now
175
176
  * own.
176
177
  */ {
177
- id: 'licences',
178
+ id: MARKETPLACE_LICENSES_SECTION_ID,
178
179
  label: 'Licenses',
179
180
  landsOnQuery: [
180
181
  'purchase'
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../libs/plugins/marketplace/src/lib/plugin.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport { ICON_VARIANT_SYMBOL_FLAG } from '@aglyn/shared-data-enums'\nimport { mdiStorefrontOutline } from '@aglyn/shared-data-mdi'\nimport MarketplaceBrowse from './components/marketplace-browse.component'\nimport MarketplaceHub from './components/marketplace-hub.component'\nimport MarketplaceReportsPage from './components/marketplace-reports-page.component'\nimport PluginReviewsSurface from './components/plugin-reviews-surface.component'\nimport MarketplacePaymentsNotice from './components/marketplace-payments-notice.component'\nimport HostPluginsCard from './components/host-plugins-card.component'\nimport PluginSiteSetPanel from './components/plugin-site-set-panel.component'\nimport OrgPluginInstallsCard from './components/org-plugin-installs-card.component'\nimport PluginInstallStatus from './components/plugin-install-status.component'\nimport StaffMarketplaceOverview from './components/staff-marketplace-overview.component'\nimport TemplateGalleryShelf from './components/template-gallery-shelf.component'\nimport TemplateInstallStatus from './components/template-install-status.component'\nimport PublishArtifactDialog from './components/publish-artifact-dialog.component'\nimport { MarketplaceListingContent } from './components/listing-content.component'\nimport { BUNDLE_ID } from './constants/bundle-common'\nimport { RATING_FIELD } from './model/rating-field'\nimport RatingInput from './components/rating-input.component'\n\n/**\n * Marketplace feature plugin (AGL-395). Console-only — marketplace components\n * install into a host's own components collection and render through the\n * normal compose pipeline, so there is no separate canvas bundle.\n *\n * The marketplace moved to org scope (AGL-772/774): browse + install live at\n * `/[orgSlug]/marketplace`, so this plugin no longer contributes a per-site\n * `Marketplace` nav tab (AGL-775). It exposes its UI purely through widget\n * slots — `orgMarketplace` (browse), `marketplaceListing` (detail) and\n * `orgAddons` (installed) — which the app renders without importing the\n * plugin.\n */\nexport function registerMarketplaceConsole(): void {\n // Custom field type (AGL-434): rating rides int32 with a starred input.\n Aglyn.registerCustomFieldType({ ...RATING_FIELD, Input: RatingInput })\n Aglyn.registerConsoleExtension({\n /*\n * Four widgets fewer since AGL-3080 — the listing body, the capability\n * notice, browse, and installed add-ons. Their zones existed for one\n * reason: a CONSOLE ROUTE had to show them and an app may not import a\n * plugin. The hub is this plugin's own surface now, so those components\n * are plain imports and the four zones are gone from the catalog.\n *\n * What is left is what a console page OTHER than the marketplace draws.\n */\n widgets: [\n // The site set for one installation (AGL-1007): the same control the\n // listing page uses, exposed so the installation detail page can show\n // it without the app importing this plugin.\n {\n slot: 'pluginSiteSet',\n widgetId: 'marketplace-plugin-site-set',\n Component: PluginSiteSetPanel,\n },\n // Publishing something the console holds (AGL-3080). The page that\n // offers it keeps the control that opens it — a menu item is one entry\n // of a list the page builds, not a widget — and hands over what it has\n // in its own vocabulary. Where a layout or a theme GOES, what a listing\n // of it is called and what it may cost at the least are this plugin's.\n {\n slot: 'hostArtifactPublish',\n widgetId: 'marketplace-publish-artifact',\n Component: PublishArtifactDialog,\n },\n // The workspace's Plugins page and an installation's own page\n // (AGL-3080). The shell owns both pages and the built-in half of the\n // inventory; what this plugin installed — its pins, whether a newer\n // version may be installed, whether a kill switch is thrown — is read\n // from this plugin's own collections, so this plugin draws it.\n {\n slot: 'orgPluginInstalls',\n widgetId: 'marketplace-org-plugin-installs',\n Component: OrgPluginInstallsCard,\n },\n {\n slot: 'pluginInstallStatus',\n widgetId: 'marketplace-plugin-install-status',\n Component: PluginInstallStatus,\n },\n // The staff overview (AGL-3080): recent purchases and the\n // refund-reversal recovery queue, from this plugin's own purchases.\n {\n slot: 'staffOverview',\n widgetId: 'marketplace-staff-overview',\n Component: StaffMarketplaceOverview,\n },\n // A site's templates (AGL-3080). The gallery and the library are the\n // shell's; the site templates this plugin lists, the route that\n // installs one, and whether a template it installed has a newer\n // version are read from this plugin's listings, so this plugin draws\n // them: a shelf of the gallery, and a chip on the library's row.\n {\n slot: 'templateGallery',\n widgetId: 'marketplace-template-gallery',\n Component: TemplateGalleryShelf,\n },\n {\n slot: 'templateInstallStatus',\n widgetId: 'marketplace-template-install-status',\n Component: TemplateInstallStatus,\n },\n ],\n /**\n * THE MARKETPLACE HUB, as a declaration (AGL-3080).\n *\n * Seventeen hand-written console routes until now — the eight sections\n * below plus a listing, a publisher storefront and a publish form —\n * whose whole job was assembling chrome around bodies that already\n * belonged to this plugin. The shell's generic org plugin route does\n * that assembly for every other surface from exactly this.\n *\n * `ownsSubtree` is what keeps every URL the same. A segment naming a\n * section below resolves as that section; anything else beneath\n * `/marketplace` is handed to the page as `segments`, which is how\n * `/{org}/marketplace/{listingId}` still opens a listing. The cost is\n * stated where the flag is declared: this surface can no longer tell a\n * typo from an id, so it owns saying \"no such thing\" — which a listing\n * page has to do anyway for one deleted while a link to it was still in\n * someone's inbox.\n */\n orgNavItems: [\n {\n label: 'Marketplace',\n href: '/marketplace',\n navTabId: 'nav-tab-org-marketplace',\n icon: { path: mdiStorefrontOutline.path },\n /*\n * Last of the plugin tabs, so it sits directly before the shell's\n * Plugins tab (AGL-3294): shopping for plugins beside managing the\n * ones the workspace runs, the pair AGL-1011 split into two tabs.\n */\n tabOrder: 100,\n ownsSubtree: true,\n Component: MarketplaceHub,\n header: {\n title: 'Marketplace',\n icon: { path: mdiStorefrontOutline.path },\n docsTopic: 'plugins',\n },\n sections: [\n // \"Browse All\" (AGL-1024): the same grid also renders\n // publisher-filtered views, so the unqualified verb was ambiguous\n // about which you were getting.\n { id: 'browse', label: 'Browse All' },\n { id: 'installed', label: 'Installed' },\n /*\n * What this workspace OWNS (AGL-2331) — an org can hold a licence\n * nobody has installed, and a member can install something they\n * never bought. Buyer-side, so deliberately NOT gated like the\n * seller sections below: the person who needs it is often not a\n * publisher at all.\n *\n * `purchase` lands here: Stripe bakes it into the checkout session\n * and holds the URL, and a buyer coming back wants what they now\n * own.\n */\n {\n id: 'licences',\n label: 'Licenses',\n landsOnQuery: ['purchase'],\n },\n /*\n * The seller half. Each reads the organization's REVENUE or its\n * payout account, so each names the permission rather than relying\n * on a hidden tab — a URL can be typed whether or not a tab was\n * ever offered, and the shell applies this to the rail and to the\n * deep link as one verdict.\n */\n {\n id: 'upload',\n // Covers uploading a bundle as well as publishing an existing\n // artifact (AGL-1024).\n label: 'Upload / Publish',\n permission: 'publishToMarketplace',\n },\n {\n id: 'profile',\n // Whose profile (AGL-1024) — the console also has org and user\n // profiles.\n label: 'Publisher Profile',\n permission: 'publishToMarketplace',\n },\n {\n id: 'listings',\n label: 'Listings',\n permission: 'publishToMarketplace',\n },\n {\n id: 'payouts',\n label: 'Payouts',\n permission: 'publishToMarketplace',\n // Stripe Connect onboarding returns with this, from\n // `server/connect.ts`. A seller coming back wants Payouts.\n landsOnQuery: ['connect'],\n },\n {\n id: 'sales',\n label: 'Sales',\n permission: 'publishToMarketplace',\n },\n ],\n },\n ],\n /**\n * The report queue, in the staff area (AGL-2310, moved by AGL-3080).\n *\n * `marketplaceReports` is a collection only this plugin writes, and the\n * queue that triages it was a console staff route because the staff area\n * had no way for a plugin to own a page. It does (AGL-2939), and the\n * shell serves this at the same `/admin/marketplace-reports` it always\n * had — a staff page's id IS its URL segment.\n */\n staffPages: [\n {\n id: 'marketplace-reports',\n label: 'Marketplace reports',\n header: {\n title: 'Marketplace Reports',\n icon: { path: ICON_VARIANT_SYMBOL_FLAG.path },\n // The abuse queue's topic, for the reason the page's own help\n // gives. The page publishes the `#statuses` anchor itself, which a\n // `staffPages` entry cannot carry.\n docsTopic: 'abuseReports',\n },\n Component: MarketplaceReportsPage,\n },\n /**\n * The review queue (AGL-432, moved by AGL-3080).\n *\n * `ownsSubtree` is what makes the move possible at all: the queue is a\n * list and each row opens one submission at\n * `/admin/plugin-reviews/{listingId}`, and a staff page without it\n * could only ever BE the list. Same URLs as the console routes it\n * replaces — a staff page's id IS its segment under `/admin`.\n *\n * The queue carries no signing authority. Granting realm trust is a\n * separate super-only act on its own route; listing and verifying here\n * never signs anything.\n */\n {\n id: 'plugin-reviews',\n label: 'Plugin reviews',\n ownsSubtree: true,\n header: {\n title: 'Plugin reviews',\n icon: { path: ICON_VARIANT_SYMBOL_FLAG.path },\n docsTopic: 'staffConsole',\n },\n Component: PluginReviewsSurface,\n },\n ],\n pluginId: BUNDLE_ID,\n displayName: 'Marketplace',\n })\n}\n\n// Shared with the listing/publisher detail app-routes.\nexport { default as useMarketplaceActions } from './hooks/use-marketplace-actions'\nexport { default as MarketplaceBrowse } from './components/marketplace-browse.component'\nexport { default as HostPluginsCard } from './components/host-plugins-card.component'\nexport { default as PluginSiteSetPanel } from './components/plugin-site-set-panel.component'\n"],"names":["Aglyn","ICON_VARIANT_SYMBOL_FLAG","mdiStorefrontOutline","MarketplaceHub","MarketplaceReportsPage","PluginReviewsSurface","PluginSiteSetPanel","OrgPluginInstallsCard","PluginInstallStatus","StaffMarketplaceOverview","TemplateGalleryShelf","TemplateInstallStatus","PublishArtifactDialog","BUNDLE_ID","RATING_FIELD","RatingInput","registerMarketplaceConsole","registerCustomFieldType","Input","registerConsoleExtension","widgets","slot","widgetId","Component","orgNavItems","label","href","navTabId","icon","path","tabOrder","ownsSubtree","header","title","docsTopic","sections","id","landsOnQuery","permission","staffPages","pluginId","displayName","default","useMarketplaceActions","MarketplaceBrowse","HostPluginsCard"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../libs/plugins/marketplace/src/lib/plugin.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport { ICON_VARIANT_SYMBOL_FLAG } from '@aglyn/shared-data-enums'\nimport { mdiStorefrontOutline } from '@aglyn/shared-data-mdi'\nimport MarketplaceBrowse from './components/marketplace-browse.component'\nimport MarketplaceHub from './components/marketplace-hub.component'\nimport MarketplaceReportsPage from './components/marketplace-reports-page.component'\nimport PluginReviewsSurface from './components/plugin-reviews-surface.component'\nimport MarketplacePaymentsNotice from './components/marketplace-payments-notice.component'\nimport HostPluginsCard from './components/host-plugins-card.component'\nimport PluginSiteSetPanel from './components/plugin-site-set-panel.component'\nimport OrgPluginInstallsCard from './components/org-plugin-installs-card.component'\nimport PluginInstallStatus from './components/plugin-install-status.component'\nimport StaffMarketplaceOverview from './components/staff-marketplace-overview.component'\nimport TemplateGalleryShelf from './components/template-gallery-shelf.component'\nimport TemplateInstallStatus from './components/template-install-status.component'\nimport PublishArtifactDialog from './components/publish-artifact-dialog.component'\nimport { MarketplaceListingContent } from './components/listing-content.component'\nimport { BUNDLE_ID } from './constants/bundle-common'\nimport { MARKETPLACE_LICENSES_SECTION_ID } from './model/marketplace-section-ids'\nimport { RATING_FIELD } from './model/rating-field'\nimport RatingInput from './components/rating-input.component'\n\n/**\n * Marketplace feature plugin (AGL-395). Console-only — marketplace components\n * install into a host's own components collection and render through the\n * normal compose pipeline, so there is no separate canvas bundle.\n *\n * The marketplace moved to org scope (AGL-772/774): browse + install live at\n * `/[orgSlug]/marketplace`, so this plugin no longer contributes a per-site\n * `Marketplace` nav tab (AGL-775). It exposes its UI purely through widget\n * slots — `orgMarketplace` (browse), `marketplaceListing` (detail) and\n * `orgAddons` (installed) — which the app renders without importing the\n * plugin.\n */\nexport function registerMarketplaceConsole(): void {\n // Custom field type (AGL-434): rating rides int32 with a starred input.\n Aglyn.registerCustomFieldType({ ...RATING_FIELD, Input: RatingInput })\n Aglyn.registerConsoleExtension({\n /*\n * Four widgets fewer since AGL-3080 — the listing body, the capability\n * notice, browse, and installed add-ons. Their zones existed for one\n * reason: a CONSOLE ROUTE had to show them and an app may not import a\n * plugin. The hub is this plugin's own surface now, so those components\n * are plain imports and the four zones are gone from the catalog.\n *\n * What is left is what a console page OTHER than the marketplace draws.\n */\n widgets: [\n // The site set for one installation (AGL-1007): the same control the\n // listing page uses, exposed so the installation detail page can show\n // it without the app importing this plugin.\n {\n slot: 'pluginSiteSet',\n widgetId: 'marketplace-plugin-site-set',\n Component: PluginSiteSetPanel,\n },\n // Publishing something the console holds (AGL-3080). The page that\n // offers it keeps the control that opens it — a menu item is one entry\n // of a list the page builds, not a widget — and hands over what it has\n // in its own vocabulary. Where a layout or a theme GOES, what a listing\n // of it is called and what it may cost at the least are this plugin's.\n {\n slot: 'hostArtifactPublish',\n widgetId: 'marketplace-publish-artifact',\n Component: PublishArtifactDialog,\n },\n // The workspace's Plugins page and an installation's own page\n // (AGL-3080). The shell owns both pages and the built-in half of the\n // inventory; what this plugin installed — its pins, whether a newer\n // version may be installed, whether a kill switch is thrown — is read\n // from this plugin's own collections, so this plugin draws it.\n {\n slot: 'orgPluginInstalls',\n widgetId: 'marketplace-org-plugin-installs',\n Component: OrgPluginInstallsCard,\n },\n {\n slot: 'pluginInstallStatus',\n widgetId: 'marketplace-plugin-install-status',\n Component: PluginInstallStatus,\n },\n // The staff overview (AGL-3080): recent purchases and the\n // refund-reversal recovery queue, from this plugin's own purchases.\n {\n slot: 'staffOverview',\n widgetId: 'marketplace-staff-overview',\n Component: StaffMarketplaceOverview,\n },\n // A site's templates (AGL-3080). The gallery and the library are the\n // shell's; the site templates this plugin lists, the route that\n // installs one, and whether a template it installed has a newer\n // version are read from this plugin's listings, so this plugin draws\n // them: a shelf of the gallery, and a chip on the library's row.\n {\n slot: 'templateGallery',\n widgetId: 'marketplace-template-gallery',\n Component: TemplateGalleryShelf,\n },\n {\n slot: 'templateInstallStatus',\n widgetId: 'marketplace-template-install-status',\n Component: TemplateInstallStatus,\n },\n ],\n /**\n * THE MARKETPLACE HUB, as a declaration (AGL-3080).\n *\n * Seventeen hand-written console routes until now — the eight sections\n * below plus a listing, a publisher storefront and a publish form —\n * whose whole job was assembling chrome around bodies that already\n * belonged to this plugin. The shell's generic org plugin route does\n * that assembly for every other surface from exactly this.\n *\n * `ownsSubtree` is what keeps every URL the same. A segment naming a\n * section below resolves as that section; anything else beneath\n * `/marketplace` is handed to the page as `segments`, which is how\n * `/{org}/marketplace/{listingId}` still opens a listing. The cost is\n * stated where the flag is declared: this surface can no longer tell a\n * typo from an id, so it owns saying \"no such thing\" — which a listing\n * page has to do anyway for one deleted while a link to it was still in\n * someone's inbox.\n */\n orgNavItems: [\n {\n label: 'Marketplace',\n href: '/marketplace',\n navTabId: 'nav-tab-org-marketplace',\n icon: { path: mdiStorefrontOutline.path },\n /*\n * Last of the plugin tabs, so it sits directly before the shell's\n * Plugins tab (AGL-3294): shopping for plugins beside managing the\n * ones the workspace runs, the pair AGL-1011 split into two tabs.\n */\n tabOrder: 100,\n ownsSubtree: true,\n Component: MarketplaceHub,\n header: {\n title: 'Marketplace',\n icon: { path: mdiStorefrontOutline.path },\n docsTopic: 'plugins',\n },\n sections: [\n // \"Browse All\" (AGL-1024): the same grid also renders\n // publisher-filtered views, so the unqualified verb was ambiguous\n // about which you were getting.\n { id: 'browse', label: 'Browse All' },\n { id: 'installed', label: 'Installed' },\n /*\n * What this workspace OWNS (AGL-2331) — an org can hold a licence\n * nobody has installed, and a member can install something they\n * never bought. Buyer-side, so deliberately NOT gated like the\n * seller sections below: the person who needs it is often not a\n * publisher at all.\n *\n * `purchase` lands here: Stripe bakes it into the checkout session\n * and holds the URL, and a buyer coming back wants what they now\n * own.\n */\n {\n id: MARKETPLACE_LICENSES_SECTION_ID,\n label: 'Licenses',\n landsOnQuery: ['purchase'],\n },\n /*\n * The seller half. Each reads the organization's REVENUE or its\n * payout account, so each names the permission rather than relying\n * on a hidden tab — a URL can be typed whether or not a tab was\n * ever offered, and the shell applies this to the rail and to the\n * deep link as one verdict.\n */\n {\n id: 'upload',\n // Covers uploading a bundle as well as publishing an existing\n // artifact (AGL-1024).\n label: 'Upload / Publish',\n permission: 'publishToMarketplace',\n },\n {\n id: 'profile',\n // Whose profile (AGL-1024) — the console also has org and user\n // profiles.\n label: 'Publisher Profile',\n permission: 'publishToMarketplace',\n },\n {\n id: 'listings',\n label: 'Listings',\n permission: 'publishToMarketplace',\n },\n {\n id: 'payouts',\n label: 'Payouts',\n permission: 'publishToMarketplace',\n // Stripe Connect onboarding returns with this, from\n // `server/connect.ts`. A seller coming back wants Payouts.\n landsOnQuery: ['connect'],\n },\n {\n id: 'sales',\n label: 'Sales',\n permission: 'publishToMarketplace',\n },\n ],\n },\n ],\n /**\n * The report queue, in the staff area (AGL-2310, moved by AGL-3080).\n *\n * `marketplaceReports` is a collection only this plugin writes, and the\n * queue that triages it was a console staff route because the staff area\n * had no way for a plugin to own a page. It does (AGL-2939), and the\n * shell serves this at the same `/admin/marketplace-reports` it always\n * had — a staff page's id IS its URL segment.\n */\n staffPages: [\n {\n id: 'marketplace-reports',\n label: 'Marketplace reports',\n header: {\n title: 'Marketplace Reports',\n icon: { path: ICON_VARIANT_SYMBOL_FLAG.path },\n // The abuse queue's topic, for the reason the page's own help\n // gives. The page publishes the `#statuses` anchor itself, which a\n // `staffPages` entry cannot carry.\n docsTopic: 'abuseReports',\n },\n Component: MarketplaceReportsPage,\n },\n /**\n * The review queue (AGL-432, moved by AGL-3080).\n *\n * `ownsSubtree` is what makes the move possible at all: the queue is a\n * list and each row opens one submission at\n * `/admin/plugin-reviews/{listingId}`, and a staff page without it\n * could only ever BE the list. Same URLs as the console routes it\n * replaces — a staff page's id IS its segment under `/admin`.\n *\n * The queue carries no signing authority. Granting realm trust is a\n * separate super-only act on its own route; listing and verifying here\n * never signs anything.\n */\n {\n id: 'plugin-reviews',\n label: 'Plugin reviews',\n ownsSubtree: true,\n header: {\n title: 'Plugin reviews',\n icon: { path: ICON_VARIANT_SYMBOL_FLAG.path },\n docsTopic: 'staffConsole',\n },\n Component: PluginReviewsSurface,\n },\n ],\n pluginId: BUNDLE_ID,\n displayName: 'Marketplace',\n })\n}\n\n// Shared with the listing/publisher detail app-routes.\nexport { default as useMarketplaceActions } from './hooks/use-marketplace-actions'\nexport { default as MarketplaceBrowse } from './components/marketplace-browse.component'\nexport { default as HostPluginsCard } from './components/host-plugins-card.component'\nexport { default as PluginSiteSetPanel } from './components/plugin-site-set-panel.component'\n"],"names":["Aglyn","ICON_VARIANT_SYMBOL_FLAG","mdiStorefrontOutline","MarketplaceHub","MarketplaceReportsPage","PluginReviewsSurface","PluginSiteSetPanel","OrgPluginInstallsCard","PluginInstallStatus","StaffMarketplaceOverview","TemplateGalleryShelf","TemplateInstallStatus","PublishArtifactDialog","BUNDLE_ID","MARKETPLACE_LICENSES_SECTION_ID","RATING_FIELD","RatingInput","registerMarketplaceConsole","registerCustomFieldType","Input","registerConsoleExtension","widgets","slot","widgetId","Component","orgNavItems","label","href","navTabId","icon","path","tabOrder","ownsSubtree","header","title","docsTopic","sections","id","landsOnQuery","permission","staffPages","pluginId","displayName","default","useMarketplaceActions","MarketplaceBrowse","HostPluginsCard"],"mappings":"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"}