@hedgehog-finance/hedgehog-plugin 1.0.21 → 1.0.22

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 (111) hide show
  1. package/dist/index.d.ts +4 -3
  2. package/dist/index.js +49 -6
  3. package/dist/index.js.map +1 -1
  4. package/dist/setup-api.d.ts +2 -0
  5. package/dist/setup-api.js +8 -0
  6. package/dist/setup-api.js.map +1 -0
  7. package/dist/src/channel.js +25 -23
  8. package/dist/src/channel.js.map +1 -1
  9. package/dist/src/core/database.js +449 -39
  10. package/dist/src/core/database.js.map +1 -1
  11. package/dist/src/dailyMorningBriefingCron.d.ts +46 -0
  12. package/dist/src/dailyMorningBriefingCron.js +82 -0
  13. package/dist/src/dailyMorningBriefingCron.js.map +1 -0
  14. package/dist/src/features/chartOutput.d.ts +2 -0
  15. package/dist/src/features/chartOutput.js +35 -0
  16. package/dist/src/features/chartOutput.js.map +1 -0
  17. package/dist/src/features/dailyMorningBriefing/schema.d.ts +56 -0
  18. package/dist/src/features/dailyMorningBriefing/schema.js +22 -0
  19. package/dist/src/features/dailyMorningBriefing/schema.js.map +1 -0
  20. package/dist/src/features/dailyMorningBriefing/tools.d.ts +12 -0
  21. package/dist/src/features/dailyMorningBriefing/tools.js +204 -0
  22. package/dist/src/features/dailyMorningBriefing/tools.js.map +1 -0
  23. package/dist/src/features/deepReasoning/schema.d.ts +43 -0
  24. package/dist/src/features/deepReasoning/schema.js +17 -0
  25. package/dist/src/features/deepReasoning/schema.js.map +1 -0
  26. package/dist/src/features/deepReasoning/tools.d.ts +12 -0
  27. package/dist/src/features/deepReasoning/tools.js +163 -0
  28. package/dist/src/features/deepReasoning/tools.js.map +1 -0
  29. package/dist/src/features/index.d.ts +2 -1
  30. package/dist/src/features/index.js +9 -1
  31. package/dist/src/features/index.js.map +1 -1
  32. package/dist/src/features/informationVerification/schema.d.ts +43 -0
  33. package/dist/src/features/informationVerification/schema.js +17 -0
  34. package/dist/src/features/informationVerification/schema.js.map +1 -0
  35. package/dist/src/features/informationVerification/tools.d.ts +12 -0
  36. package/dist/src/features/informationVerification/tools.js +162 -0
  37. package/dist/src/features/informationVerification/tools.js.map +1 -0
  38. package/dist/src/features/notes/schema.d.ts +136 -39
  39. package/dist/src/features/notes/schema.js +13 -10
  40. package/dist/src/features/notes/schema.js.map +1 -1
  41. package/dist/src/features/notes/tools.d.ts +1 -0
  42. package/dist/src/features/notes/tools.js +47 -14
  43. package/dist/src/features/notes/tools.js.map +1 -1
  44. package/dist/src/features/pluginInfo/schema.d.ts +79 -0
  45. package/dist/src/features/pluginInfo/schema.js +14 -0
  46. package/dist/src/features/pluginInfo/schema.js.map +1 -0
  47. package/dist/src/features/pluginInfo/tools.d.ts +1 -0
  48. package/dist/src/features/pluginInfo/tools.js +157 -2
  49. package/dist/src/features/pluginInfo/tools.js.map +1 -1
  50. package/dist/src/features/profileLibrary/schema.d.ts +34 -6
  51. package/dist/src/features/profileLibrary/schema.js +1 -1
  52. package/dist/src/features/profileLibrary/schema.js.map +1 -1
  53. package/dist/src/features/stockAnalysis/schema.d.ts +224 -31
  54. package/dist/src/features/stockAnalysis/schema.js +76 -12
  55. package/dist/src/features/stockAnalysis/schema.js.map +1 -1
  56. package/dist/src/features/stockAnalysis/tools.d.ts +6 -4
  57. package/dist/src/features/stockAnalysis/tools.js +389 -44
  58. package/dist/src/features/stockAnalysis/tools.js.map +1 -1
  59. package/dist/src/features/stockBasic/schema.d.ts +149 -0
  60. package/dist/src/features/stockBasic/schema.js +26 -0
  61. package/dist/src/features/stockBasic/schema.js.map +1 -0
  62. package/dist/src/features/stockBasic/tools.d.ts +12 -0
  63. package/dist/src/features/stockBasic/tools.js +124 -0
  64. package/dist/src/features/stockBasic/tools.js.map +1 -0
  65. package/dist/src/features/watchlist/logic.d.ts +3 -3
  66. package/dist/src/features/watchlist/logic.js +47 -46
  67. package/dist/src/features/watchlist/logic.js.map +1 -1
  68. package/dist/src/features/watchlist/schema.d.ts +89 -54
  69. package/dist/src/features/watchlist/schema.js +7 -4
  70. package/dist/src/features/watchlist/schema.js.map +1 -1
  71. package/dist/src/features/watchlist/tools.d.ts +106 -59
  72. package/dist/src/features/watchlist/tools.js +182 -104
  73. package/dist/src/features/watchlist/tools.js.map +1 -1
  74. package/dist/src/openclawConfig.d.ts +6 -0
  75. package/dist/src/openclawConfig.js +74 -0
  76. package/dist/src/openclawConfig.js.map +1 -0
  77. package/dist/src/openclawConstants.d.ts +4 -0
  78. package/dist/src/openclawConstants.js +10 -0
  79. package/dist/src/openclawConstants.js.map +1 -0
  80. package/dist/src/runtime.js +20 -0
  81. package/dist/src/runtime.js.map +1 -1
  82. package/index.ts +52 -5
  83. package/openclaw.plugin.json +24 -0
  84. package/package.json +21 -6
  85. package/setup-api.ts +10 -0
  86. package/src/channel.ts +26 -25
  87. package/src/core/database.ts +447 -40
  88. package/src/dailyMorningBriefingCron.ts +129 -0
  89. package/src/features/chartOutput.ts +35 -0
  90. package/src/features/dailyMorningBriefing/schema.ts +38 -0
  91. package/src/features/dailyMorningBriefing/tools.ts +246 -0
  92. package/src/features/deepReasoning/schema.ts +22 -0
  93. package/src/features/deepReasoning/tools.ts +182 -0
  94. package/src/features/index.ts +11 -2
  95. package/src/features/informationVerification/schema.ts +22 -0
  96. package/src/features/informationVerification/tools.ts +181 -0
  97. package/src/features/notes/schema.ts +17 -12
  98. package/src/features/notes/tools.ts +54 -17
  99. package/src/features/pluginInfo/schema.ts +19 -0
  100. package/src/features/pluginInfo/tools.ts +173 -2
  101. package/src/features/profileLibrary/schema.ts +1 -1
  102. package/src/features/stockAnalysis/schema.ts +99 -17
  103. package/src/features/stockAnalysis/tools.ts +447 -49
  104. package/src/features/stockBasic/schema.ts +33 -0
  105. package/src/features/stockBasic/tools.ts +157 -0
  106. package/src/features/watchlist/logic.ts +56 -53
  107. package/src/features/watchlist/schema.ts +11 -6
  108. package/src/features/watchlist/tools.ts +191 -106
  109. package/src/openclawConfig.ts +101 -0
  110. package/src/openclawConstants.ts +11 -0
  111. 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,4 @@
