@powerhousedao/network-admin 0.0.41 → 0.0.43

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/dist/document-models/network-profile/gen/document-schema.d.ts +16 -16
  2. package/dist/document-models/network-profile/gen/document-schema.d.ts.map +1 -1
  3. package/dist/document-models/network-profile/gen/reducer.d.ts +1 -1
  4. package/dist/document-models/network-profile/gen/reducer.d.ts.map +1 -1
  5. package/dist/document-models/network-profile/gen/schema/zod.d.ts.map +1 -1
  6. package/dist/document-models/network-profile/hooks.d.ts +1 -1
  7. package/dist/document-models/network-profile/hooks.d.ts.map +1 -1
  8. package/dist/document-models/network-profile/module.d.ts +1 -1
  9. package/dist/document-models/network-profile/module.d.ts.map +1 -1
  10. package/dist/document-models/network-profile/module.js +1 -1
  11. package/dist/document-models/network-profile/src/reducers/network-profile-management.d.ts +1 -1
  12. package/dist/document-models/network-profile/src/reducers/network-profile-management.d.ts.map +1 -1
  13. package/dist/document-models/network-profile/src/reducers/network-profile-management.js +5 -5
  14. package/dist/document-models/payment-terms/gen/reducer.d.ts +1 -1
  15. package/dist/document-models/payment-terms/gen/reducer.d.ts.map +1 -1
  16. package/dist/document-models/payment-terms/gen/schema/zod.d.ts.map +1 -1
  17. package/dist/document-models/payment-terms/hooks.d.ts +1 -1
  18. package/dist/document-models/payment-terms/hooks.d.ts.map +1 -1
  19. package/dist/document-models/payment-terms/module.d.ts +1 -1
  20. package/dist/document-models/payment-terms/module.d.ts.map +1 -1
  21. package/dist/document-models/payment-terms/module.js +1 -1
  22. package/dist/document-models/payment-terms/src/reducers/clauses.d.ts +1 -1
  23. package/dist/document-models/payment-terms/src/reducers/clauses.d.ts.map +1 -1
  24. package/dist/document-models/payment-terms/src/reducers/milestones.d.ts +1 -1
  25. package/dist/document-models/payment-terms/src/reducers/milestones.d.ts.map +1 -1
  26. package/dist/document-models/payment-terms/src/reducers/terms.d.ts +1 -1
  27. package/dist/document-models/payment-terms/src/reducers/terms.d.ts.map +1 -1
  28. package/dist/document-models/request-for-proposals/gen/ph-factories.js +1 -1
  29. package/dist/document-models/request-for-proposals/gen/reducer.d.ts +1 -1
  30. package/dist/document-models/request-for-proposals/gen/reducer.d.ts.map +1 -1
  31. package/dist/document-models/request-for-proposals/gen/schema/zod.d.ts.map +1 -1
  32. package/dist/document-models/request-for-proposals/gen/utils.js +1 -1
  33. package/dist/document-models/request-for-proposals/hooks.d.ts +1 -1
  34. package/dist/document-models/request-for-proposals/hooks.d.ts.map +1 -1
  35. package/dist/document-models/request-for-proposals/module.d.ts +1 -1
  36. package/dist/document-models/request-for-proposals/module.d.ts.map +1 -1
  37. package/dist/document-models/request-for-proposals/module.js +1 -1
  38. package/dist/document-models/request-for-proposals/src/reducers/contex-document.d.ts +1 -1
  39. package/dist/document-models/request-for-proposals/src/reducers/contex-document.d.ts.map +1 -1
  40. package/dist/document-models/request-for-proposals/src/reducers/contex-document.js +2 -2
  41. package/dist/document-models/request-for-proposals/src/reducers/proposals.d.ts +1 -1
  42. package/dist/document-models/request-for-proposals/src/reducers/proposals.d.ts.map +1 -1
  43. package/dist/document-models/request-for-proposals/src/reducers/proposals.js +3 -3
  44. package/dist/document-models/request-for-proposals/src/reducers/rfp-state.d.ts +1 -1
  45. package/dist/document-models/request-for-proposals/src/reducers/rfp-state.d.ts.map +1 -1
  46. package/dist/document-models/request-for-proposals/src/reducers/rfp-state.js +1 -1
  47. package/dist/document-models/workstream/gen/reducer.d.ts +1 -1
  48. package/dist/document-models/workstream/gen/reducer.d.ts.map +1 -1
  49. package/dist/document-models/workstream/gen/schema/zod.d.ts.map +1 -1
  50. package/dist/document-models/workstream/hooks.d.ts +1 -1
  51. package/dist/document-models/workstream/hooks.d.ts.map +1 -1
  52. package/dist/document-models/workstream/module.d.ts +1 -1
  53. package/dist/document-models/workstream/module.d.ts.map +1 -1
  54. package/dist/document-models/workstream/module.js +1 -1
  55. package/dist/document-models/workstream/src/reducers/proposals.d.ts +1 -1
  56. package/dist/document-models/workstream/src/reducers/proposals.d.ts.map +1 -1
  57. package/dist/document-models/workstream/src/reducers/proposals.js +4 -4
  58. package/dist/document-models/workstream/src/reducers/workstream.d.ts +1 -1
  59. package/dist/document-models/workstream/src/reducers/workstream.d.ts.map +1 -1
  60. package/dist/document-models/workstream/src/reducers/workstream.js +5 -5
  61. package/dist/editors/editors.js +8 -8
  62. package/dist/editors/index.d.ts +4 -4
  63. package/dist/editors/index.d.ts.map +1 -1
  64. package/dist/editors/index.js +4 -4
  65. package/dist/editors/network-admin/components/CreateDocument.d.ts +6 -0
  66. package/dist/editors/network-admin/components/CreateDocument.d.ts.map +1 -0
  67. package/dist/editors/network-admin/components/CreateDocument.js +18 -0
  68. package/dist/editors/network-admin/components/DriveContents.d.ts +3 -0
  69. package/dist/editors/network-admin/components/DriveContents.d.ts.map +1 -0
  70. package/dist/editors/network-admin/components/DriveContents.js +10 -0
  71. package/dist/editors/network-admin/components/DriveExplorer.d.ts.map +1 -1
  72. package/dist/editors/network-admin/components/DriveExplorer.js +1 -1
  73. package/dist/editors/network-admin/components/EmptyState.d.ts +3 -0
  74. package/dist/editors/network-admin/components/EmptyState.d.ts.map +1 -0
  75. package/dist/editors/network-admin/components/EmptyState.js +10 -0
  76. package/dist/editors/network-admin/components/Files.d.ts +3 -0
  77. package/dist/editors/network-admin/components/Files.d.ts.map +1 -0
  78. package/dist/editors/network-admin/components/Files.js +12 -0
  79. package/dist/editors/network-admin/components/FolderTree.d.ts +6 -0
  80. package/dist/editors/network-admin/components/FolderTree.d.ts.map +1 -0
  81. package/dist/editors/network-admin/components/FolderTree.js +65 -0
  82. package/dist/editors/network-admin/components/Folders.d.ts +3 -0
  83. package/dist/editors/network-admin/components/Folders.d.ts.map +1 -0
  84. package/dist/editors/network-admin/components/Folders.js +12 -0
  85. package/dist/editors/network-admin/components/NavigationBreadcrumbs.d.ts +3 -0
  86. package/dist/editors/network-admin/components/NavigationBreadcrumbs.d.ts.map +1 -0
  87. package/dist/editors/network-admin/components/NavigationBreadcrumbs.js +6 -0
  88. package/dist/editors/network-profile/components/EditName.d.ts +3 -0
  89. package/dist/editors/network-profile/components/EditName.d.ts.map +1 -0
  90. package/dist/editors/network-profile/components/EditName.js +31 -0
  91. package/dist/editors/network-profile/module.d.ts +1 -1
  92. package/dist/editors/network-profile/module.d.ts.map +1 -1
  93. package/dist/editors/network-profile/module.js +1 -1
  94. package/dist/editors/payment-terms/basic-terms-tab.js +1 -1
  95. package/dist/editors/payment-terms/components/EditName.d.ts +3 -0
  96. package/dist/editors/payment-terms/components/EditName.d.ts.map +1 -0
  97. package/dist/editors/payment-terms/components/EditName.js +31 -0
  98. package/dist/editors/payment-terms/editor.d.ts.map +1 -1
  99. package/dist/editors/payment-terms/editor.js +2 -2
  100. package/dist/editors/payment-terms/module.d.ts +1 -1
  101. package/dist/editors/payment-terms/module.d.ts.map +1 -1
  102. package/dist/editors/payment-terms/module.js +1 -1
  103. package/dist/editors/payment-terms/retainer-tab.d.ts.map +1 -1
  104. package/dist/editors/payment-terms/retainer-tab.js +3 -5
  105. package/dist/editors/request-for-proposals/components/EditName.d.ts +3 -0
  106. package/dist/editors/request-for-proposals/components/EditName.d.ts.map +1 -0
  107. package/dist/editors/request-for-proposals/components/EditName.js +31 -0
  108. package/dist/editors/request-for-proposals/module.d.ts +1 -1
  109. package/dist/editors/request-for-proposals/module.d.ts.map +1 -1
  110. package/dist/editors/request-for-proposals/module.js +1 -1
  111. package/dist/editors/workstream/components/EditName.d.ts +3 -0
  112. package/dist/editors/workstream/components/EditName.d.ts.map +1 -0
  113. package/dist/editors/workstream/components/EditName.js +31 -0
  114. package/dist/editors/workstream/module.d.ts +1 -1
  115. package/dist/editors/workstream/module.d.ts.map +1 -1
  116. package/dist/editors/workstream/module.js +1 -1
  117. package/dist/index.d.ts +2 -2
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.js +2 -4
  120. package/dist/processors/workstreams/index.d.ts.map +1 -1
  121. package/dist/processors/workstreams/index.js +0 -1
  122. package/dist/scripts/sow-mirror/mirror_sow_state.d.ts +3 -0
  123. package/dist/scripts/sow-mirror/mirror_sow_state.d.ts.map +1 -0
  124. package/dist/scripts/sow-mirror/mirror_sow_state.js +440 -0
  125. package/dist/style.css +26 -0
  126. package/dist/subgraphs/index.d.ts +5 -0
  127. package/dist/subgraphs/index.d.ts.map +1 -1
  128. package/dist/subgraphs/index.js +5 -0
  129. package/dist/subgraphs/networks/index.d.ts +11 -0
  130. package/dist/subgraphs/networks/index.d.ts.map +1 -0
  131. package/dist/subgraphs/networks/index.js +11 -0
  132. package/dist/subgraphs/networks/resolvers.d.ts +3 -0
  133. package/dist/subgraphs/networks/resolvers.d.ts.map +1 -0
  134. package/dist/subgraphs/networks/resolvers.js +42 -0
  135. package/dist/subgraphs/networks/schema.d.ts +3 -0
  136. package/dist/subgraphs/networks/schema.d.ts.map +1 -0
  137. package/dist/subgraphs/networks/schema.js +39 -0
  138. package/dist/subgraphs/payment-terms/index.d.ts +11 -0
  139. package/dist/subgraphs/payment-terms/index.d.ts.map +1 -0
  140. package/dist/subgraphs/payment-terms/index.js +11 -0
  141. package/dist/subgraphs/payment-terms/resolvers.d.ts +3 -0
  142. package/dist/subgraphs/payment-terms/resolvers.d.ts.map +1 -0
  143. package/dist/subgraphs/payment-terms/resolvers.js +277 -0
  144. package/dist/subgraphs/payment-terms/schema.d.ts +3 -0
  145. package/dist/subgraphs/payment-terms/schema.d.ts.map +1 -0
  146. package/dist/subgraphs/payment-terms/schema.js +324 -0
  147. package/dist/subgraphs/request-for-proposals/index.d.ts +11 -0
  148. package/dist/subgraphs/request-for-proposals/index.d.ts.map +1 -0
  149. package/dist/subgraphs/request-for-proposals/index.js +11 -0
  150. package/dist/subgraphs/request-for-proposals/resolvers.d.ts +3 -0
  151. package/dist/subgraphs/request-for-proposals/resolvers.d.ts.map +1 -0
  152. package/dist/subgraphs/request-for-proposals/resolvers.js +145 -0
  153. package/dist/subgraphs/request-for-proposals/schema.d.ts +3 -0
  154. package/dist/subgraphs/request-for-proposals/schema.d.ts.map +1 -0
  155. package/dist/subgraphs/request-for-proposals/schema.js +232 -0
  156. package/dist/subgraphs/workstream/index.d.ts +11 -0
  157. package/dist/subgraphs/workstream/index.d.ts.map +1 -0
  158. package/dist/subgraphs/workstream/index.js +11 -0
  159. package/dist/subgraphs/workstream/resolvers.d.ts +3 -0
  160. package/dist/subgraphs/workstream/resolvers.d.ts.map +1 -0
  161. package/dist/subgraphs/workstream/resolvers.js +181 -0
  162. package/dist/subgraphs/workstream/schema.d.ts +3 -0
  163. package/dist/subgraphs/workstream/schema.d.ts.map +1 -0
  164. package/dist/subgraphs/workstream/schema.js +206 -0
  165. package/dist/subgraphs/workstreams/index.d.ts +11 -0
  166. package/dist/subgraphs/workstreams/index.d.ts.map +1 -0
  167. package/dist/subgraphs/workstreams/index.js +11 -0
  168. package/dist/subgraphs/workstreams/resolvers.d.ts +3 -0
  169. package/dist/subgraphs/workstreams/resolvers.d.ts.map +1 -0
  170. package/dist/subgraphs/workstreams/resolvers.js +380 -0
  171. package/dist/subgraphs/workstreams/schema.d.ts +3 -0
  172. package/dist/subgraphs/workstreams/schema.d.ts.map +1 -0
  173. package/dist/subgraphs/workstreams/schema.js +326 -0
  174. package/package.json +41 -30
