@zaclinley/dsh-mailharbor 0.23.0 → 0.24.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.
package/lib/index.js CHANGED
@@ -2958,6 +2958,7 @@ var ProjectStore = class {
2958
2958
  status: project.status ?? "active",
2959
2959
  notes: Array.isArray(project.notes) ? project.notes : [],
2960
2960
  milestones: Array.isArray(project.milestones) ? project.milestones : [],
2961
+ activity: Array.isArray(project.activity) ? project.activity : [],
2961
2962
  sessionIds: Array.isArray(project.sessionIds) ? project.sessionIds : project.sessionId === "" ? [] : [project.sessionId]
2962
2963
  }))
2963
2964
  };
@@ -3057,6 +3058,47 @@ var ProjectStore = class {
3057
3058
  this.flush();
3058
3059
  return project;
3059
3060
  }
3061
+ addMilestone(id, title, due) {
3062
+ const project = this.get(id);
3063
+ if (project === void 0) return void 0;
3064
+ project.milestones.push({
3065
+ id: `ms_${randomUUID2().slice(0, 8)}`,
3066
+ title,
3067
+ due,
3068
+ done: false
3069
+ });
3070
+ project.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
3071
+ this.flush();
3072
+ return project;
3073
+ }
3074
+ updateMilestone(id, milestoneId, patch) {
3075
+ const project = this.get(id);
3076
+ const milestone = project?.milestones.find((item) => item.id === milestoneId);
3077
+ if (project === void 0 || milestone === void 0) return void 0;
3078
+ if (patch.title !== void 0) milestone.title = patch.title;
3079
+ if (patch.due !== void 0) milestone.due = patch.due;
3080
+ if (patch.done !== void 0) milestone.done = patch.done;
3081
+ project.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
3082
+ this.flush();
3083
+ return project;
3084
+ }
3085
+ removeMilestone(id, milestoneId) {
3086
+ const project = this.get(id);
3087
+ if (project === void 0) return void 0;
3088
+ project.milestones = project.milestones.filter((item) => item.id !== milestoneId);
3089
+ project.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
3090
+ this.flush();
3091
+ return project;
3092
+ }
3093
+ addActivity(id, text2, at = (/* @__PURE__ */ new Date()).toISOString()) {
3094
+ const project = this.get(id);
3095
+ if (project === void 0) return void 0;
3096
+ project.activity.unshift({ id: `act_${randomUUID2().slice(0, 8)}`, at, text: text2 });
3097
+ if (project.activity.length > 100) project.activity.length = 100;
3098
+ project.updatedAt = at;
3099
+ this.flush();
3100
+ return project;
3101
+ }
3060
3102
  remove(id) {
3061
3103
  const data = this.load();
3062
3104
  const index = data.projects.findIndex((project) => project.id === id);
@@ -3124,6 +3166,7 @@ async function createProject(options) {
3124
3166
  status: "active",
3125
3167
  notes: [],
3126
3168
  milestones: [],
3169
+ activity: [],
3127
3170
  path,
3128
3171
  workspaceId,
3129
3172
  sessionId,
@@ -3185,7 +3228,7 @@ ${conversation.trim()}
3185
3228
  }
3186
3229
 
3187
3230
  // src/host/version.ts
3188
- var VERSION = "0.23.0";
3231
+ var VERSION = "0.24.0";
3189
3232
 
3190
3233
  // src/host/api.ts
3191
3234
  init_smtp();
@@ -4168,7 +4211,56 @@ function buildRouter(runtime) {
4168
4211
  }
4169
4212
  const project = runtime.projects().update(String(params.id ?? ""), patch);
4170
4213
  if (project === void 0) throw new HttpError(404, "\u9879\u76EE\u4E0D\u5B58\u5728");
4171
- return { project: projectView(project) };
4214
+ if (typeof patch.status === "string") {
4215
+ const labels = {
4216
+ active: "\u8FDB\u884C\u4E2D",
4217
+ paused: "\u6682\u505C",
4218
+ done: "\u5DF2\u5B8C\u6210",
4219
+ archived: "\u5DF2\u5F52\u6863"
4220
+ };
4221
+ runtime.projects().addActivity(project.id, `\u9879\u76EE\u72B6\u6001\u6539\u4E3A\u300C${labels[patch.status] ?? patch.status}\u300D`);
4222
+ }
4223
+ return { project: projectView(runtime.projects().get(project.id) ?? project) };
4224
+ });
4225
+ router.post("/projects/:id/milestones", async ({ params, body }) => {
4226
+ const payload = await body();
4227
+ const project = runtime.projects().get(String(params.id ?? ""));
4228
+ if (project === void 0) throw new HttpError(404, "\u9879\u76EE\u4E0D\u5B58\u5728");
4229
+ const title = String(payload.title ?? "").trim();
4230
+ if (title === "") throw new HttpError(400, "\u91CC\u7A0B\u7891\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");
4231
+ const updated = runtime.projects().addMilestone(project.id, title, typeof payload.due === "string" ? payload.due : "");
4232
+ if (updated === void 0) throw new HttpError(404, "\u9879\u76EE\u4E0D\u5B58\u5728");
4233
+ runtime.projects().addActivity(project.id, `\u65B0\u589E\u91CC\u7A0B\u7891\u300C${title}\u300D`);
4234
+ return { project: projectView(runtime.projects().get(project.id) ?? updated) };
4235
+ });
4236
+ router.patch("/projects/:id/milestones/:milestoneId", async ({ params, body }) => {
4237
+ const payload = await body();
4238
+ const project = runtime.projects().get(String(params.id ?? ""));
4239
+ if (project === void 0) throw new HttpError(404, "\u9879\u76EE\u4E0D\u5B58\u5728");
4240
+ const milestone = project.milestones.find((item) => item.id === String(params.milestoneId ?? ""));
4241
+ if (milestone === void 0) throw new HttpError(404, "\u91CC\u7A0B\u7891\u4E0D\u5B58\u5728");
4242
+ const patch = {};
4243
+ if (typeof payload.title === "string") patch.title = payload.title.trim();
4244
+ if (typeof payload.due === "string") patch.due = payload.due;
4245
+ if (typeof payload.done === "boolean") patch.done = payload.done;
4246
+ const updated = runtime.projects().updateMilestone(project.id, milestone.id, patch);
4247
+ if (updated === void 0) throw new HttpError(404, "\u91CC\u7A0B\u7891\u4E0D\u5B58\u5728");
4248
+ if (patch.done !== void 0) {
4249
+ runtime.projects().addActivity(
4250
+ project.id,
4251
+ `\u91CC\u7A0B\u7891\u300C${patch.title ?? milestone.title}\u300D${patch.done ? "\u5DF2\u5B8C\u6210" : "\u91CD\u65B0\u6253\u5F00"}`
4252
+ );
4253
+ }
4254
+ return { project: projectView(runtime.projects().get(project.id) ?? updated) };
4255
+ });
4256
+ router.delete("/projects/:id/milestones/:milestoneId", ({ params }) => {
4257
+ const project = runtime.projects().get(String(params.id ?? ""));
4258
+ if (project === void 0) throw new HttpError(404, "\u9879\u76EE\u4E0D\u5B58\u5728");
4259
+ const milestone = project.milestones.find((item) => item.id === String(params.milestoneId ?? ""));
4260
+ const updated = runtime.projects().removeMilestone(project.id, String(params.milestoneId ?? ""));
4261
+ if (updated === void 0) throw new HttpError(404, "\u91CC\u7A0B\u7891\u4E0D\u5B58\u5728");
4262
+ runtime.projects().addActivity(project.id, `\u5220\u9664\u91CC\u7A0B\u7891\u300C${milestone?.title ?? ""}\u300D`);
4263
+ return { project: projectView(runtime.projects().get(project.id) ?? updated) };
4172
4264
  });
