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 +123 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -18
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/skills/ynabro/prompts/match-transactions.md +29 -9
- package/src/index.ts +265 -182
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
|
-
- `
|
|
22
|
-
- `
|
|
23
|
-
- `
|
|
24
|
-
- `
|
|
25
|
-
- `
|
|
26
|
-
- `
|
|
27
|
-
- `
|
|
28
|
-
- `
|
|
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.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;;;
|
|
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.
|
|
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 `
|
|
66
|
-
3.
|
|
67
|
-
4.
|
|
68
|
-
5.
|
|
69
|
-
6.
|
|
70
|
-
7.
|
|
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 don
|
|
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
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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
|
-
|
|
259
|
-
|
|
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
|
-
|
|
263
|
-
defaultPlanId: p.planId,
|
|
300
|
+
plans: plans.map((p) => ({ id: p.id, name: p.name })),
|
|
264
301
|
}),
|
|
265
302
|
);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
error: "onboarding_required",
|
|
271
|
-
...status,
|
|
272
|
-
}),
|
|
273
|
-
);
|
|
274
|
-
}
|
|
275
|
-
},
|
|
276
|
-
});
|
|
303
|
+
},
|
|
304
|
+
}),
|
|
305
|
+
{ names: ["ynabro_setup"] },
|
|
306
|
+
);
|
|
277
307
|
|
|
278
|
-
api.registerTool(
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
Promise.
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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
|
-
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
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
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
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
|
|
337
|
-
|
|
338
|
-
|
|
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
|
-
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
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
|
});
|