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
package/dist/index.html CHANGED
@@ -13,15 +13,14 @@
13
13
  />
14
14
  <link rel="icon" type="image/png" href="/forge/assets/favicon-BCHm9dUV.ico" />
15
15
  <link rel="alternate icon" href="/forge/assets/favicon-BCHm9dUV.ico" />
16
- <script type="module" crossorigin src="/forge/assets/index-CFCKDIMH.js"></script>
17
- <link rel="modulepreload" crossorigin href="/forge/assets/viz-Cqb6s--o.js">
18
- <link rel="modulepreload" crossorigin href="/forge/assets/vendor-D9PTEPSB.js">
19
- <link rel="modulepreload" crossorigin href="/forge/assets/ui-nYfoC0Gq.js">
20
- <link rel="modulepreload" crossorigin href="/forge/assets/motion-DvkU14p-.js">
21
- <link rel="modulepreload" crossorigin href="/forge/assets/table-DgiPof9E.js">
22
- <link rel="modulepreload" crossorigin href="/forge/assets/board-VmF4FAfr.js">
16
+ <script type="module" crossorigin src="/forge/assets/index-zYB-9Dfo.js"></script>
17
+ <link rel="modulepreload" crossorigin href="/forge/assets/vendor-DoNZuFhn.js">
18
+ <link rel="modulepreload" crossorigin href="/forge/assets/board-C6jCchjI.js">
19
+ <link rel="modulepreload" crossorigin href="/forge/assets/ui-CKNPpz7q.js">
20
+ <link rel="modulepreload" crossorigin href="/forge/assets/motion-DFHrH2rd.js">
21
+ <link rel="modulepreload" crossorigin href="/forge/assets/table-ZL7Di_u3.js">
23
22
  <link rel="stylesheet" crossorigin href="/forge/assets/vendor-DT3pnAKJ.css">
24
- <link rel="stylesheet" crossorigin href="/forge/assets/index-ZPY6U1TU.css">
23
+ <link rel="stylesheet" crossorigin href="/forge/assets/index-DVvS8iiU.css">
25
24
  </head>
26
25
  <body class="bg-canvas text-ink antialiased">
27
26
  <div id="root"></div>
@@ -33,7 +33,9 @@ export type ForgeRuntimeRestartResult = {
33
33
  };
34
34
  export declare function ensureForgeRuntimeReady(config: ForgePluginConfig): Promise<void>;
35
35
  export declare function startForgeRuntime(config: ForgePluginConfig): Promise<ForgeRuntimeStartResult>;
36
- export declare function primeForgeRuntime(config: ForgePluginConfig): void;
36
+ export declare function primeForgeRuntime(config: ForgePluginConfig, logger?: {
37
+ warn?(message: string): void;
38
+ }): void;
37
39
  export declare function stopForgeRuntime(config: ForgePluginConfig): Promise<ForgeRuntimeStopResult>;
38
40
  export declare function getForgeRuntimeStatus(config: ForgePluginConfig): Promise<ForgeRuntimeStatusResult>;
39
41
  export declare function restartForgeRuntime(config: ForgePluginConfig): Promise<ForgeRuntimeRestartResult>;
@@ -165,9 +165,50 @@ function isLocalOrigin(origin) {
165
165
  return false;
166
166
  }
167
167
  }
168
+ function isTruthyEnvFlag(value) {
169
+ if (!value) {
170
+ return false;
171
+ }
172
+ const normalized = value.trim().toLowerCase();
173
+ return normalized === "1" || normalized === "true" || normalized === "yes";
174
+ }
175
+ function shouldEnableManagedDevWeb(plan, env = process.env) {
176
+ return plan.mode === "source" || isTruthyEnvFlag(env.FORGE_OPENCLAW_DEV);
177
+ }
168
178
  function getCurrentModuleRoot() {
169
179
  return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
170
180
  }