@@ -0,0 +1,440 @@
1
+ #!/usr/bin/env bun
2
+ // Parse command line arguments
3
+ const args = process.argv.slice(2);
4
+ if (args.length !== 6) {
5
+ console.error('Usage: bun mirror_sow_state.ts <remote-mcp-url> <remote-sow-id> <remote-drive-id> <local-mcp-url> <local-sow-id> <local-drive-id>');
6
+ console.error('');
7
+ console.error('Example:');
8
+ console.error(' bun mirror_sow_state.ts \\');
9
+ console.error(' https://switchboard-dev.powerhouse.xyz/mcp \\');
10
+ console.error(' 65f3e7e8-500d-4c42-9e73-8cd5d7966cd8 \\');
11
+ console.error(' powerhouse-network-admin \\');
12
+ console.error(' http://localhost:4001/mcp \\');
13
+ console.error(' 3471233d-c481-4214-afe3-c196b5a7778f \\');
14
+ console.error(' bai-network-admin');
15
+ process.exit(1);
16
+ }
17
+ const [REMOTE_MCP_URL, REMOTE_DOC_ID, REMOTE_DRIVE_ID, LOCAL_MCP_URL, LOCAL_DOC_ID, LOCAL_DRIVE_ID] = args;
18
+ // Helper function to make MCP requests
19
+ async function mcpRequest(url, payload) {
20
+ const response = await fetch(url, {
21
+ method: 'POST',
22
+ headers: {
23
+ 'Content-Type': 'application/json',
24
+ 'Accept': 'application/json, text/event-stream'
25
+ },
26
+ body: JSON.stringify(payload)
27
+ });
28
+ const text = await response.text();
29
+ // Handle SSE format (event: message\ndata: {...})
30
+ if (text.includes('event: message')) {
31
+ const lines = text.split('\n');
32
+ const dataLine = lines.find(line => line.startsWith('data: '));
33
+ if (dataLine) {
34
+ const jsonData = dataLine.substring(6);
35
+ return JSON.parse(jsonData);
36
+ }
37
+ throw new Error('No data line found in SSE response');
38
+ }
39
+ return JSON.parse(text);
40
+ }
41
+ // Fetch remote document
42
+ async function getRemoteDocument() {
43
+ console.log(`Fetching remote document (${REMOTE_DOC_ID}) from drive "${REMOTE_DRIVE_ID}"...`);
44
+ const payload = {
45
+ jsonrpc: '2.0',
46
+ method: 'tools/call',
47
+ params: {
48
+ name: 'getDocument',
49
+ arguments: { id: REMOTE_DOC_ID }
50
+ },
51
+ id: 1
52
+ };
53
+ const response = await mcpRequest(REMOTE_MCP_URL, payload);
54
+ if (response.error) {
55
+ throw new Error(`Remote fetch error: ${JSON.stringify(response.error)}`);
56
+ }
57
+ return response.result.structuredContent.document;
58
+ }
59
+ // Get current local document state
60
+ async function getLocalDocument() {
61
+ console.log(`Fetching local document (${LOCAL_DOC_ID}) from drive "${LOCAL_DRIVE_ID}"...`);
62
+ const payload = {
63
+ jsonrpc: '2.0',
64
+ method: 'tools/call',
65
+ params: {
66
+ name: 'getDocument',
67
+ arguments: { id: LOCAL_DOC_ID }
68
+ },
69
+ id: 2
70
+ };
71
+ const response = await mcpRequest(LOCAL_MCP_URL, payload);
72
+ if (response.error) {
73
+ throw new Error(`Local fetch error: ${JSON.stringify(response.error)}`);
74
+ }
75
+ return response.result.structuredContent.document;
76
+ }
77
+ // Generate actions to mirror remote state
78
+ function generateActions(remoteState, localState) {
79
+ const actions = [];
80
+ // 1. Update basic scope of work details
81
+ if (remoteState.title !== localState.title ||
82
+ remoteState.description !== localState.description ||
83
+ remoteState.status !== localState.status) {
84
+ actions.push({
85
+ type: 'EDIT_SCOPE_OF_WORK',
86
+ scope: 'global',
87
+ input: {
88
+ title: remoteState.title,
89
+ description: remoteState.description,
90
+ status: remoteState.status
91
+ }
92
+ });
93
+ }
94
+ // 2. Add missing contributors
95
+ const localContributorIds = new Set(localState.contributors.map((c) => c.id));
96
+ remoteState.contributors.forEach((contributor) => {
97
+ if (!localContributorIds.has(contributor.id)) {
98
+ const input = {
99
+ id: contributor.id,
100
+ name: contributor.name
101
+ };
102
+ if (contributor.icon)
103
+ input.icon = contributor.icon;
104
+ if (contributor.description)
105
+ input.description = contributor.description;
106
+ actions.push({
107
+ type: 'ADD_AGENT',
108
+ scope: 'global',
109
+ input
110
+ });
111
+ }
112
+ });
113
+ // 3. Add missing deliverables with all their data
114
+ const localDeliverableIds = new Set(localState.deliverables.map((d) => d.id));
115
+ remoteState.deliverables.forEach((deliverable) => {
116
+ if (!localDeliverableIds.has(deliverable.id)) {
117
+ // Add deliverable
118
+ actions.push({
119
+ type: 'ADD_DELIVERABLE',
120
+ scope: 'global',
121
+ input: {
122
+ id: deliverable.id,
123
+ owner: deliverable.owner || undefined,
124
+ title: deliverable.title,
125
+ code: deliverable.code,
126
+ description: deliverable.description,
127
+ status: deliverable.status
128
+ }
129
+ });
130
+ // Set work progress
131
+ if (deliverable.workProgress) {
132
+ const progressInput = {};
133
+ if (deliverable.workProgress.value !== undefined) {
134
+ progressInput.percentage = deliverable.workProgress.value;
135
+ }
136
+ else if (deliverable.workProgress.total !== undefined) {
137
+ progressInput.storyPoints = {
138
+ total: deliverable.workProgress.total,
139
+ completed: deliverable.workProgress.completed
140
+ };
141
+ }
142
+ else if (deliverable.workProgress.done !== undefined) {
143
+ progressInput.done = deliverable.workProgress.done;
144
+ }
145
+ if (Object.keys(progressInput).length > 0) {
146
+ actions.push({
147
+ type: 'SET_DELIVERABLE_PROGRESS',
148
+ scope: 'global',
149
+ input: {
150
+ id: deliverable.id,
151
+ workProgress: progressInput
152
+ }
153
+ });
154
+ }
155
+ }
156
+ // Add key results
157
+ if (deliverable.keyResults && deliverable.keyResults.length > 0) {
158
+ deliverable.keyResults.forEach((kr) => {
159
+ actions.push({
160
+ type: 'ADD_KEY_RESULT',
161
+ scope: 'global',
162
+ input: {
163
+ id: kr.id,
164
+ deliverableId: deliverable.id,
165
+ title: kr.title,
166
+ link: kr.link
167
+ }
168
+ });
169
+ });
170
+ }
171
+ // Set budget anchor if exists
172
+ if (deliverable.budgetAnchor && deliverable.budgetAnchor.project) {
173
+ actions.push({
174
+ type: 'SET_DELIVERABLE_BUDGET_ANCHOR_PROJECT',
175
+ scope: 'global',
176
+ input: {
177
+ deliverableId: deliverable.id,
178
+ project: deliverable.budgetAnchor.project,
179
+ unit: deliverable.budgetAnchor.unit,
180
+ unitCost: deliverable.budgetAnchor.unitCost,
181
+ quantity: deliverable.budgetAnchor.quantity,
182
+ margin: deliverable.budgetAnchor.margin
183
+ }
184
+ });
185
+ }
186
+ }
187
+ });
188
+ // 4. Add projects if any
189
+ if (remoteState.projects && remoteState.projects.length > 0) {
190
+ const localProjectsMap = new Map(localState.projects.map((p) => [p.id, p]));
191
+ remoteState.projects.forEach((project) => {
192
+ const localProject = localProjectsMap.get(project.id);
193
+ if (!localProject) {
194
+ // Project doesn't exist, add it
195
+ actions.push({
196
+ type: 'ADD_PROJECT',
197
+ scope: 'global',
198
+ input: {
199
+ id: project.id,
200
+ code: project.code,
201
+ title: project.title,
202
+ projectOwner: project.projectOwner || undefined,
203
+ abstract: project.abstract || undefined,
204
+ imageUrl: project.imageUrl || undefined,
205
+ budgetType: project.budgetType || undefined,
206
+ currency: project.currency || undefined,
207
+ budget: project.budget || 0
208
+ }
209
+ });
210
+ }
211
+ // Add missing deliverables to project scope
212
+ if (project.scope && project.scope.deliverables && project.scope.deliverables.length > 0) {
213
+ const localDeliverables = new Set(((localProject)?.scope?.deliverables) || []);
214
+ project.scope.deliverables.forEach((deliverableId) => {
215
+ if (!localDeliverables.has(deliverableId)) {
216
+ const deliverable = remoteState.deliverables.find((d) => d.id === deliverableId);
217
+ if (deliverable) {
218
+ actions.push({
219
+ type: 'ADD_DELIVERABLE_IN_SET',
220
+ scope: 'global',
221
+ input: {
222
+ projectId: project.id,
223
+ deliverableId: deliverableId
224
+ }
225
+ });
226
+ }
227
+ }
228
+ });
229
+ // Set project scope metadata (status and deliverablesCompleted)
230
+ if (project.scope.status || project.scope.deliverablesCompleted) {
231
+ actions.push({
232
+ type: 'EDIT_DELIVERABLES_SET',
233
+ scope: 'global',
234
+ input: {
235
+ projectId: project.id,
236
+ status: project.scope.status || undefined,
237
+ deliverablesCompleted: project.scope.deliverablesCompleted || undefined
238
+ }
239
+ });
240
+ }
241
+ }
242
+ });
243
+ }
244
+ // 5. Add roadmaps if any
245
+ if (remoteState.roadmaps && remoteState.roadmaps.length > 0) {
246
+ const localRoadmapsMap = new Map(localState.roadmaps.map((r) => [r.id, r]));
247
+ remoteState.roadmaps.forEach((roadmap) => {
248
+ const localRoadmap = localRoadmapsMap.get(roadmap.id);
249
+ if (!localRoadmap) {
250
+ actions.push({
251
+ type: 'ADD_ROADMAP',
252
+ scope: 'global',
253
+ input: {
254
+ id: roadmap.id,
255
+ title: roadmap.title,
256
+ slug: roadmap.slug || undefined,
257
+ description: roadmap.description || undefined
258
+ }
259
+ });
260
+ }
261
+ // Add milestones for this roadmap
262
+ if (roadmap.milestones && roadmap.milestones.length > 0) {
263
+ const localMilestonesMap = new Map(((localRoadmap)?.milestones || []).map((m) => [m.id, m]));
264
+ roadmap.milestones.forEach((milestone) => {
265
+ const localMilestone = localMilestonesMap.get(milestone.id);
266
+ if (!localMilestone) {
267
+ actions.push({
268
+ type: 'ADD_MILESTONE',
269
+ scope: 'global',
270
+ input: {
271
+ id: milestone.id,
272
+ roadmapId: roadmap.id,
273
+ sequenceCode: milestone.sequenceCode || undefined,
274
+ title: milestone.title,
275
+ description: milestone.description || undefined,
276
+ deliveryTarget: milestone.deliveryTarget || undefined
277
+ }
278
+ });
279
+ }
280
+ // Add coordinators for milestone
281
+ if (milestone.coordinators && milestone.coordinators.length > 0) {
282
+ const localCoordinators = new Set((localMilestone)?.coordinators || []);
283
+ milestone.coordinators.forEach((coordinatorId) => {
284
+ if (!localCoordinators.has(coordinatorId)) {
285
+ actions.push({
286
+ type: 'ADD_COORDINATOR',
287
+ scope: 'global',
288
+ input: {
289
+ id: coordinatorId,
290
+ milestoneId: milestone.id
291
+ }
292
+ });
293
+ }
294
+ });
295
+ }
296
+ // Add deliverables to milestone
297
+ if (milestone.scope && milestone.scope.deliverables && milestone.scope.deliverables.length > 0) {
298
+ const localMilestoneDeliverables = new Set(((localMilestone)?.scope?.deliverables) || []);
299
+ milestone.scope.deliverables.forEach((deliverableId) => {
300
+ if (!localMilestoneDeliverables.has(deliverableId)) {
301
+ actions.push({
302
+ type: 'ADD_DELIVERABLE_IN_SET',
303
+ scope: 'global',
304
+ input: {
305
+ milestoneId: milestone.id,
306
+ deliverableId: deliverableId
307
+ }
308
+ });
309
+ }
310
+ });
311
+ // Set milestone scope metadata
312
+ if (milestone.scope.status || milestone.scope.deliverablesCompleted) {
313
+ actions.push({
314
+ type: 'EDIT_DELIVERABLES_SET',
315
+ scope: 'global',
316
+ input: {
317
+ milestoneId: milestone.id,
318
+ status: milestone.scope.status || undefined,
319
+ deliverablesCompleted: milestone.scope.deliverablesCompleted || undefined
320
+ }
321
+ });
322
+ }
323
+ }
324
+ });
325
+ }
326
+ });
327
+ }
328
+ return actions;
329
+ }
330
+ // Send actions in batches
331
+ async function sendActions(actions) {
332
+ const BATCH_SIZE = 50;
333
+ const batches = [];
334
+ for (let i = 0; i < actions.length; i += BATCH_SIZE) {
335
+ batches.push(actions.slice(i, i + BATCH_SIZE));
336
+ }
337
+ console.log(`\nSending ${actions.length} actions in ${batches.length} batches...`);
338
+ for (let i = 0; i < batches.length; i++) {
339
+ const batch = batches[i];
340
+ console.log(`\nBatch ${i + 1}/${batches.length} (${batch.length} actions)...`);
341
+ const payload = {
342
+ jsonrpc: '2.0',
343
+ method: 'tools/call',
344
+ params: {
345
+ name: 'addActions',
346
+ arguments: {
347
+ documentId: LOCAL_DOC_ID,
348
+ actions: batch
349
+ }
350
+ },
351
+ id: 1000 + i
352
+ };
353
+ try {
354
+ const response = await mcpRequest(LOCAL_MCP_URL, payload);
355
+ if (response.error) {
356
+ console.error(`Error in batch ${i + 1}:`, JSON.stringify(response.error, null, 2));
357
+ throw new Error(`Batch ${i + 1} failed`);
358
+ }
359
+ console.log(`✓ Batch ${i + 1} completed successfully`);
360
+ }
361
+ catch (error) {
362
+ console.error(`Failed to send batch ${i + 1}:`, error);
363
+ throw error;
364
+ }
365
+ }
366
+ }
367
+ // Main function
368
+ async function main() {
369
+ try {
370
+ console.log('='.repeat(70));
371
+ console.log('Scope of Work State-Based Mirror Script');
372
+ console.log('='.repeat(70));
373
+ console.log('\nConfiguration:');
374
+ console.log(` Remote MCP: ${REMOTE_MCP_URL}`);
375
+ console.log(` Remote Drive: ${REMOTE_DRIVE_ID}`);
376
+ console.log(` Remote SoW ID: ${REMOTE_DOC_ID}`);
377
+ console.log(` Local MCP: ${LOCAL_MCP_URL}`);
378
+ console.log(` Local Drive: ${LOCAL_DRIVE_ID}`);
379
+ console.log(` Local SoW ID: ${LOCAL_DOC_ID}`);
380
+ console.log('');
381
+ // Fetch remote document
382
+ const remoteDoc = await getRemoteDocument();
383
+ const remoteState = remoteDoc.state.global;
384
+ console.log(`✓ Remote document fetched: "${remoteState.title}"`);
385
+ console.log(` - Status: ${remoteState.status}`);
386
+ console.log(` - Contributors: ${remoteState.contributors.length}`);
387
+ console.log(` - Deliverables: ${remoteState.deliverables.length}`);
388
+ console.log(` - Projects: ${remoteState.projects.length}`);
389
+ console.log(` - Roadmaps: ${remoteState.roadmaps.length}`);
390
+ // Fetch local document
391
+ const localDoc = await getLocalDocument();
392
+ const localState = localDoc.state.global;
393
+ console.log(`\n✓ Local document fetched: "${localState.title}"`);
394
+ console.log(` - Status: ${localState.status}`);
395
+ console.log(` - Contributors: ${localState.contributors.length}`);
396
+ console.log(` - Deliverables: ${localState.deliverables.length}`);
397
+ console.log(` - Projects: ${localState.projects.length}`);
398
+ console.log(` - Roadmaps: ${localState.roadmaps.length}`);
399
+ // Generate actions
400
+ console.log('\nGenerating actions to mirror remote state...');
401
+ const actions = generateActions(remoteState, localState);
402
+ console.log(`✓ Generated ${actions.length} actions`);
403
+ if (actions.length === 0) {
404
+ console.log('\n✓ Documents are already in sync!');
405
+ return;
406
+ }
407
+ // Show action summary
408
+ const actionTypes = {};
409
+ actions.forEach(action => {
410
+ actionTypes[action.type] = (actionTypes[action.type] || 0) + 1;
411
+ });
412
+ console.log('\nAction summary:');
413
+ Object.entries(actionTypes).forEach(([type, count]) => {
414
+ console.log(` - ${type}: ${count}`);
415
+ });
416
+ // Send actions
417
+ await sendActions(actions);
418
+ // Verify final state
419
+ console.log('\nVerifying final state...');
420
+ const finalLocalDoc = await getLocalDocument();
421
+ const finalLocalState = finalLocalDoc.state.global;
422
+ console.log(`✓ Final local document state:`);
423
+ console.log(` - Title: "${finalLocalState.title}"`);
424
+ console.log(` - Status: ${finalLocalState.status}`);
425
+ console.log(` - Contributors: ${finalLocalState.contributors.length}`);
426
+ console.log(` - Deliverables: ${finalLocalState.deliverables.length}`);
427
+ console.log(` - Projects: ${finalLocalState.projects.length}`);
428
+ console.log(` - Roadmaps: ${finalLocalState.roadmaps.length}`);
429
+ console.log('\n' + '='.repeat(70));
430
+ console.log('✓ Mirror complete!');
431
+ console.log('='.repeat(70));
432
+ }
433
+ catch (error) {
434
+ console.error('\n✗ Error:', error);
435
+ process.exit(1);
436
+ }
437
+ }
438
+ // Run the script
439
+ main();
440
+ export {};
package/dist/style.css CHANGED
@@ -458,6 +458,9 @@
458
458
  .cursor-pointer {
459
459
  cursor: pointer;
460
460
  }
