openclaw-ynabro 2.2.9 → 2.2.11

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/README.md CHANGED
@@ -22,17 +22,70 @@ After installation, restart the OpenClaw gateway to load the plugin:
22
22
  openclaw gateway restart
23
23
  ```
24
24
 
25
+ ## Tool Access
26
+
27
+ OpenClaw's default `coding` tool profile only exposes core built-in tools. Plugin tools like `ynabro_*` must be explicitly allowed before agents can call them.
28
+
29
+ ### Global — all agents (recommended)
30
+
31
+ Adds `openclaw-ynabro` tools to every agent on this gateway:
32
+
33
+ ```bash
34
+ openclaw config set tools.alsoAllow '["openclaw-ynabro"]'
35
+ openclaw gateway restart
36
+ ```
37
+
38
+ This is the standard pattern used by OpenClaw plugins and the right choice for most installs.
39
+
40
+ ### Per-agent — scoped to one agent only
41
+
42
+ If you want ynabro tools available only to a specific dedicated agent (and not your main session or other agents), add `tools.alsoAllow` to that agent's entry in `openclaw.json` instead:
43
+
44
+ ```json
45
+ {
46
+ "agents": {
47
+ "list": [
48
+ {
49
+ "id": "ynabro-matchmaker",
50
+ "tools": {
51
+ "profile": "coding",
52
+ "alsoAllow": ["openclaw-ynabro"]
53
+ }
54
+ }
55
+ ]
56
+ }
57
+ }
58
+ ```
59
+
60
+ Or via the CLI:
61
+
62
+ ```bash
63
+ openclaw config set tools.alsoAllow '["openclaw-ynabro"]'
64
+ openclaw gateway restart
65
+ ```
66
+
67
+ ### Full profile — no restrictions (not recommended)
68
+
69
+ Setting `tools.profile: "full"` removes all tool restrictions for an agent, giving access to every installed plugin — not just ynabro. Only use this if you intentionally want unrestricted tool access:
70
+
71
+ ```json
72
+ {
73
+ "id": "ynabro-matchmaker",
74
+ "tools": { "profile": "full" }
75
+ }
76
+ ```
77
+
25
78
  ## Available Tools
26
79
 
27
- - `ynabro_onboarding_status`
28
- - `ynabro_setup`
29
- - `ynabro_save_default_plan`
30
- - `ynabro_get_pending_transactions`
31
- - `ynabro_get_recent_transactions`
32
- - `ynabro_approve_transaction`
33
- - `ynabro_get_plan_info`
34
- - `ynabro_get_skill_state`
35
- - `ynabro_update_skill_state`
80
+ - `ynabro_onboarding_status` — check whether the plugin is fully configured
81
+ - `ynabro_setup` — fetch available YNAB plans for onboarding
82
+ - `ynabro_save_default_plan` — persist the selected plan as the default
83
+ - `ynabro_get_pending_transactions` — fetch all unapproved transactions
84
+ - `ynabro_get_recent_transactions` — fetch recent transactions for context or audit
85
+ - `ynabro_approve_transaction` — approve a specific transaction by ID
86
+ - `ynabro_get_plan_info` — get basic plan metadata
87
+ - `ynabro_get_skill_state` — read persistent skill state (memory, flags)
88
+ - `ynabro_update_skill_state` — merge updates into persistent skill state
36
89
 
37
90
  ## Configuration
38
91
 
@@ -101,3 +154,58 @@ Run `ynabro_setup` to fetch your available YNAB plans, then `ynabro_save_default
101
154
  3. `ynabro_save_default_plan` with `{ planId: "<selected-id>" }` — persists the default
102
155
 
103
156
  After onboarding, all plan-dependent tools (`ynabro_get_pending_transactions`, `ynabro_get_recent_transactions`, `ynabro_approve_transaction`, `ynabro_get_plan_info`) resolve the plan automatically — no `planId` parameter required.
