@oda-agent/openclaw-plugin 0.1.6 → 0.1.8

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.
@@ -0,0 +1,9 @@
1
+ /// <reference types="node" />
2
+ export interface PluginCredentials {
3
+ email: string;
4
+ password: string;
5
+ }
6
+ export declare const ODA_EMAIL_ENV_VAR = "ODA_EMAIL";
7
+ export declare const ODA_PASSWORD_ENV_VAR = "ODA_PASSWORD";
8
+ export declare function readEnvironmentCredentials(env?: NodeJS.ProcessEnv): PluginCredentials;
9
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":";AAAA,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAC7C,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AAOnD,wBAAgB,0BAA0B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,iBAAiB,CAYlG"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readEnvironmentCredentials = exports.ODA_PASSWORD_ENV_VAR = exports.ODA_EMAIL_ENV_VAR = void 0;
4
+ exports.ODA_EMAIL_ENV_VAR = 'ODA_EMAIL';
5
+ exports.ODA_PASSWORD_ENV_VAR = 'ODA_PASSWORD';
6
+ function readEnvironmentValue(env, name) {
7
+ const value = env[name];
8
+ return typeof value === 'string' ? value.trim() : '';
9
+ }
10
+ function readEnvironmentCredentials(env = process.env) {
11
+ const email = readEnvironmentValue(env, exports.ODA_EMAIL_ENV_VAR);
12
+ const password = readEnvironmentValue(env, exports.ODA_PASSWORD_ENV_VAR);
13
+ if (!email || !password) {
14
+ throw new Error('Oda credentials are required before using this plugin. ' +
15
+ `Set both ${exports.ODA_EMAIL_ENV_VAR} and ${exports.ODA_PASSWORD_ENV_VAR} in the environment before launching OpenClaw.`);
16
+ }
17
+ return { email, password };
18
+ }
19
+ exports.readEnvironmentCredentials = readEnvironmentCredentials;
20
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":";;;AAKa,QAAA,iBAAiB,GAAG,WAAW,CAAC;AAChC,QAAA,oBAAoB,GAAG,cAAc,CAAC;AAEnD,SAAS,oBAAoB,CAAC,GAAsB,EAAE,IAAY;IAChE,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,SAAgB,0BAA0B,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7E,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,EAAE,yBAAiB,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,oBAAoB,CAAC,GAAG,EAAE,4BAAoB,CAAC,CAAC;IAEjE,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,yDAAyD;YACvD,YAAY,yBAAiB,QAAQ,4BAAoB,gDAAgD,CAC5G,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAZD,gEAYC"}
package/dist/entry.d.ts CHANGED
@@ -37,6 +37,8 @@ export interface OpenClawPluginEntry {
37
37
  /** Called once by the OpenClaw runtime when the plugin is activated. */
38
38
  activate(): void;
39
39
  }
40
+ export declare function register(api: OpenClawApi): void;
41
+ export declare function activate(): void;
40
42
  declare const pluginEntry: OpenClawPluginEntry;
41
43
  export default pluginEntry;
42
44
  //# sourceMappingURL=entry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH;;;;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;AAcD,QAAA,MAAM,WAAW,qBA0Jf,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,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"}
package/dist/entry.js CHANGED
@@ -35,9 +35,11 @@ var __importStar = (this && this.__importStar) || function (mod) {
35
35
  return result;
36
36
  };
37
37
  Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.activate = exports.register = void 0;
38
39
  const core_1 = require("@oda-agent/core");
39
40
  const readOnlyTools = __importStar(require("./tools/readOnlyTools.js"));
40
41
  const cartMutationTools = __importStar(require("./tools/cartMutationTools.js"));
42
+ const credentials_js_1 = require("./credentials.js");
41
43
  const plugin_js_1 = require("./plugin.js");