461
+ .resize {
462
+ resize: both;
463
+ }
461
464
  .list-inside {
462
465
  list-style-position: inside;
463
466
  }
@@ -520,6 +523,13 @@
520
523
  margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));
521
524
  }
522
525
  }
526
+ .space-y-3 {
527
+ :where(& > :not(:last-child)) {
528
+ --tw-space-y-reverse: 0;
529
+ margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));
530
+ margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)));
531
+ }
532
+ }
523
533
  .space-y-4 {
524
534
  :where(& > :not(:last-child)) {
525
535
  --tw-space-y-reverse: 0;
@@ -787,9 +797,18 @@
787
797
  .py-8 {
788
798
  padding-block: calc(var(--spacing) * 8);
789
799
  }
800
+ .py-12 {
801
+ padding-block: calc(var(--spacing) * 12);
802
+ }
803
+ .pt-1 {
804
+ padding-top: calc(var(--spacing) * 1);
805
+ }
790
806
  .pt-6 {
791
807
  padding-top: calc(var(--spacing) * 6);
792
808
  }
809
+ .pb-3 {
810
+ padding-bottom: calc(var(--spacing) * 3);
811
+ }
793
812
  .text-center {
794
813
  text-align: center;
795
814
  }
@@ -1009,6 +1028,13 @@
1009
1028
  }
1010
1029
  }
