@oda-agent/openclaw-plugin 0.2.0 → 0.4.0

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/entry.d.ts CHANGED
@@ -23,6 +23,7 @@ export interface OpenClawApi {
23
23
  }
24
24
  export interface OpenClawToolDefinition {
25
25
  name: string;
26
+ label?: string;
26
27
  description: string;
27
28
  parameters: {
28
29
  type: 'object';
@@ -1 +1 @@
1
- {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAcH;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,YAAY,CAAC,IAAI,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACjD,2EAA2E;IAC3E,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE;AAED,gDAAgD;AAChD,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,wEAAwE;IACxE,QAAQ,IAAI,IAAI,CAAC;CAClB;AAgCD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CA0S/C;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAG/B;AAMD,QAAA,MAAM,WAAW,qBAOf,CAAC;AAEH,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAcH;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,YAAY,CAAC,IAAI,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACjD,2EAA2E;IAC3E,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE;AAED,gDAAgD;AAChD,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,wEAAwE;IACxE,QAAQ,IAAI,IAAI,CAAC;CAClB;AAkCD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAkO/C;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAG/B;AAMD,QAAA,MAAM,WAAW,qBAOf,CAAC;AAEH,eAAe,WAAW,CAAC"}
package/dist/entry.js CHANGED
@@ -48,9 +48,10 @@ const plugin_js_1 = require("./plugin.js");
48
48
  function definePluginEntry(entry) {
49
49
  return entry;
50
50
  }
51
- function registerTool(api, name, description, parameters, handler) {
51
+ function registerTool(api, name, label, description, parameters, handler) {
52
52
  api.registerTool({
53
53
  name,
54
+ label,
54
55
  description,
55
56
  parameters,
56
57
  async execute(_toolCallId, params) {
@@ -93,156 +94,131 @@ function register(api) {
93
94
  }
94
95
  return authenticatedRuntimePromise;
95
96
  }
96
- // ── Read-only tools ─────────────────────────────────────────────────────
97
- registerTool(api, 'searchProducts', 'Search for products in the Oda catalogue by keyword.', {
97
+ // ── Workflow-oriented tools ─────────────────────────────────────────────
98
+ registerTool(api, 'browse_oda_catalog', 'Browse Catalog', 'Search the Oda catalog with a short, easy-to-scan result list.', {
98
99
  type: 'object',
99
100
  properties: {
100
101
  query: {
101
102
  type: 'string',
102
- description: 'Search query for catalogue lookup.',
103
+ description: 'Search query for the Oda catalog.',
103
104
  },
104
- },
105
- required: ['query'],
106
- }, async (params) => {
107
- const { client } = await ensureLoggedIn();
108
- return readOnlyTools.searchProducts(client, params);
109
- });
110
- registerTool(api, 'getCart', 'Retrieve the current shopping cart.', {
111
- type: 'object',
112
- properties: {},
113
- }, async () => {
114
- const { client } = await ensureLoggedIn();
115
- return readOnlyTools.getCart(client);
116
- });
117
- registerTool(api, 'getOrders', 'Fetch paginated order history.', {
118
- type: 'object',
119
- properties: {
120
- page: {
105
+ limit: {
121
106
  type: 'number',
122
- description: 'Page number to fetch. Defaults to 1.',
107
+ description: 'Maximum number of products to return. Defaults to 5.',
123
108
  },
124
109
  },
110
+ required: ['query'],
125
111
  }, async (params) => {
126
112
  const { client } = await ensureLoggedIn();
127
- return readOnlyTools.getOrders(client, params);
128
- });
129
- registerTool(api, 'getDeliverySlots', 'List available delivery time slots.', {
130
- type: 'object',
131
- properties: {},
132
- }, async () => {
133
- const { client } = await ensureLoggedIn();
134
- return readOnlyTools.getDeliverySlots(client);
135
- });
136
- registerTool(api, 'getShoppingLists', "List the user's saved shopping lists.", {
137
- type: 'object',
138
- properties: {},
139
- }, async () => {
140
- const { client } = await ensureLoggedIn();
141
- return readOnlyTools.getShoppingLists(client);
113
+ return readOnlyTools.browseCatalog(client, params);
142
114
  });
143
- // ── Higher-level read-only helpers ──────────────────────────────────────
144
- registerTool(api, 'analyseOrderHistory', 'Analyse past orders and return a summary of frequently ordered products.', {
115
+ registerTool(api, 'review_shopping_overview', 'Review Shopping Overview', 'See the cart, saved lists, repeat buys, and delivery options together.', {
145
116
  type: 'object',
146
117
  properties: {
147
- maxPages: {
118
+ includeCart: {
119
+ type: 'boolean',
120
+ description: 'Include a cart summary. Defaults to true.',
121
+ },
122
+ includeSavedLists: {
123
+ type: 'boolean',
124
+ description: 'Include saved shopping lists. Defaults to true.',
125
+ },
126
+ includeOrderHistory: {
127
+ type: 'boolean',
128
+ description: 'Include frequent purchase analysis. Defaults to true.',
129
+ },
130
+ includeDelivery: {
131
+ type: 'boolean',
132
+ description: 'Include delivery slot overview. Defaults to true.',
133
+ },
134
+ maxHistoryPages: {
148
135
  type: 'number',
149
136
  description: 'Maximum number of order-history pages to inspect.',
150
137
  },
138
+ maxSavedLists: {
139
+ type: 'number',
140
+ description: 'Maximum number of saved lists to include.',
141
+ },
142
+ maxDeliverySlots: {
143
+ type: 'number',
144
+ description: 'Maximum number of delivery slots to include.',
145
+ },
151
146
  },
152
147
  }, async (params) => {
153
148
  const { plugin } = await ensureLoggedIn();
154
- const p = params;
155
- return plugin.analyseOrderHistory(p?.maxPages);
149
+ return plugin.reviewAccount((params ?? {}));
156
150
  });
157
- registerTool(api, 'buildShoppingList', 'Resolve plain-text queries into a structured shopping list without mutating the cart.', {
151
+ registerTool(api, 'plan_grocery_list', 'Plan Grocery List', 'Turn grocery requests into a matched plan without changing the cart.', {
158
152
  type: 'object',
159
153
  properties: {
160
154
  name: {
161
155
  type: 'string',
162
- description: 'Shopping-list name.',
156
+ description: 'Plan name shown back to the user.',
163
157
  },
164
- items: {
158
+ requests: {
165
159
  type: 'array',
166
- description: 'Requested items to resolve into Oda products.',
160
+ description: 'Requested groceries to resolve into Oda products.',
167
161
  items: {
168
162
  type: 'object',
169
163
  properties: {
170
164
  query: {
171
165
  type: 'string',
172
- description: 'Free-text item query.',
166
+ description: 'Free-text grocery request.',
173
167
  },
174
168
  quantity: {
175
169
  type: 'number',
176
- description: 'Requested quantity.',
170
+ description: 'Requested quantity. Defaults to 1.',
177
171
  },
178
172
  },
179
- required: ['query', 'quantity'],
173
+ required: ['query'],
180
174
  },
181
175
  },
182
176
  },
183
- required: ['name', 'items'],
177
+ required: ['name', 'requests'],
184
178
  }, async (params) => {
185
179
  const { plugin } = await ensureLoggedIn();
186
- const p = params;
187
- return plugin.buildShoppingList(p.name, p.items);
188
- });
189
- registerTool(api, 'findCheapestDeliverySlot', 'Return the cheapest available delivery slot without booking it.', {
190
- type: 'object',
191
- properties: {},
192
- }, async () => {
193
- const { plugin } = await ensureLoggedIn();
194
- return plugin.findCheapestDeliverySlot();
195
- });
196
- // ── Cart-mutation tools (disabled by default in manifest) ───────────────
197
- registerTool(api, 'addToCart', 'Add a single product to the cart. Requires explicit user confirmation before use.', {
198
- type: 'object',
199
- properties: {
200
- productId: {
201
- type: 'number',
202
- description: 'Oda product ID.',
203
- },
204
- quantity: {
205
- type: 'number',
206
- description: 'Quantity to add.',
207
- },
208
- },
209
- required: ['productId', 'quantity'],
210
- }, async (params) => {
211
- const { client } = await ensureLoggedIn();
212
- const p = params;
213
- return cartMutationTools.addToCart(client, p.productId, p.quantity);
214
- });
215
- registerTool(api, 'removeFromCart', 'Remove an item from the cart by product ID. Requires explicit user confirmation before use.', {
216
- type: 'object',
217
- properties: {
218
- productId: {
219
- type: 'number',
220
- description: 'Oda product ID to remove.',
221
- },
222
- },
223
- required: ['productId'],
224
- }, async (params) => {
225
- const { client } = await ensureLoggedIn();
226
- const p = params;
227
- return cartMutationTools.removeFromCart(client, p.productId);
228
- });
229
- registerTool(api, 'clearCart', 'Remove all items from the cart. Requires explicit user confirmation before use.', {
230
- type: 'object',
231
- properties: {},
232
- }, async () => {
233
- const { client } = await ensureLoggedIn();
234
- return cartMutationTools.clearCart(client);
180
+ const plan = params;
181
+ return plugin.planGroceries(plan.name, plan.requests);
235
182
  });
236
- registerTool(api, 'prepareCart', 'Add all items from a shopping list to the cart. Requires explicit user confirmation before use.', {
183
+ registerTool(api, 'apply_cart_changes', 'Apply Cart Changes', 'Apply one confirmed cart change.', {
237
184
  type: 'object',
238
185
  properties: {
239
- name: {
186
+ mode: {
240
187
  type: 'string',
241
- description: 'Shopping-list name.',
188
+ description: 'Cart update mode.',
189
+ enum: ['apply-plan', 'add-products', 'remove-products', 'clear-cart'],
190
+ },
191
+ plan: {
192
+ type: 'object',
193
+ description: 'Shopping plan to apply when mode is "apply-plan".',
194
+ properties: {
195
+ name: {
196
+ type: 'string',
197
+ description: 'Shopping-plan name.',
198
+ },
199
+ items: {
200
+ type: 'array',
201
+ items: {
202
+ type: 'object',
203
+ properties: {
204
+ productId: {
205
+ type: 'number',
206
+ description: 'Oda product ID.',
207
+ },
208
+ quantity: {
209
+ type: 'number',
210
+ description: 'Quantity to add.',
211
+ },
212
+ },
213
+ required: ['productId', 'quantity'],
214
+ },
215
+ },
216
+ },
217
+ required: ['name', 'items'],
242
218
  },
243
219
  items: {
244
220
  type: 'array',
245
- description: 'Resolved products to add to the cart.',
221
+ description: 'Products to add when mode is "add-products".',
246
222
  items: {
247
223
  type: 'object',
248
224
  properties: {
@@ -258,11 +234,18 @@ function register(api) {
258
234
  required: ['productId', 'quantity'],
259
235
  },
260
236
  },
237
+ productIds: {
238
+ type: 'array',
239
+ description: 'Products to remove when mode is "remove-products".',
240
+ items: {
241
+ type: 'number',
242
+ },
243
+ },
261
244
  },
262
- required: ['name', 'items'],
245
+ required: ['mode'],
263
246
  }, async (params) => {
264
247
  const { client } = await ensureLoggedIn();
265
- return cartMutationTools.prepareCart(client, params);
248
+ return cartMutationTools.updateCart(client, params);
266
249
  });
267
250
  }
268
251
  exports.register = register;
@@ -275,9 +258,9 @@ exports.activate = activate;
275
258
  // Plugin entry
276
259
  // ---------------------------------------------------------------------------
277
260
  const pluginEntry = definePluginEntry({
278
- id: '@oda-agent/openclaw-plugin',
279
- name: 'oda-shopping-assistant',
280
- description: 'Oda grocery shopping assistant safe cart planning, order history analysis, and delivery slot discovery.',
261
+ id: 'oda-groceries',
262
+ name: 'Oda Groceries',
263
+ description: 'Browse groceries, review your shopping context, and apply confirmed cart changes.',
281
264
  register,
282
265
  activate,
283
266
  });
package/dist/entry.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,0CAA4C;AAE5C,wEAA0D;AAC1D,gFAAkE;AAClE,qDAA8D;AAC9D,2CAAmD;AA+CnD;;;GAGG;AACH,SAAS,iBAAiB,CAAC,KAA0B;IACnD,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,SAAS,YAAY,CACnB,GAAgB,EAChB,IAAY,EACZ,WAAmB,EACnB,UAAgD,EAChD,OAA8C;IAE9C,GAAG,CAAC,YAAY,CAAC;QACf,IAAI;QACJ,WAAW;QACX,UAAU;QACV,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,MAAe;YAChD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,QAAQ,CAAC,GAAgB;IACvC,IAAI,cAAc,GAAkC,IAAI,CAAC;IACzD,IAAI,2BAA2B,GAAkC,IAAI,CAAC;IAEtE,SAAS,UAAU;QACjB,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC5B,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE;iBAC/B,IAAI,CAAC,GAAG,EAAE;gBACT,MAAM,WAAW,GAAG,IAAA,2CAA0B,GAAE,CAAC;gBACjD,MAAM,MAAM,GAAG,IAAI,gBAAS,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;gBAE9C,OAAO;oBACL,MAAM;oBACN,MAAM,EAAE,IAAA,gCAAoB,EAAC,MAAM,CAAC;iBACrC,CAAC;YACJ,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBACxB,cAAc,GAAG,IAAI,CAAC;gBACtB,MAAM,KAAK,CAAC;YACd,CAAC,CAAC,CAAC;QACP,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,KAAK,UAAU,cAAc;QAC3B,IAAI,2BAA2B,KAAK,IAAI,EAAE,CAAC;YACzC,2BAA2B,GAAG,UAAU,EAAE;iBACvC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBACtB,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC7B,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBACxB,2BAA2B,GAAG,IAAI,CAAC;gBACnC,MAAM,KAAK,CAAC;YACd,CAAC,CAAC,CAAC;QACP,CAAC;QAED,OAAO,2BAA2B,CAAC;IACrC,CAAC;IAED,2EAA2E;IAE3E,YAAY,CACV,GAAG,EACH,gBAAgB,EAChB,sDAAsD,EACtD;QACE,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oCAAoC;aAClD;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,OAAO,aAAa,CAAC,cAAc,CAAC,MAAM,EAAE,MAA8B,CAAC,CAAC;IAC9E,CAAC,CACF,CAAC;IAEF,YAAY,CACV,GAAG,EACH,SAAS,EACT,qCAAqC,EACrC;QACE,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;KACf,EACD,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,OAAO,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC,CACF,CAAC;IAEF,YAAY,CACV,GAAG,EACH,WAAW,EACX,gCAAgC,EAChC;QACE,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sCAAsC;aACpD;SACF;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,OAAO,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAqC,CAAC,CAAC;IAChF,CAAC,CACF,CAAC;IAEF,YAAY,CACV,GAAG,EACH,kBAAkB,EAClB,qCAAqC,EACrC;QACE,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;KACf,EACD,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,OAAO,aAAa,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC,CACF,CAAC;IAEF,YAAY,CACV,GAAG,EACH,kBAAkB,EAClB,uCAAuC,EACvC;QACE,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;KACf,EACD,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,OAAO,aAAa,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC,CACF,CAAC;IAEF,2EAA2E;IAE3E,YAAY,CACV,GAAG,EACH,qBAAqB,EACrB,0EAA0E,EAC1E;QACE,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mDAAmD;aACjE;SACF;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,MAA2C,CAAC;QACtD,OAAO,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC,CACF,CAAC;IAEF,YAAY,CACV,GAAG,EACH,mBAAmB,EACnB,uFAAuF,EACvF;QACE,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,qBAAqB;aACnC;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,+CAA+C;gBAC5D,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,uBAAuB;yBACrC;wBACD,QAAQ,EAAE;4BACR,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,qBAAqB;yBACnC;qBACF;oBACD,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;iBAChC;aACF;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;KAC5B,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,MAA6E,CAAC;QACxF,OAAO,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CACF,CAAC;IAEF,YAAY,CACV,GAAG,EACH,0BAA0B,EAC1B,iEAAiE,EACjE;QACE,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;KACf,EACD,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,OAAO,MAAM,CAAC,wBAAwB,EAAE,CAAC;IAC3C,CAAC,CACF,CAAC;IAEF,2EAA2E;IAE3E,YAAY,CACV,GAAG,EACH,WAAW,EACX,mFAAmF,EACnF;QACE,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iBAAiB;aAC/B;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kBAAkB;aAChC;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;KACpC,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,MAAiD,CAAC;QAC5D,OAAO,iBAAiB,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtE,CAAC,CACF,CAAC;IAEF,YAAY,CACV,GAAG,EACH,gBAAgB,EAChB,6FAA6F,EAC7F;QACE,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,2BAA2B;aACzC;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,CAAC;KACxB,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,MAA+B,CAAC;QAC1C,OAAO,iBAAiB,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC,CACF,CAAC;IAEF,YAAY,CACV,GAAG,EACH,WAAW,EACX,iFAAiF,EACjF;QACE,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;KACf,EACD,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,OAAO,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC,CACF,CAAC;IAEF,YAAY,CACV,GAAG,EACH,aAAa,EACb,iGAAiG,EACjG;QACE,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,qBAAqB;aACnC;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,uCAAuC;gBACpD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,SAAS,EAAE;4BACT,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,iBAAiB;yBAC/B;wBACD,QAAQ,EAAE;4BACR,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,kBAAkB;yBAChC;qBACF;oBACD,QAAQ,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;iBACpC;aACF;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;KAC5B,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,OAAO,iBAAiB,CAAC,WAAW,CAAC,MAAM,EAAE,MAAsB,CAAC,CAAC;IACvE,CAAC,CACF,CAAC;AACJ,CAAC;AA1SD,4BA0SC;AAED,SAAgB,QAAQ;IACtB,kEAAkE;IAClE,kEAAkE;AACpE,CAAC;AAHD,4BAGC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,WAAW,GAAG,iBAAiB,CAAC;IACpC,EAAE,EAAE,4BAA4B;IAChC,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EACT,2GAA2G;IAC7G,QAAQ;IACR,QAAQ;CACT,CAAC,CAAC;AAEH,kBAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { default, register, activate } from './entry.js';
2
2
  export type { OpenClawApi, OpenClawPluginEntry } from './entry.js';
3
3
  export { createOpenClawPlugin } from './plugin.js';
4
- export type { ShoppingList, OrderHistorySummary, OpenClawPlugin } from './plugin.js';
4
+ export type { AccountReview, CartOverview, DeliverySlotOverview, GroceryPlan, GroceryRequest, OpenClawPlugin, OrderHistorySummary, PlannedGroceryItem, ReviewAccountOptions, SavedListOverview, ShoppingList, UnmatchedGroceryRequest, } from './plugin.js';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EACV,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,GACxB,MAAM,aAAa,CAAC"}
package/dist/plugin.d.ts CHANGED
@@ -7,6 +7,111 @@ export interface ShoppingList {
7
7
  quantity: number;
8
8
  }>;
9
9
  }
10
+ /** A user-friendly summary of a cart item. */
11
+ export interface CartOverviewItem {
12
+ productId: number;
13
+ name: string;
14
+ quantity: number;
15
+ linePrice: string;
16
+ originalLinePrice: string | null;
17
+ unitPrice: string;
18
+ label: string | null;
19
+ available: boolean;
20
+ }
21
+ /** A user-friendly non-item pricing line. */
22
+ export interface CartOverviewPriceLine {
23
+ label: string;
24
+ price: string;
25
+ kind: 'item' | 'discount' | 'subtotal' | 'fee' | 'total' | 'other';
26
+ details: string | null;
27
+ }
28
+ /** A compact cart summary for UI-facing tools. */
29
+ export interface CartOverview {
30
+ itemCount: number;
31
+ label: string | null;
32
+ displayPrice: string | null;
33
+ subtotalPrice: string;
34
+ totalPrice: string;
35
+ currency: string;
36
+ items: CartOverviewItem[];
37
+ summaryLines: CartOverviewPriceLine[];
38
+ feeLines: CartOverviewPriceLine[];
39
+ }
40
+ /** A compact saved-list summary for UI-facing tools. */
41
+ export interface SavedListOverview {
42
+ id: number;
43
+ name: string;
44
+ itemCount: number;
45
+ }
46
+ /** A compact product frequency summary. */
47
+ export interface FrequentProductOverview {
48
+ productId: number;
49
+ name: string;
50
+ brand: string | null;
51
+ timesOrdered: number;
52
+ }
53
+ /** A compact delivery-slot summary. */
54
+ export interface DeliverySlotOverview {
55
+ id: number;
56
+ start: string;
57
+ end: string;
58
+ price: string;
59
+ currency: string;
60
+ }
61
+ /** Options for the reviewAccount helper. */
62
+ export interface ReviewAccountOptions {
63
+ includeCart?: boolean;
64
+ includeSavedLists?: boolean;
65
+ includeOrderHistory?: boolean;
66
+ includeDelivery?: boolean;
67
+ maxHistoryPages?: number;
68
+ maxSavedLists?: number;
69
+ maxDeliverySlots?: number;
70
+ }
71
+ /** User-facing account review returned by the OpenClaw tool. */
72
+ export interface AccountReview {
73
+ cart?: CartOverview;
74
+ savedLists?: SavedListOverview[];
75
+ orderHistory?: {
76
+ totalOrders: number;
77
+ totalSpend: string;
78
+ currency: string;
79
+ mostOrderedProducts: FrequentProductOverview[];
80
+ };
81
+ delivery?: {
82
+ availableSlotCount: number;
83
+ cheapestSlot?: DeliverySlotOverview;
84
+ upcomingSlots: DeliverySlotOverview[];
85
+ };
86
+ }
87
+ /** A single request supplied to the grocery planner. */
88
+ export interface GroceryRequest {
89
+ query: string;
90
+ quantity?: number;
91
+ }
92
+ /** A matched request in the grocery planner output. */
93
+ export interface PlannedGroceryItem {
94
+ query: string;
95
+ quantity: number;
96
+ productId: number;
97
+ productName: string;
98
+ brand: string | null;
99
+ price: string;
100
+ currency: string;
101
+ }
102
+ /** A request that could not be matched to a product. */
103
+ export interface UnmatchedGroceryRequest {
104
+ query: string;
105
+ quantity: number;
106
+ }
107
+ /** User-facing grocery plan returned by the OpenClaw tool. */
108
+ export interface GroceryPlan {
109
+ name: string;
110
+ shoppingList: ShoppingList;
111
+ matchedItems: PlannedGroceryItem[];
112
+ unmatchedItems: UnmatchedGroceryRequest[];
113
+ summary: string;
114
+ }
10
115
  /** Summary of a user's order history. */
11
116
  export interface OrderHistorySummary {
12
117
  totalOrders: number;
@@ -19,6 +124,14 @@ export interface OrderHistorySummary {
19
124
  }
20
125
  /** The OpenClaw plugin object returned by the factory. */
21
126
  export interface OpenClawPlugin {
127
+ /**
128
+ * Search the current account state in one call for day-to-day planning.
129
+ */
130
+ reviewAccount(options?: ReviewAccountOptions): Promise<AccountReview>;
131
+ /**
132
+ * Build a user-facing grocery plan from free-text requests.
133
+ */
134
+ planGroceries(name: string, requests: GroceryRequest[]): Promise<GroceryPlan>;
22
135
  /**
23
136
  * Search for products and build a shopping list from a plain-text description.
24
137
  * Returns a list of matched products ready to add to cart.
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAmB,MAAM,iBAAiB,CAAC;AAM9E,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvD;AAED,yCAAyC;AACzC,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,UAAU,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3E;AAED,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE1G;;OAEG;IACH,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAErE;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C;;;OAGG;IACH,wBAAwB,IAAI,OAAO,CACjC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CACxF,CAAC;CACH;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,cAAc,CAwEtE"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/dist/plugin.js CHANGED
@@ -1,6 +1,105 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createOpenClawPlugin = void 0;
4
+ function summarizeCart(cart) {
5
+ return {
6
+ itemCount: cart.item_count,
7
+ label: cart.label,
8
+ displayPrice: cart.display_price,
9
+ subtotalPrice: cart.subtotal_price,
10
+ totalPrice: cart.total_price,
11
+ currency: cart.currency,
12
+ items: cart.items.map((item) => ({
13
+ productId: item.product.id,
14
+ name: item.product.full_name,
15
+ quantity: item.quantity,
16
+ linePrice: item.line_price,
17
+ originalLinePrice: item.original_line_price,
18
+ unitPrice: item.unit_price,
19
+ label: item.label,
20
+ available: item.product.is_available,
21
+ })),
22
+ summaryLines: cart.summary_lines.map((line) => ({
23
+ label: line.label,
24
+ price: line.price,
25
+ kind: line.kind,
26
+ details: line.details,
27
+ })),
28
+ feeLines: cart.fee_lines.map((line) => ({
29
+ label: line.label,
30
+ price: line.price,
31
+ kind: line.kind,
32
+ details: line.details,
33
+ })),
34
+ };
35
+ }
36
+ function summarizeSavedLists(lists, maxSavedLists) {
37
+ return lists.slice(0, maxSavedLists).map((list) => ({
38
+ id: list.id,
39
+ name: list.name,
40
+ itemCount: list.items.length,
41
+ }));
42
+ }
43
+ async function loadShoppingLists(client) {
44
+ const clientWithLists = client;
45
+ if (typeof clientWithLists.getShoppingLists !== 'function') {
46
+ return [];
47
+ }
48
+ return clientWithLists.getShoppingLists();
49
+ }
50
+ function summarizeDeliverySlots(slots, maxDeliverySlots) {
51
+ const available = slots
52
+ .filter((slot) => slot.is_available)
53
+ .sort((left, right) => parseFloat(left.price) - parseFloat(right.price));
54
+ return {
55
+ availableSlotCount: available.length,
56
+ cheapestSlot: available[0]
57
+ ? {
58
+ id: available[0].id,
59
+ start: available[0].start,
60
+ end: available[0].end,
61
+ price: available[0].price,
62
+ currency: available[0].currency,
63
+ }
64
+ : undefined,
65
+ upcomingSlots: available.slice(0, maxDeliverySlots).map((slot) => ({
66
+ id: slot.id,
67
+ start: slot.start,
68
+ end: slot.end,
69
+ price: slot.price,
70
+ currency: slot.currency,
71
+ })),
72
+ };
73
+ }
74
+ async function resolveShoppingRequests(client, requests) {
75
+ const items = [];
76
+ const matchedItems = [];
77
+ const unmatchedItems = [];
78
+ for (const request of requests) {
79
+ const quantity = request.quantity ?? 1;
80
+ const results = await client.searchProducts(request.query);
81
+ const first = results.results[0];
82
+ if (!first) {
83
+ unmatchedItems.push({ query: request.query, quantity });
84
+ continue;
85
+ }
86
+ items.push({ productId: first.id, quantity });
87
+ matchedItems.push({
88
+ query: request.query,
89
+ quantity,
90
+ productId: first.id,
91
+ productName: first.full_name,
92
+ brand: first.brand,
93
+ price: first.gross_price,
94
+ currency: first.currency,
95
+ });
96
+ }
97
+ return {
98
+ items,
99
+ matchedItems,
100
+ unmatchedItems,
101
+ };
102
+ }
4
103
  // ---------------------------------------------------------------------------
5
104
  // Factory
6
105
  // ---------------------------------------------------------------------------
@@ -20,67 +119,104 @@ exports.createOpenClawPlugin = void 0;
20
119
  * ```
21
120
  */
22
121
  function createOpenClawPlugin(client) {
23
- return {
24
- async buildShoppingList(name, items) {
25
- const resolved = [];
26
- for (const item of items) {
27
- const results = await client.searchProducts(item.query);
28
- const first = results.results[0];
29
- if (first) {
30
- resolved.push({ productId: first.id, quantity: item.quantity });
31
- }
32
- }
33
- return { name, items: resolved };
34
- },
35
- async analyseOrderHistory(maxPages = 5) {
36
- const productCounts = new Map();
37
- let totalOrders = 0;
38
- let totalSpendCents = 0;
39
- let currency = 'NOK';
40
- for (let page = 1; page <= maxPages; page++) {
41
- const orderPage = await client.getOrders(page);
42
- if (orderPage.results.length === 0)
43
- break;
44
- totalOrders += orderPage.results.length;
45
- for (const order of orderPage.results) {
46
- currency = order.currency;
47
- totalSpendCents += Math.round(parseFloat(order.total_price) * 100);
48
- for (const item of order.items) {
49
- const existing = productCounts.get(item.product.id);
50
- if (existing) {
51
- existing.count += item.quantity;
52
- }
53
- else {
54
- productCounts.set(item.product.id, { product: item.product, count: item.quantity });
55
- }
122
+ async function analyseOrderHistory(maxPages = 5) {
123
+ const productCounts = new Map();
124
+ let totalOrders = 0;
125
+ let totalSpendCents = 0;
126
+ let currency = 'NOK';
127
+ for (let page = 1; page <= maxPages; page++) {
128
+ const orderPage = await client.getOrders(page);
129
+ if (orderPage.results.length === 0)
130
+ break;
131
+ totalOrders += orderPage.results.length;
132
+ for (const order of orderPage.results) {
133
+ currency = order.currency;
134
+ totalSpendCents += Math.round(parseFloat(order.total_price) * 100);
135
+ for (const item of order.items) {
136
+ const existing = productCounts.get(item.product.id);
137
+ if (existing) {
138
+ existing.count += item.quantity;
139
+ }
140
+ else {
141
+ productCounts.set(item.product.id, { product: item.product, count: item.quantity });
56
142
  }
57
143
  }
58
- if (!orderPage.next)
59
- break;
60
144
  }
61
- const sorted = [...productCounts.values()]
62
- .sort((a, b) => b.count - a.count)
63
- .slice(0, 10)
64
- .map(({ product, count }) => ({ product, timesOrdered: count }));
145
+ if (!orderPage.next)
146
+ break;
147
+ }
148
+ const sorted = [...productCounts.values()]
149
+ .sort((a, b) => b.count - a.count)
150
+ .slice(0, 10)
151
+ .map(({ product, count }) => ({ product, timesOrdered: count }));
152
+ return {
153
+ totalOrders,
154
+ totalSpend: (totalSpendCents / 100).toFixed(2),
155
+ currency,
156
+ mostOrderedProducts: sorted,
157
+ };
158
+ }
159
+ async function buildShoppingList(name, items) {
160
+ const resolved = await resolveShoppingRequests(client, items);
161
+ return { name, items: resolved.items };
162
+ }
163
+ async function findCheapestDeliverySlot() {
164
+ const slots = await client.getDeliverySlots();
165
+ const available = slots.filter((slot) => slot.is_available);
166
+ if (available.length === 0)
167
+ return undefined;
168
+ return available.sort((left, right) => parseFloat(left.price) - parseFloat(right.price))[0];
169
+ }
170
+ return {
171
+ async reviewAccount(options = {}) {
172
+ const { includeCart = true, includeSavedLists = true, includeOrderHistory = true, includeDelivery = true, maxHistoryPages = 5, maxSavedLists = 5, maxDeliverySlots = 3, } = options;
173
+ const review = {};
174
+ if (includeCart) {
175
+ review.cart = summarizeCart(await client.getCart());
176
+ }
177
+ if (includeSavedLists) {
178
+ review.savedLists = summarizeSavedLists(await loadShoppingLists(client), maxSavedLists);
179
+ }
180
+ if (includeOrderHistory) {
181
+ const summary = await analyseOrderHistory(maxHistoryPages);
182
+ review.orderHistory = {
183
+ totalOrders: summary.totalOrders,
184
+ totalSpend: summary.totalSpend,
185
+ currency: summary.currency,
186
+ mostOrderedProducts: summary.mostOrderedProducts.map(({ product, timesOrdered }) => ({
187
+ productId: product.id,
188
+ name: product.full_name,
189
+ brand: product.brand,
190
+ timesOrdered,
191
+ })),
192
+ };
193
+ }
194
+ if (includeDelivery) {
195
+ review.delivery = summarizeDeliverySlots(await client.getDeliverySlots(), maxDeliverySlots);
196
+ }
197
+ return review;
198
+ },
199
+ async planGroceries(name, requests) {
200
+ const resolved = await resolveShoppingRequests(client, requests);
65
201
  return {
66
- totalOrders,
67
- totalSpend: (totalSpendCents / 100).toFixed(2),
68
- currency,
69
- mostOrderedProducts: sorted,
202
+ name,
203
+ shoppingList: {
204
+ name,
205
+ items: resolved.items,
206
+ },
207
+ matchedItems: resolved.matchedItems,
208
+ unmatchedItems: resolved.unmatchedItems,
209
+ summary: `Matched ${resolved.matchedItems.length} request(s) and left ${resolved.unmatchedItems.length} unmatched.`,
70
210
  };
71
211
  },
212
+ buildShoppingList,
213
+ analyseOrderHistory,
72
214
  async prepareCart(list) {
73
215
  for (const item of list.items) {
74
216
  await client.addToCart(item.productId, item.quantity);
75
217
  }
76
218
  },
77
- async findCheapestDeliverySlot() {
78
- const slots = await client.getDeliverySlots();
79
- const available = slots.filter((s) => s.is_available);
80
- if (available.length === 0)
81
- return undefined;
82
- return available.sort((a, b) => parseFloat(a.price) - parseFloat(b.price))[0];
83
- },
219
+ findCheapestDeliverySlot,
84
220
  };
85
221
  }
86
222
  exports.createOpenClawPlugin = createOpenClawPlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,21 @@ export interface CartMutationResult {
22
22
  /** Human-readable description of what changed. */
23
23
  summary: string;
24
24
  }
25
+ /** Parameters for the higher-level updateCart tool. */
26
+ export interface UpdateCartParams {
27
+ mode: 'apply-plan' | 'add-products' | 'remove-products' | 'clear-cart';
28
+ plan?: ShoppingList;
29
+ items?: Array<{
30
+ productId: number;
31
+ quantity: number;
32
+ }>;
33
+ productIds?: number[];
34
+ }
35
+ /** Result of the higher-level updateCart tool. */
36
+ export interface CartUpdateResult extends CartMutationResult {
37
+ mode: UpdateCartParams['mode'];
38
+ steps: string[];
39
+ }
25
40
  /**
26
41
  * Add `quantity` units of `productId` to the cart.
27
42
  *
@@ -50,4 +65,8 @@ export declare function clearCart(client: OdaClient): Promise<CartMutationResult
50
65
  * the full shopping list to the user and wait for approval.
51
66
  */
52
67
  export declare function prepareCart(client: OdaClient, list: ShoppingList): Promise<CartMutationResult>;
68
+ /**
69
+ * Apply one cart update intent by composing the lower-level mutation helpers.
70
+ */
71
+ export declare function updateCart(client: OdaClient, params: UpdateCartParams): Promise<CartUpdateResult>;
53
72
  //# sourceMappingURL=cartMutationTools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cartMutationTools.d.ts","sourceRoot":"","sources":["../../src/tools/cartMutationTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAMjD,2CAA2C;AAC3C,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC,CAG7B;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAG7B;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAG9E;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,kBAAkB,CAAC,CAO7B"}
1
+ {"version":3,"file":"cartMutationTools.d.ts","sourceRoot":"","sources":["../../src/tools/cartMutationTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAMjD,2CAA2C;AAC3C,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,uDAAuD;AACvD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,GAAG,cAAc,GAAG,iBAAiB,GAAG,YAAY,CAAC;IACvE,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,kDAAkD;AAClD,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAMD;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC,CAG7B;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAG7B;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAG9E;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,kBAAkB,CAAC,CAO7B;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CA8D3B"}
@@ -17,7 +17,7 @@
17
17
  * this module. See SKILL.md for the canonical workflow.
18
18
  */
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.prepareCart = exports.clearCart = exports.removeFromCart = exports.addToCart = void 0;
20
+ exports.updateCart = exports.prepareCart = exports.clearCart = exports.removeFromCart = exports.addToCart = void 0;
21
21
  // ---------------------------------------------------------------------------
22
22
  // Tool implementations
23
23
  // ---------------------------------------------------------------------------
@@ -69,4 +69,61 @@ async function prepareCart(client, list) {
69
69
  };
70
70
  }
71
71
  exports.prepareCart = prepareCart;
72
+ /**
73
+ * Apply one cart update intent by composing the lower-level mutation helpers.
74
+ */
75
+ async function updateCart(client, params) {
76
+ switch (params.mode) {
77
+ case 'apply-plan': {
78
+ if (!params.plan) {
79
+ throw new Error('updateCart with mode "apply-plan" requires a shopping plan.');
80
+ }
81
+ const result = await prepareCart(client, params.plan);
82
+ return {
83
+ mode: params.mode,
84
+ summary: result.summary,
85
+ steps: params.plan.items.map((item) => `Add ${item.quantity}× product #${item.productId}.`),
86
+ };
87
+ }
88
+ case 'add-products': {
89
+ if (!params.items || params.items.length === 0) {
90
+ throw new Error('updateCart with mode "add-products" requires at least one item.');
91
+ }
92
+ const steps = [];
93
+ for (const item of params.items) {
94
+ const result = await addToCart(client, item.productId, item.quantity);
95
+ steps.push(result.summary);
96
+ }
97
+ return {
98
+ mode: params.mode,
99
+ summary: `Added ${params.items.length} product(s) to cart.`,
100
+ steps,
101
+ };
102
+ }
103
+ case 'remove-products': {
104
+ if (!params.productIds || params.productIds.length === 0) {
105
+ throw new Error('updateCart with mode "remove-products" requires at least one product ID.');
106
+ }
107
+ const steps = [];
108
+ for (const productId of params.productIds) {
109
+ const result = await removeFromCart(client, productId);
110
+ steps.push(result.summary);
111
+ }
112
+ return {
113
+ mode: params.mode,
114
+ summary: `Removed ${params.productIds.length} product(s) from cart.`,
115
+ steps,
116
+ };
117
+ }
118
+ case 'clear-cart': {
119
+ const result = await clearCart(client);
120
+ return {
121
+ mode: params.mode,
122
+ summary: result.summary,
123
+ steps: [result.summary],
124
+ };
125
+ }
126
+ }
127
+ }
128
+ exports.updateCart = updateCart;
72
129
  //# sourceMappingURL=cartMutationTools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cartMutationTools.js","sourceRoot":"","sources":["../../src/tools/cartMutationTools.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;;AAeH,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;;;GAIG;AACI,KAAK,UAAU,SAAS,CAC7B,MAAiB,EACjB,SAAiB,EACjB,QAAgB;IAEhB,MAAM,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC5C,OAAO,EAAE,OAAO,EAAE,SAAS,QAAQ,cAAc,SAAS,WAAW,EAAE,CAAC;AAC1E,CAAC;AAPD,8BAOC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,cAAc,CAClC,MAAiB,EACjB,SAAiB;IAEjB,MAAM,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACvC,OAAO,EAAE,OAAO,EAAE,oBAAoB,SAAS,aAAa,EAAE,CAAC;AACjE,CAAC;AAND,wCAMC;AAED;;;;GAIG;AACI,KAAK,UAAU,SAAS,CAAC,MAAiB;IAC/C,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;IACzB,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;AACtC,CAAC;AAHD,8BAGC;AAED;;;;;GAKG;AACI,KAAK,UAAU,WAAW,CAC/B,MAAiB,EACjB,IAAkB;IAElB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IACD,OAAO;QACL,OAAO,EAAE,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,uBAAuB,IAAI,CAAC,IAAI,YAAY;KAChF,CAAC;AACJ,CAAC;AAVD,kCAUC"}
1
+ {"version":3,"file":"cartMutationTools.js","sourceRoot":"","sources":["../../src/tools/cartMutationTools.ts"],"names":[],"mappings":"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"}
@@ -15,21 +15,48 @@
15
15
  * findCheapestDeliverySlot) are implemented in plugin.ts and compose
16
16
  * these primitives without performing any writes.
17
17
  */
18
- import type { OdaClient, OdaSearchResponse, OdaCart, OdaPage, OdaOrder, OdaDeliverySlot, OdaShoppingList } from '@oda-agent/core';
18
+ import type { OdaClient, OdaSearchResponse, OdaCart, OdaPage, OdaOrder, OdaDeliverySlot } from '@oda-agent/core';
19
19
  /** Parameters for the searchProducts tool. */
20
20
  export interface SearchProductsParams {
21
21
  query: string;
22
22
  }
23
+ /** Parameters for the browseCatalog tool. */
24
+ export interface BrowseCatalogParams {
25
+ query: string;
26
+ limit?: number;
27
+ }
28
+ /** A compact search result for UI-facing catalog browsing. */
29
+ export interface CatalogBrowseResult {
30
+ query: string;
31
+ totalMatches: number;
32
+ products: Array<{
33
+ productId: number;
34
+ name: string;
35
+ brand: string | null;
36
+ price: string;
37
+ currency: string;
38
+ available: boolean;
39
+ }>;
40
+ }
23
41
  /** Parameters for the getOrders tool. */
24
42
  export interface GetOrdersParams {
25
43
  /** Page number, 1-based. Defaults to 1. */
26
44
  page?: number;
27
45
  }
46
+ interface SavedListLike {
47
+ id: number;
48
+ name: string;
49
+ items: unknown[];
50
+ }
28
51
  /**
29
52
  * Search the Oda catalogue for products matching `query`.
30
53
  * Returns the raw search response including matched products and result count.
31
54
  */
32
55
  export declare function searchProducts(client: OdaClient, params: SearchProductsParams): Promise<OdaSearchResponse>;
56
+ /**
57
+ * Search the Oda catalogue and return a compact, UI-friendly result list.
58
+ */
59
+ export declare function browseCatalog(client: OdaClient, params: BrowseCatalogParams): Promise<CatalogBrowseResult>;
33
60
  /**
34
61
  * Retrieve the authenticated user's current shopping cart.
35
62
  */
@@ -45,5 +72,6 @@ export declare function getDeliverySlots(client: OdaClient): Promise<OdaDelivery
45
72
  /**
46
73
  * List the authenticated user's saved shopping lists.
47
74
  */
48
- export declare function getShoppingLists(client: OdaClient): Promise<OdaShoppingList[]>;
75
+ export declare function getShoppingLists(client: OdaClient): Promise<SavedListLike[]>;
76
+ export {};
49
77
  //# sourceMappingURL=readOnlyTools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"readOnlyTools.d.ts","sourceRoot":"","sources":["../../src/tools/readOnlyTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMlI,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAMD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAE5B;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAEjE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,SAAS,EACjB,MAAM,GAAE,eAAoB,GAC3B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAE5B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAEpF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAEpF"}
1
+ {"version":3,"file":"readOnlyTools.d.ts","sourceRoot":"","sources":["../../src/tools/readOnlyTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMjH,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,6CAA6C;AAC7C,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;CACJ;AAED,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAUD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAE5B;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAgB9B;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAEjE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,SAAS,EACjB,MAAM,GAAE,eAAoB,GAC3B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAE5B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAEpF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAQlF"}
@@ -17,7 +17,7 @@
17
17
  * these primitives without performing any writes.
18
18
  */
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.getShoppingLists = exports.getDeliverySlots = exports.getOrders = exports.getCart = exports.searchProducts = void 0;
20
+ exports.getShoppingLists = exports.getDeliverySlots = exports.getOrders = exports.getCart = exports.browseCatalog = exports.searchProducts = void 0;
21
21
  // ---------------------------------------------------------------------------
22
22
  // Tool implementations
23
23
  // ---------------------------------------------------------------------------
@@ -29,6 +29,26 @@ async function searchProducts(client, params) {
29
29
  return client.searchProducts(params.query);
30
30
  }
31
31
  exports.searchProducts = searchProducts;
32
+ /**
33
+ * Search the Oda catalogue and return a compact, UI-friendly result list.
34
+ */
35
+ async function browseCatalog(client, params) {
36
+ const response = await client.searchProducts(params.query);
37
+ const limit = params.limit ?? 5;
38
+ return {
39
+ query: response.query,
40
+ totalMatches: response.count,
41
+ products: response.results.slice(0, limit).map((product) => ({
42
+ productId: product.id,
43
+ name: product.full_name,
44
+ brand: product.brand,
45
+ price: product.gross_price,
46
+ currency: product.currency,
47
+ available: product.is_available,
48
+ })),
49
+ };
50
+ }
51
+ exports.browseCatalog = browseCatalog;
32
52
  /**
33
53
  * Retrieve the authenticated user's current shopping cart.
34
54
  */
@@ -54,7 +74,11 @@ exports.getDeliverySlots = getDeliverySlots;
54
74
  * List the authenticated user's saved shopping lists.
55
75
  */
56
76
  async function getShoppingLists(client) {
57
- return client.getShoppingLists();
77
+ const clientWithLists = client;
78
+ if (typeof clientWithLists.getShoppingLists !== 'function') {
79
+ return [];
80
+ }
81
+ return clientWithLists.getShoppingLists();
58
82
  }
59
83
  exports.getShoppingLists = getShoppingLists;
60
84
  //# sourceMappingURL=readOnlyTools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"readOnlyTools.js","sourceRoot":"","sources":["../../src/tools/readOnlyTools.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;;AAmBH,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;;GAGG;AACI,KAAK,UAAU,cAAc,CAClC,MAAiB,EACjB,MAA4B;IAE5B,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC;AALD,wCAKC;AAED;;GAEG;AACI,KAAK,UAAU,OAAO,CAAC,MAAiB;IAC7C,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC;AAFD,0BAEC;AAED;;GAEG;AACI,KAAK,UAAU,SAAS,CAC7B,MAAiB,EACjB,SAA0B,EAAE;IAE5B,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AALD,8BAKC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CAAC,MAAiB;IACtD,OAAO,MAAM,CAAC,gBAAgB,EAAE,CAAC;AACnC,CAAC;AAFD,4CAEC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CAAC,MAAiB;IACtD,OAAO,MAAM,CAAC,gBAAgB,EAAE,CAAC;AACnC,CAAC;AAFD,4CAEC"}
1
+ {"version":3,"file":"readOnlyTools.js","sourceRoot":"","sources":["../../src/tools/readOnlyTools.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;;AAiDH,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;;GAGG;AACI,KAAK,UAAU,cAAc,CAClC,MAAiB,EACjB,MAA4B;IAE5B,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC;AALD,wCAKC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CACjC,MAAiB,EACjB,MAA2B;IAE3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAEhC,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,YAAY,EAAE,QAAQ,CAAC,KAAK;QAC5B,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC3D,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,IAAI,EAAE,OAAO,CAAC,SAAS;YACvB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,WAAW;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,OAAO,CAAC,YAAY;SAChC,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAnBD,sCAmBC;AAED;;GAEG;AACI,KAAK,UAAU,OAAO,CAAC,MAAiB;IAC7C,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC;AAFD,0BAEC;AAED;;GAEG;AACI,KAAK,UAAU,SAAS,CAC7B,MAAiB,EACjB,SAA0B,EAAE;IAE5B,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AALD,8BAKC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CAAC,MAAiB;IACtD,OAAO,MAAM,CAAC,gBAAgB,EAAE,CAAC;AACnC,CAAC;AAFD,4CAEC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CAAC,MAAiB;IACtD,MAAM,eAAe,GAAG,MAAoC,CAAC;IAE7D,IAAI,OAAO,eAAe,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;QAC3D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,eAAe,CAAC,gBAAgB,EAAE,CAAC;AAC5C,CAAC;AARD,4CAQC"}
@@ -1,8 +1,8 @@
1
1
  {
2
- "id": "@oda-agent/openclaw-plugin",
3
- "name": "oda-shopping-assistant",
2
+ "id": "oda-groceries",
3
+ "name": "Oda Groceries",
4
4
  "version": "0.1.8",
5
- "description": "Oda grocery shopping assistant safe cart planning, order history analysis, and delivery slot discovery.",
5
+ "description": "Browse groceries, review your shopping context, and apply confirmed cart changes.",
6
6
  "author": "oda-agent-kit",
7
7
  "license": "MIT",
8
8
  "configSchema": {
@@ -14,40 +14,20 @@
14
14
  "toolGroups": [
15
15
  {
16
16
  "name": "read-only",
17
- "description": "Safe, read-only tools for browsing products, cart, orders, and delivery slots.",
17
+ "description": "Safe tools for browsing groceries and reviewing shopping context.",
18
18
  "enabled": true,
19
19
  "tools": [
20
20
  {
21
- "name": "searchProducts",
22
- "description": "Search for products in the Oda catalogue by keyword."
21
+ "name": "browse_oda_catalog",
22
+ "description": "Search the Oda catalog with a short, easy-to-scan result list."
23
23
  },
24
24
  {
25
- "name": "getCart",
26
- "description": "Retrieve the current shopping cart."
25
+ "name": "review_shopping_overview",
26
+ "description": "See the cart, saved lists, repeat buys, and delivery options together."
27
27
  },
28
28
  {
29
- "name": "getOrders",
30
- "description": "Fetch paginated order history."
31
- },
32
- {
33
- "name": "getDeliverySlots",
34
- "description": "List available delivery time slots."
35
- },
36
- {
37
- "name": "getShoppingLists",
38
- "description": "List the user's saved shopping lists."
39
- },
40
- {
41
- "name": "analyseOrderHistory",
42
- "description": "Analyse past orders and return a summary of frequently ordered products."
43
- },
44
- {
45
- "name": "buildShoppingList",
46
- "description": "Resolve plain-text queries into a structured shopping list without mutating the cart."
47
- },
48
- {
49
- "name": "findCheapestDeliverySlot",
50
- "description": "Return the cheapest available delivery slot without booking it."
29
+ "name": "plan_grocery_list",
30
+ "description": "Turn grocery requests into a matched plan without changing the cart."
51
31
  }
52
32
  ]
53
33
  },
@@ -57,20 +37,8 @@
57
37
  "enabled": false,
58
38
  "tools": [
59
39
  {
60
- "name": "prepareCart",
61
- "description": "Add all items from a shopping list to the cart. Requires explicit user confirmation before use."
62
- },
63
- {
64
- "name": "addToCart",
65
- "description": "Add a single product to the cart. Requires explicit user confirmation before use."
66
- },
67
- {
68
- "name": "removeFromCart",
69
- "description": "Remove an item from the cart by cart-item ID from getCart (`cart.items[].id`). Requires explicit user confirmation before use."
70
- },
71
- {
72
- "name": "clearCart",
73
- "description": "Remove all items from the cart. Requires explicit user confirmation before use."
40
+ "name": "apply_cart_changes",
41
+ "description": "Apply one confirmed cart change."
74
42
  }
75
43
  ]
76
44
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oda-agent/openclaw-plugin",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "OpenClaw plugin for safe grocery planning and Oda automation",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -27,14 +27,9 @@ These tools are safe to invoke without user confirmation. They observe but do no
27
27
 
28
28
  | Tool | Description |
29
29
  |------|-------------|
30
- | `searchProducts` | Search the Oda catalogue by keyword |
31
- | `getCart` | Read the current shopping cart |
32
- | `getOrders` | Fetch paginated order history |
33
- | `getDeliverySlots` | List available delivery time slots |
34
- | `getShoppingLists` | List the user's saved shopping lists |
35
- | `buildShoppingList` | Resolve plain-text queries into a structured shopping list |
36
- | `analyseOrderHistory` | Summarise past orders and frequently bought products |
37
- | `findCheapestDeliverySlot` | Find the cheapest available delivery slot (read-only) |
30
+ | `browse_oda_catalog` | Search the Oda catalogue with a short result list |
31
+ | `review_shopping_overview` | Review the cart, saved lists, repeat purchases, and delivery options in one call |
32
+ | `plan_grocery_list` | Turn grocery requests into a matched shopping plan without mutating the cart |
38
33
 
39
34
  ### Cart-mutation tools (disabled by default)
40
35
 
@@ -42,10 +37,7 @@ These tools modify the shopping cart. They must be **explicitly enabled** by the
42
37
 
43
38
  | Tool | Description |
44
39
  |------|-------------|
45
- | `prepareCart` | Bulk-add all items from a shopping list to the cart |
46
- | `addToCart` | Add a single product to the cart |
47
- | `removeFromCart` | Remove a cart item by cart-item ID (`cart.items[].id`) |
48
- | `clearCart` | Remove all items from the cart |
40
+ | `apply_cart_changes` | Apply one confirmed cart change, including adding products, removing products, clearing the cart, or applying a shopping plan |
49
41
 
50
42
  ### High-risk tools (not implemented in v0)
51
43
 
@@ -68,7 +60,7 @@ Order placement and payment are **out of scope** for v0. The `placeOrder` tool i
68
60
  ```
69
61
  User: Can you suggest a weekly shop based on what I usually buy?
70
62
 
71
- Agent: Sure! Here's a proposed list based on your last 5 orders:
63
+ Agent: I reviewed your account and built a proposed list based on your recent orders:
72
64
 
73
65
  1. Oat Milk 1L × 2 — ordered 4 times in the last 3 months
74
66
  2. Sourdough Bread × 1 — ordered every week
@@ -78,7 +70,7 @@ Agent: Sure! Here's a proposed list based on your last 5 orders:
78
70
 
79
71
  User: Yes, add them.
80
72
 
81
- Agent: Adding 3 items to your cart
73
+ Agent: Applying the confirmed cart update
82
74
  ✓ Oat Milk 1L × 2
83
75
  ✓ Sourdough Bread × 1
84
76
  ✓ Greek Yoghurt 500g × 2