157
+
158
+ ## Dedicated Agent Setup
159
+
160
+ For YNAB-specific workflows (e.g. transaction review) it is recommended to create a dedicated agent rather than running ynabro tools in your main session. This keeps YNAB context and memory isolated and prevents ynabro tools from appearing in unrelated conversations.
161
+
162
+ ### Example: `ynabro-matchmaker`
163
+
164
+ Add the following entry to the `agents.list` array in `~/.openclaw/openclaw.json`:
165
+
166
+ ```json
167
+ {
168
+ // Unique agent identifier used for routing and CLI commands
169
+ "id": "ynabro-matchmaker",
170
+
171
+ // Internal name used when listing agents via `openclaw agents list`
172
+ "name": "ynabro-matchmaker",
173
+
174
+ // Display name, emoji, and avatar shown in the OpenClaw dashboard
175
+ "identity": {
176
+ "name": "YNABro Matchmaker",
177
+ "emoji": "🔁",
178
+ "avatar": "logo.png"
179
+ },
180
+
181
+ // Isolated workspace — this agent gets its own AGENTS.md, memory,
182
+ // and context files completely separate from your main session
183
+ "workspace": "~/.openclaw/workspace-ynabro-matchmaker",
184
+
185
+ // Isolated session store and auth profiles for this agent
186
+ "agentDir": "~/.openclaw/agents/ynabro-matchmaker/agent",
187
+
188
+ // Skills to inject into the system prompt at session start.
189
+ // match-transactions is provided by the openclaw-ynabro plugin
190
+ // and guides the agent through the transaction review workflow.
191
+ "skills": ["match-transactions"],
192
+
193
+ // Scope ynabro tools to this agent only.
194
+ // Remove this block and use the global option in Tool Access above
195
+ // if you want ynabro tools available across all agents instead.
196
+ "tools": {
197
+ "profile": "coding",
198
+ "alsoAllow": ["openclaw-ynabro"]
199
+ }
200
+ }
201
+ ```
202
+
203
+ Then restart the gateway to apply:
204
+
205
+ ```bash
206
+ openclaw gateway restart
207
+ ```
208
+
209
+ Once the agent is running, start a conversation and type `/skill:match-transactions` to trigger the transaction review workflow, or say it naturally: _"match my transactions"_.
210
+
211
+ > **Note:** Skills are loaded into the system prompt at session start. If you update a skill or change the agent config, type `/new` in the chat to start a fresh session and pick up the changes.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;;;oBAoGxD,iBAAiB,KAAK,IAAI;;;;;;;;;AAiG5C,wBAyQG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;;;oBAoGxD,iBAAiB,KAAK,IAAI;;;;;;;;;AAiG5C,wBAuSG"}
package/dist/index.js CHANGED
@@ -205,7 +205,7 @@ export default definePluginEntry({
205
205
  }
206
206
  return planId;
207
207
  }
208
- api.registerTool({
208
+ api.registerTool((_ctx) => ({
209
209
  name: "ynabro_onboarding_status",
210
210
  label: "Onboarding Status",
211
211
  description: "Check whether YNABro is fully configured. Returns ready status, any missing configuration, and token generation instructions.",
@@ -214,8 +214,8 @@ export default definePluginEntry({
214
214
  const status = await checkOnboardingStatus(openClawAdapter);
215
215
  return ok(JSON.stringify(status));
216
216
  },
217
- });
218
- api.registerTool({
217
+ }), { names: ["ynabro_onboarding_status"] });
218
+ api.registerTool((_ctx) => ({
219
219
  name: "ynabro_setup",
220
220
  label: "Setup YNAB",
221
221
  description: "Fetch available YNAB plans for onboarding. Returns a list of plans. " +
@@ -231,8 +231,8 @@ export default definePluginEntry({
231
231
  plans: plans.map((p) => ({ id: p.id, name: p.name })),
232
232
  }));
233
233
  },
234
- });
235
- api.registerTool({
234
+ }), { names: ["ynabro_setup"] });
235
+ api.registerTool((_ctx) => ({
236
236
  name: "ynabro_save_default_plan",
237
237
  label: "Save Default Plan",
238
238
  description: "Save a YNAB plan as the default for all subsequent tool calls. " +
@@ -241,13 +241,16 @@ export default definePluginEntry({
241
241
  async execute(_id, raw) {
242
242
  try {
243
243
  const p = params(raw);
244
- const client = getClient();
245
- const plans = await client.getPlans();
246
- await setupYnab(client, plans, p.planId, openClawAdapter);
247
- const saved = plans.find((plan) => plan.id === p.planId);
244
+ const planId = p.planId;
245
+ if (!planId) {
246
+ throw new Error("planId is required");
247
+ }
248
+ // Pass undefined for plans — the agent already fetched them via
249
+ // ynabro_setup, so we skip the redundant getPlans() validation fetch.
250
+ await setupYnab(getClient(), undefined, planId, openClawAdapter);
248
251
  return ok(JSON.stringify({
249
- message: `Default plan set to: ${saved?.name ?? p.planId}`,
250
- defaultPlanId: p.planId,
252
+ message: `Default plan set to: ${planId}`,
253
+ defaultPlanId: planId,
251
254
  }));
252
255
  }
253
256
  catch (_error) {
@@ -258,8 +261,8 @@ export default definePluginEntry({
258
261
  }));
259
262
  }
260
263
  },
261
- });
262
- api.registerTool({
264
+ }), { names: ["ynabro_save_default_plan"] });
265
+ api.registerTool((_ctx) => ({
263
266
  name: "ynabro_get_pending_transactions",
264
267
  label: "Get Pending Transactions",
265
268
  description: "Get all pending (uncategorized) transactions for a plan",
@@ -281,8 +284,8 @@ export default definePluginEntry({
281
284
  }));
282
285
  }
283
286
  },
284
- });
285
- api.registerTool({
287
+ }), { names: ["ynabro_get_pending_transactions"] });
288
+ api.registerTool((_ctx) => ({
286
289
  name: "ynabro_get_recent_transactions",
287
290
  label: "Get Recent Transactions",
288
291
  description: "Get recent transactions for a plan",
@@ -304,8 +307,8 @@ export default definePluginEntry({
304
307
  }));
305
308
  }
306
309
  },
