forge-openclaw-plugin 0.2.28 → 0.2.29

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 (34) hide show
  1. package/README.md +1 -1
  2. package/dist/assets/{board-DPFvZf-D.js → board-q8cfwaAW.js} +2 -2
  3. package/dist/assets/{board-DPFvZf-D.js.map → board-q8cfwaAW.js.map} +1 -1
  4. package/dist/assets/index-C6PCeHD_.css +1 -0
  5. package/dist/assets/index-bfHIqj0-.js +85 -0
  6. package/dist/assets/index-bfHIqj0-.js.map +1 -0
  7. package/dist/assets/{motion-Bvwc85ch.js → motion-DHfqFntt.js} +2 -2
  8. package/dist/assets/{motion-Bvwc85ch.js.map → motion-DHfqFntt.js.map} +1 -1
  9. package/dist/assets/{table-FJQTJvUR.js → table-DLweENXt.js} +2 -2
  10. package/dist/assets/{table-FJQTJvUR.js.map → table-DLweENXt.js.map} +1 -1
  11. package/dist/assets/{ui-GXFcgvSw.js → ui-BV0OYxkH.js} +2 -2
  12. package/dist/assets/{ui-GXFcgvSw.js.map → ui-BV0OYxkH.js.map} +1 -1
  13. package/dist/assets/{vendor-Cwf49UMz.js → vendor-OwcH20PM.js} +2 -2
  14. package/dist/assets/{vendor-Cwf49UMz.js.map → vendor-OwcH20PM.js.map} +1 -1
  15. package/dist/index.html +7 -7
  16. package/dist/server/server/migrations/044_macos_local_calendar_provider.sql +21 -0
  17. package/dist/server/server/src/app.js +87 -12
  18. package/dist/server/server/src/openapi.js +29 -1
  19. package/dist/server/server/src/repositories/calendar.js +144 -12
  20. package/dist/server/server/src/repositories/tasks.js +36 -17
  21. package/dist/server/server/src/services/calendar-runtime.js +613 -32
  22. package/dist/server/server/src/services/macos-calendar-helper.js +748 -0
  23. package/dist/server/server/src/types.js +46 -2
  24. package/dist/server/src/lib/api-error.js +2 -0
  25. package/dist/server/src/lib/api.js +39 -2
  26. package/dist/server/src/lib/calendar-name-deduper.js +2 -0
  27. package/openclaw.plugin.json +1 -1
  28. package/package.json +1 -1
  29. package/server/migrations/044_macos_local_calendar_provider.sql +21 -0
  30. package/skills/forge-openclaw/SKILL.md +21 -5
  31. package/skills/forge-openclaw/entity_conversation_playbooks.md +88 -5
  32. package/dist/assets/index-Auw3JrdE.css +0 -1
  33. package/dist/assets/index-D1H7myQH.js +0 -85
  34. package/dist/assets/index-D1H7myQH.js.map +0 -1
@@ -70,9 +70,9 @@ function nextSortOrder(status) {
70
70
  .get(status);
71
71
  return row.max_sort + 1;
72
72
  }
73
- function normalizeCompletedAt(status, existingCompletedAt) {
73
+ function normalizeCompletedAt(status, existingCompletedAt, overrideCompletedAt) {
74
74
  if (status === "done") {
75
- return existingCompletedAt ?? new Date().toISOString();
75
+ return overrideCompletedAt ?? existingCompletedAt ?? new Date().toISOString();
76
76
  }
77
77
  return null;
78
78
  }
@@ -203,10 +203,32 @@ function updateTaskRecord(current, input, activity) {
203
203
  const movedColumns = nextStatus !== current.status;
204
204
  const nextSort = input.sortOrder ??
205
205
  (movedColumns ? nextSortOrder(nextStatus) : current.sortOrder);
206
+ const completionRequirement = nextStatus === "done"
207
+ ? getTaskCompletionRequirement(current, current.userId ?? undefined)
208
+ : null;
209
+ const applyCompletionWorkLogAdjustment = (desiredTodaySeconds, currentTodayCreditedSeconds) => {
210
+ const deltaMinutes = Math.round((desiredTodaySeconds - currentTodayCreditedSeconds) / 60);
211
+ if (deltaMinutes === 0) {
212
+ return;
213
+ }
214
+ const appliedDeltaMinutes = deltaMinutes;
215
+ createWorkAdjustment({
216
+ entityType: "task",
217
+ entityId: current.id,
218
+ deltaMinutes: appliedDeltaMinutes,
219
+ appliedDeltaMinutes,
220
+ note: desiredTodaySeconds <= 0
221
+ ? "Completion log cleared for today"
222
+ : "Completion log adjusted for today"
223
+ }, {
224
+ actor: activity?.actor ?? null,
225
+ source: activity?.source ?? "ui"
226
+ });
227
+ };
206
228
  if (current.status !== "done" &&
207
229
  nextStatus === "done" &&
208
- input.resolutionKind !== "split") {
209
- const completionRequirement = getTaskCompletionRequirement(current, current.userId ?? undefined);
230
+ input.resolutionKind !== "split" &&
231
+ completionRequirement) {
210
232
  if (input.enforceTodayWorkLog === true &&
211
233
  completionRequirement.requiresWorkLog &&
212
234
  input.completedTodayWorkSeconds === undefined) {
@@ -215,21 +237,18 @@ function updateTaskRecord(current, input, activity) {
215
237
  todayCreditedSeconds: completionRequirement.todayCreditedSeconds
216
238
  });
217
239
  }
218
- if ((input.completedTodayWorkSeconds ?? 0) > 0) {
219
- const appliedDeltaMinutes = Math.max(1, Math.round((input.completedTodayWorkSeconds ?? 0) / 60));
220
- createWorkAdjustment({
221
- entityType: "task",
222
- entityId: current.id,
223
- deltaMinutes: appliedDeltaMinutes,
224
- appliedDeltaMinutes,
225
- note: "Completion log for today"
226
- }, {
227
- actor: activity?.actor ?? null,
228
- source: activity?.source ?? "ui"
229
- });
240
+ if (input.completedTodayWorkSeconds !== undefined) {
241
+ const desiredTodaySeconds = Math.max(0, input.completedTodayWorkSeconds);
242
+ applyCompletionWorkLogAdjustment(desiredTodaySeconds, completionRequirement.todayCreditedSeconds);
230
243
  }
231
244
  }
232
- const completedAt = normalizeCompletedAt(nextStatus, current.completedAt);
245
+ else if (nextStatus === "done" &&
246
+ input.completedTodayWorkSeconds !== undefined &&
247
+ completionRequirement) {
248
+ const desiredTodaySeconds = Math.max(0, input.completedTodayWorkSeconds);
249
+ applyCompletionWorkLogAdjustment(desiredTodaySeconds, completionRequirement.todayCreditedSeconds);
250
+ }
251
+ const completedAt = normalizeCompletedAt(nextStatus, current.completedAt, input.completedAt);
233
252
  const updatedAt = new Date().toISOString();
234
253
  getDatabase()
235
254
  .prepare(`UPDATE tasks