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.
- package/README.md +59 -3
- package/dist/assets/{board-VmF4FAfr.js → board-C6jCchjI.js} +3 -3
- package/dist/assets/{board-VmF4FAfr.js.map → board-C6jCchjI.js.map} +1 -1
- package/dist/assets/index-DVvS8iiU.css +1 -0
- package/dist/assets/index-zYB-9Dfo.js +85 -0
- package/dist/assets/index-zYB-9Dfo.js.map +1 -0
- package/dist/assets/knowledge-graph-layout.worker-DRvzPxhP.js +2 -0
- package/dist/assets/knowledge-graph-layout.worker-DRvzPxhP.js.map +1 -0
- package/dist/assets/{motion-DvkU14p-.js → motion-DFHrH2rd.js} +2 -2
- package/dist/assets/{motion-DvkU14p-.js.map → motion-DFHrH2rd.js.map} +1 -1
- package/dist/assets/{table-DgiPof9E.js → table-ZL7Di_u3.js} +2 -2
- package/dist/assets/{table-DgiPof9E.js.map → table-ZL7Di_u3.js.map} +1 -1
- package/dist/assets/{ui-nYfoC0Gq.js → ui-CKNPpz7q.js} +2 -2
- package/dist/assets/{ui-nYfoC0Gq.js.map → ui-CKNPpz7q.js.map} +1 -1
- package/dist/assets/vendor-DoNZuFhn.js +1247 -0
- package/dist/assets/vendor-DoNZuFhn.js.map +1 -0
- package/dist/index.html +7 -8
- package/dist/openclaw/local-runtime.d.ts +3 -1
- package/dist/openclaw/local-runtime.js +67 -15
- package/dist/openclaw/plugin-entry-shared.js +24 -2
- package/dist/openclaw/plugin-sdk-types.d.ts +17 -0
- package/dist/openclaw/routes.d.ts +27 -0
- package/dist/openclaw/routes.js +16 -12
- package/dist/openclaw/tools.js +0 -3
- package/dist/server/server/migrations/001_core.sql +411 -0
- package/dist/server/server/migrations/002_psyche.sql +392 -0
- package/dist/server/server/migrations/003_habits.sql +30 -0
- package/dist/server/server/migrations/004_habit_links.sql +8 -0
- package/dist/server/server/migrations/005_habit_psyche_links.sql +24 -0
- package/dist/server/server/migrations/006_work_adjustments.sql +14 -0
- package/dist/server/server/migrations/007_weekly_review_closures.sql +17 -0
- package/dist/server/server/migrations/008_calendar_execution.sql +147 -0
- package/dist/server/server/migrations/009_true_calendar_events.sql +195 -0
- package/dist/server/server/migrations/010_calendar_selection_state.sql +6 -0
- package/dist/server/server/migrations/011_calendar_timezone_backfill.sql +11 -0
- package/dist/server/server/migrations/012_work_block_ranges.sql +7 -0
- package/dist/server/server/migrations/013_microsoft_local_auth_settings.sql +8 -0
- package/dist/server/server/migrations/014_note_tags_and_ephemeral.sql +8 -0
- package/dist/server/server/migrations/015_multi_user_and_strategies.sql +244 -0
- package/dist/server/server/migrations/016_health_companion.sql +158 -0
- package/dist/server/server/migrations/016_strategy_contracts_and_user_graph.sql +22 -0
- package/dist/server/server/migrations/017_preferences.sql +131 -0
- package/dist/server/server/migrations/018_preference_catalogs.sql +31 -0
- package/dist/server/server/migrations/019_wiki_memory.sql +255 -0
- package/dist/server/server/migrations/020_wiki_page_hierarchy.sql +11 -0
- package/dist/server/server/migrations/021_hide_evidence_from_wiki_index.sql +3 -0
- package/dist/server/server/migrations/022_wiki_ingest_background.sql +85 -0
- package/dist/server/server/migrations/023_diagnostic_logs.sql +28 -0
- package/dist/server/server/migrations/024_questionnaires.sql +96 -0
- package/dist/server/server/migrations/025_ai_model_connections.sql +26 -0
- package/dist/server/server/migrations/026_custom_theme_settings.sql +2 -0
- package/dist/server/server/migrations/027_ai_processors.sql +31 -0
- package/dist/server/server/migrations/028_movement_domain.sql +136 -0
- package/dist/server/server/migrations/029_watch_micro_capture.sql +23 -0
- package/dist/server/server/migrations/030_surface_layouts.sql +5 -0
- package/dist/server/server/migrations/031_ai_processor_runtime_upgrades.sql +10 -0
- package/dist/server/server/migrations/032_ai_connectors.sql +44 -0
- package/dist/server/server/migrations/033_movement_trip_point_sync.sql +36 -0
- package/dist/server/server/migrations/034_movement_segment_sync.sql +49 -0
- package/dist/server/server/migrations/035_google_local_auth_settings.sql +2 -0
- package/dist/server/server/migrations/036_google_local_auth_client_secret.sql +2 -0
- package/dist/server/server/migrations/037_workbench_public_inputs_and_run_inputs.sql +5 -0
- package/dist/server/server/migrations/038_data_management_settings.sql +11 -0
- package/dist/server/server/migrations/039_life_force_and_action_points.sql +114 -0
- package/dist/server/server/migrations/040_screen_time_domain.sql +89 -0
- package/dist/server/server/migrations/041_companion_source_states.sql +21 -0
- package/dist/server/server/migrations/042_movement_boxes.sql +47 -0
- package/dist/server/server/migrations/043_movement_box_overlap_overrides.sql +26 -0
- package/dist/server/{app.js → server/src/app.js} +2112 -414
- package/dist/server/server/src/connectors/box-registry.js +223 -0
- package/dist/server/server/src/data-management-types.js +107 -0
- package/dist/server/{db.js → server/src/db.js} +72 -4
- package/dist/server/server/src/debug.js +19 -0
- package/dist/server/{demo-data.js → server/src/demo-data.js} +2 -2
- package/dist/server/{health.js → server/src/health.js} +702 -18
- package/dist/server/{managers → server/src/managers}/platform/llm-manager.js +7 -4
- package/dist/server/server/src/managers/platform/mock-workbench-provider.js +149 -0
- package/dist/server/{managers → server/src/managers}/platform/secrets-manager.js +18 -1
- package/dist/server/{managers → server/src/managers}/runtime.js +9 -0
- package/dist/server/{movement.js → server/src/movement.js} +1971 -112
- package/dist/server/{openapi.js → server/src/openapi.js} +491 -3
- package/dist/server/{psyche-types.js → server/src/psyche-types.js} +9 -1
- package/dist/server/{repositories → server/src/repositories}/activity-events.js +8 -0
- package/dist/server/{repositories → server/src/repositories}/ai-connectors.js +758 -47
- package/dist/server/{repositories → server/src/repositories}/calendar.js +1 -1
- package/dist/server/{repositories → server/src/repositories}/habits.js +37 -1
- package/dist/server/{repositories → server/src/repositories}/model-settings.js +13 -3
- package/dist/server/{repositories → server/src/repositories}/notes.js +3 -0
- package/dist/server/{repositories → server/src/repositories}/settings.js +431 -21
- package/dist/server/{repositories → server/src/repositories}/tasks.js +170 -10
- package/dist/server/server/src/runtime-data-root.js +82 -0
- package/dist/server/server/src/screen-time.js +802 -0
- package/dist/server/{services → server/src/services}/calendar-runtime.js +775 -58
- package/dist/server/server/src/services/data-management.js +788 -0
- package/dist/server/{services → server/src/services}/entity-crud.js +205 -2
- package/dist/server/server/src/services/google-calendar-oauth-config.js +176 -0
- package/dist/server/server/src/services/knowledge-graph.js +1455 -0
- package/dist/server/server/src/services/life-force-model.js +197 -0
- package/dist/server/server/src/services/life-force.js +1270 -0
- package/dist/server/server/src/services/psyche-observation-calendar.js +413 -0
- package/dist/server/{types.js → server/src/types.js} +420 -29
- package/dist/server/server/src/web.js +332 -0
- package/dist/server/src/components/customization/utility-widgets.js +439 -0
- package/dist/server/src/components/ui/info-tooltip.js +25 -0
- package/dist/server/src/components/workbench-boxes/calendar/calendar-boxes.js +78 -0
- package/dist/server/src/components/workbench-boxes/goals/goals-boxes.js +62 -0
- package/dist/server/src/components/workbench-boxes/habits/habits-boxes.js +62 -0
- package/dist/server/src/components/workbench-boxes/health/health-boxes.js +147 -0
- package/dist/server/src/components/workbench-boxes/insights/insights-boxes.js +50 -0
- package/dist/server/src/components/workbench-boxes/kanban/kanban-boxes.js +136 -0
- package/dist/server/src/components/workbench-boxes/movement/movement-boxes.js +47 -0
- package/dist/server/src/components/workbench-boxes/notes/notes-boxes.js +132 -0
- package/dist/server/src/components/workbench-boxes/overview/overview-boxes.js +65 -0
- package/dist/server/src/components/workbench-boxes/preferences/preferences-boxes.js +78 -0
- package/dist/server/src/components/workbench-boxes/projects/projects-boxes.js +62 -0
- package/dist/server/src/components/workbench-boxes/psyche/psyche-boxes.js +88 -0
- package/dist/server/src/components/workbench-boxes/questionnaires/questionnaires-boxes.js +61 -0
- package/dist/server/src/components/workbench-boxes/review/review-boxes.js +53 -0
- package/dist/server/src/components/workbench-boxes/shared/define-workbench-box.js +6 -0
- package/dist/server/src/components/workbench-boxes/shared/generic-node-view.js +49 -0
- package/dist/server/src/components/workbench-boxes/strategies/strategies-boxes.js +62 -0
- package/dist/server/src/components/workbench-boxes/tasks/tasks-boxes.js +76 -0
- package/dist/server/src/components/workbench-boxes/today/today-boxes.js +78 -0
- package/dist/server/src/components/workbench-boxes/wiki/wiki-boxes.js +60 -0
- package/dist/server/src/lib/api-error.js +37 -0
- package/dist/server/src/lib/api.js +2118 -0
- package/dist/server/src/lib/calendar-name-deduper.js +144 -0
- package/dist/server/src/lib/data-management-types.js +1 -0
- package/dist/server/src/lib/diagnostics.js +67 -0
- package/dist/server/src/lib/entity-visuals.js +279 -0
- package/dist/server/src/lib/knowledge-graph-types.js +276 -0
- package/dist/server/src/lib/knowledge-graph.js +470 -0
- package/dist/server/src/lib/psyche-types.js +1 -0
- package/dist/server/src/lib/questionnaire-types.js +1 -0
- package/dist/server/src/lib/runtime-paths.js +24 -0
- package/dist/server/src/lib/schemas.js +238 -0
- package/dist/server/src/lib/snapshot-normalizer.js +416 -0
- package/dist/server/src/lib/theme-system.js +319 -0
- package/dist/server/src/lib/types.js +1 -0
- package/dist/server/src/lib/utils.js +22 -0
- package/dist/server/src/lib/workbench/boxes.js +16 -0
- package/dist/server/src/lib/workbench/contracts.js +229 -0
- package/dist/server/src/lib/workbench/nodes.js +215 -0
- package/dist/server/src/lib/workbench/registry.js +120 -0
- package/dist/server/src/lib/workbench/runtime.js +397 -0
- package/dist/server/src/lib/workbench/tool-catalog.js +68 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/server/index.js +68 -0
- package/server/migrations/035_google_local_auth_settings.sql +2 -0
- package/server/migrations/036_google_local_auth_client_secret.sql +2 -0
- package/server/migrations/037_workbench_public_inputs_and_run_inputs.sql +5 -0
- package/server/migrations/038_data_management_settings.sql +11 -0
- package/server/migrations/039_life_force_and_action_points.sql +114 -0
- package/server/migrations/040_screen_time_domain.sql +89 -0
- package/server/migrations/041_companion_source_states.sql +21 -0
- package/server/migrations/042_movement_boxes.sql +47 -0
- package/server/migrations/043_movement_box_overlap_overrides.sql +26 -0
- package/skills/forge-openclaw/SKILL.md +27 -11
- package/skills/forge-openclaw/entity_conversation_playbooks.md +411 -46
- package/skills/forge-openclaw/psyche_entity_playbooks.md +195 -20
- package/dist/assets/index-CFCKDIMH.js +0 -67
- package/dist/assets/index-CFCKDIMH.js.map +0 -1
- package/dist/assets/index-ZPY6U1TU.css +0 -1
- package/dist/assets/vendor-D9PTEPSB.js +0 -824
- package/dist/assets/vendor-D9PTEPSB.js.map +0 -1
- package/dist/assets/viz-Cqb6s--o.js +0 -34
- package/dist/assets/viz-Cqb6s--o.js.map +0 -1
- package/dist/server/connectors/box-registry.js +0 -257
- package/dist/server/services/psyche-observation-calendar.js +0 -46
- package/dist/server/web.js +0 -98
- /package/dist/server/{discovery-advertiser.js → server/src/discovery-advertiser.js} +0 -0
- /package/dist/server/{e2e-server.js → server/src/e2e-server.js} +0 -0
- /package/dist/server/{errors.js → server/src/errors.js} +0 -0
- /package/dist/server/{index.js → server/src/index.js} +0 -0
- /package/dist/server/{managers → server/src/managers}/base.js +0 -0
- /package/dist/server/{managers → server/src/managers}/contracts.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/api-gateway-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/audit-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/authentication-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/authorization-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/background-job-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/configuration-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/database-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/event-bus-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/external-service-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/health-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/migration-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/openai-responses-provider.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/search-index-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/session-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/storage-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/token-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/transaction-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/trusted-network.js +0 -0
- /package/dist/server/{managers → server/src/managers}/type-guards.js +0 -0
- /package/dist/server/{preferences-seeds.js → server/src/preferences-seeds.js} +0 -0
- /package/dist/server/{preferences-types.js → server/src/preferences-types.js} +0 -0
- /package/dist/server/{questionnaire-flow.js → server/src/questionnaire-flow.js} +0 -0
- /package/dist/server/{questionnaire-seeds.js → server/src/questionnaire-seeds.js} +0 -0
- /package/dist/server/{questionnaire-types.js → server/src/questionnaire-types.js} +0 -0
- /package/dist/server/{repositories → server/src/repositories}/ai-processors.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/collaboration.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/deleted-entities.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/diagnostic-logs.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/domains.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/entity-ownership.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/event-log.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/goals.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/preferences.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/projects.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/psyche.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/questionnaires.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/rewards.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/strategies.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/surface-layouts.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/tags.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/task-runs.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/users.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/weekly-reviews.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/wiki-memory.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/work-adjustments.js +0 -0
- /package/dist/server/{seed-demo.js → server/src/seed-demo.js} +0 -0
- /package/dist/server/{services → server/src/services}/context.js +0 -0
- /package/dist/server/{services → server/src/services}/dashboard.js +0 -0
- /package/dist/server/{services → server/src/services}/gamification.js +0 -0
- /package/dist/server/{services → server/src/services}/insights.js +0 -0
- /package/dist/server/{services → server/src/services}/openai-codex-oauth.js +0 -0
- /package/dist/server/{services → server/src/services}/projects.js +0 -0
- /package/dist/server/{services → server/src/services}/psyche.js +0 -0
- /package/dist/server/{services → server/src/services}/relations.js +0 -0
- /package/dist/server/{services → server/src/services}/reviews.js +0 -0
- /package/dist/server/{services → server/src/services}/run-recovery.js +0 -0
- /package/dist/server/{services → server/src/services}/tagging.js +0 -0
- /package/dist/server/{services → server/src/services}/task-run-watchdog.js +0 -0
- /package/dist/server/{services → server/src/services}/work-time.js +0 -0
- /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-
|
|
17
|
-
<link rel="modulepreload" crossorigin href="/forge/assets/
|
|
18
|
-
<link rel="modulepreload" crossorigin href="/forge/assets/
|
|
19
|
-
<link rel="modulepreload" crossorigin href="/forge/assets/ui-
|
|
20
|
-
<link rel="modulepreload" crossorigin href="/forge/assets/motion-
|
|
21
|
-
<link rel="modulepreload" crossorigin href="/forge/assets/table-
|
|
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-
|
|
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
|
|
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.
|
|
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 =
|
|
255
|
-
|
|
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
|
|
264
|
-
const
|
|
265
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 {};
|
package/dist/openclaw/routes.js
CHANGED
|
@@ -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 [
|
|
697
|
-
runReadOnly(config, "/api/v1/
|
|
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
|
|
716
|
-
?
|
|
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
|
-
|
|
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
|
package/dist/openclaw/tools.js
CHANGED
|
@@ -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(),
|