181
+ function buildLaunchPlanSearchPaths(moduleRoot) {
182
+ const repoRoot = path.resolve(moduleRoot, "..");
183
+ return {
184
+ packagedEntries: [
185
+ path.join(moduleRoot, "server", "index.js"),
186
+ path.join(moduleRoot, "dist", "server", "index.js"),
187
+ path.join(moduleRoot, "dist", "server", "src", "index.js"),
188
+ path.join(moduleRoot, "dist", "server", "server", "src", "index.js")
189
+ ],
190
+ packagedMigrations: path.join(moduleRoot, "server", "migrations"),
191
+ sourceEntries: [
192
+ path.join(repoRoot, "server", "src", "index.ts"),
193
+ path.join(moduleRoot, "server", "src", "index.ts")
194
+ ],
195
+ tsxCliCandidates: [
196
+ path.join(repoRoot, "node_modules", "tsx", "dist", "cli.mjs"),
197
+ path.join(moduleRoot, "node_modules", "tsx", "dist", "cli.mjs")
198
+ ],
199
+ repoRoot
200
+ };
201
+ }
202
+ function formatLaunchPlanFailure(moduleRoot) {
203
+ const paths = buildLaunchPlanSearchPaths(moduleRoot);
204
+ return [
205
+ "Forge local runtime could not find a launchable server entry.",
206
+ `Packaged entry candidates: ${paths.packagedEntries.join(", ")}.`,
207
+ `Expected migrations at: ${paths.packagedMigrations}.`,
208
+ `Source entry candidates: ${paths.sourceEntries.join(", ")}.`,
209
+ `tsx candidates: ${paths.tsxCliCandidates.join(", ")}.`
210
+ ].join(" ");
211
+ }
171
212
  function getRuntimeLogPath(config) {
172
213
  const origin = new URL(config.origin).hostname.toLowerCase().replace(/[^a-z0-9._-]+/g, "-");
173
214
  return path.join(homedir(), ".openclaw", "logs", FORGE_PLUGIN_ID, `${origin}-${config.port}.log`);
@@ -177,7 +218,7 @@ function openRuntimeLogFile(logPath) {
177
218
  return openSync(logPath, "a");
178
219
  }
179
220
  function isPackagedServerPlan(plan) {
180
- return plan.entryFile.endsWith(path.join("dist", "server", "index.js"));
221
+ return plan.mode === "packaged";
181
222
  }
182
223
  function getNpmInvocation() {
183
224
  const binDir = path.dirname(process.execPath);
@@ -250,23 +291,25 @@ async function ensurePackagedRuntimeDependencies(plan, config) {
250
291
  }
251
292
  function resolveLaunchPlan() {
252
293
  const moduleRoot = getCurrentModuleRoot();
294
+ const paths = buildLaunchPlanSearchPaths(moduleRoot);
253
295
  // Published or linked plugin package runtime.
254
- const packagedEntry = path.join(moduleRoot, "dist", "server", "index.js");
255
- const packagedMigrations = path.join(moduleRoot, "server", "migrations");
256
- if (existsSync(packagedEntry) && existsSync(packagedMigrations)) {
296
+ const packagedEntry = paths.packagedEntries.find((candidate) => existsSync(candidate));
297
+ if (packagedEntry && existsSync(paths.packagedMigrations)) {
257
298
  return {
258
299
  packageRoot: moduleRoot,
259
- entryFile: packagedEntry
300
+ entryFile: packagedEntry,
301
+ mode: "packaged"
260
302
  };
261
303
  }
262
304
  // Source-tree fallback for local development before packaging.
263
- const repoRoot = moduleRoot;
264
- const sourceEntry = path.join(repoRoot, "server", "src", "index.ts");
265
- const tsxCli = path.join(repoRoot, "node_modules", "tsx", "dist", "cli.mjs");
266
- if (existsSync(sourceEntry) && existsSync(tsxCli)) {
305
+ const sourceEntry = paths.sourceEntries.find((candidate) => existsSync(candidate));
306
+ const tsxCli = paths.tsxCliCandidates.find((candidate) => existsSync(candidate));
307
+ if (sourceEntry && tsxCli) {
267
308
  return {
268
- packageRoot: repoRoot,
269
- entryFile: tsxCli
309
+ packageRoot: paths.repoRoot,
310
+ entryFile: tsxCli,
311
+ mode: "source",
312
+ sourceEntryFile: sourceEntry
270
313
  };
271
314
  }
272
315
  return null;
@@ -330,9 +373,12 @@ async function adoptManagedRuntimeState(config, probe) {
330
373
  }
331
374
  async function spawnManagedRuntime(config, plan) {
332
375
  const isPackagedServer = isPackagedServerPlan(plan);
333
- const args = isPackagedServer ? [plan.entryFile] : [plan.entryFile, path.join(plan.packageRoot, "server", "src", "index.ts")];
376
+ const args = isPackagedServer
377
+ ? [plan.entryFile]
378
+ : [plan.entryFile, plan.sourceEntryFile ?? path.join(plan.packageRoot, "server", "src", "index.ts")];
334
379
  const logPath = getRuntimeLogPath(config);
335
380
  const logFd = openRuntimeLogFile(logPath);
381
+ const enableManagedDevWeb = shouldEnableManagedDevWeb(plan);
336
382
  const child = spawn(process.execPath, args, {
337
383
  cwd: plan.packageRoot,
338
384
  env: {
@@ -340,6 +386,11 @@ async function spawnManagedRuntime(config, plan) {
340
386
  HOST: "127.0.0.1",
341
387
  PORT: String(config.port),
342
388
  FORGE_BASE_PATH: "/forge/",
389
+ ...(enableManagedDevWeb
390
+ ? {
391
+ FORGE_DEV_WEB_ORIGIN: process.env.FORGE_DEV_WEB_ORIGIN ?? "http://127.0.0.1:3027/forge/"
392
+ }
393
+ : {}),
343
394
  ...(config.dataRoot ? { FORGE_DATA_ROOT: config.dataRoot } : {})
344
395
  },
345
396
  stdio: ["ignore", logFd, logFd],
@@ -454,7 +505,7 @@ export async function ensureForgeRuntimeReady(config) {
454
505
  }
455
506
  const plan = resolveLaunchPlan();
456
507
  if (!plan) {
457
- return;
508
+ throw new Error(formatLaunchPlanFailure(getCurrentModuleRoot()));
458
509
  }
459
510
  startupPromise = (async () => {
460
511
  const probeBeforeStart = await probeForgeRuntime(config, HEALTHCHECK_TIMEOUT_MS);
@@ -556,8 +607,9 @@ export async function startForgeRuntime(config) {
556
607
  baseUrl: config.baseUrl
557
608
  };
558
609
  }
559
- export function primeForgeRuntime(config) {
560
- void ensureForgeRuntimeReady(config).catch(() => {
610
+ export function primeForgeRuntime(config, logger) {
611
+ void ensureForgeRuntimeReady(config).catch((error) => {
612
+ logger?.warn?.(`Forge local runtime bootstrap failed for ${config.baseUrl}: ${error instanceof Error ? error.message : String(error)}`);
561
613
  // Keep plugin registration non-blocking. Failures surface on first real call.
562
614
  });
563
615
  }
@@ -2,7 +2,7 @@ import { existsSync, readFileSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import path from "node:path";
4
4
  import { buildForgeBaseUrl, buildForgeWebAppUrl } from "./api-client.js";
5
- import { primeForgeRuntime } from "./local-runtime.js";
5
+ import { ensureForgeRuntimeReady, getForgeRuntimeStatus, primeForgeRuntime } from "./local-runtime.js";
6
6
  import { registerForgePluginCli, registerForgePluginRoutes } from "./routes.js";
7
7
  import { registerForgeSessionBootstrapHook } from "./session-bootstrap.js";
8
8
  import { registerForgePluginTools } from "./tools.js";
@@ -175,7 +175,29 @@ export const forgePluginConfigSchema = {
175
175
  };
176
176
  export function registerForgePlugin(api) {
177
177
  const config = resolveForgePluginConfig(api.pluginConfig);
178
- primeForgeRuntime(config);
178
+ if (api.registerService) {
179
+ api.registerService({
180
+ id: "forge-local-runtime-bootstrap",
181
+ start: async ({ logger }) => {
182
+ if (!isLocalOrigin(config.origin)) {
183
+ logger.info?.(`Forge local runtime bootstrap skipped for remote target ${config.baseUrl}.`);
184
+ return;
185
+ }
186
+ logger.info?.(`Forge local runtime bootstrap: ensuring Forge at ${config.baseUrl}.`);
187
+ try {
188
+ await ensureForgeRuntimeReady(config);
189
+ const status = await getForgeRuntimeStatus(config);
190
+ logger.info?.(`Forge local runtime bootstrap: ${status?.message ?? `Forge is ready at ${config.baseUrl}.`}`);
191
+ }
192
+ catch (error) {
193
+ logger.warn?.(`Forge local runtime bootstrap failed for ${config.baseUrl}: ${error instanceof Error ? error.message : String(error)}`);
194
+ }
195
+ }
196
+ });
197
+ }
198
+ else {
199
+ primeForgeRuntime(config, api.logger);
200
+ }
179
201
  registerForgeSessionBootstrapHook(api, config);
180
202
  registerForgePluginRoutes(api, config);
181
203
  registerForgePluginCli(api, config);
@@ -42,6 +42,22 @@ export type ForgeCliRegistrarContext = {
42
42
  debug?(message: string): void;
43
43
  };
44
44
  };
45
+ export type ForgePluginServiceContext = {
46
+ config?: unknown;
47
+ workspaceDir?: string;
48
+ stateDir: string;
49
+ logger: {
50
+ info?(message: string): void;
51
+ warn?(message: string): void;
52
+ error?(message: string): void;
53
+ debug?(message: string): void;
54
+ };
55
+ };
56
+ export type ForgeRegisteredService = {
57
+ id: string;
58
+ start: (context: ForgePluginServiceContext) => Promise<void> | void;
59
+ stop?: (context: ForgePluginServiceContext) => Promise<void> | void;
60
+ };
45
61
  export type ForgePluginRegistrationApi = {
46
62
  pluginConfig?: unknown;
47
63
  logger?: {
@@ -62,6 +78,7 @@ export type ForgePluginRegistrationApi = {
62
78
  registerCli?(registrar: (context: ForgeCliRegistrarContext) => void, options?: {
63
79
  commands?: string[];
64
80
  }): void;
81
+ registerService?(service: ForgeRegisteredService): void;
65
82
  };
66
83
  export type ForgePluginRouteApi = Pick<ForgePluginRegistrationApi, "registerHttpRoute">;
67
84
  export type ForgePluginToolApi = Pick<ForgePluginRegistrationApi, "registerTool">;
@@ -32,5 +32,32 @@ export declare function buildRouteParityReport(pathMap: Record<string, Record<st
32
32
  unexpectedMirrors: `${Uppercase<string>} ${string}`[];
33
33
  };
34
34
  export declare function registerForgePluginRoutes(api: ForgePluginRouteApi, config: ForgePluginConfig): void;
35
+ export declare function runRouteCheck(config: ForgePluginConfig): Promise<{
36
+ supported: `${Uppercase<string>} ${string}`[];
37
+ mirrored: `${Uppercase<string>} ${string}`[];
38
+ missingFromPlugin: `${Uppercase<string>} ${string}`[];
39
+ missingFromOpenApi: `${Uppercase<string>} ${string}`[];
40
+ unexpectedMirrors: `${Uppercase<string>} ${string}`[];
41
+ }>;
42
+ export declare function runDoctor(config: ForgePluginConfig): Promise<{
43
+ ok: boolean;
44
+ origin: string;
45
+ port: number;
46
+ baseUrl: string;
47
+ webAppUrl: string;
48
+ actorLabel: string;
49
+ apiTokenConfigured: boolean;
50
+ operatorSessionBootstrapAvailable: boolean;
51
+ warnings: string[];
52
+ overview: unknown;
53
+ onboarding: unknown;
54
+ routeParity: {
55
+ supported: `${Uppercase<string>} ${string}`[];
56
+ mirrored: `${Uppercase<string>} ${string}`[];
57
+ missingFromPlugin: `${Uppercase<string>} ${string}`[];
58
+ missingFromOpenApi: `${Uppercase<string>} ${string}`[];
59
+ unexpectedMirrors: `${Uppercase<string>} ${string}`[];
60
+ };
61
+ }>;
35
62
  export declare function registerForgePluginCli(api: ForgePluginCliApi, config: ForgePluginConfig): void;
36
63
  export {};
@@ -681,7 +681,7 @@ async function runReadOnly(config, path) {
681
681
  path
682
682
  }));
683
683
  }
684
- async function runRouteCheck(config) {
684
+ export async function runRouteCheck(config) {
685
685
  const openapi = await runReadOnly(config, "/api/v1/openapi.json");
686
686
  const pathMap = typeof openapi === "object" &&
687
687
  openapi !== null &&
@@ -692,14 +692,21 @@ async function runRouteCheck(config) {
692
692
  : {};
693
693
  return buildRouteParityReport(pathMap);
694
694
  }
695
- async function runDoctor(config) {
696
- const [health, overview, onboarding, routeParity, uiUrl] = await Promise.all([
697
- runReadOnly(config, "/api/v1/health"),
695
+ export async function runDoctor(config) {
696
+ const [doctorResponse, overview, onboarding, routeParity, uiUrl] = await Promise.all([
697
+ runReadOnly(config, "/api/v1/doctor"),
698
698
  runReadOnly(config, "/api/v1/operator/overview"),
699
699
  runReadOnly(config, "/api/v1/agents/onboarding"),
700
700
  runRouteCheck(config),
701
701
  resolveForgeUiUrl(config)
702
702
  ]);
703
+ const doctorBody = typeof doctorResponse === "object" &&
704
+ doctorResponse !== null &&
705
+ "doctor" in doctorResponse &&
706
+ typeof doctorResponse.doctor === "object" &&
707
+ doctorResponse.doctor !== null
708
+ ? doctorResponse.doctor
709
+ : null;
703
710
  const overviewBody = typeof overview === "object" &&
704
711
  overview !== null &&
705
712
  "overview" in overview &&
@@ -712,10 +719,9 @@ async function runDoctor(config) {
712
719
  overviewBody.capabilities !== null
713
720
  ? overviewBody.capabilities
714
721
  : null;
715
- const overviewWarnings = Array.isArray(overviewBody?.warnings)
716
- ? overviewBody.warnings.filter((entry) => typeof entry === "string")
722
+ const warnings = Array.isArray(doctorBody?.warnings)
723
+ ? doctorBody.warnings.filter((entry) => typeof entry === "string")
717
724
  : [];
718
- const warnings = [];
719
725
  const canBootstrap = canBootstrapOperatorSession(config.baseUrl);
720
726
  if (config.apiToken.trim().length === 0 && canBootstrap) {
721
727
  warnings.push("Forge apiToken is blank, but this target can bootstrap a local or Tailscale operator session for protected reads and writes.");
@@ -723,9 +729,6 @@ async function runDoctor(config) {
723
729
  else if (config.apiToken.trim().length === 0) {
724
730
  warnings.push("Forge apiToken is missing, and this target cannot use local or Tailscale operator-session bootstrap. Protected writes will fail.");
725
731
  }
726
- if (overviewWarnings.length > 0) {
727
- warnings.push(...overviewWarnings);
728
- }
729
732
  if (capabilities && capabilities.canReadPsyche === false) {
730
733
  warnings.push("The configured token cannot read Psyche state. Sensitive reflection summaries will stay partial.");
731
734
  }
@@ -739,7 +742,9 @@ async function runDoctor(config) {
739
742
  warnings.push(`Plugin still mirrors ${routeParity.unexpectedMirrors.length} unexpected route${routeParity.unexpectedMirrors.length === 1 ? "" : "s"} outside the curated contract.`);
740
743
  }
741
744
  return {
742
- ok: (config.apiToken.trim().length > 0 || canBootstrap) &&
745
+ ...(doctorBody ?? {}),
746
+ ok: doctorBody?.ok === true &&
747
+ (config.apiToken.trim().length > 0 || canBootstrap) &&
743
748
  routeParity.missingFromPlugin.length === 0 &&
744
749
  routeParity.missingFromOpenApi.length === 0 &&
745
750
  routeParity.unexpectedMirrors.length === 0,
@@ -751,7 +756,6 @@ async function runDoctor(config) {
751
756
  apiTokenConfigured: config.apiToken.trim().length > 0,
752
757
  operatorSessionBootstrapAvailable: canBootstrap,
753
758
  warnings,
754
- health,
755
759
  overview,
756
760
  onboarding,
757
761
  routeParity
@@ -1065,9 +1065,6 @@ export function registerForgePluginTools(api, config) {
1065
1065
  ]),
1066
1066
  label: Type.String({ minLength: 1 }),
1067
1067
  username: optionalString(),
1068
- clientId: optionalString(),
1069
- clientSecret: optionalString(),
1070
- refreshToken: optionalString(),
1071
1068
  password: optionalString(),
1072
1069
  serverUrl: optionalString(),
1073
1070
  authSessionId: optionalString(),