forge-openclaw-plugin 0.2.25 → 0.2.27

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 (237) hide show
  1. package/README.md +59 -3
  2. package/dist/assets/{board-VmF4FAfr.js → board-C6jCchjI.js} +3 -3
  3. package/dist/assets/{board-VmF4FAfr.js.map → board-C6jCchjI.js.map} +1 -1
  4. package/dist/assets/index-DVvS8iiU.css +1 -0
  5. package/dist/assets/index-zYB-9Dfo.js +85 -0
  6. package/dist/assets/index-zYB-9Dfo.js.map +1 -0
  7. package/dist/assets/knowledge-graph-layout.worker-DRvzPxhP.js +2 -0
  8. package/dist/assets/knowledge-graph-layout.worker-DRvzPxhP.js.map +1 -0
  9. package/dist/assets/{motion-DvkU14p-.js → motion-DFHrH2rd.js} +2 -2
  10. package/dist/assets/{motion-DvkU14p-.js.map → motion-DFHrH2rd.js.map} +1 -1
  11. package/dist/assets/{table-DgiPof9E.js → table-ZL7Di_u3.js} +2 -2
  12. package/dist/assets/{table-DgiPof9E.js.map → table-ZL7Di_u3.js.map} +1 -1
  13. package/dist/assets/{ui-nYfoC0Gq.js → ui-CKNPpz7q.js} +2 -2
  14. package/dist/assets/{ui-nYfoC0Gq.js.map → ui-CKNPpz7q.js.map} +1 -1
  15. package/dist/assets/vendor-DoNZuFhn.js +1247 -0
  16. package/dist/assets/vendor-DoNZuFhn.js.map +1 -0
  17. package/dist/index.html +7 -8
  18. package/dist/openclaw/local-runtime.d.ts +3 -1
  19. package/dist/openclaw/local-runtime.js +67 -15
  20. package/dist/openclaw/plugin-entry-shared.js +24 -2
  21. package/dist/openclaw/plugin-sdk-types.d.ts +17 -0
  22. package/dist/openclaw/routes.d.ts +27 -0
  23. package/dist/openclaw/routes.js +16 -12
  24. package/dist/openclaw/tools.js +0 -3
  25. package/dist/server/server/migrations/001_core.sql +411 -0
  26. package/dist/server/server/migrations/002_psyche.sql +392 -0
  27. package/dist/server/server/migrations/003_habits.sql +30 -0
  28. package/dist/server/server/migrations/004_habit_links.sql +8 -0
  29. package/dist/server/server/migrations/005_habit_psyche_links.sql +24 -0
  30. package/dist/server/server/migrations/006_work_adjustments.sql +14 -0
  31. package/dist/server/server/migrations/007_weekly_review_closures.sql +17 -0
  32. package/dist/server/server/migrations/008_calendar_execution.sql +147 -0
  33. package/dist/server/server/migrations/009_true_calendar_events.sql +195 -0
  34. package/dist/server/server/migrations/010_calendar_selection_state.sql +6 -0
  35. package/dist/server/server/migrations/011_calendar_timezone_backfill.sql +11 -0
  36. package/dist/server/server/migrations/012_work_block_ranges.sql +7 -0
  37. package/dist/server/server/migrations/013_microsoft_local_auth_settings.sql +8 -0
  38. package/dist/server/server/migrations/014_note_tags_and_ephemeral.sql +8 -0
  39. package/dist/server/server/migrations/015_multi_user_and_strategies.sql +244 -0
  40. package/dist/server/server/migrations/016_health_companion.sql +158 -0
  41. package/dist/server/server/migrations/016_strategy_contracts_and_user_graph.sql +22 -0
  42. package/dist/server/server/migrations/017_preferences.sql +131 -0
  43. package/dist/server/server/migrations/018_preference_catalogs.sql +31 -0
  44. package/dist/server/server/migrations/019_wiki_memory.sql +255 -0
  45. package/dist/server/server/migrations/020_wiki_page_hierarchy.sql +11 -0
  46. package/dist/server/server/migrations/021_hide_evidence_from_wiki_index.sql +3 -0
  47. package/dist/server/server/migrations/022_wiki_ingest_background.sql +85 -0
  48. package/dist/server/server/migrations/023_diagnostic_logs.sql +28 -0
  49. package/dist/server/server/migrations/024_questionnaires.sql +96 -0
  50. package/dist/server/server/migrations/025_ai_model_connections.sql +26 -0
  51. package/dist/server/server/migrations/026_custom_theme_settings.sql +2 -0
  52. package/dist/server/server/migrations/027_ai_processors.sql +31 -0
  53. package/dist/server/server/migrations/028_movement_domain.sql +136 -0
  54. package/dist/server/server/migrations/029_watch_micro_capture.sql +23 -0
  55. package/dist/server/server/migrations/030_surface_layouts.sql +5 -0
  56. package/dist/server/server/migrations/031_ai_processor_runtime_upgrades.sql +10 -0
  57. package/dist/server/server/migrations/032_ai_connectors.sql +44 -0
  58. package/dist/server/server/migrations/033_movement_trip_point_sync.sql +36 -0
  59. package/dist/server/server/migrations/034_movement_segment_sync.sql +49 -0
  60. package/dist/server/server/migrations/035_google_local_auth_settings.sql +2 -0
  61. package/dist/server/server/migrations/036_google_local_auth_client_secret.sql +2 -0
  62. package/dist/server/server/migrations/037_workbench_public_inputs_and_run_inputs.sql +5 -0
  63. package/dist/server/server/migrations/038_data_management_settings.sql +11 -0
  64. package/dist/server/server/migrations/039_life_force_and_action_points.sql +114 -0
  65. package/dist/server/server/migrations/040_screen_time_domain.sql +89 -0
  66. package/dist/server/server/migrations/041_companion_source_states.sql +21 -0
  67. package/dist/server/server/migrations/042_movement_boxes.sql +47 -0
  68. package/dist/server/server/migrations/043_movement_box_overlap_overrides.sql +26 -0
  69. package/dist/server/{app.js → server/src/app.js} +2112 -414
  70. package/dist/server/server/src/connectors/box-registry.js +223 -0
  71. package/dist/server/server/src/data-management-types.js +107 -0
  72. package/dist/server/{db.js → server/src/db.js} +72 -4
  73. package/dist/server/server/src/debug.js +19 -0
  74. package/dist/server/{demo-data.js → server/src/demo-data.js} +2 -2
  75. package/dist/server/{health.js → server/src/health.js} +702 -18
  76. package/dist/server/{managers → server/src/managers}/platform/llm-manager.js +7 -4
  77. package/dist/server/server/src/managers/platform/mock-workbench-provider.js +149 -0
  78. package/dist/server/{managers → server/src/managers}/platform/secrets-manager.js +18 -1
  79. package/dist/server/{managers → server/src/managers}/runtime.js +9 -0
  80. package/dist/server/{movement.js → server/src/movement.js} +1971 -112
  81. package/dist/server/{openapi.js → server/src/openapi.js} +491 -3
  82. package/dist/server/{psyche-types.js → server/src/psyche-types.js} +9 -1
  83. package/dist/server/{repositories → server/src/repositories}/activity-events.js +8 -0
  84. package/dist/server/{repositories → server/src/repositories}/ai-connectors.js +758 -47
  85. package/dist/server/{repositories → server/src/repositories}/calendar.js +1 -1
  86. package/dist/server/{repositories → server/src/repositories}/habits.js +37 -1
  87. package/dist/server/{repositories → server/src/repositories}/model-settings.js +13 -3
  88. package/dist/server/{repositories → server/src/repositories}/notes.js +3 -0
  89. package/dist/server/{repositories → server/src/repositories}/settings.js +431 -21
  90. package/dist/server/{repositories → server/src/repositories}/tasks.js +170 -10
  91. package/dist/server/server/src/runtime-data-root.js +82 -0
  92. package/dist/server/server/src/screen-time.js +802 -0
  93. package/dist/server/{services → server/src/services}/calendar-runtime.js +775 -58
  94. package/dist/server/server/src/services/data-management.js +788 -0
  95. package/dist/server/{services → server/src/services}/entity-crud.js +205 -2
  96. package/dist/server/server/src/services/google-calendar-oauth-config.js +176 -0
  97. package/dist/server/server/src/services/knowledge-graph.js +1455 -0
  98. package/dist/server/server/src/services/life-force-model.js +197 -0
  99. package/dist/server/server/src/services/life-force.js +1270 -0
  100. package/dist/server/server/src/services/psyche-observation-calendar.js +413 -0
  101. package/dist/server/{types.js → server/src/types.js} +420 -29
  102. package/dist/server/server/src/web.js +332 -0
  103. package/dist/server/src/components/customization/utility-widgets.js +439 -0
  104. package/dist/server/src/components/ui/info-tooltip.js +25 -0
  105. package/dist/server/src/components/workbench-boxes/calendar/calendar-boxes.js +78 -0
  106. package/dist/server/src/components/workbench-boxes/goals/goals-boxes.js +62 -0
  107. package/dist/server/src/components/workbench-boxes/habits/habits-boxes.js +62 -0
  108. package/dist/server/src/components/workbench-boxes/health/health-boxes.js +147 -0
  109. package/dist/server/src/components/workbench-boxes/insights/insights-boxes.js +50 -0
  110. package/dist/server/src/components/workbench-boxes/kanban/kanban-boxes.js +136 -0
  111. package/dist/server/src/components/workbench-boxes/movement/movement-boxes.js +47 -0
  112. package/dist/server/src/components/workbench-boxes/notes/notes-boxes.js +132 -0
  113. package/dist/server/src/components/workbench-boxes/overview/overview-boxes.js +65 -0
  114. package/dist/server/src/components/workbench-boxes/preferences/preferences-boxes.js +78 -0
  115. package/dist/server/src/components/workbench-boxes/projects/projects-boxes.js +62 -0
  116. package/dist/server/src/components/workbench-boxes/psyche/psyche-boxes.js +88 -0
  117. package/dist/server/src/components/workbench-boxes/questionnaires/questionnaires-boxes.js +61 -0
  118. package/dist/server/src/components/workbench-boxes/review/review-boxes.js +53 -0
  119. package/dist/server/src/components/workbench-boxes/shared/define-workbench-box.js +6 -0
  120. package/dist/server/src/components/workbench-boxes/shared/generic-node-view.js +49 -0
  121. package/dist/server/src/components/workbench-boxes/strategies/strategies-boxes.js +62 -0
  122. package/dist/server/src/components/workbench-boxes/tasks/tasks-boxes.js +76 -0
  123. package/dist/server/src/components/workbench-boxes/today/today-boxes.js +78 -0
  124. package/dist/server/src/components/workbench-boxes/wiki/wiki-boxes.js +60 -0
  125. package/dist/server/src/lib/api-error.js +37 -0
  126. package/dist/server/src/lib/api.js +2118 -0
  127. package/dist/server/src/lib/calendar-name-deduper.js +144 -0
  128. package/dist/server/src/lib/data-management-types.js +1 -0
  129. package/dist/server/src/lib/diagnostics.js +67 -0
  130. package/dist/server/src/lib/entity-visuals.js +279 -0
  131. package/dist/server/src/lib/knowledge-graph-types.js +276 -0
  132. package/dist/server/src/lib/knowledge-graph.js +470 -0
  133. package/dist/server/src/lib/psyche-types.js +1 -0
  134. package/dist/server/src/lib/questionnaire-types.js +1 -0
  135. package/dist/server/src/lib/runtime-paths.js +24 -0
  136. package/dist/server/src/lib/schemas.js +238 -0
  137. package/dist/server/src/lib/snapshot-normalizer.js +416 -0
  138. package/dist/server/src/lib/theme-system.js +319 -0
  139. package/dist/server/src/lib/types.js +1 -0
  140. package/dist/server/src/lib/utils.js +22 -0
  141. package/dist/server/src/lib/workbench/boxes.js +16 -0
  142. package/dist/server/src/lib/workbench/contracts.js +229 -0
  143. package/dist/server/src/lib/workbench/nodes.js +215 -0
  144. package/dist/server/src/lib/workbench/registry.js +120 -0
  145. package/dist/server/src/lib/workbench/runtime.js +397 -0
  146. package/dist/server/src/lib/workbench/tool-catalog.js +68 -0
  147. package/openclaw.plugin.json +1 -1
  148. package/package.json +1 -1
  149. package/server/index.js +68 -0
  150. package/server/migrations/035_google_local_auth_settings.sql +2 -0
  151. package/server/migrations/036_google_local_auth_client_secret.sql +2 -0
  152. package/server/migrations/037_workbench_public_inputs_and_run_inputs.sql +5 -0
  153. package/server/migrations/038_data_management_settings.sql +11 -0
  154. package/server/migrations/039_life_force_and_action_points.sql +114 -0
  155. package/server/migrations/040_screen_time_domain.sql +89 -0
  156. package/server/migrations/041_companion_source_states.sql +21 -0
  157. package/server/migrations/042_movement_boxes.sql +47 -0
  158. package/server/migrations/043_movement_box_overlap_overrides.sql +26 -0
  159. package/skills/forge-openclaw/SKILL.md +27 -11
  160. package/skills/forge-openclaw/entity_conversation_playbooks.md +411 -46
  161. package/skills/forge-openclaw/psyche_entity_playbooks.md +195 -20
  162. package/dist/assets/index-CFCKDIMH.js +0 -67
  163. package/dist/assets/index-CFCKDIMH.js.map +0 -1
  164. package/dist/assets/index-ZPY6U1TU.css +0 -1
  165. package/dist/assets/vendor-D9PTEPSB.js +0 -824
  166. package/dist/assets/vendor-D9PTEPSB.js.map +0 -1
  167. package/dist/assets/viz-Cqb6s--o.js +0 -34
  168. package/dist/assets/viz-Cqb6s--o.js.map +0 -1
  169. package/dist/server/connectors/box-registry.js +0 -257
  170. package/dist/server/services/psyche-observation-calendar.js +0 -46
  171. package/dist/server/web.js +0 -98
  172. /package/dist/server/{discovery-advertiser.js → server/src/discovery-advertiser.js} +0 -0
  173. /package/dist/server/{e2e-server.js → server/src/e2e-server.js} +0 -0
  174. /package/dist/server/{errors.js → server/src/errors.js} +0 -0
  175. /package/dist/server/{index.js → server/src/index.js} +0 -0
  176. /package/dist/server/{managers → server/src/managers}/base.js +0 -0
  177. /package/dist/server/{managers → server/src/managers}/contracts.js +0 -0
  178. /package/dist/server/{managers → server/src/managers}/platform/api-gateway-manager.js +0 -0
  179. /package/dist/server/{managers → server/src/managers}/platform/audit-manager.js +0 -0
  180. /package/dist/server/{managers → server/src/managers}/platform/authentication-manager.js +0 -0
  181. /package/dist/server/{managers → server/src/managers}/platform/authorization-manager.js +0 -0
  182. /package/dist/server/{managers → server/src/managers}/platform/background-job-manager.js +0 -0
  183. /package/dist/server/{managers → server/src/managers}/platform/configuration-manager.js +0 -0
  184. /package/dist/server/{managers → server/src/managers}/platform/database-manager.js +0 -0
  185. /package/dist/server/{managers → server/src/managers}/platform/event-bus-manager.js +0 -0
  186. /package/dist/server/{managers → server/src/managers}/platform/external-service-manager.js +0 -0
  187. /package/dist/server/{managers → server/src/managers}/platform/health-manager.js +0 -0
  188. /package/dist/server/{managers → server/src/managers}/platform/migration-manager.js +0 -0
  189. /package/dist/server/{managers → server/src/managers}/platform/openai-responses-provider.js +0 -0
  190. /package/dist/server/{managers → server/src/managers}/platform/search-index-manager.js +0 -0
  191. /package/dist/server/{managers → server/src/managers}/platform/session-manager.js +0 -0
  192. /package/dist/server/{managers → server/src/managers}/platform/storage-manager.js +0 -0
  193. /package/dist/server/{managers → server/src/managers}/platform/token-manager.js +0 -0
  194. /package/dist/server/{managers → server/src/managers}/platform/transaction-manager.js +0 -0
  195. /package/dist/server/{managers → server/src/managers}/platform/trusted-network.js +0 -0
  196. /package/dist/server/{managers → server/src/managers}/type-guards.js +0 -0
  197. /package/dist/server/{preferences-seeds.js → server/src/preferences-seeds.js} +0 -0
  198. /package/dist/server/{preferences-types.js → server/src/preferences-types.js} +0 -0
  199. /package/dist/server/{questionnaire-flow.js → server/src/questionnaire-flow.js} +0 -0
  200. /package/dist/server/{questionnaire-seeds.js → server/src/questionnaire-seeds.js} +0 -0
  201. /package/dist/server/{questionnaire-types.js → server/src/questionnaire-types.js} +0 -0
  202. /package/dist/server/{repositories → server/src/repositories}/ai-processors.js +0 -0
  203. /package/dist/server/{repositories → server/src/repositories}/collaboration.js +0 -0
  204. /package/dist/server/{repositories → server/src/repositories}/deleted-entities.js +0 -0
  205. /package/dist/server/{repositories → server/src/repositories}/diagnostic-logs.js +0 -0
  206. /package/dist/server/{repositories → server/src/repositories}/domains.js +0 -0
  207. /package/dist/server/{repositories → server/src/repositories}/entity-ownership.js +0 -0
  208. /package/dist/server/{repositories → server/src/repositories}/event-log.js +0 -0
  209. /package/dist/server/{repositories → server/src/repositories}/goals.js +0 -0
  210. /package/dist/server/{repositories → server/src/repositories}/preferences.js +0 -0
  211. /package/dist/server/{repositories → server/src/repositories}/projects.js +0 -0
  212. /package/dist/server/{repositories → server/src/repositories}/psyche.js +0 -0
  213. /package/dist/server/{repositories → server/src/repositories}/questionnaires.js +0 -0
  214. /package/dist/server/{repositories → server/src/repositories}/rewards.js +0 -0
  215. /package/dist/server/{repositories → server/src/repositories}/strategies.js +0 -0
  216. /package/dist/server/{repositories → server/src/repositories}/surface-layouts.js +0 -0
  217. /package/dist/server/{repositories → server/src/repositories}/tags.js +0 -0
  218. /package/dist/server/{repositories → server/src/repositories}/task-runs.js +0 -0
  219. /package/dist/server/{repositories → server/src/repositories}/users.js +0 -0
  220. /package/dist/server/{repositories → server/src/repositories}/weekly-reviews.js +0 -0
  221. /package/dist/server/{repositories → server/src/repositories}/wiki-memory.js +0 -0
  222. /package/dist/server/{repositories → server/src/repositories}/work-adjustments.js +0 -0
  223. /package/dist/server/{seed-demo.js → server/src/seed-demo.js} +0 -0
  224. /package/dist/server/{services → server/src/services}/context.js +0 -0
  225. /package/dist/server/{services → server/src/services}/dashboard.js +0 -0
  226. /package/dist/server/{services → server/src/services}/gamification.js +0 -0
  227. /package/dist/server/{services → server/src/services}/insights.js +0 -0
  228. /package/dist/server/{services → server/src/services}/openai-codex-oauth.js +0 -0
  229. /package/dist/server/{services → server/src/services}/projects.js +0 -0
  230. /package/dist/server/{services → server/src/services}/psyche.js +0 -0
  231. /package/dist/server/{services → server/src/services}/relations.js +0 -0
  232. /package/dist/server/{services → server/src/services}/reviews.js +0 -0
  233. /package/dist/server/{services → server/src/services}/run-recovery.js +0 -0
  234. /package/dist/server/{services → server/src/services}/tagging.js +0 -0
  235. /package/dist/server/{services → server/src/services}/task-run-watchdog.js +0 -0
  236. /package/dist/server/{services → server/src/services}/work-time.js +0 -0
  237. /package/dist/server/{watch-mobile.js → server/src/watch-mobile.js} +0 -0