307
- });
308
- api.registerTool({
310
+ }), { names: ["ynabro_get_recent_transactions"] });
311
+ api.registerTool((_ctx) => ({
309
312
  name: "ynabro_approve_transaction",
310
313
  label: "Approve Transaction",
311
314
  description: "Approve a specific transaction",
@@ -328,8 +331,8 @@ export default definePluginEntry({
328
331
  }));
329
332
  }
330
333
  },
331
- });
332
- api.registerTool({
334
+ }), { names: ["ynabro_approve_transaction"] });
335
+ api.registerTool((_ctx) => ({
333
336
  name: "ynabro_get_plan_info",
334
337
  label: "Get Plan Info",
335
338
  description: "Get basic information about a plan",
@@ -351,8 +354,8 @@ export default definePluginEntry({
351
354
  }));
352
355
  }
353
356
  },
354
- });
355
- api.registerTool({
357
+ }), { names: ["ynabro_get_plan_info"] });
358
+ api.registerTool((_ctx) => ({
356
359
  name: "ynabro_get_skill_state",
357
360
  label: "Get Skill State",
358
361
  description: "Get the current state for a skill, including memory and auto_approve_enabled flag",
@@ -362,8 +365,8 @@ export default definePluginEntry({
362
365
  const result = await getSkillState(p.skillSlug);
363
366
  return ok(JSON.stringify(result, null, 2));
364
367
  },
365
- });
366
- api.registerTool({
368
+ }), { names: ["ynabro_get_skill_state"] });
369
+ api.registerTool((_ctx) => ({
367
370
  name: "ynabro_update_skill_state",
368
371
  label: "Update Skill State",
369
372
  description: "Update the state for a skill — merge partial updates into existing state",
@@ -373,7 +376,7 @@ export default definePluginEntry({
373
376
  const result = await updateSkillState(p.skillSlug, p.updates);
374
377
  return ok(JSON.stringify(result, null, 2));
375
378
  },
376
- });
379
+ }), { names: ["ynabro_update_skill_state"] });
377
380
  },
378
381
  });
379
382
  //# 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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openclaw-ynabro",
3
- "version": "2.2.9",
3
+ "version": "2.2.11",
4
4
  "description": "OpenClaw plugin that registers YNABro tools for YNAB integration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -59,15 +59,35 @@ Accept replies in these formats:
59
59
 
60
60
  Interpret numbers as row numbers from the table.
61
61
 
