@oda-agent/openclaw-plugin 0.2.0 → 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 +1 -0
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +91 -108
- package/dist/entry.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/plugin.d.ts +98 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +168 -50
- package/dist/plugin.js.map +1 -1
- package/dist/tools/cartMutationTools.d.ts +19 -0
- package/dist/tools/cartMutationTools.d.ts.map +1 -1
- package/dist/tools/cartMutationTools.js +58 -1
- package/dist/tools/cartMutationTools.js.map +1 -1
- package/dist/tools/readOnlyTools.d.ts +30 -2
- package/dist/tools/readOnlyTools.d.ts.map +1 -1
- package/dist/tools/readOnlyTools.js +26 -2
- package/dist/tools/readOnlyTools.js.map +1 -1
- package/openclaw.plugin.json +12 -44
- package/package.json +1 -1
- package/skills/oda-shopping-assistant/SKILL.md +6 -14
package/dist/entry.d.ts
CHANGED
package/dist/entry.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
// ──
|
|
97
|
-
registerTool(api, '
|
|
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
|
|
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: '
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
155
|
-
return plugin.analyseOrderHistory(p?.maxPages);
|
|
149
|
+
return plugin.reviewAccount((params ?? {}));
|
|
156
150
|
});
|
|
157
|
-
registerTool(api, '
|
|
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: '
|
|
156
|
+
description: 'Plan name shown back to the user.',
|
|
163
157
|
},
|
|
164
|
-
|
|
158
|
+
requests: {
|
|
165
159
|
type: 'array',
|
|
166
|
-
description: 'Requested
|
|
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
|
|
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'
|
|
173
|
+
required: ['query'],
|
|
180
174
|
},
|
|
181
175
|
},
|
|
182
176
|
},
|
|
183
|
-
required: ['name', '
|
|
177
|
+
required: ['name', 'requests'],
|
|
184
178
|
}, async (params) => {
|
|
185
179
|
const { plugin } = await ensureLoggedIn();
|
|
186
|
-
const
|
|
187
|
-
return plugin.
|
|
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, '
|
|
183
|
+
registerTool(api, 'apply_cart_changes', 'Apply Cart Changes', 'Apply one confirmed cart change.', {
|
|
237
184
|
type: 'object',
|
|
238
185
|
properties: {
|
|
239
|
-
|
|
186
|
+
mode: {
|
|
240
187
|
type: 'string',
|
|
241
|
-
description: '
|
|
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: '
|
|
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: ['
|
|
245
|
+
required: ['mode'],
|
|
263
246
|
}, async (params) => {
|
|
264
247
|
const { client } = await ensureLoggedIn();
|
|
265
|
-
return cartMutationTools.
|
|
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: '
|
|
279
|
-
name: '
|
|
280
|
-
description: '
|
|
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;
|
|
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 {
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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.
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
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;
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":";;;
|
|
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;;;
|
|
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
|
|
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<
|
|
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,
|
|
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
|
-
|
|
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;;;
|
|
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"}
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"id": "
|
|
3
|
-
"name": "
|
|
2
|
+
"id": "oda-groceries",
|
|
3
|
+
"name": "Oda Groceries",
|
|
4
4
|
"version": "0.1.8",
|
|
5
|
-
"description": "
|
|
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
|
|
17
|
+
"description": "Safe tools for browsing groceries and reviewing shopping context.",
|
|
18
18
|
"enabled": true,
|
|
19
19
|
"tools": [
|
|
20
20
|
{
|
|
21
|
-
"name": "
|
|
22
|
-
"description": "Search
|
|
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": "
|
|
26
|
-
"description": "
|
|
25
|
+
"name": "review_shopping_overview",
|
|
26
|
+
"description": "See the cart, saved lists, repeat buys, and delivery options together."
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
|
-
"name": "
|
|
30
|
-
"description": "
|
|
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": "
|
|
61
|
-
"description": "
|
|
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
|
@@ -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
|
-
| `
|
|
31
|
-
| `
|
|
32
|
-
| `
|
|
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
|
-
| `
|
|
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:
|
|
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:
|
|
73
|
+
Agent: Applying the confirmed cart update…
|
|
82
74
|
✓ Oat Milk 1L × 2
|
|
83
75
|
✓ Sourdough Bread × 1
|
|
84
76
|
✓ Greek Yoghurt 500g × 2
|