@overmap-ai/core 1.0.48-fix-agent-errors.4 → 1.0.48-form-submission-view.0

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.
@@ -1798,6 +1798,11 @@ var __publicField = (obj, key, value) => {
1798
1798
  }
1799
1799
  });
1800
1800
  const selectStageMapping = (state) => state.componentStageReducer.stages;
1801
+ const selectStage = restructureCreateSelectorWithArgs(
1802
+ toolkit.createSelector([selectStageMapping, (_state, stageId) => stageId], (stageMapping, stageId) => {
1803
+ return stageMapping[stageId];
1804
+ })
1805
+ );
1801
1806
  const selectStages = toolkit.createSelector(
1802
1807
  [selectStageMapping],
1803
1808
  (stageMapping) => {
@@ -2038,6 +2043,7 @@ var __publicField = (obj, key, value) => {
2038
2043
  issues: {},
2039
2044
  attachments: {},
2040
2045
  comments: {},
2046
+ updates: {},
2041
2047
  visibleStatuses: [IssueStatus.BACKLOG, IssueStatus.SELECTED],
2042
2048
  visibleUserIds: null,
2043
2049
  recentIssueIds: [],
@@ -2059,6 +2065,16 @@ var __publicField = (obj, key, value) => {
2059
2065
  });
2060
2066
  },
2061
2067
  setIssueAttachments: setAttachments,
2068
+ setIssueUpdates: (state, action) => {
2069
+ if (action.payload.filter(onlyUniqueOfflineIds).length !== action.payload.length) {
2070
+ throw new Error("Tried to use setIssues reducer with duplicate ID's");
2071
+ }
2072
+ const newUpdates = {};
2073
+ for (const update of action.payload) {
2074
+ newUpdates[update.offline_id] = update;
2075
+ }
2076
+ state.updates = newUpdates;
2077
+ },
2062
2078
  setActiveIssueId: (state, action) => {
2063
2079
  state.activeIssueId = action.payload;
2064
2080
  },
@@ -2070,6 +2086,17 @@ var __publicField = (obj, key, value) => {
2070
2086
  },
2071
2087
  addIssueAttachment: addAttachment,
2072
2088
  addIssueAttachments: addAttachments,
2089
+ addIssueUpdate: (state, action) => {
2090
+ if (action.payload.offline_id in state.updates) {
2091
+ throw new Error(`Tried to add duplicate issue update with offline_id: ${action.payload.offline_id}`);
2092
+ }
2093
+ state.updates[action.payload.offline_id] = action.payload;
2094
+ },
2095
+ addIssueUpdates: (state, action) => {
2096
+ for (const update of action.payload) {
2097
+ state.updates[update.offline_id] = update;
2098
+ }
2099
+ },
2073
2100
  updateIssue: (state, action) => {
2074
2101
  if (action.payload.offline_id in state.issues) {
2075
2102
  state.issues[action.payload.offline_id] = {
@@ -2089,6 +2116,18 @@ var __publicField = (obj, key, value) => {
2089
2116
  }
2090
2117
  },
2091
2118
  removeIssueAttachment: removeAttachment,
2119
+ removeIssueUpdate: (state, action) => {
2120
+ if (action.payload in state.updates) {
2121
+ delete state.updates[action.payload];
2122
+ } else {
2123
+ throw new Error(`Failed to remove issue update because offline_id doesn't exist: ${action.payload}`);
2124
+ }
2125
+ },
2126
+ removeIssueUpdates: (state, action) => {
2127
+ for (const updateId of action.payload) {
2128
+ delete state.updates[updateId];
2129
+ }
2130
+ },
2092
2131
  removeAttachmentsOfIssue: (state, action) => {
2093
2132
  const attachments = Object.values(state.attachments).filter((a) => a.issue === action.payload);
2094
2133
  for (const attachment of attachments) {
@@ -2101,20 +2140,55 @@ var __publicField = (obj, key, value) => {
2101
2140
  setVisibleUserIds: (state, action) => {
2102
2141
  state.visibleUserIds = [...new Set(action.payload)];
2103
2142
  },
2104
- setIssueComments: (state, action) => {
2143
+ // Comments
2144
+ addIssueComment: (state, action) => {
2145
+ if (action.payload.offline_id in state.comments) {
2146
+ throw new Error(
2147
+ `Tried to add issue comment with offline_id: ${action.payload.offline_id} that already exists`
2148
+ );
2149
+ }
2150
+ state.comments[action.payload.offline_id] = action.payload;
2151
+ },
2152
+ addIssueComments: (state, action) => {
2153
+ for (const comment of action.payload) {
2154
+ if (comment.offline_id in state.comments) {
2155
+ throw new Error(
2156
+ `Tried to add issue comment with offline_id: ${comment.offline_id} that already exists`
2157
+ );
2158
+ }
2159
+ }
2105
2160
  for (const comment of action.payload) {
2106
2161
  state.comments[comment.offline_id] = comment;
2107
2162
  }
2108
2163
  },
2164
+ setIssueComment: (state, action) => {
2165
+ state.comments[action.payload.offline_id] = action.payload;
2166
+ },
2167
+ setIssueComments: (state, action) => {
2168
+ const newComments = {};
2169
+ for (const comment of action.payload) {
2170
+ newComments[comment.offline_id] = comment;
2171
+ }
2172
+ state.comments = newComments;
2173
+ },
2109
2174
  addOrReplaceIssueComment: (state, action) => {
2110
2175
  state.comments[action.payload.offline_id] = action.payload;
2111
2176
  },
2112
2177
  removeIssueComment: (state, action) => {
2113
- if (action.payload in state.comments) {
2114
- delete state.comments[action.payload];
2115
- } else {
2178
+ if (!(action.payload in state.comments)) {
2116
2179
  throw new Error(`Failed to remove issue comment because ID doesn't exist: ${action.payload}`);
2117
2180
  }
2181
+ delete state.comments[action.payload];
2182
+ },
2183
+ removeIssueComments: (state, action) => {
2184
+ for (const commentId of action.payload) {
2185
+ if (!(commentId in state.comments)) {
2186
+ throw new Error(`Failed to remove issue comment because ID doesn't exist: ${commentId}`);
2187
+ }
2188
+ }
2189
+ for (const commentId of action.payload) {
2190
+ delete state.comments[commentId];
2191
+ }
2118
2192
  },
2119
2193
  cleanRecentIssues: (state) => {
2120
2194
  state.recentIssueIds = state.recentIssueIds.filter((recentIssue) => state.issues[recentIssue.offlineId]);
@@ -2145,23 +2219,33 @@ var __publicField = (obj, key, value) => {
2145
2219
  addIssueAttachment,
2146
2220
  addIssueAttachments,
2147
2221
  addIssue,
2222
+ addIssueUpdate,
2223
+ addIssueUpdates,
2148
2224
  addOrReplaceIssueComment,
2149
2225
  addToRecentIssues,
2150
2226
  cleanRecentIssues,
2151
2227
  removeIssueAttachment,
2152
2228
  removeAttachmentsOfIssue,
2153
2229
  removeIssue,
2154
- removeIssueComment,
2230
+ removeIssueUpdate,
2231
+ removeIssueUpdates,
2155
2232
  removeRecentIssue,
2156
2233
  resetRecentIssues,
2157
2234
  setActiveIssueId,
2158
2235
  setIssueAttachments,
2159
- setIssueComments,
2236
+ setIssueUpdates,
2160
2237
  setIssues,
2161
2238
  setVisibleStatuses,
2162
2239
  setVisibleUserIds,
2163
2240
  updateIssueAttachment,
2164
- updateIssue
2241
+ updateIssue,
2242
+ // Commments
2243
+ addIssueComment,
2244
+ addIssueComments,
2245
+ setIssueComment,
2246
+ setIssueComments,
2247
+ removeIssueComment,
2248
+ removeIssueComments
2165
2249
  } = issueSlice.actions;
2166
2250
  const selectIssueMapping = (state) => state.issueReducer.issues;
2167
2251
  const selectRecentIssueIds = (state) => state.issueReducer.recentIssueIds;
@@ -2232,6 +2316,12 @@ var __publicField = (obj, key, value) => {
2232
2316
  return Object.values(commentMapping).filter((comment) => comment.issue === issueId);
2233
2317
  })
2234
2318
  );
2319
+ const selectIssueUpdateMapping = (state) => state.issueReducer.updates;
2320
+ const selectIssueUpdatesOfIssue = restructureCreateSelectorWithArgs(
2321
+ toolkit.createSelector([selectIssueUpdateMapping, (_state, issueId) => issueId], (updates, issueId) => {
2322
+ return Object.values(updates).filter((update) => update.issue === issueId);
2323
+ })
2324
+ );
2235
2325
  const selectAttachmentsOfIssue = restructureCreateSelectorWithArgs(
2236
2326
  toolkit.createSelector(
2237
2327
  [selectIssueAttachments, (_state, issueId) => issueId],
@@ -2440,6 +2530,16 @@ var __publicField = (obj, key, value) => {
2440
2530
  OrganizationAccessLevel2[OrganizationAccessLevel2["ADMIN"] = 2] = "ADMIN";
2441
2531
  return OrganizationAccessLevel2;
2442
2532
  })(OrganizationAccessLevel || {});
2533
+ var IssueUpdateChange = /* @__PURE__ */ ((IssueUpdateChange2) => {
2534
+ IssueUpdateChange2["STATUS"] = "status";
2535
+ IssueUpdateChange2["PRIORITY"] = "priority";
2536
+ IssueUpdateChange2["CATEGORY"] = "category";
2537
+ IssueUpdateChange2["DESCRIPTION"] = "description";
2538
+ IssueUpdateChange2["TITLE"] = "title";
2539
+ IssueUpdateChange2["ASSIGNED_TO"] = "assigned_to";
2540
+ IssueUpdateChange2["DUE_DATE"] = "due_date";
2541
+ return IssueUpdateChange2;
2542
+ })(IssueUpdateChange || {});
2443
2543
  var ProjectType = /* @__PURE__ */ ((ProjectType2) => {
2444
2544
  ProjectType2[ProjectType2["PERSONAL"] = 0] = "PERSONAL";
2445
2545
  ProjectType2[ProjectType2["ORGANIZATION"] = 2] = "ORGANIZATION";
@@ -3542,6 +3642,14 @@ var __publicField = (obj, key, value) => {
3542
3642
  return state.userFormReducer.userForms[formId2];
3543
3643
  };
3544
3644
  const selectSubmissionMapping = (state) => state.userFormReducer.submissions;
3645
+ const selectUserFormSubmission = restructureCreateSelectorWithArgs(
3646
+ toolkit.createSelector(
3647
+ [selectSubmissionMapping, (_state, submissionId) => submissionId],
3648
+ (submissions, submissionId) => {
3649
+ return submissions[submissionId];
3650
+ }
3651
+ )
3652
+ );
3545
3653
  const selectSubmissions = toolkit.createSelector([selectSubmissionMapping], (submissions) => Object.values(submissions));
3546
3654
  const selectRevisionMapping = (state) => state.userFormReducer.revisions;
3547
3655
  const selectRevisions = toolkit.createSelector([selectRevisionMapping], (revisions) => Object.values(revisions));
@@ -4242,10 +4350,20 @@ var __publicField = (obj, key, value) => {
4242
4350
  var _a2;
4243
4351
  return (_a2 = allMiddleware[0]) == null ? void 0 : _a2.run(action);
4244
4352
  }
4245
- const discardStatuses = [400, 409, 403, 404];
4353
+ const discardStatuses = [400, 409, 403, 404, 405, 500];
4246
4354
  const statusMessages = {
4247
4355
  403: { title: "Forbidden", description: "You are not authorized to perform this action.", severity: "danger" },
4248
- 404: { title: "Not found", description: "The requested resource was not found.", severity: "danger" }
4356
+ 404: { title: "Not found", description: "The requested resource was not found.", severity: "danger" },
4357
+ 405: {
4358
+ title: "Not supported",
4359
+ description: "It's not you. It's us. Sorry for the inconvenience.",
4360
+ severity: "danger"
4361
+ },
4362
+ 500: {
4363
+ title: "Server error",
4364
+ description: "Our server seems to be experiencing problems at the moment. We have been alerted and will fix the problem as soon as possible.",
4365
+ severity: "danger"
4366
+ }
4249
4367
  };
4250
4368
  function discard(reason, action, retries = 0) {
4251
4369
  var _a2;
@@ -4418,7 +4536,7 @@ var __publicField = (obj, key, value) => {
4418
4536
  }
4419
4537
  // Attachments aren't models, so we use the OptimisticGenericResult type instead
4420
4538
  async addIssueAttachment(attachmentPayload) {
4421
- const { description: description2, issue, file_sha1, offline_id } = attachmentPayload;
4539
+ const { issue, file_sha1, offline_id } = attachmentPayload;
4422
4540
  if (!attachmentPayload.file.objectURL) {
4423
4541
  throw new Error("Expected attachmentPayload.file.objectURL to be defined.");
4424
4542
  }
@@ -4426,7 +4544,9 @@ var __publicField = (obj, key, value) => {
4426
4544
  ...attachmentPayload,
4427
4545
  file: attachmentPayload.file.objectURL,
4428
4546
  file_name: attachmentPayload.file.name,
4429
- file_type: attachmentPayload.file.type
4547
+ file_type: attachmentPayload.file.type,
4548
+ submitted_at: (/* @__PURE__ */ new Date()).toISOString(),
4549
+ created_by: this.client.store.getState().userReducer.currentUser.id
4430
4550
  };
4431
4551
  await this.client.files.addCache(attachmentPayload.file, file_sha1);
4432
4552
  this.client.store.dispatch(addIssueAttachment(offlineAttachment));
@@ -4438,10 +4558,7 @@ var __publicField = (obj, key, value) => {
4438
4558
  blocks: [offline_id, issue],
4439
4559
  blockers: [file_sha1],
4440
4560
  payload: {
4441
- offline_id,
4442
- issue,
4443
- description: description2 ?? "",
4444
- submitted_at: (/* @__PURE__ */ new Date()).getTime() / 1e3,
4561
+ ...offlineAttachment,
4445
4562
  ...fileProps
4446
4563
  }
4447
4564
  });
@@ -4452,7 +4569,7 @@ var __publicField = (obj, key, value) => {
4452
4569
  return [offlineAttachment, promise];
4453
4570
  }
4454
4571
  async addComponentAttachment(attachmentPayload) {
4455
- const { description: description2, component, file_sha1, offline_id } = attachmentPayload;
4572
+ const { component, file_sha1, offline_id } = attachmentPayload;
4456
4573
  if (!attachmentPayload.file.objectURL) {
4457
4574
  throw new Error("Expected attachmentPayload.file.objectURL to be defined.");
4458
4575
  }
@@ -4460,7 +4577,9 @@ var __publicField = (obj, key, value) => {
4460
4577
  ...attachmentPayload,
4461
4578
  file: attachmentPayload.file.objectURL,
4462
4579
  file_name: attachmentPayload.file.name,
4463
- file_type: attachmentPayload.file.type
4580
+ file_type: attachmentPayload.file.type,
4581
+ submitted_at: (/* @__PURE__ */ new Date()).toISOString(),
4582
+ created_by: this.client.store.getState().userReducer.currentUser.id
4464
4583
  };
4465
4584
  await this.client.files.addCache(attachmentPayload.file, file_sha1);
4466
4585
  this.client.store.dispatch(addComponentAttachment(offlineAttachment));
@@ -4472,10 +4591,7 @@ var __publicField = (obj, key, value) => {
4472
4591
  blocks: [offline_id, component],
4473
4592
  blockers: [file_sha1],
4474
4593
  payload: {
4475
- offline_id,
4476
- component,
4477
- description: description2 ?? "",
4478
- submitted_at: (/* @__PURE__ */ new Date()).getTime() / 1e3,
4594
+ ...offlineAttachment,
4479
4595
  ...fileProps
4480
4596
  }
4481
4597
  });
@@ -4486,7 +4602,7 @@ var __publicField = (obj, key, value) => {
4486
4602
  return [offlineAttachment, promise];
4487
4603
  }
4488
4604
  async addComponentTypeAttachment(attachmentPayload) {
4489
- const { description: description2, component_type, file_sha1, offline_id } = attachmentPayload;
4605
+ const { component_type, file_sha1, offline_id } = attachmentPayload;
4490
4606
  if (!attachmentPayload.file.objectURL) {
4491
4607
  throw new Error("Expected attachmentPayload.file.objectURL to be defined.");
4492
4608
  }
@@ -4494,7 +4610,9 @@ var __publicField = (obj, key, value) => {
4494
4610
  ...attachmentPayload,
4495
4611
  file: attachmentPayload.file.objectURL,
4496
4612
  file_name: attachmentPayload.file.name,
4497
- file_type: attachmentPayload.file.type
4613
+ file_type: attachmentPayload.file.type,
4614
+ submitted_at: (/* @__PURE__ */ new Date()).toISOString(),
4615
+ created_by: this.client.store.getState().userReducer.currentUser.id
4498
4616
  };
4499
4617
  await this.client.files.addCache(attachmentPayload.file, file_sha1);
4500
4618
  this.client.store.dispatch(addComponentTypeAttachment(offlineAttachment));
@@ -4506,10 +4624,7 @@ var __publicField = (obj, key, value) => {
4506
4624
  blocks: [offline_id, component_type],
4507
4625
  blockers: [file_sha1],
4508
4626
  payload: {
4509
- offline_id,
4510
- component_type,
4511
- description: description2 ?? "",
4512
- submitted_at: (/* @__PURE__ */ new Date()).getTime() / 1e3,
4627
+ ...offlineAttachment,
4513
4628
  ...fileProps
4514
4629
  }
4515
4630
  });
@@ -4528,7 +4643,9 @@ var __publicField = (obj, key, value) => {
4528
4643
  ...attachmentPayload,
4529
4644
  file: attachmentPayload.file.objectURL,
4530
4645
  file_name: attachmentPayload.file.name,
4531
- file_type: attachmentPayload.file.type
4646
+ file_type: attachmentPayload.file.type,
4647
+ submitted_at: (/* @__PURE__ */ new Date()).toISOString(),
4648
+ created_by: this.client.store.getState().userReducer.currentUser.id
4532
4649
  };
4533
4650
  await this.client.files.addCache(attachmentPayload.file, file_sha1);
4534
4651
  this.client.store.dispatch(addProjectAttachment(offlineAttachment));
@@ -4568,7 +4685,9 @@ var __publicField = (obj, key, value) => {
4568
4685
  file_name: file2.name,
4569
4686
  file_type: file2.type,
4570
4687
  issue: issueId,
4571
- file_sha1: hash
4688
+ file_sha1: hash,
4689
+ submitted_at: (/* @__PURE__ */ new Date()).toISOString(),
4690
+ created_by: this.client.store.getState().userReducer.currentUser.id
4572
4691
  });
4573
4692
  return this.addIssueAttachment(attachment);
4574
4693
  };
@@ -4587,7 +4706,9 @@ var __publicField = (obj, key, value) => {
4587
4706
  file_name: file2.name,
4588
4707
  file_type: file2.type,
4589
4708
  component: componentId,
4590
- file_sha1: hash
4709
+ file_sha1: hash,
4710
+ submitted_at: (/* @__PURE__ */ new Date()).toISOString(),
4711
+ created_by: this.client.store.getState().userReducer.currentUser.id
4591
4712
  });
4592
4713
  return this.addComponentAttachment(attachment);
4593
4714
  };
@@ -4606,7 +4727,9 @@ var __publicField = (obj, key, value) => {
4606
4727
  file_name: file2.name,
4607
4728
  file_type: file2.type,
4608
4729
  component_type: componentTypeId,
4609
- file_sha1: hash
4730
+ file_sha1: hash,
4731
+ submitted_at: (/* @__PURE__ */ new Date()).toISOString(),
4732
+ created_by: this.client.store.getState().userReducer.currentUser.id
4610
4733
  });
4611
4734
  return this.addComponentTypeAttachment(attachment);
4612
4735
  };
@@ -4625,7 +4748,9 @@ var __publicField = (obj, key, value) => {
4625
4748
  file_name: file2.name,
4626
4749
  file_type: file2.type,
4627
4750
  project: projectId,
4628
- file_sha1: hash
4751
+ file_sha1: hash,
4752
+ submitted_at: (/* @__PURE__ */ new Date()).toISOString(),
4753
+ created_by: this.client.store.getState().userReducer.currentUser.id
4629
4754
  });
4630
4755
  return this.addProjectAttachment(attachment);
4631
4756
  };
@@ -5702,49 +5827,35 @@ var __publicField = (obj, key, value) => {
5702
5827
  }
5703
5828
  }
5704
5829
  class IssueCommentService extends BaseApiService {
5830
+ // Omit author and submitted_at since these will always be set internally
5705
5831
  add(comment) {
5706
- const offlinePayload = offline(comment);
5707
- const submittedAt = (/* @__PURE__ */ new Date()).toISOString();
5708
5832
  const { store } = this.client;
5709
- const offlineComment = {
5710
- ...offlinePayload,
5833
+ const offlineComment = offline({
5834
+ ...comment,
5711
5835
  author: store.getState().userReducer.currentUser.id,
5712
- created_at: submittedAt
5713
- };
5714
- store.dispatch(addOrReplaceIssueComment(offlineComment));
5836
+ submitted_at: (/* @__PURE__ */ new Date()).toISOString()
5837
+ });
5838
+ store.dispatch(addIssueComment(offlineComment));
5715
5839
  const promise = this.enqueueRequest({
5716
5840
  description: `${truncate(comment.content, 80)}`,
5717
5841
  method: HttpMethod.POST,
5718
5842
  url: `/issues/${comment.issue}/comment/`,
5719
- payload: { ...offlinePayload, submitted_at: submittedAt },
5843
+ payload: offlineComment,
5720
5844
  blockers: [comment.issue],
5721
- blocks: [offlinePayload.offline_id]
5845
+ blocks: [offlineComment.offline_id]
5846
+ });
5847
+ promise.catch(() => {
5848
+ store.dispatch(removeIssueComment(offlineComment.offline_id));
5722
5849
  });
5723
5850
  return [offlineComment, promise];
5724
5851
  }
5725
- async refreshStore() {
5852
+ update(comment) {
5726
5853
  const { store } = this.client;
5727
- const result = await this.enqueueRequest({
5728
- description: "Get comments",
5729
- method: HttpMethod.GET,
5730
- // TODO: Choose between /issues/comments/in-project/${projectId}/ and /projects/${projectId}/issue-comments/
5731
- url: `/projects/${store.getState().projectReducer.activeProjectId}/comments/`,
5732
- blockers: [],
5733
- blocks: []
5734
- });
5735
- let filteredResult = result.filter(onlyUniqueOfflineIds);
5736
- filteredResult = filteredResult.map((comment) => {
5737
- return { ...comment };
5738
- });
5739
- if (result.length !== filteredResult.length) {
5740
- console.error(
5741
- `Received duplicate comments from the API (new length ${filteredResult.length}); filtered in browser.`
5742
- );
5854
+ const commentToUpdate = store.getState().issueReducer.comments[comment.offline_id];
5855
+ if (!commentToUpdate) {
5856
+ throw new Error(`Comment with offline_id ${comment.offline_id} not found in store`);
5743
5857
  }
5744
- store.dispatch(setIssueComments(filteredResult));
5745
- }
5746
- update(comment) {
5747
- this.client.store.dispatch(addOrReplaceIssueComment(comment));
5858
+ store.dispatch(setIssueComment(comment));
5748
5859
  const promise = this.enqueueRequest({
5749
5860
  description: `Edit comment: ${truncate(comment.content, 80)}`,
5750
5861
  method: HttpMethod.PATCH,
@@ -5753,17 +5864,62 @@ var __publicField = (obj, key, value) => {
5753
5864
  blockers: [comment.issue],
5754
5865
  blocks: [comment.offline_id]
5755
5866
  });
5867
+ promise.catch(() => {
5868
+ store.dispatch(setIssueComment(commentToUpdate));
5869
+ });
5756
5870
  return [comment, promise];
5757
5871
  }
5758
5872
  remove(offline_id) {
5873
+ const commentToRemove = this.client.store.getState().issueReducer.comments[offline_id];
5874
+ if (!commentToRemove) {
5875
+ throw new Error(`Comment with offline_id ${offline_id} not found in store`);
5876
+ }
5759
5877
  this.client.store.dispatch(removeIssueComment(offline_id));
5760
- return this.enqueueRequest({
5878
+ const promise = this.enqueueRequest({
5761
5879
  description: "Delete comment",
5762
5880
  method: HttpMethod.DELETE,
5763
5881
  url: `/issues/comments/${offline_id}/`,
5764
5882
  blockers: [offline_id],
5765
5883
  blocks: []
5766
5884
  });
5885
+ promise.catch(() => {
5886
+ this.client.store.dispatch(addIssueComment(commentToRemove));
5887
+ });
5888
+ return promise;
5889
+ }
5890
+ async refreshStore() {
5891
+ const { store } = this.client;
5892
+ const result = await this.enqueueRequest({
5893
+ description: "Get comments",
5894
+ method: HttpMethod.GET,
5895
+ // TODO: Choose between /issues/comments/in-project/${projectId}/ and /projects/${projectId}/issue-comments/
5896
+ url: `/projects/${store.getState().projectReducer.activeProjectId}/comments/`,
5897
+ blockers: [],
5898
+ blocks: []
5899
+ });
5900
+ store.dispatch(setIssueComments(result));
5901
+ }
5902
+ }
5903
+ class IssueUpdateService extends BaseApiService {
5904
+ async refreshStore() {
5905
+ const { store } = this.client;
5906
+ const result = await this.enqueueRequest({
5907
+ description: "Get issue updates",
5908
+ method: HttpMethod.GET,
5909
+ url: `/projects/${store.getState().projectReducer.activeProjectId}/issues/updates/`,
5910
+ blockers: [],
5911
+ blocks: []
5912
+ });
5913
+ let filteredResult = result.filter(onlyUniqueOfflineIds);
5914
+ filteredResult = filteredResult.map((comment) => {
5915
+ return { ...comment };
5916
+ });
5917
+ if (result.length !== filteredResult.length) {
5918
+ console.error(
5919
+ `Received duplicate comments from the API (new length ${filteredResult.length}); filtered in browser.`
5920
+ );
5921
+ }
5922
+ store.dispatch(setIssueUpdates(filteredResult));
5767
5923
  }
5768
5924
  }
5769
5925
  class IssueService extends BaseApiService {
@@ -5844,7 +6000,83 @@ var __publicField = (obj, key, value) => {
5844
6000
  return [offlineIssues, promise];
5845
6001
  }
5846
6002
  update(issue) {
6003
+ const state = this.client.store.getState();
6004
+ const issueToBeUpdated = state.issueReducer.issues[issue.offline_id];
6005
+ if (!issueToBeUpdated) {
6006
+ throw new Error(
6007
+ `Attempting to update an issue with offline_id ${issue.offline_id} that doesn't exist in the store`
6008
+ );
6009
+ }
5847
6010
  this.client.store.dispatch(updateIssue(issue));
6011
+ const changes = {};
6012
+ for (const issueUpdateChange of [
6013
+ IssueUpdateChange.TITLE,
6014
+ IssueUpdateChange.DESCRIPTION,
6015
+ IssueUpdateChange.STATUS,
6016
+ IssueUpdateChange.CATEGORY,
6017
+ IssueUpdateChange.PRIORITY,
6018
+ IssueUpdateChange.ASSIGNED_TO,
6019
+ IssueUpdateChange.DUE_DATE
6020
+ ]) {
6021
+ if (issueUpdateChange in issue && issue[issueUpdateChange] !== issueToBeUpdated[issueUpdateChange]) {
6022
+ switch (issueUpdateChange) {
6023
+ case "category": {
6024
+ let categoryOrNull = null;
6025
+ const categoryIdOrNull = issue[issueUpdateChange];
6026
+ if (categoryIdOrNull) {
6027
+ categoryOrNull = state.categoryReducer.categories[categoryIdOrNull] ?? null;
6028
+ if (!categoryOrNull)
6029
+ throw new Error(
6030
+ `Trying to update issue category to ${categoryIdOrNull} which does not exist in store`
6031
+ );
6032
+ }
6033
+ changes[issueUpdateChange] = categoryOrNull ? {
6034
+ name: categoryOrNull.name,
6035
+ color: categoryOrNull.color,
6036
+ offline_id: categoryOrNull.offline_id
6037
+ } : null;
6038
+ break;
6039
+ }
6040
+ case "assigned_to": {
6041
+ let userOrNull = null;
6042
+ const userIdOrNull = issue[issueUpdateChange];
6043
+ if (userIdOrNull) {
6044
+ userOrNull = state.userReducer.users[userIdOrNull] ?? null;
6045
+ if (!userOrNull)
6046
+ throw new Error(
6047
+ `Trying to update issue assigned_to to ${userIdOrNull} which does not exist in store`
6048
+ );
6049
+ }
6050
+ changes[issueUpdateChange] = userOrNull ? {
6051
+ full_name: userOrNull.username,
6052
+ id: userOrNull.id
6053
+ } : null;
6054
+ break;
6055
+ }
6056
+ case "description":
6057
+ changes[issueUpdateChange] = issue[issueUpdateChange] ?? null;
6058
+ break;
6059
+ case "title":
6060
+ changes[issueUpdateChange] = issue[issueUpdateChange] ?? null;
6061
+ break;
6062
+ case "priority":
6063
+ changes[issueUpdateChange] = issue[issueUpdateChange];
6064
+ break;
6065
+ case "status":
6066
+ changes[issueUpdateChange] = issue[issueUpdateChange];
6067
+ break;
6068
+ case "due_date":
6069
+ changes[issueUpdateChange] = issue[issueUpdateChange] ? issue[issueUpdateChange] : null;
6070
+ }
6071
+ }
6072
+ }
6073
+ const offlineIssueUpdate = offline({
6074
+ created_by: state.userReducer.currentUser.id,
6075
+ submitted_at: (/* @__PURE__ */ new Date()).toISOString(),
6076
+ issue: issueToBeUpdated.offline_id,
6077
+ changes
6078
+ });
6079
+ this.client.store.dispatch(addIssueUpdate(offlineIssueUpdate));
5848
6080
  const promise = this.enqueueRequest({
5849
6081
  description: "Edit issue",
5850
6082
  method: HttpMethod.PATCH,
@@ -5853,23 +6085,30 @@ var __publicField = (obj, key, value) => {
5853
6085
  blockers: [issue.offline_id],
5854
6086
  blocks: [issue.offline_id]
5855
6087
  });
6088
+ promise.catch(() => {
6089
+ this.client.store.dispatch(updateIssue(issueToBeUpdated));
6090
+ this.client.store.dispatch(removeIssueUpdate(offlineIssueUpdate.offline_id));
6091
+ });
5856
6092
  const fullIssue = this.client.store.getState().issueReducer.issues[issue.offline_id];
5857
6093
  return [fullIssue, promise];
5858
6094
  }
5859
6095
  async remove(id) {
5860
6096
  const { store } = this.client;
5861
6097
  const state = store.getState();
6098
+ const dispatch = store.dispatch;
5862
6099
  const backup = state.issueReducer.issues[id];
5863
6100
  if (!backup) {
5864
6101
  throw new Error(`No issue with id ${id} found in the store`);
5865
6102
  }
5866
6103
  const attachments = Object.values(state.issueReducer.attachments).filter((a) => a.issue === id);
5867
6104
  const attachmentsOfIssue = selectAttachmentsOfIssue(id)(state);
5868
- this.client.store.dispatch(removeIssue(id));
5869
- store.dispatch(addActiveProjectIssuesCount(-1));
5870
- if (attachmentsOfIssue.length > 0) {
5871
- this.client.store.dispatch(removeAttachmentsOfIssue(id));
5872
- }
6105
+ const updatesOfIssue = selectIssueUpdatesOfIssue(id)(state);
6106
+ dispatch(removeIssue(id));
6107
+ dispatch(addActiveProjectIssuesCount(-1));
6108
+ if (attachmentsOfIssue.length > 0)
6109
+ dispatch(removeAttachmentsOfIssue(id));
6110
+ if (updatesOfIssue.length > 0)
6111
+ dispatch(removeIssueUpdates(updatesOfIssue.map(({ offline_id }) => offline_id)));
5873
6112
  try {
5874
6113
  return await this.enqueueRequest({
5875
6114
  description: "Delete issue",
@@ -5879,9 +6118,10 @@ var __publicField = (obj, key, value) => {
5879
6118
  blocks: []
5880
6119
  });
5881
6120
  } catch (e) {
5882
- this.client.store.dispatch(addIssue(backup));
5883
- this.client.store.dispatch(addIssueAttachments(attachments));
5884
- store.dispatch(addActiveProjectIssuesCount(1));
6121
+ dispatch(addIssue(backup));
6122
+ dispatch(addIssueAttachments(attachments));
6123
+ dispatch(addIssueUpdates(updatesOfIssue));
6124
+ dispatch(addActiveProjectIssuesCount(1));
5885
6125
  throw e;
5886
6126
  }
5887
6127
  }
@@ -6063,6 +6303,7 @@ var __publicField = (obj, key, value) => {
6063
6303
  store.dispatch(setProjectAttachments(project_attachments));
6064
6304
  });
6065
6305
  void this.client.documents.refreshStore();
6306
+ void this.client.issueUpdates.refreshStore();
6066
6307
  }
6067
6308
  store.dispatch(setIsFetchingInitialData(false));
6068
6309
  if (overwrite) {
@@ -7490,7 +7731,7 @@ var __publicField = (obj, key, value) => {
7490
7731
  * @param request The message to prompt the agent with.
7491
7732
  * @param conversationId If continuing an existing message, the UUID of that conversation.
7492
7733
  */
7493
- prompt(request2, conversationId) {
7734
+ async prompt(request2, conversationId) {
7494
7735
  const activeProjectId = this.client.store.getState().projectReducer.activeProjectId;
7495
7736
  return this.enqueueRequest({
7496
7737
  description: "Prompt agent",
@@ -7505,6 +7746,16 @@ var __publicField = (obj, key, value) => {
7505
7746
  queryParams: conversationId ? { conversation_id: conversationId } : {}
7506
7747
  });
7507
7748
  }
7749
+ async rate(responseId, rating) {
7750
+ return this.enqueueRequest({
7751
+ description: "Rate agent response",
7752
+ method: HttpMethod.PUT,
7753
+ url: `/agents/responses/${responseId}/rate/`,
7754
+ payload: { rating },
7755
+ blockers: ["rate"],
7756
+ blocks: ["rate"]
7757
+ });
7758
+ }
7508
7759
  }
7509
7760
  class OvermapSDK {
7510
7761
  constructor(apiUrl, store) {
@@ -7520,6 +7771,7 @@ var __publicField = (obj, key, value) => {
7520
7771
  __publicField(this, "organizationAccess", new OrganizationAccessService(this));
7521
7772
  __publicField(this, "issues", new IssueService(this));
7522
7773
  __publicField(this, "issueComments", new IssueCommentService(this));
7774
+ __publicField(this, "issueUpdates", new IssueUpdateService(this));
7523
7775
  __publicField(this, "workspaces", new WorkspaceService(this));
7524
7776
  __publicField(this, "main", new MainService(this));
7525
7777
  __publicField(this, "components", new ComponentService(this));
@@ -12993,52 +13245,54 @@ var __publicField = (obj, key, value) => {
12993
13245
  Footer,
12994
13246
  Loading
12995
13247
  };
12996
- const ImageCard = React.memo((props) => {
12997
- const { file, alt, error: error2, size, rightSlot, className, truncateLength, ...rest } = props;
12998
- const fileCardRef = React.useRef(null);
12999
- const imageInsetRef = React.useRef(null);
13000
- const fileCardSize = blocks.useSize(fileCardRef);
13001
- React.useLayoutEffect(() => {
13002
- if (!imageInsetRef.current || !fileCardSize)
13003
- return;
13004
- imageInsetRef.current.style.height = `${fileCardSize.height * 4}px`;
13005
- }, [fileCardSize]);
13006
- const fileName2 = React.useMemo(() => {
13007
- if (!file)
13008
- return;
13009
- return truncateLength !== void 0 ? truncate(file.name, truncateLength) : file.name;
13010
- }, [file, truncateLength]);
13011
- return /* @__PURE__ */ jsxRuntime.jsxs(
13012
- Flex,
13013
- {
13014
- className: classNames$1(className, styles$4.ImageCard),
13015
- width: "100%",
13016
- direction: "column",
13017
- position: "relative",
13018
- height: "max-content",
13019
- gap: "0",
13020
- ...rest,
13021
- children: [
13022
- !file && !error2 && /* @__PURE__ */ jsxRuntime.jsx(Flex, { width: "100%", height: "100%", align: "center", justify: "center", position: "absolute", children: /* @__PURE__ */ jsxRuntime.jsx(blocks.Spinner, {}) }),
13023
- /* @__PURE__ */ jsxRuntime.jsx(Inset, { className: styles$4.ImageInset, ref: imageInsetRef, clip: "padding-box", side: "y", pb: "0", children: file && !error2 && /* @__PURE__ */ jsxRuntime.jsx("img", { className: styles$4.Image, src: URL.createObjectURL(file), alt: alt ?? file.name }) }),
13024
- /* @__PURE__ */ jsxRuntime.jsx(
13025
- blocks.OvermapItem,
13026
- {
13027
- className: classNames$1(styles$4.Footer, {
13028
- [styles$4.Loading]: !file
13029
- }),
13030
- size,
13031
- ref: fileCardRef,
13032
- leftSlot: error2 ? /* @__PURE__ */ jsxRuntime.jsx(blocks.RiIcon, { icon: "RiFileWarningLine" }) : file && /* @__PURE__ */ jsxRuntime.jsx(FileIcon, { fileType: file.type }),
13033
- rightSlot,
13034
- children: error2 ?? fileName2
13035
- }
13036
- )
13037
- ]
13038
- }
13039
- );
13040
- });
13041
- ImageCard.displayName = "ImageCard";
13248
+ const ImageCard = React.memo(
13249
+ React.forwardRef((props, forwardedRef) => {
13250
+ const { file, alt, error: error2, size, rightSlot, className, truncateLength, ...rest } = props;
13251
+ const fileCardRef = React.useRef(null);
13252
+ const imageInsetRef = React.useRef(null);
13253
+ const fileCardSize = blocks.useSize(fileCardRef);
13254
+ React.useLayoutEffect(() => {
13255
+ if (!imageInsetRef.current || !fileCardSize)
13256
+ return;
13257
+ imageInsetRef.current.style.height = `${fileCardSize.height * 4}px`;
13258
+ }, [fileCardSize]);
13259
+ const fileName2 = React.useMemo(() => {
13260
+ if (!file)
13261
+ return;
13262
+ return truncateLength !== void 0 ? truncate(file.name, truncateLength) : file.name;
13263
+ }, [file, truncateLength]);
13264
+ return /* @__PURE__ */ jsxRuntime.jsxs(
13265
+ Flex,
13266
+ {
13267
+ className: classNames$1(className, styles$4.ImageCard),
13268
+ width: "100%",
13269
+ direction: "column",
13270
+ position: "relative",
13271
+ height: "max-content",
13272
+ gap: "0",
13273
+ ref: forwardedRef,
13274
+ ...rest,
13275
+ children: [
13276
+ !file && !error2 && /* @__PURE__ */ jsxRuntime.jsx(Flex, { width: "100%", height: "100%", align: "center", justify: "center", position: "absolute", children: /* @__PURE__ */ jsxRuntime.jsx(blocks.Spinner, {}) }),
13277
+ /* @__PURE__ */ jsxRuntime.jsx(Inset, { className: styles$4.ImageInset, ref: imageInsetRef, clip: "padding-box", side: "y", pb: "0", children: file && !error2 && /* @__PURE__ */ jsxRuntime.jsx("img", { className: styles$4.Image, src: URL.createObjectURL(file), alt: alt ?? file.name }) }),
13278
+ /* @__PURE__ */ jsxRuntime.jsx(
13279
+ blocks.OvermapItem,
13280
+ {
13281
+ className: classNames$1(styles$4.Footer, {
13282
+ [styles$4.Loading]: !file
13283
+ }),
13284
+ size,
13285
+ ref: fileCardRef,
13286
+ leftSlot: error2 ? /* @__PURE__ */ jsxRuntime.jsx(blocks.RiIcon, { icon: "RiFileWarningLine" }) : file && /* @__PURE__ */ jsxRuntime.jsx(FileIcon, { fileType: file.type }),
13287
+ rightSlot,
13288
+ children: error2 ?? fileName2
13289
+ }
13290
+ )
13291
+ ]
13292
+ }
13293
+ );
13294
+ })
13295
+ );
13042
13296
  const UploadInput = React.memo((props) => {
13043
13297
  var _a2;
13044
13298
  const [{ inputId, labelId, size, severity, helpText, showInputOnly, field, fieldProps }, rest] = useFormikInput(props);
@@ -14175,17 +14429,15 @@ var __publicField = (obj, key, value) => {
14175
14429
  Action.key
14176
14430
  )) }),
14177
14431
  /* @__PURE__ */ jsxRuntime.jsx(Box, { display: forMobile(true, "block"), children: /* @__PURE__ */ jsxRuntime.jsx(
14178
- blocks.DropdownItemMenu,
14432
+ blocks.OvermapDropdownMenu,
14179
14433
  {
14180
14434
  trigger: /* @__PURE__ */ jsxRuntime.jsx(blocks.IconButton, { variant: "ghost", "aria-label": "Actions menu", children: /* @__PURE__ */ jsxRuntime.jsx(blocks.RiIcon, { icon: "RiMore2Line" }) }),
14181
14435
  items: actions.map((Action) => {
14182
14436
  var _a2;
14183
14437
  return {
14184
- content: /* @__PURE__ */ jsxRuntime.jsxs(blocks.Flex, { gap: "2", align: "center", children: [
14185
- /* @__PURE__ */ jsxRuntime.jsx(Action.Icon, {}),
14186
- Action.text
14187
- ] }, Action.key),
14188
- onSelect: (_a2 = Action.buttonProps) == null ? void 0 : _a2.onClick
14438
+ leftSlot: /* @__PURE__ */ jsxRuntime.jsx(Action.Icon, {}),
14439
+ children: Action.text,
14440
+ onClick: (_a2 = Action.buttonProps) == null ? void 0 : _a2.onClick
14189
14441
  };
14190
14442
  })
14191
14443
  }
@@ -14243,10 +14495,8 @@ var __publicField = (obj, key, value) => {
14243
14495
  const field = FieldTypeToClsMapping[identifier];
14244
14496
  const Icon = field.Icon;
14245
14497
  return {
14246
- content: /* @__PURE__ */ jsxRuntime.jsxs(blocks.Flex, { align: "center", gap: "2", children: [
14247
- /* @__PURE__ */ jsxRuntime.jsx(Icon, {}),
14248
- /* @__PURE__ */ jsxRuntime.jsx(blocks.Text, { children: field.fieldTypeName })
14249
- ] }, identifier),
14498
+ children: field.fieldTypeName,
14499
+ leftSlot: /* @__PURE__ */ jsxRuntime.jsx(Icon, {}),
14250
14500
  value: identifier,
14251
14501
  onSelect: () => {
14252
14502
  onSelect(identifier);
@@ -14450,7 +14700,7 @@ var __publicField = (obj, key, value) => {
14450
14700
  }
14451
14701
  ),
14452
14702
  /* @__PURE__ */ jsxRuntime.jsxs(blocks.Flex, { align: "center", gap: "3", children: [
14453
- /* @__PURE__ */ jsxRuntime.jsx(blocks.Badge, { className: styles.typeBadge, children: (_f = fieldTypeItems.flat().find((item) => item.value === type)) == null ? void 0 : _f.content }),
14703
+ /* @__PURE__ */ jsxRuntime.jsx(blocks.Badge, { className: styles.typeBadge, children: (_f = fieldTypeItems.flat().find((item) => item.value === type)) == null ? void 0 : _f.children }),
14454
14704
  showPopoverInputs && /* @__PURE__ */ jsxRuntime.jsx(FieldSettingsPopover, { popoverInputs, hasError: popoverHasErrors })
14455
14705
  ] }),
14456
14706
  resolvedImage && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -14811,7 +15061,7 @@ var __publicField = (obj, key, value) => {
14811
15061
  )),
14812
15062
  droppableProvided.placeholder,
14813
15063
  /* @__PURE__ */ jsxRuntime.jsx(
14814
- blocks.DropdownItemMenu,
15064
+ blocks.OvermapDropdownMenu,
14815
15065
  {
14816
15066
  trigger: /* @__PURE__ */ jsxRuntime.jsxs(blocks.Button, { type: "button", variant: "soft", children: [
14817
15067
  /* @__PURE__ */ jsxRuntime.jsx(blocks.RiIcon, { icon: "RiAddLine" }),
@@ -15246,6 +15496,8 @@ var __publicField = (obj, key, value) => {
15246
15496
  exports2.IssuePriority = IssuePriority;
15247
15497
  exports2.IssueService = IssueService;
15248
15498
  exports2.IssueStatus = IssueStatus;
15499
+ exports2.IssueUpdateChange = IssueUpdateChange;
15500
+ exports2.IssueUpdateService = IssueUpdateService;
15249
15501
  exports2.LicenseLevel = LicenseLevel;
15250
15502
  exports2.LicenseService = LicenseService;
15251
15503
  exports2.LicenseStatus = LicenseStatus;
@@ -15309,6 +15561,10 @@ var __publicField = (obj, key, value) => {
15309
15561
  exports2.addIssue = addIssue;
15310
15562
  exports2.addIssueAttachment = addIssueAttachment;
15311
15563
  exports2.addIssueAttachments = addIssueAttachments;
15564
+ exports2.addIssueComment = addIssueComment;
15565
+ exports2.addIssueComments = addIssueComments;
15566
+ exports2.addIssueUpdate = addIssueUpdate;
15567
+ exports2.addIssueUpdates = addIssueUpdates;
15312
15568
  exports2.addLicenses = addLicenses;
15313
15569
  exports2.addOrReplaceCategories = addOrReplaceCategories;
15314
15570
  exports2.addOrReplaceIssueComment = addOrReplaceIssueComment;
@@ -15468,6 +15724,9 @@ var __publicField = (obj, key, value) => {
15468
15724
  exports2.removeIssue = removeIssue;
15469
15725
  exports2.removeIssueAttachment = removeIssueAttachment;
15470
15726
  exports2.removeIssueComment = removeIssueComment;
15727
+ exports2.removeIssueComments = removeIssueComments;
15728
+ exports2.removeIssueUpdate = removeIssueUpdate;
15729
+ exports2.removeIssueUpdates = removeIssueUpdates;
15471
15730
  exports2.removeOrganizationAccess = removeOrganizationAccess;
15472
15731
  exports2.removeProjectAccess = removeProjectAccess;
15473
15732
  exports2.removeProjectAccessesOfProject = removeProjectAccessesOfProject;
@@ -15569,6 +15828,8 @@ var __publicField = (obj, key, value) => {
15569
15828
  exports2.selectIssueAttachmentMapping = selectIssueAttachmentMapping;
15570
15829
  exports2.selectIssueAttachments = selectIssueAttachments;
15571
15830
  exports2.selectIssueMapping = selectIssueMapping;
15831
+ exports2.selectIssueUpdateMapping = selectIssueUpdateMapping;
15832
+ exports2.selectIssueUpdatesOfIssue = selectIssueUpdatesOfIssue;
15572
15833
  exports2.selectIssues = selectIssues;
15573
15834
  exports2.selectLatestFormRevision = selectLatestFormRevision;
15574
15835
  exports2.selectLatestRetryTime = selectLatestRetryTime;
@@ -15620,6 +15881,7 @@ var __publicField = (obj, key, value) => {
15620
15881
  exports2.selectSortedOrganizationUsers = selectSortedOrganizationUsers;
15621
15882
  exports2.selectSortedProjectUsers = selectSortedProjectUsers;
15622
15883
  exports2.selectSortedProjects = selectSortedProjects;
15884
+ exports2.selectStage = selectStage;
15623
15885
  exports2.selectStageFormIdsFromStageIds = selectStageFormIdsFromStageIds;
15624
15886
  exports2.selectStageMapping = selectStageMapping;
15625
15887
  exports2.selectStages = selectStages;
@@ -15635,6 +15897,7 @@ var __publicField = (obj, key, value) => {
15635
15897
  exports2.selectUser = selectUser;
15636
15898
  exports2.selectUserForm = selectUserForm;
15637
15899
  exports2.selectUserFormMapping = selectUserFormMapping;
15900
+ exports2.selectUserFormSubmission = selectUserFormSubmission;
15638
15901
  exports2.selectUsersAsMapping = selectUsersAsMapping;
15639
15902
  exports2.selectVisibleStatuses = selectVisibleStatuses;
15640
15903
  exports2.selectVisibleUserIds = selectVisibleUserIds;
@@ -15664,7 +15927,9 @@ var __publicField = (obj, key, value) => {
15664
15927
  exports2.setIsImportingProjectFile = setIsImportingProjectFile;
15665
15928
  exports2.setIsLoading = setIsLoading;
15666
15929
  exports2.setIssueAttachments = setIssueAttachments;
15930
+ exports2.setIssueComment = setIssueComment;
15667
15931
  exports2.setIssueComments = setIssueComments;
15932
+ exports2.setIssueUpdates = setIssueUpdates;
15668
15933
  exports2.setIssues = setIssues;
15669
15934
  exports2.setLicenses = setLicenses;
15670
15935
  exports2.setLoggedIn = setLoggedIn;