42
44
  /**
43
45
  * Identity helper that mirrors `definePluginEntry` from the OpenClaw SDK.
@@ -46,6 +48,103 @@ const plugin_js_1 = require("./plugin.js");
46
48
  function definePluginEntry(entry) {
47
49
  return entry;
48
50
  }
51
+ function register(api) {
52
+ let runtimePromise = null;
53
+ let authenticatedRuntimePromise = null;
54
+ function getRuntime() {
55
+ if (runtimePromise === null) {
56
+ runtimePromise = Promise.resolve()
57
+ .then(() => {
58
+ const credentials = (0, credentials_js_1.readEnvironmentCredentials)();
59
+ const client = new core_1.OdaClient({ credentials });
60
+ return {
61
+ client,
62
+ plugin: (0, plugin_js_1.createOpenClawPlugin)(client),
63
+ };
64
+ })
65
+ .catch((error) => {
66
+ runtimePromise = null;
67
+ throw error;
68
+ });
69
+ }
70
+ return runtimePromise;
71
+ }
72
+ async function ensureLoggedIn() {
73
+ if (authenticatedRuntimePromise === null) {
74
+ authenticatedRuntimePromise = getRuntime()
75
+ .then(async (runtime) => {
76
+ await runtime.client.login();
77
+ return runtime;
78
+ })
79
+ .catch((error) => {
80
+ authenticatedRuntimePromise = null;
81
+ throw error;
82
+ });
83
+ }
84
+ return authenticatedRuntimePromise;
85
+ }
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 () => {
104
+ 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);
112
+ });
113
+ api.registerTool('buildShoppingList', 'Resolve plain-text queries into a structured shopping list without mutating the cart.', async (params) => {
114
+ const { plugin } = await ensureLoggedIn();
115
+ const p = params;
116
+ return plugin.buildShoppingList(p.name, p.items);
117
+ });
118
+ api.registerTool('findCheapestDeliverySlot', 'Return the cheapest available delivery slot without booking it.', async () => {
119
+ 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);
136
+ });
137
+ api.registerTool('prepareCart', 'Add all items from a shopping list to the cart. Requires explicit user confirmation before use.', async (params) => {
138
+ const { client } = await ensureLoggedIn();
139
+ return cartMutationTools.prepareCart(client, params);
140
+ });
141
+ }
142
+ exports.register = register;
143
+ function activate() {
144
+ // Lifecycle hook called when the plugin is activated by OpenClaw.
145
+ // No additional setup is required for the Oda shopping assistant.
146
+ }
147
+ exports.activate = activate;
49
148
  // ---------------------------------------------------------------------------
50
149
  // Plugin entry
51
150
  // ---------------------------------------------------------------------------
@@ -53,85 +152,8 @@ const pluginEntry = definePluginEntry({
53
152
  id: '@oda-agent/openclaw-plugin',
54
153
  name: 'oda-shopping-assistant',
55
154
  description: 'Oda grocery shopping assistant — safe cart planning, order history analysis, and delivery slot discovery.',
56
- register(api) {
57
- const config = api.getConfig();
58
- const email = config.email ?? process.env['ODA_EMAIL'] ?? '';
59
- const password = config.password ?? process.env['ODA_PASSWORD'] ?? '';
60
- if (!email || !password) {
61
- throw new Error('Oda credentials are required. ' +
62
- 'Set the email and password fields in the plugin config, ' +
63
- 'or export the ODA_EMAIL and ODA_PASSWORD environment variables.');
64
- }
65
- const client = new core_1.OdaClient({ credentials: { email, password } });
66
- const plugin = (0, plugin_js_1.createOpenClawPlugin)(client);
67
- // Login is deferred and cached so it only happens on the first tool call.
68
- let loginPromise = null;
69
- function ensureLoggedIn() {
70
- if (loginPromise === null) {
71
- loginPromise = client.login();
72
- }
73
- return loginPromise;
74
- }
75
- // ── Read-only tools ─────────────────────────────────────────────────────
76
- api.registerTool('searchProducts', 'Search for products in the Oda catalogue by keyword.', async (params) => {
77
- await ensureLoggedIn();
78
- return readOnlyTools.searchProducts(client, params);
79
- });
80
- api.registerTool('getCart', 'Retrieve the current shopping cart.', async () => {
81
- await ensureLoggedIn();
82
- return readOnlyTools.getCart(client);
83
- });
84
- api.registerTool('getOrders', 'Fetch paginated order history.', async (params) => {
85
- await ensureLoggedIn();
86
- return readOnlyTools.getOrders(client, params);
87
- });
88
- api.registerTool('getDeliverySlots', 'List available delivery time slots.', async () => {
89
- await ensureLoggedIn();
90
- return readOnlyTools.getDeliverySlots(client);
91
- });
92
- api.registerTool('getShoppingLists', "List the user's saved shopping lists.", async () => {
93
- await ensureLoggedIn();
94
- return readOnlyTools.getShoppingLists(client);
95
- });
96
- // ── Higher-level read-only helpers ──────────────────────────────────────
97
- api.registerTool('analyseOrderHistory', 'Analyse past orders and return a summary of frequently ordered products.', async (params) => {
98
- await ensureLoggedIn();
99
- const p = params;
100
- return plugin.analyseOrderHistory(p?.maxPages);
101
- });
102
- api.registerTool('buildShoppingList', 'Resolve plain-text queries into a structured shopping list without mutating the cart.', async (params) => {
103
- await ensureLoggedIn();
104
- const p = params;
105
- return plugin.buildShoppingList(p.name, p.items);
106
- });
107
- api.registerTool('findCheapestDeliverySlot', 'Return the cheapest available delivery slot without booking it.', async () => {
108
- await ensureLoggedIn();
109
- return plugin.findCheapestDeliverySlot();
110
- });
111
- // ── Cart-mutation tools (disabled by default in manifest) ───────────────
112
- api.registerTool('addToCart', 'Add a single product to the cart. Requires explicit user confirmation before use.', async (params) => {
113
- await ensureLoggedIn();
114
- const p = params;
115
- return cartMutationTools.addToCart(client, p.productId, p.quantity);
116
- });
117
- api.registerTool('removeFromCart', 'Remove an item from the cart by product ID. Requires explicit user confirmation before use.', async (params) => {
118
- await ensureLoggedIn();
119
- const p = params;
120
- return cartMutationTools.removeFromCart(client, p.productId);
121
- });
122
- api.registerTool('clearCart', 'Remove all items from the cart. Requires explicit user confirmation before use.', async () => {
123
- await ensureLoggedIn();
124
- return cartMutationTools.clearCart(client);
125
- });
126
- api.registerTool('prepareCart', 'Add all items from a shopping list to the cart. Requires explicit user confirmation before use.', async (params) => {
127
- await ensureLoggedIn();
128
- return cartMutationTools.prepareCart(client, params);
129
- });
130
- },
131
- activate() {
132
- // Lifecycle hook called when the plugin is activated by OpenClaw.
133
- // No additional setup is required for the Oda shopping assistant.
134
- },
155
+ register,
156
+ activate,
135
157
  });
136
158
  exports.default = pluginEntry;
137
159
  //# sourceMappingURL=entry.js.map
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,2CAAmD;AAwCnD;;;GAGG;AACH,SAAS,iBAAiB,CAAC,KAA0B;IACnD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,WAAW,GAAG,iBAAiB,CAAC;IACpC,EAAE,EAAE,4BAA4B;IAChC,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EACT,2GAA2G;IAE7G,QAAQ,CAAC,GAAgB;QACvB,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAA2C,CAAC;QACxE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAEtE,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,gCAAgC;gBAC9B,0DAA0D;gBAC1D,iEAAiE,CACpE,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,gBAAS,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,IAAA,gCAAoB,EAAC,MAAM,CAAC,CAAC;QAE5C,0EAA0E;QAC1E,IAAI,YAAY,GAAyB,IAAI,CAAC;QAC9C,SAAS,cAAc;YACrB,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;gBAC1B,YAAY,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,2EAA2E;QAE3E,GAAG,CAAC,YAAY,CACd,gBAAgB,EAChB,sDAAsD,EACtD,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,cAAc,EAAE,CAAC;YACvB,OAAO,aAAa,CAAC,cAAc,CAAC,MAAM,EAAE,MAA8B,CAAC,CAAC;QAC9E,CAAC,CACF,CAAC;QAEF,GAAG,CAAC,YAAY,CACd,SAAS,EACT,qCAAqC,EACrC,KAAK,IAAI,EAAE;YACT,MAAM,cAAc,EAAE,CAAC;YACvB,OAAO,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC,CACF,CAAC;QAEF,GAAG,CAAC,YAAY,CACd,WAAW,EACX,gCAAgC,EAChC,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,cAAc,EAAE,CAAC;YACvB,OAAO,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAqC,CAAC,CAAC;QAChF,CAAC,CACF,CAAC;QAEF,GAAG,CAAC,YAAY,CACd,kBAAkB,EAClB,qCAAqC,EACrC,KAAK,IAAI,EAAE;YACT,MAAM,cAAc,EAAE,CAAC;YACvB,OAAO,aAAa,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC,CACF,CAAC;QAEF,GAAG,CAAC,YAAY,CACd,kBAAkB,EAClB,uCAAuC,EACvC,KAAK,IAAI,EAAE;YACT,MAAM,cAAc,EAAE,CAAC;YACvB,OAAO,aAAa,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC,CACF,CAAC;QAEF,2EAA2E;QAE3E,GAAG,CAAC,YAAY,CACd,qBAAqB,EACrB,0EAA0E,EAC1E,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,MAA2C,CAAC;YACtD,OAAO,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACjD,CAAC,CACF,CAAC;QAEF,GAAG,CAAC,YAAY,CACd,mBAAmB,EACnB,uFAAuF,EACvF,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,MAA6E,CAAC;YACxF,OAAO,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QACnD,CAAC,CACF,CAAC;QAEF,GAAG,CAAC,YAAY,CACd,0BAA0B,EAC1B,iEAAiE,EACjE,KAAK,IAAI,EAAE;YACT,MAAM,cAAc,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,wBAAwB,EAAE,CAAC;QAC3C,CAAC,CACF,CAAC;QAEF,2EAA2E;QAE3E,GAAG,CAAC,YAAY,CACd,WAAW,EACX,mFAAmF,EACnF,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,MAAiD,CAAC;YAC5D,OAAO,iBAAiB,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QACtE,CAAC,CACF,CAAC;QAEF,GAAG,CAAC,YAAY,CACd,gBAAgB,EAChB,6FAA6F,EAC7F,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,MAA+B,CAAC;YAC1C,OAAO,iBAAiB,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/D,CAAC,CACF,CAAC;QAEF,GAAG,CAAC,YAAY,CACd,WAAW,EACX,iFAAiF,EACjF,KAAK,IAAI,EAAE;YACT,MAAM,cAAc,EAAE,CAAC;YACvB,OAAO,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC,CACF,CAAC;QAEF,GAAG,CAAC,YAAY,CACd,aAAa,EACb,iGAAiG,EACjG,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,cAAc,EAAE,CAAC;YACvB,OAAO,iBAAiB,CAAC,WAAW,CAAC,MAAM,EAAE,MAAsB,CAAC,CAAC;QACvE,CAAC,CACF,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,kEAAkE;QAClE,kEAAkE;IACpE,CAAC;CACF,CAAC,CAAC;AAEH,kBAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { default } from './entry.js';
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
4
  export type { ShoppingList, OrderHistorySummary, OpenClawPlugin } from './plugin.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,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,EAAE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -3,9 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createOpenClawPlugin = exports.default = void 0;
6
+ exports.createOpenClawPlugin = exports.activate = exports.register = exports.default = void 0;
7
7
  var entry_js_1 = require("./entry.js");
8
8
  Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(entry_js_1).default; } });
9
+ Object.defineProperty(exports, "register", { enumerable: true, get: function () { return entry_js_1.register; } });
10
+ Object.defineProperty(exports, "activate", { enumerable: true, get: function () { return entry_js_1.activate; } });
9
11
  var plugin_js_1 = require("./plugin.js");
10
12
  Object.defineProperty(exports, "createOpenClawPlugin", { enumerable: true, get: function () { return plugin_js_1.createOpenClawPlugin; } });
11
13
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,uCAAqC;AAA5B,oHAAA,OAAO,OAAA;AAEhB,yCAAmD;AAA1C,iHAAA,oBAAoB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,uCAAyD;AAAhD,oHAAA,OAAO,OAAA;AAAE,oGAAA,QAAQ,OAAA;AAAE,oGAAA,QAAQ,OAAA;AAEpC,yCAAmD;AAA1C,iHAAA,oBAAoB,OAAA"}
@@ -1,22 +1,14 @@
1
1
  {
2
2
  "id": "@oda-agent/openclaw-plugin",
3
3
  "name": "oda-shopping-assistant",
4
- "version": "0.1.6",
4
+ "version": "0.1.8",
5
5
  "description": "Oda grocery shopping assistant — safe cart planning, order history analysis, and delivery slot discovery.",
6
6
  "author": "oda-agent-kit",
7
7
  "license": "MIT",
8
8
  "configSchema": {
9
9
  "type": "object",
10
- "properties": {
11
- "email": {
12
- "type": "string",
13
- "description": "Your Oda.no account email address. Falls back to the ODA_EMAIL environment variable if omitted."
14
- },
15
- "password": {
16
- "type": "string",
17
- "description": "Your Oda.no account password. Falls back to the ODA_PASSWORD environment variable if omitted."
18
- }
19
- },
10
+ "description": "Set ODA_EMAIL and ODA_PASSWORD in the environment before launching OpenClaw. Reload the plugin after changing either value.",
11
+ "properties": {},
20
12
  "required": []
21
13
  },
22
14
  "toolGroups": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oda-agent/openclaw-plugin",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
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",