62
+ ## Batching — All Transactions, 10 at a Time
63
+
64
+ **Never truncate or self-limit the transaction list.** The API returns all unapproved transactions — process every one of them.
65
+
66
+ When there are more than 10 unapproved transactions:
67
+ 1. Before page 1, state the exact total: e.g. _"239 transactions to review across 24 pages."_
68
+ 2. Present transactions **10 at a time**. Page 1 = items 1–10, page 2 = items 11–20, etc.
69
+ 3. Row numbers are **global** and continuous across all pages — never reset to 1 on a new page.
70
+ 4. Include this header above each table:
71
+
72
+ > **Page X of N — items FIRST–LAST of TOTAL**
73
+ > Reply with actions for this page and I'll execute them, then move to the next page.
74
+
75
+ 5. After the user replies, execute their actions for those rows, then immediately present the next 10 **without waiting to be asked**.
76
+ 6. After the final page is actioned, post a summary: total approved / rejected / switched across the whole run, then update skill state.
77
+
78
+ If there are 10 or fewer transactions, present them all in a single table with no pagination header.
79
+
62
80
  ## Workflow
63
81
 
64
- 1. Fetch pending and unmatched transactions.
65
- 2. Call `getSkillState("match-transactions")` and review both the `memory` array and `auto_approve_enabled` flag.
66
- 3. Analyze existing matches and potential new matches (close dates, similar payees, small amount differences).
67
- 4. Present the review table with Yes/No confidence and recommended actions.
68
- 5. Wait for human reply.
69
- 6. Execute approved actions.
70
- 7. Update the skill state with concise corrections/pitfalls only. If confidence has grown sufficiently after multiple runs, ask the user whether to set `auto_approve_enabled: true`.
82
+ 1. Fetch pending and unmatched transactions via `ynabro_get_pending_transactions`.
83
+ 2. Call `ynabro_get_skill_state` with `skillSlug: "match-transactions"` and review both the `memory` array and `auto_approve_enabled` flag.
84
+ 3. Note the **exact total count**. Calculate page count (ceil(total / 10)). State the total and page count before the first table.
85
+ 4. Analyze the first batch of up to 10 transactions (items 1–10) — existing matches and potential new matches (close dates, similar payees, small amount differences).
86
+ 5. Present the review table with the page header (if paginating) and Yes/No confidence and recommended actions.
87
+ 6. Wait for human reply.
88
+ 7. Execute approved actions for that page.
89
+ 8. If more pages remain, present the next page immediately (go to step 4).
90
+ 9. After all pages are done, update skill state with concise corrections/pitfalls only. If confidence has grown sufficiently after multiple runs, ask the user whether to set `auto_approve_enabled: true`.
71
91
 
72
92
  ## Memory Strategy (Minimal Token Usage)
73
93
 
@@ -83,7 +103,7 @@ Good examples:
83
103
 
84
104
  Avoid storing:
85
105
  - Full transaction details
