@oda-agent/openclaw-plugin 0.1.9 → 0.3.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
@@ -16,11 +16,22 @@
16
16
  * members used by this plugin are declared here.
17
17
  */
18
18
  export interface OpenClawApi {
19
- /** Register a named tool with the plugin runtime. */
20
- registerTool(name: string, description: string, handler: (params: unknown) => Promise<unknown>): void;
19
+ /** Register a tool with the plugin runtime. */
20
+ registerTool(tool: OpenClawToolDefinition): void;
21
21
  /** Return the plugin configuration provided by the user or environment. */
22
22
  getConfig(): Record<string, unknown>;
23
23
  }
24
+ export interface OpenClawToolDefinition {
25
+ name: string;
26
+ label?: string;
27
+ description: string;
28
+ parameters: {
29
+ type: 'object';
30
+ properties: Record<string, unknown>;
31
+ required?: string[];
32
+ };
33
+ execute(toolCallId: string, params: unknown): Promise<unknown>;
34
+ }
24
35
  /** Shape of an OpenClaw native plugin entry. */
25
36
  export interface OpenClawPluginEntry {
26
37
  /** Unique identifier for the plugin (must match `openclaw.plugin.json` id). */
@@ -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,qDAAqD;IACrD,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAC7C,IAAI,CAAC;IACR,2EAA2E;IAC3E,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;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;AAeD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CA8J/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,6 +48,17 @@ const plugin_js_1 = require("./plugin.js");
48
48
  function definePluginEntry(entry) {
49
49
  return entry;
50
50
  }
51
+ function registerTool(api, name, label, description, parameters, handler) {
52
+ api.registerTool({
53
+ name,
54
+ label,
55
+ description,
56
+ parameters,
57
+ async execute(_toolCallId, params) {
58
+ return handler(params);
59
+ },
60
+ });
61
+ }
51
62
  function register(api) {
52
63
  let runtimePromise = null;
53
64
  let authenticatedRuntimePromise = null;
@@ -83,60 +94,158 @@ function register(api) {
83
94
  }
84
95
  return authenticatedRuntimePromise;
85
96
  }
86
- // ── Read-only tools ─────────────────────────────────────────────────────
87
- api.registerTool('searchProducts', 'Search for products in the Oda catalogue by keyword.', async (params) => {
88
- const { client } = await ensureLoggedIn();
89
- return readOnlyTools.searchProducts(client, params);
90
- });
91
- api.registerTool('getCart', 'Retrieve the current shopping cart.', async () => {
92
- const { client } = await ensureLoggedIn();
93
- return readOnlyTools.getCart(client);
94
- });
95
- api.registerTool('getOrders', 'Fetch paginated order history.', async (params) => {
96
- const { client } = await ensureLoggedIn();
97
- return readOnlyTools.getOrders(client, params);
98
- });
99
- api.registerTool('getDeliverySlots', 'List available delivery time slots.', async () => {
100
- const { client } = await ensureLoggedIn();
101
- return readOnlyTools.getDeliverySlots(client);
102
- });
103
- api.registerTool('getShoppingLists', "List the user's saved shopping lists.", async () => {
97
+ // ── Workflow-oriented tools ─────────────────────────────────────────────
98
+ registerTool(api, 'browse_oda_catalog', 'Browse Catalog', 'Search the Oda catalog with a short, easy-to-scan result list.', {
99
+ type: 'object',
100
+ properties: {
101
+ query: {
102
+ type: 'string',
103
+ description: 'Search query for the Oda catalog.',
104
+ },
105
+ limit: {
106
+ type: 'number',
107
+ description: 'Maximum number of products to return. Defaults to 5.',
108
+ },
109
+ },
110
+ required: ['query'],
111
+ }, async (params) => {
104
112
  const { client } = await ensureLoggedIn();
105
- return readOnlyTools.getShoppingLists(client);
106
- });
107
- // ── Higher-level read-only helpers ──────────────────────────────────────
108
- api.registerTool('analyseOrderHistory', 'Analyse past orders and return a summary of frequently ordered products.', async (params) => {
109
- const { plugin } = await ensureLoggedIn();
110
- const p = params;
111
- return plugin.analyseOrderHistory(p?.maxPages);
113
+ return readOnlyTools.browseCatalog(client, params);
112
114
  });
113
- api.registerTool('buildShoppingList', 'Resolve plain-text queries into a structured shopping list without mutating the cart.', async (params) => {
115
+ registerTool(api, 'review_shopping_overview', 'Review Shopping Overview', 'See the cart, saved lists, repeat buys, and delivery options together.', {
116
+ type: 'object',
117
+ properties: {
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: {
135
+ type: 'number',
136
+ description: 'Maximum number of order-history pages to inspect.',
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
+ },
146
+ },
147
+ }, async (params) => {
114
148
  const { plugin } = await ensureLoggedIn();
115
- const p = params;
116
- return plugin.buildShoppingList(p.name, p.items);
149
+ return plugin.reviewAccount((params ?? {}));
117
150
  });
118
- api.registerTool('findCheapestDeliverySlot', 'Return the cheapest available delivery slot without booking it.', async () => {
151
+ registerTool(api, 'plan_grocery_list', 'Plan Grocery List', 'Turn grocery requests into a matched plan without changing the cart.', {
152
+ type: 'object',
153
+ properties: {
154
+ name: {
155
+ type: 'string',
156
+ description: 'Plan name shown back to the user.',
157
+ },
158
+ requests: {
159
+ type: 'array',
160
+ description: 'Requested groceries to resolve into Oda products.',
161
+ items: {
162
+ type: 'object',
163
+ properties: {
164
+ query: {
165
+ type: 'string',
166
+ description: 'Free-text grocery request.',
167
+ },
168
+ quantity: {
169
+ type: 'number',
170
+ description: 'Requested quantity. Defaults to 1.',
171
+ },
172
+ },
173
+ required: ['query'],
174
+ },
175
+ },
176
+ },
177
+ required: ['name', 'requests'],
178
+ }, async (params) => {
119
179
  const { plugin } = await ensureLoggedIn();
120
- return plugin.findCheapestDeliverySlot();
121
- });
122
- // ── Cart-mutation tools (disabled by default in manifest) ───────────────
123
- api.registerTool('addToCart', 'Add a single product to the cart. Requires explicit user confirmation before use.', async (params) => {
124
- const { client } = await ensureLoggedIn();
125
- const p = params;
126
- return cartMutationTools.addToCart(client, p.productId, p.quantity);
127
- });
128
- api.registerTool('removeFromCart', 'Remove an item from the cart by product ID. Requires explicit user confirmation before use.', async (params) => {
129
- const { client } = await ensureLoggedIn();
130
- const p = params;
131
- return cartMutationTools.removeFromCart(client, p.productId);
132
- });
133
- api.registerTool('clearCart', 'Remove all items from the cart. Requires explicit user confirmation before use.', async () => {
134
- const { client } = await ensureLoggedIn();
135
- return cartMutationTools.clearCart(client);
180
+ const plan = params;
181
+ return plugin.planGroceries(plan.name, plan.requests);
136
182
  });
137
- api.registerTool('prepareCart', 'Add all items from a shopping list to the cart. Requires explicit user confirmation before use.', async (params) => {
183
+ registerTool(api, 'apply_cart_changes', 'Apply Cart Changes', 'Apply one confirmed cart change.', {
184
+ type: 'object',
185
+ properties: {
186
+ mode: {
187
+ type: 'string',
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'],
218
+ },
219
+ items: {
220
+ type: 'array',
221
+ description: 'Products to add when mode is "add-products".',
222
+ items: {
223
+ type: 'object',
224
+ properties: {
225
+ productId: {
226
+ type: 'number',
227
+ description: 'Oda product ID.',
228
+ },
229
+ quantity: {
230
+ type: 'number',
231
+ description: 'Quantity to add.',
232
+ },
233
+ },
234
+ required: ['productId', 'quantity'],
235
+ },
236
+ },
237
+ productIds: {
238
+ type: 'array',
239
+ description: 'Products to remove when mode is "remove-products".',
240
+ items: {
241
+ type: 'number',
242
+ },
243
+ },
244
+ },
245
+ required: ['mode'],
246
+ }, async (params) => {
138
247
  const { client } = await ensureLoggedIn();
139
- return cartMutationTools.prepareCart(client, params);
248
+ return cartMutationTools.updateCart(client, params);
140
249
  });
141
250
  }
142
251
  exports.register = register;
@@ -149,9 +258,9 @@ exports.activate = activate;
149
258
  // Plugin entry
150
259
  // ---------------------------------------------------------------------------
151
260
  const pluginEntry = definePluginEntry({
152
- id: '@oda-agent/openclaw-plugin',
153
- name: 'oda-shopping-assistant',
154
- 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.',
155
264
  register,
156
265
  activate,
157
266
  });
package/dist/entry.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"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"}
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,96 @@ 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
+ available: boolean;
17
+ }
18
+ /** A compact cart summary for UI-facing tools. */
19
+ export interface CartOverview {
20
+ itemCount: number;
21
+ totalPrice: string;
22
+ currency: string;
23
+ items: CartOverviewItem[];
24
+ }
25
+ /** A compact saved-list summary for UI-facing tools. */
26
+ export interface SavedListOverview {
27
+ id: number;
28
+ name: string;
29
+ itemCount: number;
30
+ }
31
+ /** A compact product frequency summary. */
32
+ export interface FrequentProductOverview {
33
+ productId: number;
34
+ name: string;
35
+ brand: string | null;
36
+ timesOrdered: number;
37
+ }
38
+ /** A compact delivery-slot summary. */
39
+ export interface DeliverySlotOverview {
40
+ id: number;
41
+ start: string;
42
+ end: string;
43
+ price: string;
44
+ currency: string;
45
+ }
46
+ /** Options for the reviewAccount helper. */
47
+ export interface ReviewAccountOptions {
48
+ includeCart?: boolean;
49
+ includeSavedLists?: boolean;
50
+ includeOrderHistory?: boolean;
51
+ includeDelivery?: boolean;
52
+ maxHistoryPages?: number;
53
+ maxSavedLists?: number;
54
+ maxDeliverySlots?: number;
55
+ }
56
+ /** User-facing account review returned by the OpenClaw tool. */
57
+ export interface AccountReview {
58
+ cart?: CartOverview;
59
+ savedLists?: SavedListOverview[];
60
+ orderHistory?: {
61
+ totalOrders: number;
62
+ totalSpend: string;
63
+ currency: string;
64
+ mostOrderedProducts: FrequentProductOverview[];
65
+ };
66
+ delivery?: {
67
+ availableSlotCount: number;
68
+ cheapestSlot?: DeliverySlotOverview;
69
+ upcomingSlots: DeliverySlotOverview[];
70
+ };
71
+ }
72
+ /** A single request supplied to the grocery planner. */
73
+ export interface GroceryRequest {
74
+ query: string;
75
+ quantity?: number;
76
+ }
77
+ /** A matched request in the grocery planner output. */
78
+ export interface PlannedGroceryItem {
79
+ query: string;
80
+ quantity: number;
81
+ productId: number;
82
+ productName: string;
83
+ brand: string | null;
84
+ price: string;
85
+ currency: string;
86
+ }
87
+ /** A request that could not be matched to a product. */
88
+ export interface UnmatchedGroceryRequest {
89
+ query: string;
90
+ quantity: number;
91
+ }
92
+ /** User-facing grocery plan returned by the OpenClaw tool. */
93
+ export interface GroceryPlan {
94
+ name: string;
95
+ shoppingList: ShoppingList;
96
+ matchedItems: PlannedGroceryItem[];
97
+ unmatchedItems: UnmatchedGroceryRequest[];
98
+ summary: string;
99
+ }
10
100
  /** Summary of a user's order history. */
11
101
  export interface OrderHistorySummary {
12
102
  totalOrders: number;
@@ -19,6 +109,14 @@ export interface OrderHistorySummary {
19
109
  }
20
110
  /** The OpenClaw plugin object returned by the factory. */
21
111
  export interface OpenClawPlugin {
112
+ /**
113
+ * Search the current account state in one call for day-to-day planning.
114
+ */
115
+ reviewAccount(options?: ReviewAccountOptions): Promise<AccountReview>;
116
+ /**
117
+ * Build a user-facing grocery plan from free-text requests.
118
+ */
119
+ planGroceries(name: string, requests: GroceryRequest[]): Promise<GroceryPlan>;
22
120
  /**
23
121
  * Search for products and build a shopping list from a plain-text description.
24
122
  * 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,87 @@
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
+ totalPrice: cart.total_price,
8
+ currency: cart.currency,
9
+ items: cart.items.map((item) => ({
10
+ productId: item.product.id,
11
+ name: item.product.full_name,
12
+ quantity: item.quantity,
13
+ linePrice: item.line_price,
14
+ available: item.product.is_available,
15
+ })),
16
+ };
17
+ }
18
+ function summarizeSavedLists(lists, maxSavedLists) {
19
+ return lists.slice(0, maxSavedLists).map((list) => ({
20
+ id: list.id,
21
+ name: list.name,
22
+ itemCount: list.items.length,
23
+ }));
24
+ }
25
+ async function loadShoppingLists(client) {
26
+ const clientWithLists = client;
27
+ if (typeof clientWithLists.getShoppingLists !== 'function') {
28
+ return [];
29
+ }
30
+ return clientWithLists.getShoppingLists();
31
+ }
32
+ function summarizeDeliverySlots(slots, maxDeliverySlots) {
33
+ const available = slots
34
+ .filter((slot) => slot.is_available)
35
+ .sort((left, right) => parseFloat(left.price) - parseFloat(right.price));
36
+ return {
37
+ availableSlotCount: available.length,
38
+ cheapestSlot: available[0]
39
+ ? {
40
+ id: available[0].id,
41
+ start: available[0].start,
42
+ end: available[0].end,
43
+ price: available[0].price,
44
+ currency: available[0].currency,
45
+ }
46
+ : undefined,
47
+ upcomingSlots: available.slice(0, maxDeliverySlots).map((slot) => ({
48
+ id: slot.id,
49
+ start: slot.start,
50
+ end: slot.end,
51
+ price: slot.price,
52
+ currency: slot.currency,
53
+ })),
54
+ };
55
+ }
56
+ async function resolveShoppingRequests(client, requests) {
57
+ const items = [];
58
+ const matchedItems = [];
59
+ const unmatchedItems = [];
60
+ for (const request of requests) {
61
+ const quantity = request.quantity ?? 1;
62
+ const results = await client.searchProducts(request.query);
63
+ const first = results.results[0];
64
+ if (!first) {
65
+ unmatchedItems.push({ query: request.query, quantity });
66
+ continue;
67
+ }
68
+ items.push({ productId: first.id, quantity });
69
+ matchedItems.push({
70
+ query: request.query,
71
+ quantity,
72
+ productId: first.id,
73
+ productName: first.full_name,
74
+ brand: first.brand,
75
+ price: first.gross_price,
76
+ currency: first.currency,
77
+ });
78
+ }
79
+ return {
80
+ items,
81
+ matchedItems,
82
+ unmatchedItems,
83
+ };
84
+ }
4
85
  // ---------------------------------------------------------------------------
5
86
  // Factory
6
87
  // ---------------------------------------------------------------------------
@@ -20,67 +101,104 @@ exports.createOpenClawPlugin = void 0;
20
101
  * ```
21
102
  */
22
103
  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
- }
104
+ async function analyseOrderHistory(maxPages = 5) {
105
+ const productCounts = new Map();
106
+ let totalOrders = 0;
107
+ let totalSpendCents = 0;
108
+ let currency = 'NOK';
109
+ for (let page = 1; page <= maxPages; page++) {
110
+ const orderPage = await client.getOrders(page);
111
+ if (orderPage.results.length === 0)
112
+ break;
113
+ totalOrders += orderPage.results.length;
114
+ for (const order of orderPage.results) {
115
+ currency = order.currency;
116
+ totalSpendCents += Math.round(parseFloat(order.total_price) * 100);
117
+ for (const item of order.items) {
118
+ const existing = productCounts.get(item.product.id);
119
+ if (existing) {
120
+ existing.count += item.quantity;
121
+ }
122
+ else {
123
+ productCounts.set(item.product.id, { product: item.product, count: item.quantity });
56
124
  }
57
125
  }
58
- if (!orderPage.next)
59
- break;
60
126
  }
61
- const sorted = [...productCounts.values()]
62
- .sort((a, b) => b.count - a.count)
63
- .slice(0, 10)
64
- .map(({ product, count }) => ({ product, timesOrdered: count }));
127
+ if (!orderPage.next)
128
+ break;
129
+ }
130
+ const sorted = [...productCounts.values()]
131
+ .sort((a, b) => b.count - a.count)
132
+ .slice(0, 10)
133
+ .map(({ product, count }) => ({ product, timesOrdered: count }));
134
+ return {
135
+ totalOrders,
136
+ totalSpend: (totalSpendCents / 100).toFixed(2),
137
+ currency,
138
+ mostOrderedProducts: sorted,
139
+ };
140
+ }
141
+ async function buildShoppingList(name, items) {
142
+ const resolved = await resolveShoppingRequests(client, items);
143
+ return { name, items: resolved.items };
144
+ }
145
+ async function findCheapestDeliverySlot() {
146
+ const slots = await client.getDeliverySlots();
147
+ const available = slots.filter((slot) => slot.is_available);
148
+ if (available.length === 0)
149
+ return undefined;
150
+ return available.sort((left, right) => parseFloat(left.price) - parseFloat(right.price))[0];
151
+ }
152
+ return {
153
+ async reviewAccount(options = {}) {
154
+ const { includeCart = true, includeSavedLists = true, includeOrderHistory = true, includeDelivery = true, maxHistoryPages = 5, maxSavedLists = 5, maxDeliverySlots = 3, } = options;
155
+ const review = {};
156
+ if (includeCart) {
157
+ review.cart = summarizeCart(await client.getCart());
158
+ }
159
+ if (includeSavedLists) {
160
+ review.savedLists = summarizeSavedLists(await loadShoppingLists(client), maxSavedLists);
161
+ }
162
+ if (includeOrderHistory) {
163
+ const summary = await analyseOrderHistory(maxHistoryPages);
164
+ review.orderHistory = {
165
+ totalOrders: summary.totalOrders,
166
+ totalSpend: summary.totalSpend,
167
+ currency: summary.currency,
168
+ mostOrderedProducts: summary.mostOrderedProducts.map(({ product, timesOrdered }) => ({
169
+ productId: product.id,
170
+ name: product.full_name,
171
+ brand: product.brand,
172
+ timesOrdered,
173
+ })),
174
+ };
175
+ }
176
+ if (includeDelivery) {
177
+ review.delivery = summarizeDeliverySlots(await client.getDeliverySlots(), maxDeliverySlots);
178
+ }
179
+ return review;
180
+ },
181
+ async planGroceries(name, requests) {
182
+ const resolved = await resolveShoppingRequests(client, requests);
65
183
  return {
66
- totalOrders,
67
- totalSpend: (totalSpendCents / 100).toFixed(2),
68
- currency,
69
- mostOrderedProducts: sorted,
184
+ name,
185
+ shoppingList: {
186
+ name,
187
+ items: resolved.items,
188
+ },
189
+ matchedItems: resolved.matchedItems,
190
+ unmatchedItems: resolved.unmatchedItems,
191
+ summary: `Matched ${resolved.matchedItems.length} request(s) and left ${resolved.unmatchedItems.length} unmatched.`,
70
192
  };
71
193
  },
194
+ buildShoppingList,
195
+ analyseOrderHistory,
72
196
  async prepareCart(list) {
73
197
  for (const item of list.items) {
74
198
  await client.addToCart(item.productId, item.quantity);
75
199
  }
76
200
  },
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
- },
201
+ findCheapestDeliverySlot,
84
202
  };
85
203
  }
86
204
  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.1.9",
3
+ "version": "0.3.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