forge-openclaw-plugin 0.2.4 → 0.2.7

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 (117) hide show
  1. package/README.md +113 -5
  2. package/dist/assets/board-CzgvdLO8.js +6 -0
  3. package/dist/assets/board-CzgvdLO8.js.map +1 -0
  4. package/dist/assets/favicon-BCHm9dUV.ico +0 -0
  5. package/dist/assets/index-8d_oM8fL.js +27 -0
  6. package/dist/assets/index-8d_oM8fL.js.map +1 -0
  7. package/dist/assets/index-D4A_bq8m.css +1 -0
  8. package/dist/assets/motion-STUd1O46.js +10 -0
  9. package/dist/assets/motion-STUd1O46.js.map +1 -0
  10. package/dist/assets/plus-jakarta-sans-latin-ext-wght-normal-DmpS2jIq.woff2 +0 -0
  11. package/dist/assets/plus-jakarta-sans-latin-wght-normal-eXO_dkmS.woff2 +0 -0
  12. package/dist/assets/plus-jakarta-sans-vietnamese-wght-normal-qRpaaN48.woff2 +0 -0
  13. package/dist/assets/sora-latin-ext-wght-normal-CawQDOvP.woff2 +0 -0
  14. package/dist/assets/sora-latin-wght-normal-DdqRvwsR.woff2 +0 -0
  15. package/dist/assets/space-grotesk-latin-500-normal-CNSSEhBt.woff +0 -0
  16. package/dist/assets/space-grotesk-latin-500-normal-lFbtlQH6.woff2 +0 -0
  17. package/dist/assets/space-grotesk-latin-700-normal-CwsQ-cCU.woff +0 -0
  18. package/dist/assets/space-grotesk-latin-700-normal-RjhwGPKo.woff2 +0 -0
  19. package/dist/assets/space-grotesk-latin-ext-500-normal-3dgZTiw9.woff +0 -0
  20. package/dist/assets/space-grotesk-latin-ext-500-normal-DUe3BAxM.woff2 +0 -0
  21. package/dist/assets/space-grotesk-latin-ext-700-normal-BQnZhY3m.woff2 +0 -0
  22. package/dist/assets/space-grotesk-latin-ext-700-normal-HVCqSBdx.woff +0 -0
  23. package/dist/assets/space-grotesk-vietnamese-500-normal-BTqKIpxg.woff +0 -0
  24. package/dist/assets/space-grotesk-vietnamese-500-normal-BmEvtly_.woff2 +0 -0
  25. package/dist/assets/space-grotesk-vietnamese-700-normal-DMty7AZE.woff2 +0 -0
  26. package/dist/assets/space-grotesk-vietnamese-700-normal-Duxec5Rn.woff +0 -0
  27. package/dist/assets/table-CtNlETLc.js +23 -0
  28. package/dist/assets/table-CtNlETLc.js.map +1 -0
  29. package/dist/assets/ui-ThzkR_oW.js +46 -0
  30. package/dist/assets/ui-ThzkR_oW.js.map +1 -0
  31. package/dist/assets/vendor-CRS-psbw.css +1 -0
  32. package/dist/assets/vendor-DyHAI6nk.js +423 -0
  33. package/dist/assets/vendor-DyHAI6nk.js.map +1 -0
  34. package/dist/assets/viz-BJuBCz_G.js +34 -0
  35. package/dist/assets/viz-BJuBCz_G.js.map +1 -0
  36. package/dist/favicon.ico +0 -0
  37. package/dist/favicon.png +0 -0
  38. package/dist/index.html +29 -0
  39. package/dist/openclaw/api-client.d.ts +8 -0
  40. package/dist/openclaw/api-client.js +31 -4
  41. package/dist/openclaw/local-runtime.d.ts +3 -0
  42. package/dist/openclaw/local-runtime.js +135 -0
  43. package/dist/openclaw/parity.d.ts +4 -4
  44. package/dist/openclaw/parity.js +23 -33
  45. package/dist/openclaw/plugin-entry-shared.d.ts +4 -2
  46. package/dist/openclaw/plugin-entry-shared.js +51 -9
  47. package/dist/openclaw/routes.d.ts +12 -3
  48. package/dist/openclaw/routes.js +156 -924
  49. package/dist/openclaw/tools.js +242 -1100
  50. package/dist/server/app.js +2450 -0
  51. package/dist/server/db.js +313 -0
  52. package/dist/server/e2e-server.js +20 -0
  53. package/dist/server/errors.js +15 -0
  54. package/dist/server/index.js +16 -0
  55. package/dist/server/managers/base.js +17 -0
  56. package/dist/server/managers/contracts.js +47 -0
  57. package/dist/server/managers/platform/api-gateway-manager.js +11 -0
  58. package/dist/server/managers/platform/audit-manager.js +15 -0
  59. package/dist/server/managers/platform/authentication-manager.js +56 -0
  60. package/dist/server/managers/platform/authorization-manager.js +56 -0
  61. package/dist/server/managers/platform/background-job-manager.js +10 -0
  62. package/dist/server/managers/platform/configuration-manager.js +33 -0
  63. package/dist/server/managers/platform/database-manager.js +14 -0
  64. package/dist/server/managers/platform/event-bus-manager.js +7 -0
  65. package/dist/server/managers/platform/external-service-manager.js +11 -0
  66. package/dist/server/managers/platform/health-manager.js +7 -0
  67. package/dist/server/managers/platform/migration-manager.js +8 -0
  68. package/dist/server/managers/platform/search-index-manager.js +4 -0
  69. package/dist/server/managers/platform/secrets-manager.js +19 -0
  70. package/dist/server/managers/platform/session-manager.js +121 -0
  71. package/dist/server/managers/platform/storage-manager.js +16 -0
  72. package/dist/server/managers/platform/token-manager.js +37 -0
  73. package/dist/server/managers/platform/transaction-manager.js +8 -0
  74. package/dist/server/managers/platform/trusted-network.js +39 -0
  75. package/dist/server/managers/runtime.js +56 -0
  76. package/dist/server/managers/type-guards.js +4 -0
  77. package/dist/server/openapi.js +3512 -0
  78. package/dist/server/psyche-types.js +395 -0
  79. package/dist/server/repositories/activity-events.js +157 -0
  80. package/dist/server/repositories/collaboration.js +497 -0
  81. package/dist/server/repositories/comments.js +176 -0
  82. package/dist/server/repositories/deleted-entities.js +192 -0
  83. package/dist/server/repositories/domains.js +30 -0
  84. package/dist/server/repositories/event-log.js +64 -0
  85. package/dist/server/repositories/goals.js +159 -0
  86. package/dist/server/repositories/projects.js +214 -0
  87. package/dist/server/repositories/psyche.js +1356 -0
  88. package/dist/server/repositories/rewards.js +675 -0
  89. package/dist/server/repositories/settings.js +399 -0
  90. package/dist/server/repositories/tags.js +160 -0
  91. package/dist/server/repositories/task-runs.js +488 -0
  92. package/dist/server/repositories/tasks.js +413 -0
  93. package/dist/server/services/context.js +214 -0
  94. package/dist/server/services/dashboard.js +170 -0
  95. package/dist/server/services/entity-crud.js +576 -0
  96. package/dist/server/services/gamification.js +215 -0
  97. package/dist/server/services/insights.js +91 -0
  98. package/dist/server/services/projects.js +75 -0
  99. package/dist/server/services/psyche.js +63 -0
  100. package/dist/server/services/relations.js +28 -0
  101. package/dist/server/services/reviews.js +88 -0
  102. package/dist/server/services/run-recovery.js +13 -0
  103. package/dist/server/services/tagging.js +49 -0
  104. package/dist/server/services/task-run-watchdog.js +92 -0
  105. package/dist/server/services/work-time.js +176 -0
  106. package/dist/server/types.js +999 -0
  107. package/dist/server/web.js +91 -0
  108. package/openclaw.plugin.json +21 -9
  109. package/package.json +17 -4
  110. package/server/migrations/001_core.sql +333 -0
  111. package/server/migrations/002_psyche.sql +241 -0
  112. package/server/migrations/003_timer_execution.sql +18 -0
  113. package/server/migrations/004_psyche_linked_entities.sql +5 -0
  114. package/server/migrations/005_adaptive_schemas.sql +157 -0
  115. package/server/migrations/006_psyche_auth_setting.sql +4 -0
  116. package/server/migrations/007_deleted_entities.sql +16 -0
  117. package/skills/forge-openclaw/SKILL.md +189 -275
