openclaw-ynabro 2.2.8 → 2.2.10

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
@@ -16,16 +16,76 @@ OpenClaw plugin that registers [ynabro](https://www.npmjs.com/package/ynabro) to
16
16
  openclaw plugins install openclaw-ynabro
17
17
  ```
18
18
 
19
+ After installation, restart the OpenClaw gateway to load the plugin:
20
+
21
+ ```bash
22
+ openclaw gateway restart
23
+ ```
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
+
19
78
  ## Available Tools
20
79
 
21
- - `ynabro_setup`
22
- - `ynabro_save_default_plan`
23
- - `ynabro_get_pending_transactions`
24
- - `ynabro_get_recent_transactions`
25
- - `ynabro_approve_transaction`
26
- - `ynabro_get_plan_info`
27
- - `ynabro_get_skill_state`
28
- - `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
29
89
 
30
90
  ## Configuration
31
91
 
@@ -94,3 +154,58 @@ Run `ynabro_setup` to fetch your available YNAB plans, then `ynabro_save_default
94
154
  3. `ynabro_save_default_plan` with `{ planId: "<selected-id>" }` — persists the default
95
155
 
96
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;;;oBA6CxD,iBAAiB,KAAK,IAAI;;;;;;;;;AAiG5C,wBAwQG"}
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,wBAoSG"}
package/dist/index.js CHANGED
@@ -32,6 +32,57 @@ function emptyPluginConfigSchema() {
32
32
  },
33
33
  };
34
34
  }
35
+ function pluginConfigSchema() {
36
+ const ALLOWED_KEYS = new Set(["token", "defaultPlanId"]);
37
+ return {
38
+ safeParse(value) {
39
+ if (value === undefined)
40
+ return { success: true, data: undefined };
41
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
42
+ return { success: false, error: "expected config object" };
43
+ }
44
+ const obj = value;
45
+ for (const key of Object.keys(obj)) {
46
+ if (!ALLOWED_KEYS.has(key)) {
47
+ return {
48
+ success: false,
49
+ error: `unknown config key: ${key}`,
50
+ };
51
+ }
52
+ }
53
+ const { token, defaultPlanId } = obj;
54
+ if (token !== undefined &&
55
+ typeof token !== "string" &&
56
+ (typeof token !== "object" || Array.isArray(token) || token === null)) {
57
+ return {
58
+ success: false,
59
+ error: "token must be a string or SecretRef object",
60
+ };
61
+ }
62
+ if (defaultPlanId !== undefined && typeof defaultPlanId !== "string") {
63
+ return {
64
+ success: false,
65
+ error: "defaultPlanId must be a string",
66
+ };
67
+ }
68
+ return { success: true, data: obj };
69
+ },
70
+ jsonSchema: {
71
+ type: "object",
72
+ additionalProperties: false,
73
+ properties: {
74
+ token: {
75
+ type: ["string", "object"],
76
+ description: "YNAB Personal Access Token. May be a plaintext string or a SecretRef object { source, provider, id } configured via `openclaw secrets configure` or `openclaw config set ... --ref-source ...`.",
77
+ },
78
+ defaultPlanId: {
79
+ type: "string",
80
+ description: "Default YNAB plan ID selected during onboarding",
81
+ },
82
+ },
83
+ },
84
+ };
85
+ }
35
86
  function definePluginEntry({ id, name, description, kind, configSchema, reload, nodeHostCommands, securityAuditCollectors, register, }) {
36
87
  const resolvedSchemaSource = configSchema ?? emptyPluginConfigSchema;
37
88
  let resolved;
@@ -98,6 +149,7 @@ export default definePluginEntry({
98
149
  id: "openclaw-ynabro",
99
150
  name: "YNABro",
100
151
  description: "YNAB budget management tools for OpenClaw agents",
152
+ configSchema: pluginConfigSchema(),
101
153
  register(api) {
102
154
  let cachedPlanId;
103
155
  const openClawAdapter = {
@@ -153,7 +205,7 @@ export default definePluginEntry({
153
205
  }
154
206
  return planId;
155
207
  }
156
- api.registerTool({
208
+ api.registerTool((_ctx) => ({
157
209
  name: "ynabro_onboarding_status",
158
210
  label: "Onboarding Status",
159
211
  description: "Check whether YNABro is fully configured. Returns ready status, any missing configuration, and token generation instructions.",
@@ -162,8 +214,8 @@ export default definePluginEntry({
162
214
  const status = await checkOnboardingStatus(openClawAdapter);
163
215
  return ok(JSON.stringify(status));
164
216
  },
165
- });
166
- api.registerTool({
217
+ }), { names: ["ynabro_onboarding_status"] });
218
+ api.registerTool((_ctx) => ({
167
219
  name: "ynabro_setup",
168
220
  label: "Setup YNAB",
169
221
  description: "Fetch available YNAB plans for onboarding. Returns a list of plans. " +
@@ -179,8 +231,8 @@ export default definePluginEntry({
179
231
  plans: plans.map((p) => ({ id: p.id, name: p.name })),
180
232
  }));
181
233
  },
182
- });
183
- api.registerTool({
234
+ }), { names: ["ynabro_setup"] });
235
+ api.registerTool((_ctx) => ({
184
236
  name: "ynabro_save_default_plan",
185
237
  label: "Save Default Plan",
186
238
  description: "Save a YNAB plan as the default for all subsequent tool calls. " +
@@ -206,8 +258,8 @@ export default definePluginEntry({
206
258
  }));
207
259
  }
208
260
  },
209
- });
210
- api.registerTool({
261
+ }), { names: ["ynabro_save_default_plan"] });
262
+ api.registerTool((_ctx) => ({
211
263
  name: "ynabro_get_pending_transactions",
212
264
  label: "Get Pending Transactions",
213
265
  description: "Get all pending (uncategorized) transactions for a plan",
@@ -229,8 +281,8 @@ export default definePluginEntry({
229
281
  }));
230
282
  }
231
283
  },
232
- });
233
- api.registerTool({
284
+ }), { names: ["ynabro_get_pending_transactions"] });
285
+ api.registerTool((_ctx) => ({
234
286
  name: "ynabro_get_recent_transactions",
235
287
  label: "Get Recent Transactions",
236
288
  description: "Get recent transactions for a plan",
@@ -252,8 +304,8 @@ export default definePluginEntry({
252
304
  }));
253
305
  }
254
306
  },
255
- });
256
- api.registerTool({
307
+ }), { names: ["ynabro_get_recent_transactions"] });
308
+ api.registerTool((_ctx) => ({
257
309
  name: "ynabro_approve_transaction",
258
310
  label: "Approve Transaction",
259
311
  description: "Approve a specific transaction",
@@ -276,8 +328,8 @@ export default definePluginEntry({
276
328
  }));
277
329
  }
278
330
  },
279
- });
280
- api.registerTool({
331
+ }), { names: ["ynabro_approve_transaction"] });
332
+ api.registerTool((_ctx) => ({
281
333
  name: "ynabro_get_plan_info",
282
334
  label: "Get Plan Info",
283
335
  description: "Get basic information about a plan",
@@ -299,8 +351,8 @@ export default definePluginEntry({
299
351
  }));
300
352
  }
301
353
  },
302
- });
303
- api.registerTool({
354
+ }), { names: ["ynabro_get_plan_info"] });
355
+ api.registerTool((_ctx) => ({
304
356
  name: "ynabro_get_skill_state",
305
357
  label: "Get Skill State",
306
358
  description: "Get the current state for a skill, including memory and auto_approve_enabled flag",
@@ -310,8 +362,8 @@ export default definePluginEntry({
310
362
  const result = await getSkillState(p.skillSlug);
311
363
  return ok(JSON.stringify(result, null, 2));
312
364
  },
313
- });
314
- api.registerTool({
365
+ }), { names: ["ynabro_get_skill_state"] });
366
+ api.registerTool((_ctx) => ({
315
367
  name: "ynabro_update_skill_state",
316
368
  label: "Update Skill State",
317
369
  description: "Update the state for a skill — merge partial updates into existing state",
@@ -321,7 +373,7 @@ export default definePluginEntry({
321
373
  const result = await updateSkillState(p.skillSlug, p.updates);
322
374
  return ok(JSON.stringify(result, null, 2));
323
375
  },
324
- });
376
+ }), { names: ["ynabro_update_skill_state"] });
325
377
  },
326
378
  });
327
379
  //# 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.8",
3
+ "version": "2.2.10",
4
4
  "description": "OpenClaw plugin that registers YNABro tools for YNAB integration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -30,7 +30,7 @@
30
30
  ],
31
31
  "compat": {
32
32
  "pluginApi": ">=2026.3.24-beta.2",
33
- "minGatewayVersion": "2026.3.24-beta.2"
33
+ "minGatewayVersion": ">=2026.3.24-beta.2"
34
34
  },
35
35
  "build": {
36
36
  "openclawVersion": "2026.3.24-beta.2",
@@ -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
@@ -35,6 +35,61 @@ function emptyPluginConfigSchema() {
35
35
  };
36
36
  }
37
37
 
38
+ function pluginConfigSchema() {
39
+ const ALLOWED_KEYS = new Set(["token", "defaultPlanId"]);
40
+ return {
41
+ safeParse(value: unknown) {
42
+ if (value === undefined)
43
+ return { success: true as const, data: undefined };
44
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
45
+ return { success: false as const, error: "expected config object" };
46
+ }
47
+ const obj = value as Record<string, unknown>;
48
+ for (const key of Object.keys(obj)) {
49
+ if (!ALLOWED_KEYS.has(key)) {
50
+ return {
51
+ success: false as const,
52
+ error: `unknown config key: ${key}`,
53
+ };
54
+ }
55
+ }
56
+ const { token, defaultPlanId } = obj;
57
+ if (
58
+ token !== undefined &&
59
+ typeof token !== "string" &&
60
+ (typeof token !== "object" || Array.isArray(token) || token === null)
61
+ ) {
62
+ return {
63
+ success: false as const,
64
+ error: "token must be a string or SecretRef object",
65
+ };
66
+ }
67
+ if (defaultPlanId !== undefined && typeof defaultPlanId !== "string") {
68
+ return {
69
+ success: false as const,
70
+ error: "defaultPlanId must be a string",
71
+ };
72
+ }
73
+ return { success: true as const, data: obj };
74
+ },
75
+ jsonSchema: {
76
+ type: "object" as const,
77
+ additionalProperties: false,
78
+ properties: {
79
+ token: {
80
+ type: ["string", "object"] as ["string", "object"],
81
+ description:
82
+ "YNAB Personal Access Token. May be a plaintext string or a SecretRef object { source, provider, id } configured via `openclaw secrets configure` or `openclaw config set ... --ref-source ...`.",
83
+ },
84
+ defaultPlanId: {
85
+ type: "string" as const,
86
+ description: "Default YNAB plan ID selected during onboarding",
87
+ },
88
+ },
89
+ },
90
+ };
91
+ }
92
+
38
93
  type InlineDefinePluginEntryOptions = {
39
94
  id: string;
40
95
  name: string;
@@ -145,6 +200,7 @@ export default definePluginEntry({
145
200
  id: "openclaw-ynabro",
146
201
  name: "YNABro",
147
202
  description: "YNAB budget management tools for OpenClaw agents",
203
+ configSchema: pluginConfigSchema(),
148
204
  register(api) {
149
205
  let cachedPlanId: string | undefined;
150
206
 
@@ -208,201 +264,228 @@ export default definePluginEntry({
208
264
  return planId;
209
265
  }
210
266
 
211
- api.registerTool({
212
- name: "ynabro_onboarding_status",
213
- label: "Onboarding Status",
214
- description:
215
- "Check whether YNABro is fully configured. Returns ready status, any missing configuration, and token generation instructions.",
216
- parameters: Type.Object({}),
217
- async execute() {
218
- const status = await checkOnboardingStatus(openClawAdapter);
219
- return ok(JSON.stringify(status));
220
- },
221
- });
222
-
223
- api.registerTool({
224
- name: "ynabro_setup",
225
- label: "Setup YNAB",
226
- description:
227
- "Fetch available YNAB plans for onboarding. Returns a list of plans. " +
228
- "After the user selects one, call ynabro_save_default_plan with the chosen plan ID.",
229
- parameters: Type.Object({}),
230
- async execute() {
231
- const client = getClient();
232
- const plans = await client.getPlans();
233
- if (plans.length === 0) {
234
- return ok(
235
- JSON.stringify({ error: "No plans found in your YNAB account." }),
236
- );
237
- }
238
- return ok(
239
- JSON.stringify({
240
- plans: plans.map((p) => ({ id: p.id, name: p.name })),
241
- }),
242
- );
243
- },
244
- });
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
+ );
245
281
 
246
- api.registerTool({
247
- name: "ynabro_save_default_plan",
248
- label: "Save Default Plan",
249
- description:
250
- "Save a YNAB plan as the default for all subsequent tool calls. " +
251
- "Call ynabro_setup first to get the list of available plan IDs.",
252
- parameters: saveDefaultPlanSchema,
253
- async execute(_id, raw) {
254
- try {
255
- 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() {
256
291
  const client = getClient();
257
292
  const plans = await client.getPlans();
258
- await setupYnab(client, plans, p.planId as string, openClawAdapter);
259
- const saved = plans.find((plan) => plan.id === p.planId);
293
+ if (plans.length === 0) {
294
+ return ok(
295
+ JSON.stringify({ error: "No plans found in your YNAB account." }),
296
+ );
297
+ }
260
298
  return ok(
261
299
  JSON.stringify({
262
- message: `Default plan set to: ${saved?.name ?? p.planId}`,
263
- defaultPlanId: p.planId,
300
+ plans: plans.map((p) => ({ id: p.id, name: p.name })),
264
301
  }),
265
302
  );
266
- } catch (_error) {
267
- const status = await checkOnboardingStatus(openClawAdapter);
268
- return ok(
269
- JSON.stringify({
270
- error: "onboarding_required",
271
- ...status,
272
- }),
273
- );
274
- }
275
- },
276
- });
303
+ },
304
+ }),
305
+ { names: ["ynabro_setup"] },
306
+ );
277
307
 
278
- api.registerTool({
279
- name: "ynabro_get_pending_transactions",
280
- label: "Get Pending Transactions",
281
- description: "Get all pending (uncategorized) transactions for a plan",
282
- parameters: Type.Object({}),
283
- async execute() {
284
- try {
285
- const [client, planId] = await Promise.all([
286
- Promise.resolve(getClient()),
287
- getDefaultPlanId(),
288
- ]);
289
- const result = await getPendingTransactions(client, planId);
290
- return ok(JSON.stringify(result, null, 2));
291
- } catch (_error) {
292
- const status = await checkOnboardingStatus(openClawAdapter);
293
- return ok(
294
- JSON.stringify({
295
- error: "onboarding_required",
296
- ...status,
297
- }),
298
- );
299
- }
300
- },
301
- });
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 client = getClient();
320
+ const plans = await client.getPlans();
321
+ await setupYnab(client, plans, p.planId as string, openClawAdapter);
322
+ const saved = plans.find((plan) => plan.id === p.planId);
323
+ return ok(
324
+ JSON.stringify({
325
+ message: `Default plan set to: ${saved?.name ?? p.planId}`,
326
+ defaultPlanId: p.planId,
327
+ }),
328
+ );
329
+ } catch (_error) {
330
+ const status = await checkOnboardingStatus(openClawAdapter);
331
+ return ok(
332
+ JSON.stringify({
333
+ error: "onboarding_required",
334
+ ...status,
335
+ }),
336
+ );
337
+ }
338
+ },
339
+ }),
340
+ { names: ["ynabro_save_default_plan"] },
341
+ );
302
342
 
303
- api.registerTool({
304
- name: "ynabro_get_recent_transactions",
305
- label: "Get Recent Transactions",
306
- description: "Get recent transactions for a plan",
307
- parameters: Type.Object({}),
308
- async execute() {
309
- try {
310
- const [client, planId] = await Promise.all([
311
- Promise.resolve(getClient()),
312
- getDefaultPlanId(),
313
- ]);
314
- const result = await getRecentTransactions(client, planId);
343
+ api.registerTool(
344
+ (_ctx) => ({
345
+ name: "ynabro_get_pending_transactions",
346
+ label: "Get Pending Transactions",
347
+ description: "Get all pending (uncategorized) transactions for a plan",
348
+ parameters: Type.Object({}),
349
+ async execute() {
350
+ try {
351
+ const [client, planId] = await Promise.all([
352
+ Promise.resolve(getClient()),
353
+ getDefaultPlanId(),
354
+ ]);
355
+ const result = await getPendingTransactions(client, planId);
356
+ return ok(JSON.stringify(result, null, 2));
357
+ } catch (_error) {
358
+ const status = await checkOnboardingStatus(openClawAdapter);
359
+ return ok(
360
+ JSON.stringify({
361
+ error: "onboarding_required",
362
+ ...status,
363
+ }),
364
+ );
365
+ }
366
+ },
367
+ }),
368
+ { names: ["ynabro_get_pending_transactions"] },
369
+ );
370
+
371
+ api.registerTool(
372
+ (_ctx) => ({
373
+ name: "ynabro_get_recent_transactions",
374
+ label: "Get Recent Transactions",
375
+ description: "Get recent transactions for a plan",
376
+ parameters: Type.Object({}),
377
+ async execute() {
378
+ try {
379
+ const [client, planId] = await Promise.all([
380
+ Promise.resolve(getClient()),
381
+ getDefaultPlanId(),
382
+ ]);
383
+ const result = await getRecentTransactions(client, planId);
384
+ return ok(JSON.stringify(result, null, 2));
385
+ } catch (_error) {
386
+ const status = await checkOnboardingStatus(openClawAdapter);
387
+ return ok(
388
+ JSON.stringify({
389
+ error: "onboarding_required",
390
+ ...status,
391
+ }),
392
+ );
393
+ }
394
+ },
395
+ }),
396
+ { names: ["ynabro_get_recent_transactions"] },
397
+ );
398
+
399
+ api.registerTool(
400
+ (_ctx) => ({
401
+ name: "ynabro_approve_transaction",
402
+ label: "Approve Transaction",
403
+ description: "Approve a specific transaction",
404
+ parameters: approveSchema,
405
+ async execute(_id, raw) {
406
+ try {
407
+ const p = params(raw);
408
+ const [client, planId] = await Promise.all([
409
+ Promise.resolve(getClient()),
410
+ getDefaultPlanId(),
411
+ ]);
412
+ await approveTransaction(client, planId, p.transactionId as string);
413
+ return ok(JSON.stringify({ success: true }));
414
+ } catch (_error) {
415
+ const status = await checkOnboardingStatus(openClawAdapter);
416
+ return ok(
417
+ JSON.stringify({
418
+ error: "onboarding_required",
419
+ ...status,
420
+ }),
421
+ );
422
+ }
423
+ },
424
+ }),
425
+ { names: ["ynabro_approve_transaction"] },
426
+ );
427
+
428
+ api.registerTool(
429
+ (_ctx) => ({
430
+ name: "ynabro_get_plan_info",
431
+ label: "Get Plan Info",
432
+ description: "Get basic information about a plan",
433
+ parameters: Type.Object({}),
434
+ async execute() {
435
+ try {
436
+ const [client, planId] = await Promise.all([
437
+ Promise.resolve(getClient()),
438
+ getDefaultPlanId(),
439
+ ]);
440
+ const result = await getPlanInfo(client, planId);
441
+ return ok(JSON.stringify(result, null, 2));
442
+ } catch (_error) {
443
+ const status = await checkOnboardingStatus(openClawAdapter);
444
+ return ok(
445
+ JSON.stringify({
446
+ error: "onboarding_required",
447
+ ...status,
448
+ }),
449
+ );
450
+ }
451
+ },
452
+ }),
453
+ { names: ["ynabro_get_plan_info"] },
454
+ );
455
+
456
+ api.registerTool(
457
+ (_ctx) => ({
458
+ name: "ynabro_get_skill_state",
459
+ label: "Get Skill State",
460
+ description:
461
+ "Get the current state for a skill, including memory and auto_approve_enabled flag",
462
+ parameters: skillStateSchema,
463
+ async execute(_id, raw) {
464
+ const p = params(raw);
465
+ const result = await getSkillState(p.skillSlug as string);
315
466
  return ok(JSON.stringify(result, null, 2));
316
- } catch (_error) {
317
- const status = await checkOnboardingStatus(openClawAdapter);
318
- return ok(
319
- JSON.stringify({
320
- error: "onboarding_required",
321
- ...status,
322
- }),
323
- );
324
- }
325
- },
326
- });
467
+ },
468
+ }),
469
+ { names: ["ynabro_get_skill_state"] },
470
+ );
327
471
 
328
- api.registerTool({
329
- name: "ynabro_approve_transaction",
330
- label: "Approve Transaction",
331
- description: "Approve a specific transaction",
332
- parameters: approveSchema,
333
- async execute(_id, raw) {
334
- try {
472
+ api.registerTool(
473
+ (_ctx) => ({
474
+ name: "ynabro_update_skill_state",
475
+ label: "Update Skill State",
476
+ description:
477
+ "Update the state for a skill — merge partial updates into existing state",
478
+ parameters: updateSkillStateSchema,
479
+ async execute(_id, raw) {
335
480
  const p = params(raw);
336
- const [client, planId] = await Promise.all([
337
- Promise.resolve(getClient()),
338
- getDefaultPlanId(),
339
- ]);
340
- await approveTransaction(client, planId, p.transactionId as string);
341
- return ok(JSON.stringify({ success: true }));
342
- } catch (_error) {
343
- const status = await checkOnboardingStatus(openClawAdapter);
344
- return ok(
345
- JSON.stringify({
346
- error: "onboarding_required",
347
- ...status,
348
- }),
481
+ const result = await updateSkillState(
482
+ p.skillSlug as string,
483
+ p.updates as object,
349
484
  );
350
- }
351
- },
352
- });
353
-
354
- api.registerTool({
355
- name: "ynabro_get_plan_info",
356
- label: "Get Plan Info",
357
- description: "Get basic information about a plan",
358
- parameters: Type.Object({}),
359
- async execute() {
360
- try {
361
- const [client, planId] = await Promise.all([
362
- Promise.resolve(getClient()),
363
- getDefaultPlanId(),
364
- ]);
365
- const result = await getPlanInfo(client, planId);
366
485
  return ok(JSON.stringify(result, null, 2));
367
- } catch (_error) {
368
- const status = await checkOnboardingStatus(openClawAdapter);
369
- return ok(
370
- JSON.stringify({
371
- error: "onboarding_required",
372
- ...status,
373
- }),
374
- );
375
- }
376
- },
377
- });
378
-
379
- api.registerTool({
380
- name: "ynabro_get_skill_state",
381
- label: "Get Skill State",
382
- description:
383
- "Get the current state for a skill, including memory and auto_approve_enabled flag",
384
- parameters: skillStateSchema,
385
- async execute(_id, raw) {
386
- const p = params(raw);
387
- const result = await getSkillState(p.skillSlug as string);
388
- return ok(JSON.stringify(result, null, 2));
389
- },
390
- });
391
-
392
- api.registerTool({
393
- name: "ynabro_update_skill_state",
394
- label: "Update Skill State",
395
- description:
396
- "Update the state for a skill — merge partial updates into existing state",
397
- parameters: updateSkillStateSchema,
398
- async execute(_id, raw) {
399
- const p = params(raw);
400
- const result = await updateSkillState(
401
- p.skillSlug as string,
402
- p.updates as object,
403
- );
404
- return ok(JSON.stringify(result, null, 2));
405
- },
406
- });
486
+ },
487
+ }),
488
+ { names: ["ynabro_update_skill_state"] },
489
+ );
407
490
  },
408
491
  });