4173
4265
  router.post("/projects/:id/notes", async ({ params, body }) => {
4174
4266
  const payload = await body();
@@ -4178,7 +4270,10 @@ function buildRouter(runtime) {
4178
4270
  if (text2 === "") throw new HttpError(400, "\u8BB0\u5F55\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A");
4179
4271
  const createdAt = typeof payload.createdAt === "string" && payload.createdAt !== "" ? payload.createdAt : (/* @__PURE__ */ new Date()).toISOString();
4180
4272
  const updated = runtime.projects().addNote(project.id, text2, createdAt);
4181
- return { project: updated === void 0 ? null : projectView(updated) };
4273
+ runtime.projects().addActivity(project.id, "\u65B0\u589E\u4E00\u6761\u9879\u76EE\u8BB0\u5F55");
4274
+ return {
4275
+ project: updated === void 0 ? null : projectView(runtime.projects().get(project.id) ?? updated)
4276
+ };
4182
4277
  });
4183
4278
  router.patch("/projects/:id/notes/:noteId", async ({ params, body }) => {
4184
4279
  const payload = await body();
@@ -4222,6 +4317,7 @@ ${note.body}`,
4222
4317
  runtime.projects().linkNoteTasks(project.id, note.id, [task.id]);
4223
4318
  created.push(taskView(task));
4224
4319
  }
4320
+ runtime.projects().addActivity(project.id, `\u5C06 ${String(created.length)} \u6761\u8BB0\u5F55\u8F6C\u4E3A\u4EFB\u52A1`);
4225
4321
  return {
4226
4322
  tasks: created,
4227
4323
  project: projectView(runtime.projects().get(project.id) ?? project)
@@ -4499,6 +4595,7 @@ function projectView(project) {
4499
4595
  status: project.status,
4500
4596
  notes: project.notes.map((note) => ({ ...note, taskIds: [...note.taskIds] })),
4501
4597
  milestones: project.milestones.map((milestone) => ({ ...milestone })),
4598
+ activity: project.activity.map((event) => ({ ...event })),
4502
4599
  path: project.path,
4503
4600
  workspaceId: project.workspaceId,
4504
4601
  sessionId: project.sessionId,