@@ -0,0 +1,170 @@
1
+ import { listGoals } from "../repositories/goals.js";
2
+ import { listActivityEvents } from "../repositories/activity-events.js";
3
+ import { listTagsByIds, listTags } from "../repositories/tags.js";
4
+ import { listTasks } from "../repositories/tasks.js";
5
+ import { buildAchievementSignals, buildGamificationProfile, buildMilestoneRewards } from "./gamification.js";
6
+ import { listProjectSummaries } from "./projects.js";
7
+ import { dashboardExecutionBucketSchema, dashboardPayloadSchema, dashboardStatsSchema } from "../types.js";
8
+ function startOfWeek(date) {
9
+ const clone = new Date(date);
10
+ const day = clone.getDay();
11
+ const delta = day === 0 ? -6 : 1 - day;
12
+ clone.setDate(clone.getDate() + delta);
13
+ clone.setHours(0, 0, 0, 0);
14
+ return clone;
15
+ }
16
+ function dateOnlyIso(date) {
17
+ return date.toISOString().slice(0, 10);
18
+ }
19
+ function addDays(date, days) {
20
+ const clone = new Date(date);
21
+ clone.setDate(clone.getDate() + days);
22
+ return clone;
23
+ }
24
+ function priorityWeight(task) {
25
+ switch (task.priority) {
26
+ case "critical":
27
+ return 4;
28
+ case "high":
29
+ return 3;
30
+ case "medium":
31
+ return 2;
32
+ default:
33
+ return 1;
34
+ }
35
+ }
36
+ function dueDateWeight(task) {
37
+ return task.dueDate ? Date.parse(`${task.dueDate}T00:00:00.000Z`) : Number.POSITIVE_INFINITY;
38
+ }
39
+ function takeExecutionSlice(tasks, limit = 4) {
40
+ return tasks.slice(0, limit);
41
+ }
42
+ function buildExecutionBuckets(tasks, todayIso, weekEndIso) {
43
+ const activeTasks = tasks.filter((task) => task.status !== "done");
44
+ const overdue = activeTasks.filter((task) => task.dueDate !== null && task.dueDate < todayIso).sort((left, right) => {
45
+ const dueDelta = dueDateWeight(left) - dueDateWeight(right);
46
+ if (dueDelta !== 0) {
47
+ return dueDelta;
48
+ }
49
+ return priorityWeight(right) - priorityWeight(left);
50
+ });
51
+ const dueSoon = activeTasks
52
+ .filter((task) => task.dueDate !== null && task.dueDate >= todayIso && task.dueDate <= weekEndIso)
53
+ .sort((left, right) => {
54
+ const dueDelta = dueDateWeight(left) - dueDateWeight(right);
55
+ if (dueDelta !== 0) {
56
+ return dueDelta;
57
+ }
58
+ return priorityWeight(right) - priorityWeight(left);
59
+ });
60
+ const focusNow = activeTasks
61
+ .filter((task) => task.status === "focus" || task.status === "in_progress")
62
+ .sort((left, right) => {
63
+ const priorityDelta = priorityWeight(right) - priorityWeight(left);
64
+ if (priorityDelta !== 0) {
65
+ return priorityDelta;
66
+ }
67
+ return dueDateWeight(left) - dueDateWeight(right);
68
+ });
69
+ const recentlyCompleted = tasks
70
+ .filter((task) => task.status === "done" && task.completedAt !== null)
71
+ .sort((left, right) => Date.parse(right.completedAt ?? "") - Date.parse(left.completedAt ?? ""))
72
+ .slice(0, 4);
73
+ return [
74
+ {
75
+ id: "overdue",
76
+ label: "Overdue pressure",
77
+ summary: overdue.length > 0 ? "Clear the oldest slips before they poison momentum." : "Nothing overdue right now.",
78
+ tone: "urgent",
79
+ tasks: takeExecutionSlice(overdue)
80
+ },
81
+ {
82
+ id: "due_soon",
83
+ label: "Due this week",
84
+ summary: dueSoon.length > 0 ? "Short-horizon commitments that need protection now." : "The next seven days look open.",
85
+ tone: "accent",
86
+ tasks: takeExecutionSlice(dueSoon)
87
+ },
88
+ {
89
+ id: "focus_now",
90
+ label: "Focus now",
91
+ summary: focusNow.length > 0 ? "Highest-signal work already in motion." : "No focus lane selected yet.",
92
+ tone: "neutral",
93
+ tasks: takeExecutionSlice(focusNow)
94
+ },
95
+ {
96
+ id: "recently_completed",
97
+ label: "Recent wins",
98
+ summary: recentlyCompleted.length > 0 ? "Completed work that is still feeding momentum." : "No completed work yet.",
99
+ tone: "success",
100
+ tasks: recentlyCompleted
101
+ }
102
+ ].map((bucket) => dashboardExecutionBucketSchema.parse(bucket));
103
+ }
104
+ function buildGoalSummary(tasks, goalId) {
105
+ const relatedTasks = tasks.filter((task) => task.goalId === goalId);
106
+ const totalTasks = relatedTasks.length;
107
+ const completedTasks = relatedTasks.filter((task) => task.status === "done").length;
108
+ const earnedPoints = relatedTasks
109
+ .filter((task) => task.status === "done")
110
+ .reduce((sum, task) => sum + task.points, 0);
111
+ const progress = totalTasks === 0 ? 0 : Math.min(100, Math.round((completedTasks / totalTasks) * 100));
112
+ const momentumLabel = completedTasks === 0 ? "Needs ignition" : completedTasks >= Math.ceil(totalTasks / 2) ? "Strong momentum" : "Building pace";
113
+ return { progress, totalTasks, completedTasks, earnedPoints, momentumLabel };
114
+ }
115
+ export function getDashboard() {
116
+ const goals = listGoals();
117
+ const tasks = listTasks();
118
+ const tags = listTags();
119
+ const now = new Date();
120
+ const weekStart = startOfWeek(now).toISOString();
121
+ const todayIso = dateOnlyIso(now);
122
+ const weekEndIso = dateOnlyIso(addDays(now, 7));
123
+ const completedThisWeek = tasks.filter((task) => task.completedAt !== null && task.completedAt >= weekStart).length;
124
+ const totalPoints = tasks
125
+ .filter((task) => task.status === "done")
126
+ .reduce((sum, task) => sum + task.points, 0);
127
+ const focusTasks = tasks.filter((task) => task.status === "focus" || task.status === "in_progress").length;
128
+ const alignedCompletedTasks = tasks.filter((task) => task.status === "done" && task.goalId !== null && task.tagIds.length > 0).length;
129
+ const overdueTasks = tasks.filter((task) => task.status !== "done" && task.dueDate !== null && task.dueDate < todayIso).length;
130
+ const dueThisWeek = tasks.filter((task) => task.status !== "done" && task.dueDate !== null && task.dueDate >= todayIso && task.dueDate <= weekEndIso).length;
131
+ const stats = dashboardStatsSchema.parse({
132
+ totalPoints,
133
+ completedThisWeek,
134
+ activeGoals: goals.filter((goal) => goal.status === "active").length,
135
+ alignmentScore: Math.min(100, alignedCompletedTasks * 14 + focusTasks * 6),
136
+ focusTasks,
137
+ overdueTasks,
138
+ dueThisWeek
139
+ });
140
+ const goalCards = goals.map((goal) => {
141
+ const summary = buildGoalSummary(tasks, goal.id);
142
+ return {
143
+ ...goal,
144
+ ...summary,
145
+ tags: listTagsByIds(goal.tagIds)
146
+ };
147
+ });
148
+ const projects = listProjectSummaries();
149
+ const suggestedTags = tags.filter((tag) => ["value", "execution"].includes(tag.kind)).slice(0, 6);
150
+ const owners = [...new Set(tasks.map((task) => task.owner).filter(Boolean))].sort((left, right) => left.localeCompare(right));
151
+ const executionBuckets = buildExecutionBuckets(tasks, todayIso, weekEndIso);
152
+ const gamification = buildGamificationProfile(goals, tasks, now);
153
+ const achievements = buildAchievementSignals(goals, tasks, now);
154
+ const milestoneRewards = buildMilestoneRewards(goals, tasks, now);
155
+ const recentActivity = listActivityEvents({ limit: 12 });
156
+ return dashboardPayloadSchema.parse({
157
+ stats,
158
+ goals: goalCards,
159
+ projects,
160
+ tasks,
161
+ tags,
162
+ suggestedTags,
163
+ owners,
164
+ executionBuckets,
165
+ gamification,
166
+ achievements,
167
+ milestoneRewards,
168
+ recentActivity
169
+ });
170
+ }