@powerhousedao/network-admin 0.0.53 → 0.0.54

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/dist/style.css CHANGED
@@ -2296,6 +2296,7 @@
2296
2296
  "Courier New", monospace;
2297
2297
  --color-red-50: oklch(97.1% 0.013 17.38);
2298
2298
  --color-red-100: hsl(3 82% 96%);
2299
+ --color-red-300: hsl(6 82% 87%);
2299
2300
  --color-red-500: hsl(5 80% 78%);
2300
2301
  --color-red-600: hsl(4 81% 74%);
2301
2302
  --color-orange-500: hsl(33 99% 70%);
@@ -2371,6 +2372,7 @@
2371
2372
  --tracking-wider: 0.05em;
2372
2373
  --leading-relaxed: 1.625;
2373
2374
  --radius-sm: 0.25rem;
2375
+ --radius-md: 0.375rem;
2374
2376
  --radius-lg: 0.5rem;
2375
2377
  --radius-xl: 0.75rem;
2376
2378
  --radius-2xl: 1rem;
@@ -2584,6 +2586,9 @@
2584
2586
  .mt-1 {
2585
2587
  margin-top: calc(var(--spacing) * 1);
2586
2588
  }
2589
+ .mt-2 {
2590
+ margin-top: calc(var(--spacing) * 2);
2591
+ }
2587
2592
  .mt-3 {
2588
2593
  margin-top: calc(var(--spacing) * 3);
2589
2594
  }
@@ -2620,6 +2625,9 @@
2620
2625
  .inline-flex {
2621
2626
  display: inline-flex;
2622
2627
  }
2628
+ .table {
2629
+ display: table;
2630
+ }
2623
2631
  .h-2 {
2624
2632
  height: calc(var(--spacing) * 2);
2625
2633
  }
@@ -2689,6 +2697,9 @@
2689
2697
  .flex-shrink-0 {
2690
2698
  flex-shrink: 0;
2691
2699
  }
2700
+ .border-collapse {
2701
+ border-collapse: collapse;
2702
+ }
2692
2703
  .-translate-y-1\/2 {
2693
2704
  --tw-translate-y: calc(calc(1/2 * 100%) * -1);
2694
2705
  translate: var(--tw-translate-x) var(--tw-translate-y);
@@ -2705,6 +2716,9 @@
2705
2716
  .grid-cols-1 {
2706
2717
  grid-template-columns: repeat(1, minmax(0, 1fr));
2707
2718
  }
2719
+ .flex-col {
2720
+ flex-direction: column;
2721
+ }
2708
2722
  .flex-wrap {
2709
2723
  flex-wrap: wrap;
2710
2724
  }
@@ -2783,6 +2797,9 @@
2783
2797
  .rounded-lg {
2784
2798
  border-radius: var(--radius-lg);
2785
2799
  }
2800
+ .rounded-md {
2801
+ border-radius: var(--radius-md);
2802
+ }
2786
2803
  .rounded-sm {
2787
2804
  border-radius: var(--radius-sm);
2788
2805
  }
@@ -2824,6 +2841,9 @@
2824
2841
  .border-indigo-100 {
2825
2842
  border-color: var(--color-indigo-100);
2826
2843
  }
2844
+ .border-red-300 {
2845
+ border-color: var(--color-red-300);
2846
+ }
2827
2847
  .border-slate-100 {
2828
2848
  border-color: var(--color-slate-100);
2829
2849
  }
@@ -2899,6 +2919,9 @@
2899
2919
  .bg-purple-500 {
2900
2920
  background-color: var(--color-purple-500);
2901
2921
  }
2922
+ .bg-red-50 {
2923
+ background-color: var(--color-red-50);
2924
+ }
2902
2925
  .bg-red-500 {
2903
2926
  background-color: var(--color-red-500);
2904
2927
  }
@@ -3090,6 +3113,10 @@
3090
3113
  font-size: var(--text-xs);
3091
3114
  line-height: var(--tw-leading, var(--text-xs--line-height));
3092
3115
  }
