forge-openclaw-plugin 0.2.26 → 0.2.28
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 +60 -3
- package/dist/assets/{board-ta0rUHOf.js → board-DPFvZf-D.js} +2 -2
- package/dist/assets/{board-ta0rUHOf.js.map → board-DPFvZf-D.js.map} +1 -1
- package/dist/assets/index-Auw3JrdE.css +1 -0
- package/dist/assets/index-D1H7myQH.js +85 -0
- package/dist/assets/index-D1H7myQH.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-fBKPB6yw.js → motion-Bvwc85ch.js} +2 -2
- package/dist/assets/{motion-fBKPB6yw.js.map → motion-Bvwc85ch.js.map} +1 -1
- package/dist/assets/{table-C-IGTQni.js → table-FJQTJvUR.js} +2 -2
- package/dist/assets/{table-C-IGTQni.js.map → table-FJQTJvUR.js.map} +1 -1
- package/dist/assets/{ui-DInOpaYF.js → ui-GXFcgvSw.js} +2 -2
- package/dist/assets/{ui-DInOpaYF.js.map → ui-GXFcgvSw.js.map} +1 -1
- package/dist/assets/vendor-Cwf49UMz.js +1247 -0
- package/dist/assets/vendor-Cwf49UMz.js.map +1 -0
- package/dist/index.html +7 -7
- package/dist/openclaw/local-runtime.js +16 -0
- package/dist/openclaw/routes.d.ts +27 -0
- package/dist/openclaw/routes.js +16 -12
- 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/server/src/app.js +1900 -91
- package/dist/server/server/src/connectors/box-registry.js +44 -9
- package/dist/server/server/src/data-management-types.js +107 -0
- package/dist/server/server/src/db.js +68 -4
- package/dist/server/server/src/demo-data.js +2 -2
- package/dist/server/server/src/health.js +702 -18
- package/dist/server/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/server/src/managers/platform/secrets-manager.js +18 -1
- package/dist/server/server/src/managers/runtime.js +9 -0
- package/dist/server/server/src/movement.js +1971 -112
- package/dist/server/server/src/openapi.js +1390 -105
- package/dist/server/server/src/psyche-types.js +9 -1
- package/dist/server/server/src/repositories/activity-events.js +8 -0
- package/dist/server/server/src/repositories/ai-connectors.js +522 -74
- package/dist/server/server/src/repositories/calendar.js +151 -0
- package/dist/server/server/src/repositories/habits.js +37 -1
- package/dist/server/server/src/repositories/model-settings.js +13 -3
- package/dist/server/server/src/repositories/notes.js +3 -0
- package/dist/server/server/src/repositories/settings.js +380 -18
- package/dist/server/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/server/src/services/data-management.js +788 -0
- package/dist/server/server/src/services/entity-crud.js +205 -2
- package/dist/server/server/src/services/knowledge-graph.js +1455 -0
- package/dist/server/server/src/services/life-force-model.js +217 -0
- package/dist/server/server/src/services/life-force.js +2506 -0
- package/dist/server/server/src/services/psyche-observation-calendar.js +383 -16
- package/dist/server/server/src/types.js +307 -14
- package/dist/server/server/src/web.js +228 -13
- package/dist/server/src/components/customization/utility-widgets.js +136 -27
- 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 +63 -8
- package/dist/server/src/components/workbench-boxes/insights/insights-boxes.js +50 -0
- package/dist/server/src/components/workbench-boxes/kanban/kanban-boxes.js +62 -54
- package/dist/server/src/components/workbench-boxes/movement/movement-boxes.js +18 -8
- package/dist/server/src/components/workbench-boxes/notes/notes-boxes.js +56 -38
- 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 +35 -30
- 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 +3 -1
- package/dist/server/src/components/workbench-boxes/shared/generic-node-view.js +39 -3
- 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 +47 -32
- package/dist/server/src/components/workbench-boxes/wiki/wiki-boxes.js +60 -0
- package/dist/server/src/lib/api.js +280 -21
- package/dist/server/src/lib/data-management-types.js +1 -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/schemas.js +4 -0
- package/dist/server/src/lib/snapshot-normalizer.js +45 -1
- package/dist/server/src/lib/workbench/contracts.js +229 -0
- package/dist/server/src/lib/workbench/nodes.js +200 -0
- package/dist/server/src/lib/workbench/registry.js +52 -5
- package/dist/server/src/lib/workbench/runtime.js +254 -38
- package/dist/server/src/lib/workbench/tool-catalog.js +68 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- 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 +41 -11
- package/skills/forge-openclaw/entity_conversation_playbooks.md +448 -34
- package/skills/forge-openclaw/psyche_entity_playbooks.md +170 -17
- package/dist/assets/index-Ro0ZF_az.css +0 -1
- package/dist/assets/index-ytlpSj23.js +0 -79
- package/dist/assets/index-ytlpSj23.js.map +0 -1
- package/dist/assets/vendor-lE3tZJcC.js +0 -876
- package/dist/assets/vendor-lE3tZJcC.js.map +0 -1
|
@@ -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 =
|
|
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,
|