@senpi/runtime 3.0.81 → 3.0.83

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 (102) hide show
  1. package/dist/actions/decision-engine.d.ts +16 -0
  2. package/dist/actions/decision-engine.d.ts.map +1 -1
  3. package/dist/actions/decision-engine.js +137 -1
  4. package/dist/actions/decision-engine.js.map +1 -1
  5. package/dist/cli/guide-commands.d.ts.map +1 -1
  6. package/dist/cli/guide-commands.js +33 -0
  7. package/dist/cli/guide-commands.js.map +1 -1
  8. package/dist/cli/senpi-commands.d.ts.map +1 -1
  9. package/dist/cli/senpi-commands.js +12 -0
  10. package/dist/cli/senpi-commands.js.map +1 -1
  11. package/dist/cli/update-command.d.ts +70 -0
  12. package/dist/cli/update-command.d.ts.map +1 -0
  13. package/dist/cli/update-command.js +132 -0
  14. package/dist/cli/update-command.js.map +1 -0
  15. package/dist/dsl/plugin/index.d.ts +35 -1
  16. package/dist/dsl/plugin/index.d.ts.map +1 -1
  17. package/dist/dsl/plugin/index.js +62 -7
  18. package/dist/dsl/plugin/index.js.map +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +87 -6
  21. package/dist/index.js.map +1 -1
  22. package/dist/runtime/effective-config.d.ts +67 -0
  23. package/dist/runtime/effective-config.d.ts.map +1 -0
  24. package/dist/runtime/effective-config.js +324 -0
  25. package/dist/runtime/effective-config.js.map +1 -0
  26. package/dist/runtime/lifecycle-events.d.ts +19 -0
  27. package/dist/runtime/lifecycle-events.d.ts.map +1 -1
  28. package/dist/runtime/lifecycle-events.js +27 -0
  29. package/dist/runtime/lifecycle-events.js.map +1 -1
  30. package/dist/runtime/rebuild-errors.d.ts +26 -0
  31. package/dist/runtime/rebuild-errors.d.ts.map +1 -0
  32. package/dist/runtime/rebuild-errors.js +36 -0
  33. package/dist/runtime/rebuild-errors.js.map +1 -0
  34. package/dist/runtime/run.d.ts +10 -0
  35. package/dist/runtime/run.d.ts.map +1 -1
  36. package/dist/runtime/run.js +13 -1
  37. package/dist/runtime/run.js.map +1 -1
  38. package/dist/runtime/runtime.d.ts +99 -1
  39. package/dist/runtime/runtime.d.ts.map +1 -1
  40. package/dist/runtime/runtime.js +321 -127
  41. package/dist/runtime/runtime.js.map +1 -1
  42. package/dist/runtime/update-apply-deps.d.ts +43 -0
  43. package/dist/runtime/update-apply-deps.d.ts.map +1 -0
  44. package/dist/runtime/update-apply-deps.js +62 -0
  45. package/dist/runtime/update-apply-deps.js.map +1 -0
  46. package/dist/runtime/update-handler.d.ts +158 -0
  47. package/dist/runtime/update-handler.d.ts.map +1 -0
  48. package/dist/runtime/update-handler.js +252 -0
  49. package/dist/runtime/update-handler.js.map +1 -0
  50. package/dist/runtime/update-plan.d.ts +60 -0
  51. package/dist/runtime/update-plan.d.ts.map +1 -0
  52. package/dist/runtime/update-plan.js +164 -0
  53. package/dist/runtime/update-plan.js.map +1 -0
  54. package/dist/runtime/update-register.d.ts +72 -0
  55. package/dist/runtime/update-register.d.ts.map +1 -0
  56. package/dist/runtime/update-register.js +146 -0
  57. package/dist/runtime/update-register.js.map +1 -0
  58. package/dist/runtime/update-report.d.ts +93 -0
  59. package/dist/runtime/update-report.d.ts.map +1 -0
  60. package/dist/runtime/update-report.js +133 -0
  61. package/dist/runtime/update-report.js.map +1 -0
  62. package/dist/skills-manager/manifest.d.ts.map +1 -1
  63. package/dist/skills-manager/manifest.js +1 -0
  64. package/dist/skills-manager/manifest.js.map +1 -1
  65. package/dist/skills-manager/skills-manifest.json +1 -0
  66. package/dist/utils/event-catalog.d.ts +26 -0
  67. package/dist/utils/event-catalog.d.ts.map +1 -1
  68. package/dist/utils/event-catalog.js +1 -0
  69. package/dist/utils/event-catalog.js.map +1 -1
  70. package/dist/widgets/errors.d.ts +3 -15
  71. package/dist/widgets/errors.d.ts.map +1 -1
  72. package/dist/widgets/errors.js +3 -20
  73. package/dist/widgets/errors.js.map +1 -1
  74. package/dist/widgets/index.d.ts +3 -10
  75. package/dist/widgets/index.d.ts.map +1 -1
  76. package/dist/widgets/index.js +3 -6
  77. package/dist/widgets/index.js.map +1 -1
  78. package/dist/widgets/registry.d.ts.map +1 -1
  79. package/dist/widgets/registry.js +10 -3
  80. package/dist/widgets/registry.js.map +1 -1
  81. package/dist/widgets/tool.d.ts +6 -9
  82. package/dist/widgets/tool.d.ts.map +1 -1
  83. package/dist/widgets/tool.js +37 -147
  84. package/dist/widgets/tool.js.map +1 -1
  85. package/dist/widgets/types.d.ts +20 -58
  86. package/dist/widgets/types.d.ts.map +1 -1
  87. package/dist/widgets/types.js +4 -4
  88. package/dist/widgets/widgets/fund-user-wallet.d.ts +4 -5
  89. package/dist/widgets/widgets/fund-user-wallet.d.ts.map +1 -1
  90. package/dist/widgets/widgets/fund-user-wallet.js +27 -67
  91. package/dist/widgets/widgets/fund-user-wallet.js.map +1 -1
  92. package/openclaw.plugin.json +1 -4
  93. package/package.json +2 -3
  94. package/dist/widgets/strategy-lookup.d.ts +0 -39
  95. package/dist/widgets/strategy-lookup.d.ts.map +0 -1
  96. package/dist/widgets/strategy-lookup.js +0 -70
  97. package/dist/widgets/strategy-lookup.js.map +0 -1
  98. package/dist/widgets/widgets/fund-strategy-wallet.d.ts +0 -13
  99. package/dist/widgets/widgets/fund-strategy-wallet.d.ts.map +0 -1
  100. package/dist/widgets/widgets/fund-strategy-wallet.js +0 -139
  101. package/dist/widgets/widgets/fund-strategy-wallet.js.map +0 -1
  102. package/skills/senpi-widgets/SKILL.md +0 -167