1011
1030
  }
1031
+ .hover\:bg-gray-300 {
1032
+ &:hover {
1033
+ @media (hover: hover) {
1034
+ background-color: var(--color-gray-300);
1035
+ }
1036
+ }
1037
+ }
1012
1038
  .hover\:bg-gray-600 {
1013
1039
  &:hover {
1014
1040
  @media (hover: hover) {
@@ -1,3 +1,8 @@
1
1
  export {};
2
2
  export * as NetworkProfileSubgraph from "./network-profile/index.js";
3
+ export * as PaymentTermsSubgraph from "./payment-terms/index.js";
4
+ export * as RequestForProposalsSubgraph from "./request-for-proposals/index.js";
5
+ export * as WorkstreamSubgraph from "./workstream/index.js";
6
+ export * as WorkstreamsSubgraph from "./workstreams/index.js";
7
+ export * as NetworksSubgraph from "./networks/index.js";
3
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../subgraphs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAG,CAAC;AACX,OAAO,KAAK,sBAAsB,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../subgraphs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC;AACV,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"}
@@ -1,2 +1,7 @@
1
1
  export {};
2
2
  export * as NetworkProfileSubgraph from "./network-profile/index.js";
3
+ export * as PaymentTermsSubgraph from "./payment-terms/index.js";
4
+ export * as RequestForProposalsSubgraph from "./request-for-proposals/index.js";
5
+ export * as WorkstreamSubgraph from "./workstream/index.js";
6
+ export * as WorkstreamsSubgraph from "./workstreams/index.js";
7
+ export * as NetworksSubgraph from "./networks/index.js";
@@ -0,0 +1,11 @@
1
+ import { BaseSubgraph } from "@powerhousedao/reactor-api";
2
+ import type { DocumentNode } from "graphql";
3
+ export declare class NetworksSubgraph 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/networks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,IAAI,SAAc;IAClB,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 NetworksSubgraph extends BaseSubgraph {
5
+ name = "networks";
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/networks/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAG5D,eAAO,MAAM,YAAY,GAAI,UAAU,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAoDxE,CAAC"}
@@ -0,0 +1,42 @@
1
+ import {} from "@powerhousedao/reactor-api";
2
+ export const getResolvers = (subgraph) => {
3
+ const reactor = subgraph.reactor;
4
+ return {
5
+ Query: {
6
+ allNetworks: async () => {
7
+ const drives = await reactor.getDrives();
8
+ const docs = [];
9
+ for (const driveId of drives) {
10
+ const docsIds = await reactor.getDocuments(driveId);
11
+ const driveDocs = await Promise.allSettled(docsIds.map(async (docId) => reactor.getDocument(docId)));
12
+ driveDocs.forEach((result) => {
13
+ if (result.status === "fulfilled" &&
14
+ result.value.header.documentType === "powerhouse/network-profile") {
15
+ docs.push(result.value);
16
+ }
17
+ });
18
+ }
19
+ return docs.map((doc) => {
20
+ const state = doc.state.global;
21
+ return {
22
+ id: doc.header.id,
23
+ documentType: doc.header.documentType,
24
+ network: {
25
+ name: state.name,
26
+ icon: state.icon,
27
+ logo: state.logo,
28
+ logoBig: state.logoBig,
29
+ website: state.website ?? null,
30
+ description: state.description,
31
+ category: state.category,
32
+ x: state.x ?? null,
33
+ github: state.github ?? null,
34
+ discord: state.discord ?? null,
35
+ youtube: state.youtube ?? null,
36
+ },
37
+ };
38
+ });
39
+ },
40
+ },
41
+ };
42
+ };
@@ -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/networks/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,MAAM,EAAE,YAqCpB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { gql } from "graphql-tag";
2
+ export const schema = gql `
3
+ """
4
+ Subgraph definition
5
+ """
6
+ type Query {
7
+ allNetworks: [AllNetworks!]!
8
+ }
9
+
10
+
11
+ type AllNetworks {
12
+ id: PHID
13
+ documentType: String
14
+ network: Network
15
+ }
16
+
17
+ type Network {
18
+ name: String!
19
+ icon: String!
20
+ logo: String!
21
+ logoBig: String!
22
+ website: String
23
+ description: String!
24
+ category: [NetworkCategory!]!
25
+ x: String
26
+ github: String
27
+ discord: String
28
+ youtube: String
29
+ }
30
+
31
+ enum NetworkCategory {
32
+ DEFI
33
+ OSS
34
+ CRYPTO
35
+ NGO
36
+ CHARITY
37
+ }
38
+
39
+ `;
@@ -0,0 +1,11 @@
1
+ import { BaseSubgraph } from "@powerhousedao/reactor-api";
2
+ import type { DocumentNode } from "graphql";
3
+ export declare class PaymentTermsSubgraph 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/payment-terms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,IAAI,SAAmB;IACvB,QAAQ,EAAE,YAAY,CAAU;IAChC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAsB;IACxD,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 PaymentTermsSubgraph extends BaseSubgraph {
5
+ name = "payment-terms";
6
+ typeDefs = schema;
7
+ resolvers = getResolvers(this);
8
+ additionalContextFields = {};
9
+ async onSetup() { }
10
+ async onDisconnect() { }
11
+ }