1
+ export declare const HEDGEHOG_AGENT_ID = "hedgehog-finance";
2
+ export declare const MAIN_AGENT_ID = "main";
3
+ export declare const MAIN_AGENT_EXTRA_TOOL_NAMES: string[];
4
+ export declare function listRegisteredAgentToolNames(): string[];
@@ -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"}
@@ -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)
@@ -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;AAE1C,IAAI,OAAO,GAAyB,IAAI,CAAC;AACzC,IAAI,MAAM,GAAW,EAAE,CAAC;AACxB,IAAI,SAAS,GAAW,EAAE,CAAC;AAE3B,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;AACF,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"}
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
- Object.entries(allFeaturesTools).forEach(([name, tool]) => {
16
- if (tool.registerTool === false) return;
17
- const registerable = { ...tool, label: tool.description };
18
- api.registerTool(registerable as any, { name });
19
- });
63
+ setHedgehogRuntime(api.runtime);
64
+ initializeDatabase();
65
+ registerDailyMorningBriefingCron(api);
66
+ registerFeatureTools(api);
20
67
  },
21
68
  });
@@ -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.21",
3
+ "version": "1.0.22",
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.27",
57
- "minGatewayVersion": "2026.5.27"
71
+ "pluginApi": ">=2026.5.4",
72
+ "minGatewayVersion": "2026.5.4"
58
73
  },