@@ -1,23 +1,11 @@
1
1
  /**
2
- * The two ways a `show_widget` call fails on purpose. Both reach the model as
3
- * tool errors, and they must not read alike: one says "your args are wrong",
4
- * the other says "we could not check them". A model told the second is expected
5
- * to retry with the same args; a model told the first is expected to change them.
2
+ * The one way a `show_widget` call fails on purpose: the args are wrong. It
3
+ * reaches the model as a tool error and carries the offending field names, so
4
+ * the WARN log and the model see the same list.
6
5
  */
7
- /** Carries the offending field names so the WARN log and the model see the same list. */
8
6
  export declare class WidgetValidationError extends Error {
9
7
  readonly widgetType: string;
10
8
  readonly fields: string[];
11
9
  constructor(message: string, widgetType: string, fields: string[]);
12
10
  }
13
- /**
14
- * A check the widget needs could not be completed — the backend timed out,
15
- * answered unusably, or is not wired in. The args are not blamed: they were
16
- * never judged.
17
- */
18
- export declare class WidgetLookupError extends Error {
19
- readonly widgetType: string;
20
- readonly cause?: unknown | undefined;
21
- constructor(message: string, widgetType: string, cause?: unknown | undefined);
22
- }
23
11
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/widgets/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yFAAyF;AACzF,qBAAa,qBAAsB,SAAQ,KAAK;IAG5C,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE;gBAFzB,OAAO,EAAE,MAAM,EACN,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EAAE;CAK5B;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAGxC,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;gBAFxB,OAAO,EAAE,MAAM,EACN,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,OAAO,YAAA;CAK3B"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/widgets/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAG5C,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE;gBAFzB,OAAO,EAAE,MAAM,EACN,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EAAE;CAK5B"}
@@ -1,10 +1,8 @@
1
1
  /**
2
- * The two ways a `show_widget` call fails on purpose. Both reach the model as
3
- * tool errors, and they must not read alike: one says "your args are wrong",
4
- * the other says "we could not check them". A model told the second is expected
5
- * to retry with the same args; a model told the first is expected to change them.
2
+ * The one way a `show_widget` call fails on purpose: the args are wrong. It
3
+ * reaches the model as a tool error and carries the offending field names, so
4
+ * the WARN log and the model see the same list.
6
5
  */