@@ -4,6 +4,9 @@ import { readEncryptedSecret, storeEncryptedSecret } from "../../repositories/ca
4
4
  function emitDiagnostic(logger, input) {
5
5
  logger?.(input);
6
6
  }
7
+ function providerAllowsCredentiallessPrompt(provider) {
8
+ return provider === "mock";
9
+ }
7
10
  export class LlmManager extends AbstractManager {
8
11
  secretsManager;
9
12
  name = "LlmManager";
@@ -74,7 +77,7 @@ export class LlmManager extends AbstractManager {
74
77
  throw new Error("Unsupported LLM provider.");
75
78
  }
76
79
  const apiKey = explicitApiKey?.trim() || (await this.readApiKey(profile.secretId));
77
- if (!apiKey) {
80
+ if (!apiKey && !providerAllowsCredentiallessPrompt(profile.provider)) {
78
81
  emitDiagnostic(logger, {
79
82
  level: "error",
80
83
  message: "Wiki LLM connection test is missing an API key.",
@@ -90,7 +93,7 @@ export class LlmManager extends AbstractManager {
90
93
  throw new Error("Save an OpenAI API key first.");
91
94
  }
92
95
  const result = await provider.testConnection({
93
- apiKey,
96
+ apiKey: apiKey ?? "mock",
94
97
  profile,
95
98
  logger
96
99
  });
@@ -114,11 +117,11 @@ export class LlmManager extends AbstractManager {
114
117
  throw new Error("This LLM provider does not support text prompt execution.");
115
118
  }
116
119
  const apiKey = input.explicitApiKey?.trim() || (await this.readApiKey(profile.secretId));
117
- if (!apiKey) {
120
+ if (!apiKey && !providerAllowsCredentiallessPrompt(profile.provider)) {
118
121
  throw new Error("Missing provider credential for prompt execution.");
119
122
  }
120
123
  return await provider.runText({
121
- apiKey,
124
+ apiKey: apiKey ?? "mock",
122
125
  profile,
123
126
  systemPrompt: input.systemPrompt,
124
127
  prompt: input.prompt,
@@ -0,0 +1,149 @@
1
+ function emit(logger, level, message, details) {
2
+ logger?.({ level, message, details });
3
+ }
4
+ function extractSection(prompt, label) {
5
+ const match = prompt.match(new RegExp(`${label}:\\n([\\s\\S]*?)(?:\\n\\n[A-Z][^\\n]*:|$)`));
6
+ return match?.[1]?.trim() ?? "";
7
+ }
8
+ function hasToolTranscript(prompt) {
9
+ return prompt.includes("Tool transcript:");
10
+ }
11
+ function hasConversationHistory(prompt) {
12
+ return prompt.includes("Conversation history:");
13
+ }
14
+ function resolveFixture(model) {
15
+ const normalized = model.trim().toLowerCase();
16
+ if (!normalized || normalized === "mock") {
17
+ return "mock-echo";
18
+ }
19
+ return normalized;
20
+ }
21
+ function buildEchoJson(prompt) {
22
+ const userInput = extractSection(prompt, "User input");
23
+ const linkedInputs = extractSection(prompt, "Linked inputs");
24
+ const answer = linkedInputs
25
+ ? `Mock consumed linked inputs${userInput ? ` and user input "${userInput}".` : "."}`
26
+ : userInput || "Mock workflow completed.";
27
+ return JSON.stringify({
28
+ answer,
29
+ summary: linkedInputs
30
+ ? `Mock consumed linked inputs and user input "${userInput || "none"}".`
31
+ : `Mock consumed user input "${userInput || "none"}".`,
32
+ linkedInputs: linkedInputs || null
33
+ });
34
+ }
35
+ export class MockWorkbenchProvider {
36
+ providerNames = ["mock"];
37
+ async compile(input) {
38
+ emit(input.logger, "info", "Running mock wiki compile.", {
39
+ model: input.profile.model
40
+ });
41
+ return {
42
+ title: input.input.titleHint || "Mock page",
43
+ summary: "Mock wiki compile output.",
44
+ markdown: input.input.rawText || "# Mock page",
45
+ tags: ["mock"],
46
+ entityProposals: [],
47
+ pageUpdateSuggestions: [],
48
+ articleCandidates: []
49
+ };
50
+ }
51
+ async testConnection(input) {
52
+ emit(input.logger, "info", "Testing mock workbench connection.", {
53
+ model: input.profile.model
54
+ });
55
+ return {
56
+ outputPreview: `Mock provider ready (${resolveFixture(input.profile.model)}).`
57
+ };
58
+ }
59
+ async runText(input) {
60
+ const fixture = resolveFixture(input.profile.model);
61
+ emit(input.logger, "debug", "Running mock workbench prompt.", {
62
+ fixture
63
+ });
64
+ if (fixture === "mock-fail") {
65
+ throw new Error("Mock provider forced a failure for this run.");
66
+ }
67
+ if (fixture === "mock-malformed") {
68
+ return { outputText: "{mock:" };
69
+ }
70
+ if (fixture === "mock-tool-search") {
71
+ if (!hasToolTranscript(input.prompt)) {
72
+ return {
73
+ outputText: JSON.stringify({
74
+ action: "tool",
75
+ tool: "forge.search_entities",
76
+ args: {
77
+ query: "missed habits",
78
+ entityTypes: ["habit"],
79
+ limit: 6
80
+ }
81
+ })
82
+ };
83
+ }
84
+ return {
85
+ outputText: JSON.stringify({
86
+ action: "final",
87
+ text: JSON.stringify({
88
+ answer: "Found missed habits and summarized them.",
89
+ summary: "Found missed habits and summarized them.",
90
+ missedHabits: [{ id: "habit_mock_1", title: "Morning mobility" }]
91
+ })
92
+ })
93
+ };
94
+ }
95
+ if (fixture === "mock-tool-note") {
96
+ if (!hasToolTranscript(input.prompt)) {
97
+ return {
98
+ outputText: JSON.stringify({
99
+ action: "tool",
100
+ tool: "forge.create_note",
101
+ args: {
102
+ title: "Mock note",
103
+ summary: "Created by mock provider",
104
+ markdown: "Mock workbench note"
105
+ }
106
+ })
107
+ };
108
+ }
109
+ return {
110
+ outputText: JSON.stringify({
111
+ action: "final",
112
+ text: JSON.stringify({
113
+ answer: "Created a mock note.",
114
+ summary: "Created a mock note.",
115
+ noteStatus: "created"
116
+ })
117
+ })
118
+ };
119
+ }
120
+ if (fixture === "mock-chat-memory") {
121
+ const userInput = extractSection(input.prompt, "User input");
122
+ return {
123
+ outputText: JSON.stringify({
124
+ answer: hasConversationHistory(input.prompt)
125
+ ? `I remember our earlier exchange and your latest message: ${userInput || "none"}.`
126
+ : `Starting a fresh conversation with: ${userInput || "none"}.`,
127
+ summary: hasConversationHistory(input.prompt)
128
+ ? "Mock chat reused prior conversation history."
129
+ : "Mock chat started fresh."
130
+ })
131
+ };
132
+ }
133
+ if (fixture === "mock-json") {
134
+ return {
135
+ outputText: JSON.stringify({
136
+ answer: "Mock JSON output.",
137
+ summary: "Mock JSON output.",
138
+ payload: {
139
+ ok: true,
140
+ fixture
141
+ }
142
+ })
143
+ };
144
+ }
145
+ return {
146
+ outputText: buildEchoJson(input.prompt)
147
+ };
148
+ }
149
+ }
@@ -24,6 +24,23 @@ export class SecretsManager extends AbstractManager {
24
24
  }
25
25
  return timingSafeEqual(leftBuffer, rightBuffer);
26
26
  }
27
+ getCanonicalKeyPath() {
28
+ return path.join(this.rootDir, ".forge-secrets.key");
29
+ }
30
+ getLegacyKeyPath() {
31
+ return path.join(this.rootDir, "data", ".forge-secrets.key");
32
+ }
33
+ getPreferredKeyPath() {
34
+ const canonicalKeyPath = this.getCanonicalKeyPath();
35
+ if (existsSync(canonicalKeyPath)) {
36
+ return canonicalKeyPath;
37
+ }
38
+ const legacyKeyPath = this.getLegacyKeyPath();
39
+ if (existsSync(legacyKeyPath)) {
40
+ return legacyKeyPath;
41
+ }
42
+ return canonicalKeyPath;
43
+ }
27
44
  sealJson(value) {
28
45
  const iv = randomBytes(12);
29
46
  const cipher = createCipheriv("aes-256-gcm", this.getEncryptionKey(), iv);
@@ -49,7 +66,7 @@ export class SecretsManager extends AbstractManager {
49
66
  if (this.cachedKey) {
50
67
  return this.cachedKey;
51
68
  }
52
- const keyPath = path.join(this.rootDir, "data", ".forge-secrets.key");
69
+ const keyPath = this.getPreferredKeyPath();
53
70
  mkdirSync(path.dirname(keyPath), { recursive: true });
54
71
  if (!existsSync(keyPath)) {
55
72
  writeFileSync(keyPath, randomBytes(32).toString("base64"), { encoding: "utf8", mode: 0o600 });
@@ -17,6 +17,12 @@ import { ExternalServiceManager } from "./platform/external-service-manager.js";
17
17
  import { SearchIndexManager } from "./platform/search-index-manager.js";
18
18
  import { LlmManager } from "./platform/llm-manager.js";
19
19
  import { OpenAiResponsesProvider } from "./platform/openai-responses-provider.js";
20
+ import { MockWorkbenchProvider } from "./platform/mock-workbench-provider.js";
21
+ function shouldEnableMockWorkbenchProvider(env = process.env) {
22
+ return (env.NODE_ENV === "test" ||
23
+ env.FORGE_ENABLE_DEV_MOCKS === "1" ||
24
+ env.FORGE_OPENCLAW_DEV === "1");
25
+ }
20
26
  export function createManagerRuntime(options = {}) {
21
27
  const configuration = new ConfigurationManager();
22
28
  const runtimeConfig = configuration.readRuntimeConfig({ dataRoot: options.dataRoot });
@@ -40,6 +46,9 @@ export function createManagerRuntime(options = {}) {
40
46
  const searchIndex = new SearchIndexManager();
41
47
  const llm = new LlmManager(secrets);
42
48
  llm.register(new OpenAiResponsesProvider());
49
+ if (shouldEnableMockWorkbenchProvider()) {
50
+ llm.register(new MockWorkbenchProvider());
51
+ }
43
52
  return {
44
53
  configuration,
45
54
  secrets,