59
74
  "build": {
60
- "openclawVersion": "2026.5.27",
61
- "pluginSdkVersion": "2026.5.27"
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 stockCode = "";
183
- let stockName = "";
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
- stockCode = typeof parsedContext.stockCode === "string" ? parsedContext.stockCode.trim() : "";
192
- stockName = typeof parsedContext.stockName === "string" ? parsedContext.stockName.trim() : "";
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 stockCode
196
- stockCode = cwContext;
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 stockCode but no stockName, attempt database lookups
201
- if (stockCode && !stockName) {
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 = stockCode.toUpperCase().replace(/\.SS$/i, ".SH");
205
- // Query global_stock_metadata first
206
- let row = db.prepare(`SELECT stockName FROM global_stock_metadata WHERE stockCode = ? OR stockCode = ? LIMIT 1`)
207
- .get(normalizedCode, normalizedCode.replace(/\.SH$/i, "").replace(/\.SZ$/i, "").replace(/\.HK$/i, "")) as { stockName: string } | undefined;
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 stockName FROM watchlist WHERE stockCode = ? LIMIT 1`)
211
- .get(normalizedCode) as { stockName: string } | undefined;
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?.stockName) {
214
- stockName = row.stockName;
214
+ if (row?.stock_name) {
215
+ stock_name = row.stock_name;
215
216
  } else {
216
- stockName = stockCode; // fallback to code if name not found in db
217
+ stock_name = stock_code; // fallback to code if name not found in db
217
218
  }
218
219
  } catch {
219
- stockName = stockCode;
220
+ stock_name = stock_code;
220
221
  }
221
222
  }
222
223
 
223
- // 3. Fallback to legacy cwContent/chatId parsing if no stockCode was found via cw_context
224
- if (!stockCode) {
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
- stockCode = typeof payload.cw_stock_code === "string"
233
+ stock_code = typeof payload.cw_stock_code === "string"
233
234
  ? payload.cw_stock_code.trim()
234
235
  : chatIdMatch?.[1]?.trim() || "";
235
- stockName = typeof payload.cw_stock_name === "string"
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 (!stockCode || !stockName) {
245
+ if (!stock_code || !stock_name) {
245
246
  return null;
246
247
  }
247
248
 
248
- return { stockCode, stockName, market };
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, stockCode: stockAnalysisRequest.stockCode }, "保存股票 AI 分析失败");
737
+ childLogger.error({ err: message, chatId, stock_code: stockAnalysisRequest.stock_code }, "保存股票 AI 分析失败");
737
738
  sendEvent("error", { error: message });
738
739
  throw err;
739
740
  }