7
- /** Carries the offending field names so the WARN log and the model see the same list. */
8
6
  export class WidgetValidationError extends Error {
9
7
  widgetType;
10
8
  fields;
@@ -15,19 +13,4 @@ export class WidgetValidationError extends Error {
15
13
  this.name = "WidgetValidationError";
16
14
  }
17
15
  }
18
- /**
19
- * A check the widget needs could not be completed — the backend timed out,
20
- * answered unusably, or is not wired in. The args are not blamed: they were
21
- * never judged.
22
- */
23
- export class WidgetLookupError extends Error {
24
- widgetType;
25
- cause;
26
- constructor(message, widgetType, cause) {
27
- super(message);
28
- this.widgetType = widgetType;
29
- this.cause = cause;
30
- this.name = "WidgetLookupError";
31
- }
32
- }
33
16
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/widgets/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yFAAyF;AACzF,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAGnC;IACA;IAHX,YACE,OAAe,EACN,UAAkB,EAClB,MAAgB;QAEzB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,eAAU,GAAV,UAAU,CAAQ;QAClB,WAAM,GAAN,MAAM,CAAU;QAGzB,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAG/B;IACA;IAHX,YACE,OAAe,EACN,UAAkB,EAClB,KAAe;QAExB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,eAAU,GAAV,UAAU,CAAQ;QAClB,UAAK,GAAL,KAAK,CAAU;QAGxB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/widgets/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAGnC;IACA;IAHX,YACE,OAAe,EACN,UAAkB,EAClB,MAAgB;QAEzB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,eAAU,GAAV,UAAU,CAAQ;QAClB,WAAM,GAAN,MAAM,CAAU;QAGzB,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF"}
@@ -1,12 +1,10 @@
1
- import type { StrategyLookup, WidgetLogger } from "./types.js";
1
+ import type { WidgetLogger } from "./types.js";
2
2
  export { WIDGET_SPECS, buildWidgetRegistry } from "./registry.js";
3
3
  export type { WidgetRegistry, WidgetsConfig } from "./registry.js";
4
- export { WidgetLookupError, WidgetValidationError } from "./errors.js";
5
- export { STRATEGY_LOOKUP_TIMEOUT_MS, createSenpiStrategyLookup, isWalletAddress, } from "./strategy-lookup.js";
6
- export type { StrategyLister } from "./strategy-lookup.js";
4
+ export { WidgetValidationError } from "./errors.js";
7
5
  export { SHOW_WIDGET_TOOL_NAME, buildShowWidgetDescription, buildShowWidgetParameters, createShowWidgetTool, } from "./tool.js";
8
6
  export type { ShowWidgetTool, ShowWidgetToolResult } from "./tool.js";
9
- export type { RegisteredWidget, StrategyLookup, StrategyMatch, WidgetContext, WidgetFieldSpec, WidgetPayload, WidgetResult, WidgetSpec, } from "./types.js";
7
+ export type { RegisteredWidget, WidgetPayload, WidgetResult, WidgetSpec } from "./types.js";
10
8
  /** The slice of the OpenClaw plugin API this module needs. */