86
- - Successful matches (they dont teach the agent what to avoid)
106
+ - Successful matches (they don't teach the agent what to avoid)
87
107
  - Verbose JSON
88
108
 
89
109
  The goal is a small number of high-signal notes that help the agent avoid previous mistakes while keeping context usage low.
@@ -97,4 +117,4 @@ The goal is a small number of high-signal notes that help the agent avoid previo
97
117
  - Prioritize user control until the skill has earned trust through consistent performance.
98
118
  - Keep memory entries minimal and focused on corrections.
99
119
 
100
- You are here to make YNAB matching reliable through intelligent, learnable review rather than brittle automation.
120
+ You are here to make YNAB matching reliable through intelligent, learnable review rather than brittle automation.
package/src/index.ts CHANGED
@@ -264,201 +264,231 @@ export default definePluginEntry({
264
264
  return planId;
265
265
  }
266
266
 
267
- api.registerTool({
268
- name: "ynabro_onboarding_status",
269
- label: "Onboarding Status",
270
- description:
271
- "Check whether YNABro is fully configured. Returns ready status, any missing configuration, and token generation instructions.",
272
- parameters: Type.Object({}),
273
- async execute() {
274
- const status = await checkOnboardingStatus(openClawAdapter);
275
- return ok(JSON.stringify(status));
276
- },
277
- });
278
-
279
- api.registerTool({
280
- name: "ynabro_setup",
281
- label: "Setup YNAB",
282
- description:
283
- "Fetch available YNAB plans for onboarding. Returns a list of plans. " +
284
- "After the user selects one, call ynabro_save_default_plan with the chosen plan ID.",
285
- parameters: Type.Object({}),
286
- async execute() {
287
- const client = getClient();
288
- const plans = await client.getPlans();
289
- if (plans.length === 0) {
290
- return ok(
291
- JSON.stringify({ error: "No plans found in your YNAB account." }),
292
- );
293
- }
294
- return ok(
295
- JSON.stringify({
296
- plans: plans.map((p) => ({ id: p.id, name: p.name })),
297
- }),
298
- );
299
- },
300
- });
267
+ api.registerTool(
268
+ (_ctx) => ({
269
+ name: "ynabro_onboarding_status",
270
+ label: "Onboarding Status",
271
+ description:
272
+ "Check whether YNABro is fully configured. Returns ready status, any missing configuration, and token generation instructions.",
273
+ parameters: Type.Object({}),
274
+ async execute() {
275
+ const status = await checkOnboardingStatus(openClawAdapter);
276
+ return ok(JSON.stringify(status));
277
+ },
278
+ }),
279
+ { names: ["ynabro_onboarding_status"] },
280
+ );
301
281
 
302
- api.registerTool({
303
- name: "ynabro_save_default_plan",
304
- label: "Save Default Plan",
305
- description:
306
- "Save a YNAB plan as the default for all subsequent tool calls. " +
307
- "Call ynabro_setup first to get the list of available plan IDs.",
308
- parameters: saveDefaultPlanSchema,
309
- async execute(_id, raw) {
310
- try {
311
- const p = params(raw);
282
+ api.registerTool(
283
+ (_ctx) => ({
284
+ name: "ynabro_setup",
285
+ label: "Setup YNAB",
286
+ description:
287
+ "Fetch available YNAB plans for onboarding. Returns a list of plans. " +
288
+ "After the user selects one, call ynabro_save_default_plan with the chosen plan ID.",
289
+ parameters: Type.Object({}),
290
+ async execute() {
312
291
  const client = getClient();
313
292
  const plans = await client.getPlans();
314
- await setupYnab(client, plans, p.planId as string, openClawAdapter);
315
- const saved = plans.find((plan) => plan.id === p.planId);
316
- return ok(
317
- JSON.stringify({
318
- message: `Default plan set to: ${saved?.name ?? p.planId}`,
319
- defaultPlanId: p.planId,
320
- }),
321
- );
322
- } catch (_error) {
323
- const status = await checkOnboardingStatus(openClawAdapter);
293
+ if (plans.length === 0) {
294
+ return ok(
295
+ JSON.stringify({ error: "No plans found in your YNAB account." }),
296
+ );
297
+ }
324
298
  return ok(
325
299
  JSON.stringify({
326
- error: "onboarding_required",
327
- ...status,
300
+ plans: plans.map((p) => ({ id: p.id, name: p.name })),
328
301
  }),
329
302
  );
330
- }
331
- },
332
- });
303
+ },
304
+ }),
305
+ { names: ["ynabro_setup"] },
306
+ );
333
307
 
334
- api.registerTool({
335
- name: "ynabro_get_pending_transactions",
336
- label: "Get Pending Transactions",
337
- description: "Get all pending (uncategorized) transactions for a plan",
338
- parameters: Type.Object({}),
339
- async execute() {
340
- try {
341
- const [client, planId] = await Promise.all([
342
- Promise.resolve(getClient()),
343
- getDefaultPlanId(),
344
- ]);
345
- const result = await getPendingTransactions(client, planId);
346
- return ok(JSON.stringify(result, null, 2));
347
- } catch (_error) {
348
- const status = await checkOnboardingStatus(openClawAdapter);
349
- return ok(
350
- JSON.stringify({
351
- error: "onboarding_required",
352
- ...status,
353
- }),
354
- );
355
- }
356
- },
357
- });
308
+ api.registerTool(
309
+ (_ctx) => ({
310
+ name: "ynabro_save_default_plan",
311
+ label: "Save Default Plan",
312
+ description:
313
+ "Save a YNAB plan as the default for all subsequent tool calls. " +
314
+ "Call ynabro_setup first to get the list of available plan IDs.",
315
+ parameters: saveDefaultPlanSchema,
316
+ async execute(_id, raw) {
317
+ try {
318
+ const p = params(raw);
319
+ const planId = p.planId as string;
320
+ if (!planId) {
321
+ throw new Error("planId is required");
322
+ }
323
+ // Pass undefined for plans — the agent already fetched them via
324
+ // ynabro_setup, so we skip the redundant getPlans() validation fetch.
325
+ await setupYnab(getClient(), undefined, planId, openClawAdapter);
326
+ return ok(
327
+ JSON.stringify({
328
+ message: `Default plan set to: ${planId}`,
329
+ defaultPlanId: planId,
330
+ }),
331
+ );
332
+ } catch (_error) {
333
+ const status = await checkOnboardingStatus(openClawAdapter);
334
+ return ok(
335
+ JSON.stringify({
336
+ error: "onboarding_required",
337
+ ...status,
338
+ }),
339
+ );
340
+ }
341
+ },
342
+ }),
343
+ { names: ["ynabro_save_default_plan"] },
344
+ );
345
+
346
+ api.registerTool(
347
+ (_ctx) => ({
348
+ name: "ynabro_get_pending_transactions",
349
+ label: "Get Pending Transactions",
350
+ description: "Get all pending (uncategorized) transactions for a plan",
351
+ parameters: Type.Object({}),
352
+ async execute() {
353
+ try {
354
+ const [client, planId] = await Promise.all([
355
+ Promise.resolve(getClient()),
356
+ getDefaultPlanId(),
357
+ ]);
358
+ const result = await getPendingTransactions(client, planId);
359
+ return ok(JSON.stringify(result, null, 2));
360
+ } catch (_error) {
361
+ const status = await checkOnboardingStatus(openClawAdapter);
362
+ return ok(
363
+ JSON.stringify({
364
+ error: "onboarding_required",
365
+ ...status,
366
+ }),
367
+ );
368
+ }
369
+ },
370
+ }),
371
+ { names: ["ynabro_get_pending_transactions"] },
372
+ );
373
+
374
+ api.registerTool(
375
+ (_ctx) => ({
376
+ name: "ynabro_get_recent_transactions",
377
+ label: "Get Recent Transactions",
378
+ description: "Get recent transactions for a plan",
379
+ parameters: Type.Object({}),
380
+ async execute() {
381
+ try {
382
+ const [client, planId] = await Promise.all([
383
+ Promise.resolve(getClient()),
384
+ getDefaultPlanId(),
385
+ ]);
386
+ const result = await getRecentTransactions(client, planId);
387
+ return ok(JSON.stringify(result, null, 2));
388
+ } catch (_error) {
389
+ const status = await checkOnboardingStatus(openClawAdapter);
390
+ return ok(
391
+ JSON.stringify({
392
+ error: "onboarding_required",
393
+ ...status,
394
+ }),
395
+ );
396
+ }
397
+ },
398
+ }),
399
+ { names: ["ynabro_get_recent_transactions"] },
400
+ );
358
401
 
359
- api.registerTool({
360
- name: "ynabro_get_recent_transactions",
361
- label: "Get Recent Transactions",
362
- description: "Get recent transactions for a plan",
363
- parameters: Type.Object({}),
364
- async execute() {
365
- try {
366
- const [client, planId] = await Promise.all([
367
- Promise.resolve(getClient()),
368
- getDefaultPlanId(),
369
- ]);
370
- const result = await getRecentTransactions(client, planId);
402
+ api.registerTool(
403
+ (_ctx) => ({
404
+ name: "ynabro_approve_transaction",
405
+ label: "Approve Transaction",
406
+ description: "Approve a specific transaction",
407
+ parameters: approveSchema,
408
+ async execute(_id, raw) {
409
+ try {
410
+ const p = params(raw);
411
+ const [client, planId] = await Promise.all([
412
+ Promise.resolve(getClient()),
413
+ getDefaultPlanId(),
414
+ ]);
415
+ await approveTransaction(client, planId, p.transactionId as string);
416
+ return ok(JSON.stringify({ success: true }));
417
+ } catch (_error) {
418
+ const status = await checkOnboardingStatus(openClawAdapter);
419
+ return ok(
420
+ JSON.stringify({
421
+ error: "onboarding_required",
422
+ ...status,
423
+ }),
424
+ );
425
+ }
426
+ },
427
+ }),
428
+ { names: ["ynabro_approve_transaction"] },
429
+ );
430
+
431
+ api.registerTool(
432
+ (_ctx) => ({
433
+ name: "ynabro_get_plan_info",
434
+ label: "Get Plan Info",
435
+ description: "Get basic information about a plan",
436
+ parameters: Type.Object({}),
437
+ async execute() {
438
+ try {
439
+ const [client, planId] = await Promise.all([
440
+ Promise.resolve(getClient()),
441
+ getDefaultPlanId(),
442
+ ]);
443
+ const result = await getPlanInfo(client, planId);
444
+ return ok(JSON.stringify(result, null, 2));
445
+ } catch (_error) {
446
+ const status = await checkOnboardingStatus(openClawAdapter);
447
+ return ok(
448
+ JSON.stringify({
449
+ error: "onboarding_required",
450
+ ...status,
451
+ }),
452
+ );
453
+ }
454
+ },
455
+ }),
456
+ { names: ["ynabro_get_plan_info"] },
457
+ );
458
+
459
+ api.registerTool(
460
+ (_ctx) => ({
461
+ name: "ynabro_get_skill_state",
462
+ label: "Get Skill State",
463
+ description:
464
+ "Get the current state for a skill, including memory and auto_approve_enabled flag",
465
+ parameters: skillStateSchema,
466
+ async execute(_id, raw) {
467
+ const p = params(raw);
468
+ const result = await getSkillState(p.skillSlug as string);
371
469
  return ok(JSON.stringify(result, null, 2));
372
- } catch (_error) {
373
- const status = await checkOnboardingStatus(openClawAdapter);
374
- return ok(
375
- JSON.stringify({
376
- error: "onboarding_required",
377
- ...status,
378
- }),
379
- );
380
- }
381
- },
382
- });
470
+ },
471
+ }),
472
+ { names: ["ynabro_get_skill_state"] },
473
+ );
383
474
 
384
- api.registerTool({
385
- name: "ynabro_approve_transaction",
386
- label: "Approve Transaction",
387
- description: "Approve a specific transaction",
388
- parameters: approveSchema,
389
- async execute(_id, raw) {
390
- try {
475
+ api.registerTool(
476
+ (_ctx) => ({
477
+ name: "ynabro_update_skill_state",
478
+ label: "Update Skill State",
479
+ description:
480
+ "Update the state for a skill — merge partial updates into existing state",
481
+ parameters: updateSkillStateSchema,
482
+ async execute(_id, raw) {
391
483
  const p = params(raw);
392
- const [client, planId] = await Promise.all([
393
- Promise.resolve(getClient()),
394
- getDefaultPlanId(),
395
- ]);
396
- await approveTransaction(client, planId, p.transactionId as string);
397
- return ok(JSON.stringify({ success: true }));
398
- } catch (_error) {
399
- const status = await checkOnboardingStatus(openClawAdapter);
400
- return ok(
401
- JSON.stringify({
402
- error: "onboarding_required",
403
- ...status,
404
- }),
484
+ const result = await updateSkillState(
485
+ p.skillSlug as string,
486
+ p.updates as object,
405
487
  );
406
- }
407
- },
408
- });
409
-
410
- api.registerTool({
411
- name: "ynabro_get_plan_info",
412
- label: "Get Plan Info",
413
- description: "Get basic information about a plan",
414
- parameters: Type.Object({}),
415
- async execute() {
416
- try {
417
- const [client, planId] = await Promise.all([
418
- Promise.resolve(getClient()),
419
- getDefaultPlanId(),
420
- ]);
421
- const result = await getPlanInfo(client, planId);
422
488
  return ok(JSON.stringify(result, null, 2));
423
- } catch (_error) {
424
- const status = await checkOnboardingStatus(openClawAdapter);
425
- return ok(
426
- JSON.stringify({
427
- error: "onboarding_required",
428
- ...status,
429
- }),
430
- );
431
- }
432
- },
433
- });
434
-
435
- api.registerTool({
436
- name: "ynabro_get_skill_state",
437
- label: "Get Skill State",
438
- description:
439
- "Get the current state for a skill, including memory and auto_approve_enabled flag",
440
- parameters: skillStateSchema,
441
- async execute(_id, raw) {
442
- const p = params(raw);
443
- const result = await getSkillState(p.skillSlug as string);
444
- return ok(JSON.stringify(result, null, 2));
445
- },
446
- });
447
-
448
- api.registerTool({
449
- name: "ynabro_update_skill_state",
450
- label: "Update Skill State",
451
- description:
452
- "Update the state for a skill — merge partial updates into existing state",
453
- parameters: updateSkillStateSchema,
454
- async execute(_id, raw) {
455
- const p = params(raw);
456
- const result = await updateSkillState(
457
- p.skillSlug as string,
458
- p.updates as object,
459
- );
460
- return ok(JSON.stringify(result, null, 2));
461
- },
462
- });
489
+ },
490
+ }),
491
+ { names: ["ynabro_update_skill_state"] },
492
+ );
463
493
  },
464
494
  });