@hedgehog-finance/hedgehog-plugin 1.0.21 → 1.0.23
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/dist/index.d.ts +4 -3
- package/dist/index.js +49 -6
- package/dist/index.js.map +1 -1
- package/dist/setup-api.d.ts +2 -0
- package/dist/setup-api.js +8 -0
- package/dist/setup-api.js.map +1 -0
- package/dist/src/channel.js +25 -23
- package/dist/src/channel.js.map +1 -1
- package/dist/src/core/database.js +449 -39
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/dailyMorningBriefingCron.d.ts +46 -0
- package/dist/src/dailyMorningBriefingCron.js +82 -0
- package/dist/src/dailyMorningBriefingCron.js.map +1 -0
- package/dist/src/features/chartOutput.d.ts +2 -0
- package/dist/src/features/chartOutput.js +35 -0
- package/dist/src/features/chartOutput.js.map +1 -0
- package/dist/src/features/dailyMorningBriefing/schema.d.ts +56 -0
- package/dist/src/features/dailyMorningBriefing/schema.js +22 -0
- package/dist/src/features/dailyMorningBriefing/schema.js.map +1 -0
- package/dist/src/features/dailyMorningBriefing/tools.d.ts +12 -0
- package/dist/src/features/dailyMorningBriefing/tools.js +204 -0
- package/dist/src/features/dailyMorningBriefing/tools.js.map +1 -0
- package/dist/src/features/deepReasoning/schema.d.ts +43 -0
- package/dist/src/features/deepReasoning/schema.js +17 -0
- package/dist/src/features/deepReasoning/schema.js.map +1 -0
- package/dist/src/features/deepReasoning/tools.d.ts +12 -0
- package/dist/src/features/deepReasoning/tools.js +163 -0
- package/dist/src/features/deepReasoning/tools.js.map +1 -0
- package/dist/src/features/index.d.ts +2 -1
- package/dist/src/features/index.js +9 -1
- package/dist/src/features/index.js.map +1 -1
- package/dist/src/features/informationVerification/schema.d.ts +43 -0
- package/dist/src/features/informationVerification/schema.js +17 -0
- package/dist/src/features/informationVerification/schema.js.map +1 -0
- package/dist/src/features/informationVerification/tools.d.ts +12 -0
- package/dist/src/features/informationVerification/tools.js +162 -0
- package/dist/src/features/informationVerification/tools.js.map +1 -0
- package/dist/src/features/notes/schema.d.ts +136 -39
- package/dist/src/features/notes/schema.js +13 -10
- package/dist/src/features/notes/schema.js.map +1 -1
- package/dist/src/features/notes/tools.d.ts +1 -0
- package/dist/src/features/notes/tools.js +47 -14
- package/dist/src/features/notes/tools.js.map +1 -1
- package/dist/src/features/pluginInfo/schema.d.ts +79 -0
- package/dist/src/features/pluginInfo/schema.js +14 -0
- package/dist/src/features/pluginInfo/schema.js.map +1 -0
- package/dist/src/features/pluginInfo/tools.d.ts +1 -0
- package/dist/src/features/pluginInfo/tools.js +157 -2
- package/dist/src/features/pluginInfo/tools.js.map +1 -1
- package/dist/src/features/profileLibrary/schema.d.ts +34 -6
- package/dist/src/features/profileLibrary/schema.js +1 -1
- package/dist/src/features/profileLibrary/schema.js.map +1 -1
- package/dist/src/features/stockAnalysis/schema.d.ts +224 -31
- package/dist/src/features/stockAnalysis/schema.js +76 -12
- package/dist/src/features/stockAnalysis/schema.js.map +1 -1
- package/dist/src/features/stockAnalysis/tools.d.ts +6 -4
- package/dist/src/features/stockAnalysis/tools.js +389 -44
- package/dist/src/features/stockAnalysis/tools.js.map +1 -1
- package/dist/src/features/stockBasic/schema.d.ts +149 -0
- package/dist/src/features/stockBasic/schema.js +26 -0
- package/dist/src/features/stockBasic/schema.js.map +1 -0
- package/dist/src/features/stockBasic/tools.d.ts +12 -0
- package/dist/src/features/stockBasic/tools.js +124 -0
- package/dist/src/features/stockBasic/tools.js.map +1 -0
- package/dist/src/features/watchlist/logic.d.ts +3 -3
- package/dist/src/features/watchlist/logic.js +47 -46
- package/dist/src/features/watchlist/logic.js.map +1 -1
- package/dist/src/features/watchlist/schema.d.ts +89 -54
- package/dist/src/features/watchlist/schema.js +7 -4
- package/dist/src/features/watchlist/schema.js.map +1 -1
- package/dist/src/features/watchlist/tools.d.ts +106 -59
- package/dist/src/features/watchlist/tools.js +182 -104
- package/dist/src/features/watchlist/tools.js.map +1 -1
- package/dist/src/openclawConfig.d.ts +6 -0
- package/dist/src/openclawConfig.js +74 -0
- package/dist/src/openclawConfig.js.map +1 -0
- package/dist/src/openclawConstants.d.ts +4 -0
- package/dist/src/openclawConstants.js +10 -0
- package/dist/src/openclawConstants.js.map +1 -0
- package/dist/src/runtime.js +20 -0
- package/dist/src/runtime.js.map +1 -1
- package/index.ts +52 -5
- package/openclaw.plugin.json +24 -0
- package/package.json +20 -5
- package/setup-api.ts +10 -0
- package/src/channel.ts +26 -25
- package/src/core/database.ts +447 -40
- package/src/dailyMorningBriefingCron.ts +129 -0
- package/src/features/chartOutput.ts +35 -0
- package/src/features/dailyMorningBriefing/schema.ts +38 -0
- package/src/features/dailyMorningBriefing/tools.ts +246 -0
- package/src/features/deepReasoning/schema.ts +22 -0
- package/src/features/deepReasoning/tools.ts +182 -0
- package/src/features/index.ts +11 -2
- package/src/features/informationVerification/schema.ts +22 -0
- package/src/features/informationVerification/tools.ts +181 -0
- package/src/features/notes/schema.ts +17 -12
- package/src/features/notes/tools.ts +54 -17
- package/src/features/pluginInfo/schema.ts +19 -0
- package/src/features/pluginInfo/tools.ts +173 -2
- package/src/features/profileLibrary/schema.ts +1 -1
- package/src/features/stockAnalysis/schema.ts +99 -17
- package/src/features/stockAnalysis/tools.ts +447 -49
- package/src/features/stockBasic/schema.ts +33 -0
- package/src/features/stockBasic/tools.ts +157 -0
- package/src/features/watchlist/logic.ts +56 -53
- package/src/features/watchlist/schema.ts +11 -6
- package/src/features/watchlist/tools.ts +191 -106
- package/src/openclawConfig.ts +101 -0
- package/src/openclawConstants.ts +11 -0
- package/src/runtime.ts +19 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { HEDGEHOG_AGENT_ID, MAIN_AGENT_EXTRA_TOOL_NAMES, MAIN_AGENT_ID, listRegisteredAgentToolNames } from "./openclawConstants.js";
|
|
2
|
+
function uniqueStrings(values) {
|
|
3
|
+
return Array.from(new Set(values));
|
|
4
|
+
}
|
|
5
|
+
function withAllowedTools(agent, toolNames) {
|
|
6
|
+
const tools = agent.tools || {};
|
|
7
|
+
const existing = Array.isArray(tools.alsoAllow) ? tools.alsoAllow : [];
|
|
8
|
+
const existingSet = new Set(existing);
|
|
9
|
+
const added = toolNames.filter((name) => !existingSet.has(name));
|
|
10
|
+
const nextAlsoAllow = uniqueStrings([...existing, ...toolNames]);
|
|
11
|
+
return {
|
|
12
|
+
agent: {
|
|
13
|
+
...agent,
|
|
14
|
+
tools: {
|
|
15
|
+
...tools,
|
|
16
|
+
alsoAllow: nextAlsoAllow
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
changed: added.length > 0,
|
|
20
|
+
added
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function withRegisteredTools(agent) {
|
|
24
|
+
return withAllowedTools(agent, listRegisteredAgentToolNames());
|
|
25
|
+
}
|
|
26
|
+
function upsertAgentTools(list, agentId, toolNames) {
|
|
27
|
+
const existingIndex = list.findIndex((agent) => agent?.id === agentId);
|
|
28
|
+
if (existingIndex >= 0) {
|
|
29
|
+
const result = withAllowedTools(list[existingIndex], toolNames);
|
|
30
|
+
if (!result.changed)
|
|
31
|
+
return { changed: false, added: [] };
|
|
32
|
+
list[existingIndex] = result.agent;
|
|
33
|
+
return { changed: true, added: result.added };
|
|
34
|
+
}
|
|
35
|
+
const result = withAllowedTools({ id: agentId }, toolNames);
|
|
36
|
+
list.push(result.agent);
|
|
37
|
+
return { changed: result.changed, added: result.added };
|
|
38
|
+
}
|
|
39
|
+
export function ensureRegisteredToolsAllowedInConfig(config) {
|
|
40
|
+
const agents = config.agents || {};
|
|
41
|
+
const list = Array.isArray(agents.list) ? agents.list : [];
|
|
42
|
+
const existingIndex = list.findIndex((agent) => agent?.id === HEDGEHOG_AGENT_ID);
|
|
43
|
+
const nextList = [...list];
|
|
44
|
+
const changes = [];
|
|
45
|
+
if (existingIndex >= 0) {
|
|
46
|
+
const result = withRegisteredTools(nextList[existingIndex]);
|
|
47
|
+
if (result.changed) {
|
|
48
|
+
nextList[existingIndex] = result.agent;
|
|
49
|
+
changes.push(`Added ${result.added.join(", ")} to agents.list[id=${HEDGEHOG_AGENT_ID}].tools.alsoAllow.`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const result = withRegisteredTools({ id: HEDGEHOG_AGENT_ID });
|
|
54
|
+
nextList.push(result.agent);
|
|
55
|
+
changes.push(`Added ${result.added.join(", ")} to agents.list[id=${HEDGEHOG_AGENT_ID}].tools.alsoAllow.`);
|
|
56
|
+
}
|
|
57
|
+
const mainResult = upsertAgentTools(nextList, MAIN_AGENT_ID, MAIN_AGENT_EXTRA_TOOL_NAMES);
|
|
58
|
+
if (mainResult.changed) {
|
|
59
|
+
changes.push(`Added ${mainResult.added.join(", ")} to agents.list[id=${MAIN_AGENT_ID}].tools.alsoAllow.`);
|
|
60
|
+
}
|
|
61
|
+
if (changes.length === 0)
|
|
62
|
+
return null;
|
|
63
|
+
return {
|
|
64
|
+
config: {
|
|
65
|
+
...config,
|
|
66
|
+
agents: {
|
|
67
|
+
...agents,
|
|
68
|
+
list: nextList
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
changes
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=openclawConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclawConfig.js","sourceRoot":"","sources":["../../src/openclawConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { allFeaturesTools } from "./features/index.js";
|
|
2
|
+
export const HEDGEHOG_AGENT_ID = "hedgehog-finance";
|
|
3
|
+
export const MAIN_AGENT_ID = "main";
|
|
4
|
+
export const MAIN_AGENT_EXTRA_TOOL_NAMES = ["update_hedgehog_skill_versions"];
|
|
5
|
+
export function listRegisteredAgentToolNames() {
|
|
6
|
+
return Object.entries(allFeaturesTools)
|
|
7
|
+
.filter(([, tool]) => tool.registerTool !== false && tool.agentToolTarget !== "main")
|
|
8
|
+
.map(([name]) => name);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=openclawConstants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclawConstants.js","sourceRoot":"","sources":["../../src/openclawConstants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AACpD,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC;AACpC,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAE9E,MAAM,UAAU,4BAA4B;IAC3C,OAAO,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC;SACrC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,KAAK,KAAK,IAAI,IAAI,CAAC,eAAe,KAAK,MAAM,CAAC;SACpF,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
|
package/dist/src/runtime.js
CHANGED
|
@@ -1,9 +1,28 @@
|
|
|
1
1
|
import path from "path";
|
|
2
2
|
import * as os from "node:os";
|
|
3
3
|
import { logger } from "./core/logger.js";
|
|
4
|
+
import { ensureRegisteredToolsAllowedInConfig } from "./openclawConfig.js";
|
|
4
5
|
let runtime = null;
|
|
5
6
|
let dbPath = "";
|
|
6
7
|
let backupDir = "";
|
|
8
|
+
async function ensureAgentToolAllowConfig(next) {
|
|
9
|
+
try {
|
|
10
|
+
if (typeof next.config.mutateConfigFile !== "function")
|
|
11
|
+
return;
|
|
12
|
+
await next.config.mutateConfigFile({
|
|
13
|
+
afterWrite: { mode: "auto" },
|
|
14
|
+
mutate(draft) {
|
|
15
|
+
const migrated = ensureRegisteredToolsAllowedInConfig(draft);
|
|
16
|
+
if (!migrated)
|
|
17
|
+
return;
|
|
18
|
+
Object.assign(draft, migrated.config);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
logger.error({ err: e }, "Failed to ensure Hedgehog agent tool allow config");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
7
26
|
export function setHedgehogRuntime(next) {
|
|
8
27
|
runtime = next;
|
|
9
28
|
try {
|
|
@@ -19,6 +38,7 @@ export function setHedgehogRuntime(next) {
|
|
|
19
38
|
catch (e) {
|
|
20
39
|
logger.error({ err: e }, "Failed to resolve workspace");
|
|
21
40
|
}
|
|
41
|
+
void ensureAgentToolAllowConfig(next);
|
|
22
42
|
}
|
|
23
43
|
export function getDbPath() {
|
|
24
44
|
if (!dbPath)
|
package/dist/src/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AAE3E,IAAI,OAAO,GAAyB,IAAI,CAAC;AACzC,IAAI,MAAM,GAAW,EAAE,CAAC;AACxB,IAAI,SAAS,GAAW,EAAE,CAAC;AAE3B,KAAK,UAAU,0BAA0B,CAAC,IAAmB;IAC5D,IAAI,CAAC;QACJ,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,KAAK,UAAU;YAAE,OAAO;QAC/D,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;YAClC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YAC5B,MAAM,CAAC,KAAK;gBACX,MAAM,QAAQ,GAAG,oCAAoC,CAAC,KAAK,CAAC,CAAC;gBAC7D,IAAI,CAAC,QAAQ;oBAAE,OAAO;gBACtB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;SACD,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,mDAAmD,CAAC,CAAC;IAC/E,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAmB;IACrD,OAAO,GAAG,IAAI,CAAC;IAEf,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAyC,CAAC;QACnF,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,kBAAkB,CAAC,CAAC;QACzE,MAAM,YAAY,GAAG,aAAa,EAAE,SAAS;YAC5C,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS;YAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAC;QAE5D,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QACxD,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,6BAA6B,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,0BAA0B,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,SAAS;IACxB,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY;IAC3B,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC5E,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB;IACjC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACxE,OAAO,OAAO,CAAC;AAChB,CAAC"}
|
package/index.ts
CHANGED
|
@@ -1,7 +1,51 @@
|
|
|
1
1
|
import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";
|
|
2
|
+
import { jsonResult, type AnyAgentTool, type OpenClawPluginApi } from "openclaw/plugin-sdk/core";
|
|
2
3
|
import { hedgehogFinancePlugin } from "./src/channel.js";
|
|
3
4
|
import { setHedgehogRuntime } from "./src/runtime.js";
|
|
4
5
|
import { allFeaturesTools } from "./src/features/index.js";
|
|
6
|
+
import { getDB } from "./src/core/database.js";
|
|
7
|
+
import { logger } from "./src/core/logger.js";
|
|
8
|
+
import { registerDailyMorningBriefingCron } from "./src/dailyMorningBriefingCron.js";
|
|
9
|
+
|
|
10
|
+
const registeredToolApis = new WeakSet<OpenClawPluginApi>();
|
|
11
|
+
|
|
12
|
+
function registerFeatureTools(api: OpenClawPluginApi): void {
|
|
13
|
+
if (registeredToolApis.has(api)) return;
|
|
14
|
+
registeredToolApis.add(api);
|
|
15
|
+
|
|
16
|
+
Object.entries(allFeaturesTools).forEach(([name, tool]) => {
|
|
17
|
+
if (tool.registerTool === false) return;
|
|
18
|
+
const registerable: AnyAgentTool = {
|
|
19
|
+
name,
|
|
20
|
+
label: tool.label || tool.description,
|
|
21
|
+
description: tool.description,
|
|
22
|
+
parameters: tool.parameters as any,
|
|
23
|
+
async execute(_toolCallId, params) {
|
|
24
|
+
const result = await tool.execute(params);
|
|
25
|
+
const payload: unknown = JSON.parse(result);
|
|
26
|
+
if (
|
|
27
|
+
payload &&
|
|
28
|
+
typeof payload === "object" &&
|
|
29
|
+
"success" in payload &&
|
|
30
|
+
payload.success === false
|
|
31
|
+
) {
|
|
32
|
+
const error = "error" in payload ? payload.error : undefined;
|
|
33
|
+
throw new Error(typeof error === "string" ? error : `${name} failed`);
|
|
34
|
+
}
|
|
35
|
+
return jsonResult(payload);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
api.registerTool(registerable, { name });
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function initializeDatabase(): void {
|
|
43
|
+
try {
|
|
44
|
+
getDB();
|
|
45
|
+
} catch (err) {
|
|
46
|
+
logger.error({ err }, "Failed to initialize Hedgehog database");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
5
49
|
|
|
6
50
|
export default defineChannelPluginEntry({
|
|
7
51
|
id: "hedgehog_finance",
|
|
@@ -10,12 +54,15 @@ export default defineChannelPluginEntry({
|
|
|
10
54
|
plugin: hedgehogFinancePlugin,
|
|
11
55
|
setRuntime(runtime) {
|
|
12
56
|
setHedgehogRuntime(runtime);
|
|
57
|
+
initializeDatabase();
|
|
58
|
+
},
|
|
59
|
+
registerCliMetadata(api) {
|
|
60
|
+
registerFeatureTools(api);
|
|
13
61
|
},
|
|
14
62
|
registerFull(api) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
});
|
|
63
|
+
setHedgehogRuntime(api.runtime);
|
|
64
|
+
initializeDatabase();
|
|
65
|
+
registerDailyMorningBriefingCron(api);
|
|
66
|
+
registerFeatureTools(api);
|
|
20
67
|
},
|
|
21
68
|
});
|
package/openclaw.plugin.json
CHANGED
|
@@ -6,6 +6,30 @@
|
|
|
6
6
|
],
|
|
7
7
|
"name": "Hedgehog Finance Comprehensive Plugin",
|
|
8
8
|
"description": "WebSocket Channel & Watchlist SQLite Tools for Hedgehog App",
|
|
9
|
+
"contracts": {
|
|
10
|
+
"tools": [
|
|
11
|
+
"get_watchlist",
|
|
12
|
+
"get_industry_list",
|
|
13
|
+
"save_daily_morning_briefing",
|
|
14
|
+
"save_stock_ai_analysis",
|
|
15
|
+
"save_information_verification",
|
|
16
|
+
"save_article_deep_reasoning_analysis",
|
|
17
|
+
"get_stock_basic_info",
|
|
18
|
+
"get_stock_note",
|
|
19
|
+
"update_hedgehog_skill_versions"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"setup": {
|
|
23
|
+
"configMigrations": [
|
|
24
|
+
"daily_morning_briefing_agent_tools"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
"configContracts": {
|
|
28
|
+
"compatibilityMigrationPaths": [
|
|
29
|
+
"agents",
|
|
30
|
+
"plugins.entries.hedgehog_finance"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
9
33
|
"configSchema": {
|
|
10
34
|
"type": "object",
|
|
11
35
|
"additionalProperties": false,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hedgehog-finance/hedgehog-plugin",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.23",
|
|
4
4
|
"description": "Hedgehog App WebSocket channel and Watchlist Tools for OpenClaw",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bot",
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"dist/**/*.js.map",
|
|
21
21
|
"dist/**/*.d.ts",
|
|
22
22
|
"index.ts",
|
|
23
|
+
"setup-api.ts",
|
|
23
24
|
"src/**/*.ts",
|
|
24
25
|
"openclaw.plugin.json",
|
|
25
26
|
"LICENSE"
|
|
@@ -42,23 +43,37 @@
|
|
|
42
43
|
},
|
|
43
44
|
"openclaw": {
|
|
44
45
|
"kind": "channel",
|
|
46
|
+
"contracts": {
|
|
47
|
+
"tools": [
|
|
48
|
+
"get_watchlist",
|
|
49
|
+
"get_industry_list",
|
|
50
|
+
"save_daily_morning_briefing",
|
|
51
|
+
"save_stock_ai_analysis",
|
|
52
|
+
"save_information_verification",
|
|
53
|
+
"save_article_deep_reasoning_analysis",
|
|
54
|
+
"get_stock_basic_info",
|
|
55
|
+
"get_stock_note",
|
|
56
|
+
"update_hedgehog_skill_versions"
|
|
57
|
+
]
|
|
58
|
+
},
|
|
45
59
|
"extensions": [
|
|
46
60
|
"./index.ts"
|
|
47
61
|
],
|
|
48
62
|
"runtimeExtensions": [
|
|
49
63
|
"./dist/index.js"
|
|
50
64
|
],
|
|
65
|
+
"setupEntry": "./dist/setup-api.js",
|
|
51
66
|
"install": {
|
|
52
67
|
"npmSpec": "@hedgehog-finance/hedgehog-plugin",
|
|
53
68
|
"defaultChoice": "npm"
|
|
54
69
|
},
|
|
55
70
|
"compat": {
|
|
56
|
-
"pluginApi": ">=2026.5.
|
|
57
|
-
"minGatewayVersion": "2026.5.
|
|
71
|
+
"pluginApi": ">=2026.5.4",
|
|
72
|
+
"minGatewayVersion": "2026.5.4"
|
|
58
73
|
},
|
|
59
74
|
"build": {
|
|
60
|
-
"openclawVersion": "2026.5.
|
|
61
|
-
"pluginSdkVersion": "2026.5.
|
|
75
|
+
"openclawVersion": "2026.5.4",
|
|
76
|
+
"pluginSdkVersion": "2026.5.4"
|
|
62
77
|
}
|
|
63
78
|
}
|
|
64
79
|
}
|
package/setup-api.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OpenClawConfig, OpenClawPluginApi } from "openclaw/plugin-sdk/core";
|
|
2
|
+
import { ensureRegisteredToolsAllowedInConfig } from "./src/openclawConfig.js";
|
|
3
|
+
|
|
4
|
+
function migrateDailyBriefingAgentTools(config: OpenClawConfig): { config: OpenClawConfig; changes: string[] } | null {
|
|
5
|
+
return ensureRegisteredToolsAllowedInConfig(config);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export default function register(api: OpenClawPluginApi): void {
|
|
9
|
+
api.registerConfigMigration(migrateDailyBriefingAgentTools);
|
|
10
|
+
}
|
package/src/channel.ts
CHANGED
|
@@ -179,8 +179,8 @@ function parseStockAnalysisRequest(text: string, chatId?: string) {
|
|
|
179
179
|
const payload = body as Record<string, unknown>;
|
|
180
180
|
const cwContent = typeof payload.cw_content === "string" ? payload.cw_content.trim() : "";
|
|
181
181
|
|
|
182
|
-
let
|
|
183
|
-
let
|
|
182
|
+
let stock_code = "";
|
|
183
|
+
let stock_name = "";
|
|
184
184
|
|
|
185
185
|
// 1. Try parsing cw_context if it exists
|
|
186
186
|
const cwContext = typeof payload.cw_context === "string" ? payload.cw_context.trim() : "";
|
|
@@ -188,40 +188,41 @@ function parseStockAnalysisRequest(text: string, chatId?: string) {
|
|
|
188
188
|
try {
|
|
189
189
|
const parsedContext = JSON.parse(cwContext);
|
|
190
190
|
if (parsedContext && typeof parsedContext === "object" && !Array.isArray(parsedContext)) {
|
|
191
|
-
|
|
192
|
-
|
|
191
|
+
if ((parsedContext as Record<string, unknown>).saveMode === "tool") return null;
|
|
192
|
+
stock_code = typeof parsedContext.stock_code === "string" ? parsedContext.stock_code.trim() : "";
|
|
193
|
+
stock_name = typeof parsedContext.stock_name === "string" ? parsedContext.stock_name.trim() : "";
|
|
193
194
|
}
|
|
194
195
|
} catch {
|
|
195
|
-
// If not a valid JSON string, treat cwContext as the plain
|
|
196
|
-
|
|
196
|
+
// If not a valid JSON string, treat cwContext as the plain stock_code
|
|
197
|
+
stock_code = cwContext;
|
|
197
198
|
}
|
|
198
199
|
}
|
|
199
200
|
|
|
200
|
-
// 2. If we found a
|
|
201
|
-
if (
|
|
201
|
+
// 2. If we found a stock_code but no stock_name, attempt database lookups
|
|
202
|
+
if (stock_code && !stock_name) {
|
|
202
203
|
try {
|
|
203
204
|
const db = getDB();
|
|
204
|
-
const normalizedCode =
|
|
205
|
-
// Query
|
|
206
|
-
let row = db.prepare(`SELECT
|
|
207
|
-
.get(normalizedCode, normalizedCode.replace(/\.SH$/i, "").replace(/\.SZ$/i, "").replace(/\.HK$/i, "")) as {
|
|
205
|
+
const normalizedCode = stock_code.toUpperCase().replace(/\.SS$/i, ".SH");
|
|
206
|
+
// Query stock classification cache first
|
|
207
|
+
let row = db.prepare(`SELECT stock_name FROM stock_classification_cache WHERE stock_code = ? OR stock_code = ? LIMIT 1`)
|
|
208
|
+
.get(normalizedCode, normalizedCode.replace(/\.SH$/i, "").replace(/\.SZ$/i, "").replace(/\.HK$/i, "")) as { stock_name: string } | undefined;
|
|
208
209
|
if (!row) {
|
|
209
210
|
// Fallback to watchlist
|
|
210
|
-
row = db.prepare(`SELECT
|
|
211
|
-
.get(normalizedCode) as {
|
|
211
|
+
row = db.prepare(`SELECT stock_name FROM watchlist WHERE stock_code = ? LIMIT 1`)
|
|
212
|
+
.get(normalizedCode) as { stock_name: string } | undefined;
|
|
212
213
|
}
|
|
213
|
-
if (row?.
|
|
214
|
-
|
|
214
|
+
if (row?.stock_name) {
|
|
215
|
+
stock_name = row.stock_name;
|
|
215
216
|
} else {
|
|
216
|
-
|
|
217
|
+
stock_name = stock_code; // fallback to code if name not found in db
|
|
217
218
|
}
|
|
218
219
|
} catch {
|
|
219
|
-
|
|
220
|
+
stock_name = stock_code;
|
|
220
221
|
}
|
|
221
222
|
}
|
|
222
223
|
|
|
223
|
-
// 3. Fallback to legacy cwContent/chatId parsing if no
|
|
224
|
-
if (!
|
|
224
|
+
// 3. Fallback to legacy cwContent/chatId parsing if no stock_code was found via cw_context
|
|
225
|
+
if (!stock_code) {
|
|
225
226
|
if (!cwContent.startsWith("分析一下") || !cwContent.endsWith("股票")) {
|
|
226
227
|
return null;
|
|
227
228
|
}
|
|
@@ -229,10 +230,10 @@ function parseStockAnalysisRequest(text: string, chatId?: string) {
|
|
|
229
230
|
const chatIdMatch = typeof chatId === "string"
|
|
230
231
|
? /^stock_analysis_(.+)_\d+$/.exec(chatId)
|
|
231
232
|
: null;
|
|
232
|
-
|
|
233
|
+
stock_code = typeof payload.cw_stock_code === "string"
|
|
233
234
|
? payload.cw_stock_code.trim()
|
|
234
235
|
: chatIdMatch?.[1]?.trim() || "";
|
|
235
|
-
|
|
236
|
+
stock_name = typeof payload.cw_stock_name === "string"
|
|
236
237
|
? payload.cw_stock_name.trim()
|
|
237
238
|
: cwContent.replace(/^分析一下/, "").replace(/股票$/, "").trim();
|
|
238
239
|
}
|
|
@@ -241,11 +242,11 @@ function parseStockAnalysisRequest(text: string, chatId?: string) {
|
|
|
241
242
|
? payload.cw_market.trim()
|
|
242
243
|
: "CN";
|
|
243
244
|
|
|
244
|
-
if (!
|
|
245
|
+
if (!stock_code || !stock_name) {
|
|
245
246
|
return null;
|
|
246
247
|
}
|
|
247
248
|
|
|
248
|
-
return {
|
|
249
|
+
return { stock_code, stock_name, market };
|
|
249
250
|
}
|
|
250
251
|
|
|
251
252
|
async function getJsonlLineCountAsync(agentId: string, sessionId: string): Promise<number> {
|
|
@@ -733,7 +734,7 @@ export const hedgehogFinancePlugin: ChannelPlugin<HedgehogFinanceResolvedAccount
|
|
|
733
734
|
didSaveStockAnalysis = true;
|
|
734
735
|
} catch (err: any) {
|
|
735
736
|
const message = err?.message || "保存股票 AI 分析失败";
|
|
736
|
-
childLogger.error({ err: message, chatId,
|
|
737
|
+
childLogger.error({ err: message, chatId, stock_code: stockAnalysisRequest.stock_code }, "保存股票 AI 分析失败");
|
|
737
738
|
sendEvent("error", { error: message });
|
|
738
739
|
throw err;
|
|
739
740
|
}
|