11
9
  export interface WidgetToolPluginApi {
12
10
  registerTool(tool: (ctx: {
@@ -21,11 +19,6 @@ export interface RegisterShowWidgetToolOptions {
21
19
  /** The plugin config `widgets` block: `{ "<widget_type>": boolean }`. */
22
20
  widgetsConfig?: unknown;
23
21
  logger?: WidgetLogger;
24
- /**
25
- * Backend the address-validating widgets check against. Omitting it does not
26
- * loosen them: they refuse the call rather than render an unverified card.
27
- */
28
- strategies?: StrategyLookup;
29
22
  }
30
23
  /**
31
24
  * Register `show_widget` as a plugin tool factory.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/widgets/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAClE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtE,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IAClC,YAAY,CACV,IAAI,EAAE,CAAC,GAAG,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,EAC9C,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC9C,IAAI,CAAC;CACT;AAED,MAAM,WAAW,6BAA6B;IAC5C,GAAG,EAAE,mBAAmB,CAAC;IACzB,yEAAyE;IACzE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,OAAO,CA4BtF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/widgets/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAClE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5F,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IAClC,YAAY,CACV,IAAI,EAAE,CAAC,GAAG,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,EAC9C,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC9C,IAAI,CAAC;CACT;AAED,MAAM,WAAW,6BAA6B;IAC5C,GAAG,EAAE,mBAAmB,CAAC;IACzB,yEAAyE;IACzE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,OAAO,CA0BtF"}
@@ -1,8 +1,7 @@
1
1
  import { buildWidgetRegistry } from "./registry.js";
2
2
  import { SHOW_WIDGET_TOOL_NAME, buildShowWidgetParameters, createShowWidgetTool, } from "./tool.js";
3
3
  export { WIDGET_SPECS, buildWidgetRegistry } from "./registry.js";
4
- export { WidgetLookupError, WidgetValidationError } from "./errors.js";
5
- export { STRATEGY_LOOKUP_TIMEOUT_MS, createSenpiStrategyLookup, isWalletAddress, } from "./strategy-lookup.js";
4
+ export { WidgetValidationError } from "./errors.js";
6
5
  export { SHOW_WIDGET_TOOL_NAME, buildShowWidgetDescription, buildShowWidgetParameters, createShowWidgetTool, } from "./tool.js";
7
6
  /**
8
7
  * Register `show_widget` as a plugin tool factory.
@@ -14,21 +13,19 @@ export { SHOW_WIDGET_TOOL_NAME, buildShowWidgetDescription, buildShowWidgetParam
14
13
  */
15
14
  export function registerShowWidgetTool(options) {
16
15
  const { api, logger } = options;
16
+ // A duplicate widget_type throws here, at registration, where src/index.ts
17
+ // turns it into a WARN rather than failing every agent turn.
17
18
  const registry = buildWidgetRegistry(options.widgetsConfig);
18
19
  const enabled = registry.enabledTypes();
19
20
  if (enabled.length === 0) {
20
21
  logger?.warn("[senpi-widgets] every widget type is disabled in plugin config — show_widget not registered");
21
22
  return false;
22
23
  }
23
- // Build the schema once here so a bad spec (duplicate field name declared with
24
- // conflicting types, a field named widget_type) fails registration, where
25
- // src/index.ts turns it into a WARN, rather than every agent turn.
26
24
  buildShowWidgetParameters(registry);
27
25
  api.registerTool((ctx) => createShowWidgetTool({
28
26
  registry,
29
27
  logger,
30
28
  sessionId: ctx?.sessionId,
31
- strategies: options.strategies,
32
29
  }), { names: [SHOW_WIDGET_TOOL_NAME] });
33
30
  logger?.info(`[senpi-widgets] ${SHOW_WIDGET_TOOL_NAME} registered | widget_types=${enabled.join(",")}`);
34
31
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/widgets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AAiCnB;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAsC;IAC3E,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAChC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;IACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,EAAE,IAAI,CACV,6FAA6F,CAC9F,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,+EAA+E;IAC/E,0EAA0E;IAC1E,mEAAmE;IACnE,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACpC,GAAG,CAAC,YAAY,CACd,CAAC,GAA2B,EAAE,EAAE,CAC9B,oBAAoB,CAAC;QACnB,QAAQ;QACR,MAAM;QACN,SAAS,EAAE,GAAG,EAAE,SAAS;QACzB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC,EACJ,EAAE,KAAK,EAAE,CAAC,qBAAqB,CAAC,EAAE,CACnC,CAAC;IACF,MAAM,EAAE,IAAI,CACV,mBAAmB,qBAAqB,8BAA8B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC1F,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/widgets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAElE,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AAmBnB;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAsC;IAC3E,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAChC,2EAA2E;IAC3E,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;IACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,EAAE,IAAI,CACV,6FAA6F,CAC9F,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACpC,GAAG,CAAC,YAAY,CACd,CAAC,GAA2B,EAAE,EAAE,CAC9B,oBAAoB,CAAC;QACnB,QAAQ;QACR,MAAM;QACN,SAAS,EAAE,GAAG,EAAE,SAAS;KAC1B,CAAC,EACJ,EAAE,KAAK,EAAE,CAAC,qBAAqB,CAAC,EAAE,CACnC,CAAC;IACF,MAAM,EAAE,IAAI,CACV,mBAAmB,qBAAqB,8BAA8B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC1F,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/widgets/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI/D;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAAiD,CAAC;AAEhG;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,GAAG,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACnC,yEAAyE;IACzE,OAAO,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACvC,+CAA+C;IAC/C,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACtD,YAAY,IAAI,MAAM,EAAE,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CACjC,MAAM,CAAC,EAAE,OAAO,EAChB,KAAK,GAAE,SAAS,UAAU,EAAiB,GAC1C,cAAc,CAiBhB"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/widgets/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG/D;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAAyB,CAAC;AAExE;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,GAAG,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACnC,yEAAyE;IACzE,OAAO,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACvC,+CAA+C;IAC/C,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACtD,YAAY,IAAI,MAAM,EAAE,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CACjC,MAAM,CAAC,EAAE,OAAO,EAChB,KAAK,GAAE,SAAS,UAAU,EAAiB,GAC1C,cAAc,CAyBhB"}
@@ -1,11 +1,10 @@
1
- import { fundStrategyWalletSpec } from "./widgets/fund-strategy-wallet.js";
2
1
  import { fundUserWalletSpec } from "./widgets/fund-user-wallet.js";
3
2
  /**
4
3
  * Every widget type this plugin can render. Adding one here adds it to the
5
4
  * `show_widget` enum, to the generated tool description, and to the config
6
5
  * gate — the tool name and the manifest are untouched.
7
6
  */
8
- export const WIDGET_SPECS = [fundUserWalletSpec, fundStrategyWalletSpec];
7
+ export const WIDGET_SPECS = [fundUserWalletSpec];
9
8
  export function buildWidgetRegistry(config, specs = WIDGET_SPECS) {
10
9
  const gate = config && typeof config === "object" && !Array.isArray(config)
11
10
  ? config
@@ -14,7 +13,15 @@ export function buildWidgetRegistry(config, specs = WIDGET_SPECS) {
14
13
  ...spec,
15
14
  enabled: gate?.[spec.widgetType] !== false,
16
15
  }));
17
- const byType = new Map(widgets.map((w) => [w.widgetType, w]));
16
+ const byType = new Map();
17
+ for (const widget of widgets) {
18
+ // The enum and this map both key on the type, so a duplicate would shadow a
19
+ // widget and put the same value in the enum twice instead of failing.
20
+ if (byType.has(widget.widgetType)) {
21
+ throw new Error(`show_widget: two widget specs declare widget_type "${widget.widgetType}"`);
22
+ }
23
+ byType.set(widget.widgetType, widget);
24
+ }
18
25
  const enabled = widgets.filter((w) => w.enabled);
19
26
  return {
20
27
  all: () => widgets,
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/widgets/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;AAmBhG,MAAM,UAAU,mBAAmB,CACjC,MAAgB,EAChB,QAA+B,YAAY;IAE3C,MAAM,IAAI,GACR,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAC5D,CAAC,CAAE,MAAkC;QACrC,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,OAAO,GAAuB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvD,GAAG,IAAI;QACP,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK;KAC3C,CAAC,CAAC,CAAC;IACJ,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO;QACL,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO;QAClB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO;QACtB,GAAG,EAAE,CAAC,UAAkB,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;QACnD,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;KACrD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/widgets/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,kBAAkB,CAAC,CAAC;AAmBxE,MAAM,UAAU,mBAAmB,CACjC,MAAgB,EAChB,QAA+B,YAAY;IAE3C,MAAM,IAAI,GACR,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAC5D,CAAC,CAAE,MAAkC;QACrC,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,OAAO,GAAuB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvD,GAAG,IAAI;QACP,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK;KAC3C,CAAC,CAAC,CAAC;IACJ,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IACnD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,4EAA4E;QAC5E,sEAAsE;QACtE,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,sDAAsD,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO;QACL,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO;QAClB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO;QACtB,GAAG,EAAE,CAAC,UAAkB,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;QACnD,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;KACrD,CAAC;AACJ,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { WidgetRegistry } from "./registry.js";
2
- import type { StrategyLookup, WidgetLogger, WidgetPayload } from "./types.js";
2
+ import type { WidgetLogger, WidgetPayload } from "./types.js";
3
3
  /**
4
4
  * The plugin's single agent tool. The name is static — new widget types are
5
5
  * new `widget_type` enum values, never new tools — so it is declared once in
@@ -24,22 +24,19 @@ export interface CreateShowWidgetToolOptions {
24
24
  logger?: WidgetLogger;
25
25
  /** Ephemeral session id from the plugin tool factory context; logged only. */
26
26
  sessionId?: string;
27
- /** Backend a widget validates addresses against. Absent = those widgets fail closed. */
28
- strategies?: StrategyLookup;
29
27
  }
30
28
  /**
31
- * Tool description, generated from the enabled specs. This is the text the
32
- * model selects a `widget_type` on, so it carries the per-type field list that
33
- * the flat JSON schema cannot express.
29
+ * Tool description, generated from the enabled specs. Nothing else teaches the
30
+ * model about these cards, so this text carries the condition that should make
31
+ * it call the tool, not just the shape of the call.
34
32
  */
35
33
  export declare function buildShowWidgetDescription(registry: WidgetRegistry): string;
36
34
  /**
37
35
  * Declared JSON schema: one flat object, no unions at any depth.
38
36
  *
39
37
  * OpenClaw flattens top-level unions, Gemini flattens nested ones, and OpenAI
40
- * strict mode rejects a schema containing one anywhere — so a discriminated
41
- * union on `widget_type` would buy nothing. Only `widget_type` is required;
42
- * per-widget requiredness is enforced in `execute()`.
38
+ * strict mode rejects a schema containing one anywhere. `widget_type` is the
39
+ * only parameter, and it is required.
43
40
  */
44
41
  export declare function buildShowWidgetParameters(registry: WidgetRegistry): Record<string, unknown>;
45
42
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/widgets/tool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAEV,cAAc,EAEd,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AAInD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAC7E;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAQD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAuB3E;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyD3F;AAyID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,CA2CzF"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/widgets/tool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAoB,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AAInD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAC7E;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAsB3E;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiB3F;AAmED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,CAkCzF"}
@@ -1,4 +1,4 @@
1
- import { WidgetLookupError, WidgetValidationError } from "./errors.js";
1
+ import { WidgetValidationError } from "./errors.js";
2
2
  /**
3
3
  * The plugin's single agent tool. The name is static — new widget types are
4
4
  * new `widget_type` enum values, never new tools — so it is declared once in
@@ -6,38 +6,31 @@ import { WidgetLookupError, WidgetValidationError } from "./errors.js";
6
6
  */
7
7
  export const SHOW_WIDGET_TOOL_NAME = "show_widget";
8
8
  const WIDGET_TYPE_PARAM = "widget_type";
9
- function fieldLine(field) {
10
- const parts = [`${field.required ? "required" : "optional"} ${field.type}`];
11
- if (field.maxLength !== undefined)
12
- parts.push(`max ${field.maxLength} chars`);
13
- return ` ${field.name} (${parts.join(", ")}): ${field.description}`;
14
- }
15
9
  /**
16
- * Tool description, generated from the enabled specs. This is the text the
17
- * model selects a `widget_type` on, so it carries the per-type field list that
18
- * the flat JSON schema cannot express.
10
+ * Tool description, generated from the enabled specs. Nothing else teaches the
11
+ * model about these cards, so this text carries the condition that should make
12
+ * it call the tool, not just the shape of the call.
19
13
  */
20
14
  export function buildShowWidgetDescription(registry) {
21
15
  const widgets = registry.enabled();
16
+ if (widgets.length === 0) {
17
+ return "Render a Senpi UI card in the user's chat.\n\nNo widget types are enabled on this deployment.";
18
+ }
22
19
  const lines = [
23
- "Render a Senpi UI card in the user's chat, for cases where a card communicates better than text.",
20
+ "Render a Senpi UI card in the user's chat. The card is live UI: its button runs the flow, so showing it is how the user acts.",
24
21
  "",
25
- `Pass ${WIDGET_TYPE_PARAM} plus only the fields listed for that type. Any other field is rejected.`,
22
+ "Call it yourself as part of your answer — the user does not have to ask for a card. Each type below states when to call it; the examples illustrate that rule, they are not a checklist to match.",
26
23
  "",
24
+ `Pass ${WIDGET_TYPE_PARAM} and nothing else.`,
25
+ "",
26
+ "Widget types:",
27
27
  ];
28
- if (widgets.length === 0) {
29
- lines.push("No widget types are enabled on this deployment.");
30
- return lines.join("\n");
31
- }
32
- lines.push("Widget types:");
33
28
  for (const widget of widgets) {
34
29
  lines.push(`- ${widget.widgetType}: ${widget.description}`);
35
- lines.push(" fields:");
36
- if (widget.fields.length === 0) {
37
- lines.push(" none — pass widget_type only");
38
- continue;
39
- }
40
- lines.push(...widget.fields.map(fieldLine));
30
+ lines.push(` when: ${widget.callWhen}`);
31
+ lines.push(` not this card: ${widget.notFor}`);
32
+ lines.push(" for example:");
33
+ lines.push(...widget.examples.map((example) => ` - ${example}`));
41
34
  }
42
35
  return lines.join("\n");
43
36
  }
@@ -45,60 +38,23 @@ export function buildShowWidgetDescription(registry) {
45
38
  * Declared JSON schema: one flat object, no unions at any depth.
46
39
  *
47
40
  * OpenClaw flattens top-level unions, Gemini flattens nested ones, and OpenAI
48
- * strict mode rejects a schema containing one anywhere — so a discriminated
49
- * union on `widget_type` would buy nothing. Only `widget_type` is required;
50
- * per-widget requiredness is enforced in `execute()`.
41
+ * strict mode rejects a schema containing one anywhere. `widget_type` is the
42
+ * only parameter, and it is required.
51
43
  */
52
44
  export function buildShowWidgetParameters(registry) {
53
45
  const widgets = registry.enabled();
54
46
  if (widgets.length === 0) {
55
47
  throw new Error("show_widget has no enabled widget types; do not register the tool");
56
48
  }
57
- const properties = {
58
- [WIDGET_TYPE_PARAM]: {
59
- type: "string",
60
- enum: widgets.map((w) => w.widgetType),
61
- description: "Which widget to render.",
62
- },
63
- };
64
- // Fields shared by several widget types collapse into one property, so the
65
- // shared property has to admit every owner's input: per-widget limits are
66
- // enforced in execute(), and a declared bound stricter than one owner's would
67
- // make the provider reject a call that execute() would have accepted.
68
- const owners = new Map();
69
- for (const widget of widgets) {
70
- for (const field of widget.fields) {
71
- if (field.name === WIDGET_TYPE_PARAM) {
72
- throw new Error(`show_widget: ${widget.widgetType} declares a field named "${WIDGET_TYPE_PARAM}", which is the discriminator`);
73
- }
74
- const entry = owners.get(field.name);
75
- if (entry) {
76
- entry.types.push(widget.widgetType);
77
- entry.fields.push(field);
78
- continue;
79
- }
80
- owners.set(field.name, { types: [widget.widgetType], fields: [field] });
81
- }
82
- }
83
- for (const [name, { types, fields }] of owners) {
84
- const valueTypes = [...new Set(fields.map((f) => f.type))];
85
- if (valueTypes.length > 1) {
86
- throw new Error(`show_widget: field "${name}" is declared as ${valueTypes.join(" and ")} by ${types.join(", ")}; one schema property cannot be both`);
87
- }
88
- const property = { type: valueTypes[0] };
89
- const bounds = fields.map((f) => f.maxLength);
90
- if (bounds.every((b) => b !== undefined)) {
91
- property.maxLength = Math.max(...bounds);
92
- }
93
- property.description =
94
- types.length === 1
95
- ? `${fields[0].description} Accepted by: ${types[0]}.`
96
- : fields.map((f, i) => `${types[i]}: ${f.description}`).join(" ");
97
- properties[name] = property;
98
- }
99
49
  return {
100
50
  type: "object",
101
- properties,
51
+ properties: {
52
+ [WIDGET_TYPE_PARAM]: {
53
+ type: "string",
54
+ enum: widgets.map((w) => w.widgetType),
55
+ description: "Which card to render.",
56
+ },
57
+ },
102
58
  required: [WIDGET_TYPE_PARAM],
103
59
  additionalProperties: false,
104
60
  };
@@ -134,76 +90,16 @@ function resolveWidget(registry, args) {
134
90
  return widget;
135
91
  }
136
92
  /**
137
- * Validate the remaining args against the widget's own field list. Every
138
- * problem is reported in one message so the model can fix them all in a single
139
- * retry instead of discovering them one call at a time.
93
+ * The tool takes one argument, so any other key is a field the model invented.
94
+ * Every one is named in a single message: the correction is the same for all of
95
+ * them, and the model can apply it in one retry.
140
96
  */
141
- function validateFields(widget, args) {
142
- // Guarded fields are accepted as keys so the widget can answer them itself;
143
- // they are absent from the description and the declared schema.
144
- const guarded = widget.guardedFields ?? [];
145
- const allowed = new Set([
146
- WIDGET_TYPE_PARAM,
147
- ...widget.fields.map((f) => f.name),
148
- ...guarded.map((f) => f.name),
149
- ]);
150
- const problems = [];
151
- const offending = [];
152
- const unexpected = Object.keys(args).filter((key) => !allowed.has(key));
153
- if (unexpected.length > 0) {
154
- offending.push(...unexpected);
155
- // Guarded names are parseable but not on offer, so they stay out of this list.
156
- const offered = [WIDGET_TYPE_PARAM, ...widget.fields.map((f) => f.name)];
157
- problems.push(`unexpected fields: ${unexpected.join(", ")} (allowed: ${offered.join(", ")})`);
158
- }
159
- const missing = [];
160
- const invalid = [];
161
- const values = {};
162
- // A guarded field goes to the handler exactly as it arrived. Its answer is
163
- // "drop this field", which is the same for every value, so complaining about
164
- // the type or the length first would only buy a retry that corrects a field
165
- // the model then has to remove anyway.
166
- for (const field of guarded) {
167
- const value = Object.hasOwn(args, field.name) ? args[field.name] : undefined;
168
- if (value !== undefined && value !== null)
169
- values[field.name] = value;
170
- }
171
- for (const field of widget.fields) {
172
- // Own keys only: an inherited `reason`/`toString` must not read as a value
173
- // the caller passed, since the unexpected-key check above only sees own keys.
174
- const value = Object.hasOwn(args, field.name) ? args[field.name] : undefined;
175
- if (value === undefined || value === null) {
176
- if (field.required)
177
- missing.push(field.name);
178
- continue;
179
- }
180
- if (typeof value !== "string") {
181
- invalid.push(`${field.name} (must be a ${field.type})`);
182
- continue;
183
- }
184
- if (value.trim().length === 0) {
185
- invalid.push(`${field.name} (must be a non-empty ${field.type}; omit it instead)`);
186
- continue;
187
- }
188
- if (field.maxLength !== undefined && value.length > field.maxLength) {
189
- invalid.push(`${field.name} (${value.length} chars, limit is ${field.maxLength})`);
190
- continue;
191
- }
192
- values[field.name] = value;
193
- }
194
- if (missing.length > 0) {
195
- offending.push(...missing);
196
- problems.push(`missing required fields: ${missing.join(", ")}`);
197
- }
198
- if (invalid.length > 0) {
199
- offending.push(...invalid.map((entry) => entry.split(" ")[0]));
200
- problems.push(`invalid fields: ${invalid.join(", ")}`);
201
- }
202
- if (problems.length > 0) {
203
- throw new WidgetValidationError(`show_widget failed for ${WIDGET_TYPE_PARAM} "${widget.widgetType}": ${problems.join("; ")}. ` +
204
- "Fix the named fields and call show_widget again with the same widget_type.", widget.widgetType, offending);
205
- }
206
- return values;
97
+ function rejectExtraFields(widget, args) {
98
+ const unexpected = Object.keys(args).filter((key) => key !== WIDGET_TYPE_PARAM);
99
+ if (unexpected.length === 0)
100
+ return;
101
+ throw new WidgetValidationError(`show_widget failed for ${WIDGET_TYPE_PARAM} "${widget.widgetType}": unexpected fields: ` +
102
+ `${unexpected.join(", ")}. show_widget takes ${WIDGET_TYPE_PARAM} only — drop them and call it again.`, widget.widgetType, unexpected);
207
103
  }
208
104
  /**
209
105
  * Build the `show_widget` tool for one agent turn. `sessionId` comes from the
@@ -211,9 +107,8 @@ function validateFields(widget, args) {
211
107
  * result depends on it.
212
108
  */
213
109
  export function createShowWidgetTool(options) {
214
- const { registry, logger, sessionId, strategies } = options;
110
+ const { registry, logger, sessionId } = options;
215
111
  const session = sessionId ?? "(unknown)";
216
- const ctx = { strategies };
217
112
  return {
218
113
  name: SHOW_WIDGET_TOOL_NAME,
219
114
  description: buildShowWidgetDescription(registry),
@@ -222,8 +117,8 @@ export function createShowWidgetTool(options) {
222
117
  try {
223
118
  const args = toArgs(params);
224
119
  const widget = resolveWidget(registry, args);
225
- const values = validateFields(widget, args);
226
- const result = await widget.handler(values, ctx);
120
+ rejectExtraFields(widget, args);
121
+ const result = await widget.handler();
227
122
  logger?.info(`[senpi-widgets] widget shown | widget_type=${widget.widgetType} widget_version=${widget.widgetVersion} session=${session}`);
228
123
  return {
229
124
  content: [{ type: "text", text: result.text }],
@@ -234,11 +129,6 @@ export function createShowWidgetTool(options) {
234
129
  if (err instanceof WidgetValidationError) {
235
130
  logger?.warn(`[senpi-widgets] validation failed | widget_type=${err.widgetType} fields=${err.fields.join(",")} session=${session} | ${err.message}`);
236
131
  }
237
- else if (err instanceof WidgetLookupError) {
238
- // The args were never judged — this is a backend problem, and it is the
239
- // only signal that a card the user asked for could not be built.
240
- logger?.warn(`[senpi-widgets] lookup failed | widget_type=${err.widgetType} session=${session} | ${err.message} | cause=${err.cause instanceof Error ? err.cause.message : String(err.cause ?? "(none)")}`);
241
- }
242
132
  else {
243
133
  logger?.error?.(`[senpi-widgets] unhandled failure | session=${session} | ${err instanceof Error ? err.message : String(err)}`);
244
134
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/widgets/tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/widgets/tool.ts"],"names":[],"mappings":"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"}