3116
+ .leading-4 {
3117
+ --tw-leading: calc(var(--spacing) * 4);
3118
+ line-height: calc(var(--spacing) * 4);
3119
+ }
3093
3120
  .leading-relaxed {
3094
3121
  --tw-leading: var(--leading-relaxed);
3095
3122
  line-height: var(--leading-relaxed);
@@ -3157,6 +3184,9 @@
3157
3184
  .text-red-500 {
3158
3185
  color: var(--color-red-500);
3159
3186
  }
3187
+ .text-red-600 {
3188
+ color: var(--color-red-600);
3189
+ }
3160
3190
  .text-sky-700 {
3161
3191
  color: var(--color-sky-700);
3162
3192
  }
@@ -3217,6 +3247,10 @@
3217
3247
  --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
3218
3248
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
3219
3249
  }
3250
+ .blur {
3251
+ --tw-blur: blur(8px);
3252
+ filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
3253
+ }
3220
3254
  .backdrop-blur-sm {
3221
3255
  --tw-backdrop-blur: blur(var(--blur-sm));
3222
3256
  -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
@@ -3469,6 +3503,19 @@
3469
3503
  --tw-ring-offset-width: 0px;
3470
3504
  --tw-ring-offset-color: #fff;
3471
3505
  --tw-ring-offset-shadow: 0 0 #0000;
3506
+ --tw-blur: initial;
3507
+ --tw-brightness: initial;
3508
+ --tw-contrast: initial;
3509
+ --tw-grayscale: initial;
3510
+ --tw-hue-rotate: initial;
3511
+ --tw-invert: initial;
3512
+ --tw-opacity: initial;
3513
+ --tw-saturate: initial;
3514
+ --tw-sepia: initial;
3515
+ --tw-drop-shadow: initial;
3516
+ --tw-drop-shadow-color: initial;
3517
+ --tw-drop-shadow-alpha: 100%;
3518
+ --tw-drop-shadow-size: initial;
3472
3519
  --tw-backdrop-blur: initial;
3473
3520
  --tw-backdrop-brightness: initial;
3474
3521
  --tw-backdrop-contrast: initial;
@@ -0,0 +1,11 @@
1
+ import { BaseSubgraph } from "@powerhousedao/reactor-api";
2
+ import type { DocumentNode } from "graphql";
3
+ export declare class BuildersAddonSubgraph extends BaseSubgraph {
4
+ name: string;
5
+ typeDefs: DocumentNode;
6
+ resolvers: Record<string, unknown>;
7
+ additionalContextFields: {};
8
+ onSetup(): Promise<void>;
9
+ onDisconnect(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../subgraphs/builders-addon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,IAAI,SAAoB;IACxB,QAAQ,EAAE,YAAY,CAAU;IAChC,SAAS,0BAAsB;IAC/B,uBAAuB,KAAM;IACvB,OAAO;IACP,YAAY;CACnB"}
@@ -0,0 +1,11 @@
1
+ import { BaseSubgraph } from "@powerhousedao/reactor-api";
2
+ import { schema } from "./schema.js";
3
+ import { getResolvers } from "./resolvers.js";
4
+ export class BuildersAddonSubgraph extends BaseSubgraph {
5
+ name = "builders-addon";
6
+ typeDefs = schema;
7
+ resolvers = getResolvers(this);
8
+ additionalContextFields = {};
9
+ async onSetup() { }
10
+ async onDisconnect() { }
11
+ }
@@ -0,0 +1,3 @@
1
+ import { type ISubgraph } from "@powerhousedao/reactor-api";
2
+ export declare const getResolvers: (subgraph: ISubgraph) => Record<string, unknown>;
3
+ //# sourceMappingURL=resolvers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../../subgraphs/builders-addon/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAc5D,eAAO,MAAM,YAAY,GAAI,UAAU,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CA4UxE,CAAC"}
@@ -0,0 +1,280 @@
1
+ import {} from "@powerhousedao/reactor-api";
2
+ export const getResolvers = (subgraph) => {
3
+ const reactor = subgraph.reactor;
4
+ const extractPhid = (value) => {
5
+ if (typeof value === "string") {
6
+ return value.trim() || null;
7
+ }
8
+ if (value &&
9
+ typeof value === "object" &&
10
+ "id" in value &&
11
+ typeof value.id === "string") {
12
+ const id = value.id;
13
+ return id.trim() || null;
14
+ }
15
+ return null;
16
+ };
17
+ const getCandidateDrives = async () => {
18
+ try {
19
+ const drives = await reactor.getDrives?.();
20
+ if (Array.isArray(drives) && drives.length > 0)
21
+ return drives;
22
+ }
23
+ catch { }
24
+ return [];
25
+ };
26
+ const applyFilters = (builder, filter) => {
27
+ if (!filter)
28
+ return true;
29
+ if (filter.id && builder.id !== filter.id)
30
+ return false;
31
+ if (filter.code &&
32
+ String(builder.code || "").toLowerCase() !==
33
+ String(filter.code || "").toLowerCase())
34
+ return false;
35
+ if (filter.name &&
36
+ String(builder.name || "").toLowerCase() !==
37
+ String(filter.name || "").toLowerCase())
38
+ return false;
39
+ if (filter.slug &&
40
+ String(builder.slug || "").toLowerCase() !==
41
+ String(filter.slug || "").toLowerCase())
42
+ return false;
43
+ if (filter.type &&
44
+ String(builder.type || "").toLowerCase() !==
45
+ String(filter.type || "").toLowerCase())
46
+ return false;
47
+ if (filter.status &&
48
+ String(builder.status || "").toLowerCase() !==
49
+ String(filter.status || "").toLowerCase())
50
+ return false;
51
+ if (filter.skills && filter.skills.length > 0) {
52
+ const builderSkills = (builder.skils || []).map((s) => String(s).toLowerCase());
53
+ const hasAllSkills = filter.skills.every((skill) => builderSkills.includes(String(skill).toLowerCase()));
54
+ if (!hasAllSkills)
55
+ return false;
56
+ }
57
+ if (filter.scopes && filter.scopes.length > 0) {
58
+ const builderScopes = (builder.scopes || []).map((s) => String(s).toLowerCase());
59
+ const hasAllScopes = filter.scopes.every((scope) => builderScopes.includes(String(scope).toLowerCase()));
60
+ if (!hasAllScopes)
61
+ return false;
62
+ }
63
+ return true;
64
+ };
65
+ return {
66
+ Query: {
67
+ builders: async (parent, args) => {
68
+ const filter = args.filter;
69
+ const drives = await getCandidateDrives();
70
+ // Step 1: Collect all builder profile documents
71
+ const builderDocs = [];
72
+ const sowDocs = [];
73
+ for (const driveId of drives) {
74
+ try {
75
+ const docIds = await reactor.getDocuments(driveId);
76
+ const docs = await Promise.all(docIds.map(async (docId) => {
77
+ try {
78
+ return await reactor.getDocument(docId);
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ }));
84
+ for (const doc of docs) {
85
+ if (!doc)
86
+ continue;
87
+ if (doc.header.documentType === "powerhouse/builder-profile") {
88
+ builderDocs.push(doc);
89
+ }
90
+ else if (doc.header.documentType === "powerhouse/scopeofwork") {
91
+ sowDocs.push(doc);
92
+ }
93
+ }
94
+ }
95
+ catch (error) {
96
+ console.warn(`Failed to process drive ${driveId}:`, error);
97
+ }
98
+ }
99
+ // Step 2: Build a map of deliverable OID -> deliverable object for each SOW
100
+ const sowDeliverablesMap = new Map();
101
+ for (const sowDoc of sowDocs) {
102
+ const sowState = sowDoc.state.global;
103
+ if (!sowState || typeof sowState !== "object")
104
+ continue;
105
+ const deliverablesMap = new Map();
106
+ const deliverables = Array.isArray(sowState.deliverables)
107
+ ? sowState.deliverables
108
+ : [];
109
+ for (const deliverable of deliverables) {
110
+ if (!deliverable || typeof deliverable !== "object")
111
+ continue;
112
+ const deliverableId = deliverable.id;
113
+ if (deliverableId && typeof deliverableId === "string") {
114
+ deliverablesMap.set(deliverableId, deliverable);
115
+ }
116
+ }
117
+ sowDeliverablesMap.set(sowDoc.header.id, deliverablesMap);
118
+ }
119
+ // Step 3: Extract projects from SOW documents and group by projectOwner
120
+ const projectsByOwner = new Map();
121
+ for (const sowDoc of sowDocs) {
122
+ const sowState = sowDoc.state.global;
123
+ if (!sowState || typeof sowState !== "object")
124
+ continue;
125
+ if (!Array.isArray(sowState.projects))
126
+ continue;
127
+ const deliverablesMap = sowDeliverablesMap.get(sowDoc.header.id) || new Map();
128
+ for (const project of sowState.projects) {
129
+ if (!project || typeof project !== "object")
130
+ continue;
131
+ const ownerPhid = extractPhid(project.projectOwner);
132
+ if (!ownerPhid)
133
+ continue;
134
+ // Resolve scope deliverables from OIDs to actual deliverable objects
135
+ let resolvedScope = null;
136
+ if (project.scope && typeof project.scope === "object") {
137
+ try {
138
+ const scopeDeliverableOids = Array.isArray(project.scope.deliverables)
139
+ ? project.scope.deliverables
140
+ : [];
141
+ const resolvedDeliverables = scopeDeliverableOids
142
+ .map((oid) => {
143
+ if (!oid || typeof oid !== "string")
144
+ return null;
145
+ const deliverable = deliverablesMap.get(oid);
146
+ if (!deliverable || typeof deliverable !== "object")
147
+ return null;
148
+ // Transform to SOW_Deliverable format with error handling
149
+ try {
150
+ return {
151
+ id: deliverable.id || "",
152
+ icon: deliverable.icon ?? null,
153
+ title: String(deliverable.title || ""),
154
+ code: String(deliverable.code || ""),
155
+ description: String(deliverable.description || ""),
156
+ status: deliverable.status || "DRAFT",
157
+ workProgress: deliverable.workProgress ?? null,
158
+ keyResults: Array.isArray(deliverable.keyResults)
159
+ ? deliverable.keyResults.map((kr) => ({
160
+ id: kr?.id || "",
161
+ title: String(kr?.title || ""),
162
+ link: String(kr?.link || ""),
163
+ }))
164
+ : [],
165
+ budgetAnchor: deliverable.budgetAnchor ?? null,
166
+ };
167
+ }
168
+ catch (error) {
169
+ console.warn(`Failed to transform deliverable ${oid}:`, error);
170
+ return null;
171
+ }
172
+ })
173
+ .filter((d) => d !== null);
174
+ // Build resolved scope with error handling
175
+ resolvedScope = {
176
+ deliverables: resolvedDeliverables,
177
+ status: project.scope.status ||
178
+ project.scope.deliverableSetStatus ||
179
+ "DRAFT",
180
+ progress: project.scope.progress ?? null,
181
+ deliverablesCompleted: project.scope.deliverablesCompleted ?? {
182
+ total: 0,
183
+ completed: 0,
184
+ },
185
+ };
186
+ }
187
+ catch (error) {
188
+ console.warn(`Failed to resolve scope for project ${project.id}:`, error);
189
+ // Fallback to empty scope
190
+ resolvedScope = {
191
+ deliverables: [],
192
+ status: "DRAFT",
193
+ progress: null,
194
+ deliverablesCompleted: { total: 0, completed: 0 },
195
+ };
196
+ }
197
+ }
198
+ // Transform project to BuilderProject format with error handling
199
+ try {
200
+ const builderProject = {
201
+ id: project.id || "",
202
+ code: String(project.code || ""),
203
+ title: String(project.title || ""),
204
+ slug: String(project.slug || ""),
205
+ abstract: project.abstract ?? null,
206
+ imageUrl: project.imageUrl ?? null,
207
+ scope: resolvedScope,
208
+ budgetType: project.budgetType ?? null,
209
+ currency: project.currency ?? null,
210
+ budget: project.budget ?? null,
211
+ expenditure: project.expenditure ?? null,
212
+ };
213
+ if (!projectsByOwner.has(ownerPhid)) {
214
+ projectsByOwner.set(ownerPhid, []);
215
+ }
216
+ projectsByOwner.get(ownerPhid).push(builderProject);
217
+ }
218
+ catch (error) {
219
+ console.warn(`Failed to transform project ${project.id}:`, error);
220
+ // Skip this project if transformation fails
221
+ continue;
222
+ }
223
+ }
224
+ }
225
+ // Step 4: Transform builder documents to BuilderProfileState format
226
+ const builders = builderDocs
227
+ .map((doc) => {
228
+ const state = doc.state.global;
229
+ // Ensure all non-nullable fields are properly handled
230
+ const name = String(state?.name ?? doc.header?.name ?? "");
231
+ const icon = String(state?.icon ?? "");
232
+ const description = String(state?.description ?? state?.slug ?? "");
233
+ const type = state?.type ?? "INDIVIDUAL";
234
+ const skils = Array.isArray(state?.skils) ? state.skils : [];
235
+ const scopes = Array.isArray(state?.scopes) ? state.scopes : [];
236
+ const links = Array.isArray(state?.links) ? state.links : [];
237
+ const contributors = Array.isArray(state?.contributors)
238
+ ? state.contributors
239
+ : [];
240
+ const builder = {
241
+ id: doc.header.id,
242
+ code: state?.code ?? null,
243
+ slug: state?.slug ?? null,
244
+ name,
245
+ icon,
246
+ description,
247
+ lastModified: state?.lastModified ?? null,
248
+ type,
249
+ contributors,
250
+ status: state?.status ?? null,
251
+ skils,
252
+ scopes,
253
+ links,
254
+ projects: projectsByOwner.get(doc.header.id) || [],
255
+ };
256
+ return builder;
257
+ })
258
+ .filter((builder) => applyFilters(builder, filter));
259
+ return builders;
260
+ },
261
+ },
262
+ SOW_Progress: {
263
+ __resolveType(obj) {
264
+ if (obj && typeof obj === "object") {
265
+ if (Object.prototype.hasOwnProperty.call(obj, "total") &&
266
+ Object.prototype.hasOwnProperty.call(obj, "completed")) {
267
+ return "SOW_StoryPoint";
268
+ }
269
+ if (Object.prototype.hasOwnProperty.call(obj, "value")) {
270
+ return "SOW_Percentage";
271
+ }
272
+ if (Object.prototype.hasOwnProperty.call(obj, "done")) {
273
+ return "SOW_Binary";
274
+ }
275
+ }
276
+ return null;
277
+ },
278
+ },
279
+ };
280
+ };
@@ -0,0 +1,3 @@
1
+ import type { DocumentNode } from "graphql";
2
+ export declare const schema: DocumentNode;
3
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../subgraphs/builders-addon/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,MAAM,EAAE,YA+MpB,CAAC"}
@@ -0,0 +1,209 @@
1
+ import { gql } from "graphql-tag";
2
+ export const schema = gql `
3
+ """
4
+ Subgraph definition
5
+ """
6
+ type Query {
7
+ builders(filter: buildersFilter): [BuilderProfileState!]!
8
+ }
9
+
10
+ ## Filters
11
+
12
+ input buildersFilter {
13
+ id: PHID
14
+ code: String
15
+ name: String
16
+ slug: String
17
+ type: teamType
18
+ status: BuilderStatus
19
+ skills: [BuilderSkill!]
20
+ scopes: [BuilderScope!]
21
+ }
22
+
23
+
24
+
25
+
26
+ ## Builder Profile Schema
27
+ type BuilderProfileState {
28
+ id: PHID
29
+ code: String
30
+ slug: String
31
+ name: String
32
+ icon: URL
33
+ description: String
34
+ lastModified: DateTime
35
+ type: teamType!
36
+ contributors: [PHID!]!
37
+ status: BuilderStatus
38
+ skils: [BuilderSkill!]!
39
+ scopes: [BuilderScope!]!
40
+ links: [BuilderLink!]!
41
+ projects: [BuilderProject!]!
42
+ }
43
+
44
+ enum teamType {
45
+ INDIVIDUAL
46
+ TEAM
47
+ }
48
+
49
+ enum BuilderStatus {
50
+ ACTIVE
51
+ INACTIVE
52
+ ON_HOLD
53
+ COMPLETED
54
+ ARCHIVED
55
+ }
56
+
57
+ enum BuilderSkill {
58
+ FRONTEND_DEVELOPMENT
59
+ BACKEND_DEVELOPMENT
60
+ FULL_STACK_DEVELOPMENT
61
+ DEVOPS_ENGINEERING
62
+ SMART_CONTRACT_DEVELOPMENT
63
+ UI_UX_DESIGN
64
+ TECHNICAL_WRITING
65
+ QA_TESTING
66
+ DATA_ENGINEERING
67
+ SECURITY_ENGINEERING
68
+ }
69
+
70
+ enum BuilderScope {
71
+ ACC
72
+ STA
73
+ SUP
74
+ STABILITY_SCOPE
75
+ SUPPORT_SCOPE
76
+ PROTOCOL_SCOPE
77
+ GOVERNANCE_SCOPE
78
+ }
79
+
80
+ type BuilderLink {
81
+ id: OID!
82
+ url: URL!
83
+ label: String
84
+ }
85
+
86
+ type Builder {
87
+ id: PHID
88
+ code: String
89
+ slug: String
90
+ name: String!
91
+ icon: String!
92
+ description: String!
93
+ lastModified: DateTime
94
+ type: teamType!
95
+ contributors: [Builder!]!
96
+ status: BuilderStatus
97
+ skils: [BuilderSkill!]!
98
+ scopes: [BuilderScope!]!
99
+ links: [BuilderLink!]!
100
+ }
101
+
102
+ type BuilderProject {
103
+ id: OID!
104
+ code: String!
105
+ title: String!
106
+ slug: String!
107
+ abstract: String
108
+ imageUrl: URL
109
+ scope: Builder_SOW_DeliverablesSet
110
+ budgetType: SOW_BudgetType
111
+ currency: SOW_PMCurrency
112
+ budget: Float
113
+ expenditure: SOW_BudgetExpenditure
114
+ }
115
+
116
+ type Builder_SOW_DeliverablesSet {
117
+ deliverables: [BuilderSOW_Deliverable!]!
118
+ status: SOW_DeliverableSetStatus!
119
+ progress: SOW_Progress!
120
+ deliverablesCompleted: SOW_DeliverablesCompleted!
121
+ }
122
+
123
+ type BuilderSOW_Deliverable {
124
+ id: OID!
125
+ icon: String
126
+ title: String!
127
+ code: String!
128
+ description: String!
129
+ status: SOW_DeliverableStatus!
130
+ workProgress: SOW_Progress
131
+ keyResults: [SOW_KeyResult!]!
132
+ budgetAnchor: SOW_BudgetAnchorProject
133
+ }
134
+
135
+ enum SOW_DeliverableStatus {
136
+ WONT_DO
137
+ DRAFT
138
+ TODO
139
+ BLOCKED
140
+ IN_PROGRESS
141
+ DELIVERED
142
+ CANCELED
143
+ }
144
+
145
+ type SOW_KeyResult {
146
+ id: OID!
147
+ title: String!
148
+ link: String!
149
+ }
150
+
151
+ type SOW_BudgetAnchorProject {
152
+ project: OID
153
+ unit: SOW_Unit
154
+ unitCost: Float!
155
+ quantity: Float!
156
+ margin: Float!
157
+ }
158
+
159
+ enum SOW_Unit {
160
+ StoryPoints
161
+ Hours
162
+ }
163
+
164
+ enum SOW_BudgetType {
165
+ CONTINGENCY
166
+ OPEX
167
+ CAPEX
168
+ OVERHEAD
169
+ }
170
+
171
+ enum SOW_PMCurrency {
172
+ DAI
173
+ USDS
174
+ EUR
175
+ USD
176
+ }
177
+
178
+ enum SOW_DeliverableSetStatus {
179
+ DRAFT
180
+ TODO
181
+ IN_PROGRESS
182
+ FINISHED
183
+ CANCELED
184
+ }
185
+
186
+ type SOW_DeliverablesCompleted {
187
+ total: Int!
188
+ completed: Int!
189
+ }
190
+
191
+ type SOW_BudgetExpenditure {
192
+ percentage: Float!
193
+ actuals: Float!
194
+ cap: Float!
195
+ }
196
+
197
+ union SOW_Progress = SOW_StoryPoint | SOW_Percentage | SOW_Binary
198
+
199
+ type SOW_Percentage {
200
+ value: Float!
201
+ }
202
+ type SOW_Binary {
203
+ done: Boolean
204
+ }
205
+ type SOW_StoryPoint {
206
+ total: Int!
207
+ completed: Int!
208
+ }
209
+ `;
@@ -5,4 +5,5 @@ export * as WorkstreamSubgraph from "./workstream/index.js";
5
5
  export * as WorkstreamsSubgraph from "./workstreams/index.js";
6
6
  export * as NetworksSubgraph from "./networks/index.js";
7
7
  export * as BuildersSubgraph from "./builders/index.js";
8
+ export * as BuildersAddonSubgraph from "./builders-addon/index.js";
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../subgraphs/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,sBAAsB,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,oBAAoB,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,2BAA2B,MAAM,kCAAkC,CAAC;AAChF,OAAO,KAAK,kBAAkB,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,mBAAmB,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,gBAAgB,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,gBAAgB,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../subgraphs/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,sBAAsB,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,oBAAoB,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,2BAA2B,MAAM,kCAAkC,CAAC;AAChF,OAAO,KAAK,kBAAkB,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,mBAAmB,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,gBAAgB,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,gBAAgB,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,qBAAqB,MAAM,2BAA2B,CAAC"}
@@ -5,3 +5,4 @@ export * as WorkstreamSubgraph from "./workstream/index.js";
5
5
  export * as WorkstreamsSubgraph from "./workstreams/index.js";
6
6
  export * as NetworksSubgraph from "./networks/index.js";
7
7
  export * as BuildersSubgraph from "./builders/index.js";
8
+ export * as BuildersAddonSubgraph from "./builders-addon/index.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@powerhousedao/network-admin",
3
3
  "description": "Network Admin package for Powerhouse",
4
- "version": "0.0.53",
4
+ "version": "0.0.54",
5
5
  "license": "AGPL-3.0-only",
6
6
  "type": "module",
7
7
  "files": [
@@ -62,7 +62,7 @@
62
62
  "service-unstartup": "bash ./node_modules/@powerhousedao/ph-cli/dist/scripts/service-unstartup.sh"
63
63
  },
64
64
  "dependencies": {
65
- "@powerhousedao/builder-profile": "0.0.5",
65
+ "@powerhousedao/builder-profile": "0.0.6",
66
66
  "@powerhousedao/builder-tools": "^5.0.12",
67
67
  "@powerhousedao/common": "^5.0.12",
68
68
  "@powerhousedao/design-system": "^5.0.12",