@powerhousedao/service-offering 1.0.0-dev.1 → 1.0.0-dev.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/document-models/upgrade-manifests.d.ts.map +1 -1
  2. package/dist/document-models/upgrade-manifests.js +0 -2
  3. package/dist/editors/service-offering-editor/editor.css +119 -0
  4. package/dist/subgraphs/resources-services/resolvers.d.ts +2 -2
  5. package/dist/subgraphs/resources-services/resolvers.d.ts.map +1 -1
  6. package/dist/subgraphs/resources-services/resolvers.js +77 -125
  7. package/dist/subgraphs/resources-services/schema.d.ts.map +1 -1
  8. package/dist/subgraphs/resources-services/schema.js +41 -107
  9. package/package.json +3 -2
  10. package/dist/document-models/facet/gen/schema/types.d.ts +0 -195
  11. package/dist/document-models/facet/gen/schema/types.d.ts.map +0 -1
  12. package/dist/document-models/facet/gen/schema/types.js +0 -1
  13. package/dist/document-models/facet/gen/schema/zod.d.ts +0 -18
  14. package/dist/document-models/facet/gen/schema/zod.d.ts.map +0 -1
  15. package/dist/document-models/facet/gen/schema/zod.js +0 -69
  16. package/dist/document-models/resource-instance/gen/schema/types.d.ts +0 -272
  17. package/dist/document-models/resource-instance/gen/schema/types.d.ts.map +0 -1
  18. package/dist/document-models/resource-instance/gen/schema/types.js +0 -1
  19. package/dist/document-models/resource-instance/gen/schema/zod.d.ts +0 -43
  20. package/dist/document-models/resource-instance/gen/schema/zod.d.ts.map +0 -1
  21. package/dist/document-models/resource-instance/gen/schema/zod.js +0 -185
  22. package/dist/document-models/resource-template/gen/schema/types.d.ts +0 -371
  23. package/dist/document-models/resource-template/gen/schema/types.d.ts.map +0 -1
  24. package/dist/document-models/resource-template/gen/schema/types.js +0 -1
  25. package/dist/document-models/resource-template/gen/schema/zod.d.ts +0 -52
  26. package/dist/document-models/resource-template/gen/schema/zod.d.ts.map +0 -1
  27. package/dist/document-models/resource-template/gen/schema/zod.js +0 -312
  28. package/dist/document-models/service-offering/gen/schema/types.d.ts +0 -451
  29. package/dist/document-models/service-offering/gen/schema/types.d.ts.map +0 -1
  30. package/dist/document-models/service-offering/gen/schema/types.js +0 -1
  31. package/dist/document-models/service-offering/gen/schema/zod.d.ts +0 -89
  32. package/dist/document-models/service-offering/gen/schema/zod.d.ts.map +0 -1
  33. package/dist/document-models/service-offering/gen/schema/zod.js +0 -419
  34. package/dist/document-models/subscription-instance/gen/schema/types.d.ts +0 -435
  35. package/dist/document-models/subscription-instance/gen/schema/types.d.ts.map +0 -1
  36. package/dist/document-models/subscription-instance/gen/schema/types.js +0 -1
  37. package/dist/document-models/subscription-instance/gen/schema/zod.d.ts +0 -99
  38. package/dist/document-models/subscription-instance/gen/schema/zod.d.ts.map +0 -1
  39. package/dist/document-models/subscription-instance/gen/schema/zod.js +0 -410
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade-manifests.d.ts","sourceRoot":"","sources":["../../document-models/upgrade-manifests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAOtD,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,SAAS,MAAM,EAAE,CAAC,EAMhE,CAAC"}
1
+ {"version":3,"file":"upgrade-manifests.d.ts","sourceRoot":"","sources":["../../document-models/upgrade-manifests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAMtD,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,SAAS,MAAM,EAAE,CAAC,EAKhE,CAAC"}
@@ -2,11 +2,9 @@ import { facetUpgradeManifest } from "./facet/upgrades/upgrade-manifest.js";
2
2
  import { resourceInstanceUpgradeManifest } from "./resource-instance/upgrades/upgrade-manifest.js";
3
3
  import { resourceTemplateUpgradeManifest } from "./resource-template/upgrades/upgrade-manifest.js";
4
4
  import { serviceOfferingUpgradeManifest } from "./service-offering/upgrades/upgrade-manifest.js";
5
- import { subscriptionInstanceUpgradeManifest } from "./subscription-instance/upgrades/upgrade-manifest.js";
6
5
  export const upgradeManifests = [
7
6
  facetUpgradeManifest,
8
7
  resourceInstanceUpgradeManifest,
9
8
  resourceTemplateUpgradeManifest,
10
9
  serviceOfferingUpgradeManifest,
11
- subscriptionInstanceUpgradeManifest,
12
10
  ];
@@ -0,0 +1,119 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400&family=DM+Mono:wght@400;500&display=swap');
2
+
3
+ /* ── Keyframes (cannot be expressed as Tailwind utilities) ── */
4
+
5
+ @keyframes so-fade-in {
6
+ from { opacity: 0; transform: translateY(8px); }
7
+ to { opacity: 1; transform: translateY(0); }
8
+ }
9
+
10
+ @keyframes so-scale-in {
11
+ from { opacity: 0; transform: scale(0.96); }
12
+ to { opacity: 1; transform: scale(1); }
13
+ }
14
+
15
+ @keyframes so-float {
16
+ 0%, 100% { transform: translateY(0); }
17
+ 50% { transform: translateY(-8px); }
18
+ }
19
+
20
+ @keyframes so-fab-in {
21
+ from { opacity: 0; transform: translateY(8px); }
22
+ to { opacity: 1; transform: translateY(0); }
23
+ }
24
+
25
+ @keyframes so-confirm-fade-in {
26
+ from { opacity: 0; }
27
+ to { opacity: 1; }
28
+ }
29
+
30
+ @keyframes so-confirm-scale-in {
31
+ from { opacity: 0; transform: scale(0.95); }
32
+ to { opacity: 1; transform: scale(1); }
33
+ }
34
+
35
+ @keyframes progress-pulse {
36
+ 0%, 100% { opacity: 1; }
37
+ 50% { opacity: 0.4; }
38
+ }
39
+
40
+ @keyframes progress-dropdown-in {
41
+ from { opacity: 0; transform: translateY(-4px); }
42
+ to { opacity: 1; transform: translateY(0); }
43
+ }
44
+
45
+ @keyframes progress-overlay-in {
46
+ from { opacity: 0; }
47
+ to { opacity: 1; }
48
+ }
49
+
50
+ @keyframes progress-modal-in {
51
+ from { opacity: 0; transform: scale(0.95) translateY(8px); }
52
+ to { opacity: 1; transform: scale(1) translateY(0); }
53
+ }
54
+
55
+ @keyframes tier-slide-up {
56
+ from { opacity: 0; transform: translateY(12px); }
57
+ to { opacity: 1; transform: translateY(0); }
58
+ }
59
+
60
+ @keyframes catalog__fade-in {
61
+ from { opacity: 0; transform: translateY(4px); }
62
+ to { opacity: 1; transform: translateY(0); }
63
+ }
64
+
65
+ @keyframes rts-spin {
66
+ to { transform: rotate(360deg); }
67
+ }
68
+
69
+ @keyframes matrix-warning-pulse {
70
+ 0%, 100% { opacity: 1; }
71
+ 50% { opacity: 0.5; }
72
+ }
73
+
74
+ @keyframes panel-overlay-fade {
75
+ from { opacity: 0; }
76
+ to { opacity: 1; }
77
+ }
78
+
79
+ @keyframes panel-slide-in {
80
+ from { opacity: 0; transform: translateX(20px); }
81
+ to { opacity: 1; transform: translateX(0); }
82
+ }
83
+
84
+ @keyframes modal-backdrop {
85
+ from { opacity: 0; }
86
+ to { opacity: 1; }
87
+ }
88
+
89
+ @keyframes modal-pop {
90
+ from { opacity: 0; transform: scale(0.95) translateY(8px); }
91
+ to { opacity: 1; transform: scale(1) translateY(0); }
92
+ }
93
+
94
+ /* ── Tooltip overrides — Radix portals outside .so-editor scope ── */
95
+
96
+ [data-radix-popper-content-wrapper] {
97
+ z-index: 9999 !important;
98
+ min-width: 0 !important;
99
+ max-width: 280px !important;
100
+ }
101
+
102
+ [data-radix-popper-content-wrapper] [data-side] {
103
+ max-width: 280px !important;
104
+ white-space: normal !important;
105
+ line-height: 1.45 !important;
106
+ word-wrap: break-word !important;
107
+ }
108
+
109
+ /* ── Scrollbar styles (not possible with Tailwind) ── */
110
+
111
+ .so-scrollbar-h::-webkit-scrollbar { height: 8px; }
112
+ .so-scrollbar-h::-webkit-scrollbar-track { background: #f1f5f9; border-radius: 4px; }
113
+ .so-scrollbar-h::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 4px; }
114
+ .so-scrollbar-h::-webkit-scrollbar-thumb:hover { background: #94a3b8; }
115
+
116
+ .so-scrollbar-v::-webkit-scrollbar { width: 6px; }
117
+ .so-scrollbar-v::-webkit-scrollbar-track { background: #f8fafc; border-radius: 3px; }
118
+ .so-scrollbar-v::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 3px; }
119
+ .so-scrollbar-v::-webkit-scrollbar-thumb:hover { background: #94a3b8; }
@@ -1,3 +1,3 @@
1
- import { type ISubgraph } from "@powerhousedao/reactor-api";
2
- export declare const getResolvers: (subgraph: ISubgraph) => Record<string, unknown>;
1
+ import { BaseSubgraph } from "@powerhousedao/reactor-api";
2
+ export declare const getResolvers: (subgraph: BaseSubgraph) => Record<string, unknown>;
3
3
  //# sourceMappingURL=resolvers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../../subgraphs/resources-services/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAsD5D,eAAO,MAAM,YAAY,GAAI,UAAU,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CA6fxE,CAAC"}
1
+ {"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../../subgraphs/resources-services/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAsD1D,eAAO,MAAM,YAAY,GAAI,UAAU,YAAY,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAib3E,CAAC"}
@@ -1,150 +1,95 @@
1
- import {} from "@powerhousedao/reactor-api";
1
+ import { BaseSubgraph } from "@powerhousedao/reactor-api";
2
2
  import { createAction, generateId } from "document-model/core";
3
3
  import { addFile } from "document-drive";
4
4
  import { ResourceInstanceV1, SubscriptionInstanceV1, } from "@powerhousedao/service-offering/document-models";
5
5
  export const getResolvers = (subgraph) => {
6
6
  const reactor = subgraph.reactor;
7
+ const reactorClient = subgraph.reactorClient;
7
8
  return {
8
9
  Query: {
9
10
  resourceTemplates: async (_, args) => {
10
11
  const { id, status, operatorId } = args.filter || {};
11
- // If filtering by specific id, try to fetch directly
12
+ // If filtering by specific id, fetch directly
12
13
  if (id) {
13
14
  try {
14
- const doc = await reactor.getDocument(id);
15
- if (doc &&
16
- doc.header.documentType === "powerhouse/resource-template") {
17
- const state = doc.state.global;
18
- // Check status filter if provided
19
- if (status &&
20
- status.length > 0 &&
21
- !status.includes(state.status)) {
22
- return [];
23
- }
24
- // Check operatorId filter if provided
25
- if (operatorId && state.operatorId !== operatorId) {
26
- return [];
27
- }
28
- return [mapResourceTemplateState(state, doc)];
15
+ const result = await reactorClient.find({ type: "powerhouse/resource-template", ids: [id] });
16
+ const docs = result.results;
17
+ if (docs.length === 0)
18
+ return [];
19
+ const doc = docs[0];
20
+ const state = doc.state.global;
21
+ if (status && status.length > 0 && !status.includes(state.status)) {
22
+ return [];
29
23
  }
24
+ if (operatorId && state.operatorId !== operatorId) {
25
+ return [];
26
+ }
27
+ return [mapResourceTemplateState(state, doc)];
30
28
  }
31
29
  catch {
32
- // Document not found
30
+ return [];
33
31
  }
34
- return [];
35
32
  }
36
- // Scan all drives for resource template documents
37
- const drives = await reactor.getDrives();
33
+ // Find all resource template documents
34
+ const result = await reactorClient.find({ type: "powerhouse/resource-template" });
35
+ const docs = result.results;
38
36
  const resourceTemplates = [];
39
- for (const driveId of drives) {
40
- try {
41
- const docIds = await reactor.getDocuments(driveId);
42
- const docs = await Promise.all(docIds.map(async (docId) => {
43
- try {
44
- return await reactor.getDocument(docId);
45
- }
46
- catch {
47
- return null;
48
- }
49
- }));
50
- for (const doc of docs) {
51
- if (doc &&
52
- doc.header.documentType === "powerhouse/resource-template") {
53
- const resourceDoc = doc;
54
- const state = resourceDoc.state.global;
55
- // Apply status filter if provided
56
- if (status &&
57
- status.length > 0 &&
58
- !status.includes(state.status)) {
59
- continue;
60
- }
61
- // Apply operatorId filter if provided
62
- if (operatorId && state.operatorId !== operatorId) {
63
- continue;
64
- }
65
- resourceTemplates.push(mapResourceTemplateState(state, doc));
66
- }
67
- }
37
+ for (const doc of docs) {
38
+ const state = doc.state.global;
39
+ if (status && status.length > 0 && !status.includes(state.status)) {
40
+ continue;
68
41
  }
69
- catch (error) {
70
- console.warn(`Failed to inspect drive ${driveId}:`, error);
42
+ if (operatorId && state.operatorId !== operatorId) {
43
+ continue;
71
44
  }
45
+ resourceTemplates.push(mapResourceTemplateState(state, doc));
72
46
  }
73
47
  return resourceTemplates;
74
48
  },
75
49
  serviceOfferings: async (_, args) => {
76
50
  const { id, status, operatorId, resourceTemplateId } = args.filter || {};
77
- // If filtering by specific id, try to fetch directly
51
+ // If filtering by specific id, fetch directly
78
52
  if (id) {
79
53
  try {
80
- const doc = await reactor.getDocument(id);
81
- if (doc &&
82
- doc.header.documentType === "powerhouse/service-offering") {
83
- const state = doc.state.global;
84
- // Check status filter if provided
85
- if (status &&
86
- status.length > 0 &&
87
- !status.includes(state.status)) {
88
- return [];
89
- }
90
- // Check operatorId filter if provided
91
- if (operatorId && state.operatorId !== operatorId) {
92
- return [];
93
- }
94
- // Check resourceTemplateId filter if provided
95
- if (resourceTemplateId &&
96
- state.resourceTemplateId !== resourceTemplateId) {
97
- return [];
98
- }
99
- return [mapServiceOfferingState(state, doc)];
54
+ const result = await reactorClient.find({ type: "powerhouse/service-offering", ids: [id] });
55
+ const docs = result.results;
56
+ if (docs.length === 0)
57
+ return [];
58
+ const doc = docs[0];
59
+ const state = doc.state.global;
60
+ if (status && status.length > 0 && !status.includes(state.status)) {
61
+ return [];
100
62
  }
63
+ if (operatorId && state.operatorId !== operatorId) {
64
+ return [];
65
+ }
66
+ if (resourceTemplateId &&
67
+ state.resourceTemplateId !== resourceTemplateId) {
68
+ return [];
69
+ }
70
+ return [mapServiceOfferingState(state, doc)];
101
71
  }
102
72
  catch {
103
- // Document not found
73
+ return [];
104
74
  }
105
- return [];
106
75
  }
107
- // Scan all drives for service offering documents
108
- const drives = await reactor.getDrives();
76
+ // Find all service offering documents
77
+ const result = await reactorClient.find({ type: "powerhouse/service-offering" });
78
+ const docs = result.results;
109
79
  const serviceOfferings = [];
110
- for (const driveId of drives) {
111
- try {
112
- const docIds = await reactor.getDocuments(driveId);
113
- const docs = await Promise.all(docIds.map(async (docId) => {
114
- try {
115
- return await reactor.getDocument(docId);
116
- }
117
- catch {
118
- return null;
119
- }
120
- }));
121
- for (const doc of docs) {
122
- if (doc &&
123
- doc.header.documentType === "powerhouse/service-offering") {
124
- const offeringDoc = doc;
125
- const state = offeringDoc.state.global;
126
- // Apply status filter if provided
127
- if (status &&
128
- status.length > 0 &&
129
- !status.includes(state.status)) {
130
- continue;
131
- }
132
- // Apply operatorId filter if provided
133
- if (operatorId && state.operatorId !== operatorId) {
134
- continue;
135
- }
136
- // Apply resourceTemplateId filter if provided
137
- if (resourceTemplateId &&
138
- state.resourceTemplateId !== resourceTemplateId) {
139
- continue;
140
- }
141
- serviceOfferings.push(mapServiceOfferingState(state, doc));
142
- }
143
- }
80
+ for (const doc of docs) {
81
+ const state = doc.state.global;
82
+ if (status && status.length > 0 && !status.includes(state.status)) {
83
+ continue;
144
84
  }
145
- catch (error) {
146
- console.warn(`Failed to inspect drive ${driveId}:`, error);
85
+ if (operatorId && state.operatorId !== operatorId) {
86
+ continue;
147
87
  }
88
+ if (resourceTemplateId &&
89
+ state.resourceTemplateId !== resourceTemplateId) {
90
+ continue;
91
+ }
92
+ serviceOfferings.push(mapServiceOfferingState(state, doc));
148
93
  }
149
94
  return serviceOfferings;
150
95
  },
@@ -292,7 +237,7 @@ export const getResolvers = (subgraph) => {
292
237
  const subscriptionInstanceDoc = await reactor.addDocument("powerhouse/subscription-instance");
293
238
  // resolve parent folders for both drives
294
239
  const teamParentFolder = teamBuilderAdminDrive.state.global.nodes?.find((node) => node.kind === "folder")?.parentFolder;
295
- const operatorDrive = await getOperatorDrive(reactor, resourceTemplateId);
240
+ const operatorDrive = await getOperatorDrive(reactorClient, resourceTemplateId);
296
241
  if (!operatorDrive) {
297
242
  throw new Error(`Operator drive not found for resource template ${resourceTemplateId}`);
298
243
  }
@@ -436,6 +381,12 @@ function mapResourceTemplateState(state, doc) {
436
381
  parentServiceId: service.parentServiceId || null,
437
382
  isSetupFormation: service.isSetupFormation,
438
383
  optionGroupId: service.optionGroupId || null,
384
+ facetBindings: (service.facetBindings || []).map((binding) => ({
385
+ id: binding.id,
386
+ facetName: binding.facetName,
387
+ facetType: binding.facetType,
388
+ supportedOptions: binding.supportedOptions,
389
+ })),
439
390
  })),
440
391
  optionGroups: (state.optionGroups || []).map((group) => ({
441
392
  id: group.id,
@@ -526,10 +477,10 @@ function mapServiceOfferingState(state, doc) {
526
477
  name: tier.name,
527
478
  description: tier.description || null,
528
479
  isCustomPricing: tier.isCustomPricing,
529
- pricingMode: tier.pricingMode || null,
480
+ pricingMode: tier.pricingMode,
530
481
  pricing: tier.pricing
531
482
  ? {
532
- amount: tier.pricing.amount ?? null,
483
+ amount: tier.pricing.amount,
533
484
  currency: tier.pricing.currency,
534
485
  }
535
486
  : null,
@@ -543,6 +494,7 @@ function mapServiceOfferingState(state, doc) {
543
494
  id: level.id,
544
495
  serviceId: level.serviceId,
545
496
  level: level.level,
497
+ description: level.description || null,
546
498
  })),
547
499
  usageLimits: tier.usageLimits.map((limit) => ({
548
500
  id: limit.id,
@@ -557,7 +509,7 @@ function mapServiceOfferingState(state, doc) {
557
509
  description: group.description || null,
558
510
  isAddOn: group.isAddOn,
559
511
  defaultSelected: group.defaultSelected,
560
- pricingMode: group.pricingMode || null,
512
+ pricingMode: group.pricingMode,
561
513
  standalonePricing: group.standalonePricing
562
514
  ? {
563
515
  amount: group.standalonePricing.amount,
@@ -582,12 +534,12 @@ function mapServiceOfferingState(state, doc) {
582
534
  })),
583
535
  };
584
536
  }
585
- async function getOperatorDrive(reactor, resourceTemplateId) {
586
- const drives = await reactor.getDrives();
587
- const results = await Promise.all(drives.map(async (drive) => {
588
- const docIds = await reactor.getDocuments(drive);
589
- return docIds.includes(resourceTemplateId) ? drive : null;
590
- }));
591
- const driveId = results.find((id) => id !== null);
592
- return driveId ? reactor.getDrive(driveId) : undefined;
537
+ /**
538
+ * Find the drive that contains a given resource template document.
539
+ * Uses reactorClient to find the parent drive.
540
+ */
541
+ async function getOperatorDrive(reactorClient, resourceTemplateId) {
542
+ const result = await reactorClient.getParents(resourceTemplateId);
543
+ const parentDrive = result.results.find((doc) => doc.header.documentType === "powerhouse/document-drive");
544
+ return parentDrive;
593
545
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../subgraphs/resources-services/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,MAAM,EAAE,YAsVpB,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../subgraphs/resources-services/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,MAAM,EAAE,YAoRpB,CAAC"}