nodal-agents 0.3.8 → 0.3.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.
Files changed (109) hide show
  1. package/README.md +6 -6
  2. package/cli.js +5 -0
  3. package/migrations/0023_agent_schedules_notify_on_success.sql +10 -0
  4. package/migrations/meta/_journal.json +7 -0
  5. package/package.json +1 -1
  6. package/runner.js +1230 -1066
  7. package/web/.next/BUILD_ID +1 -1
  8. package/web/.next/app-path-routes-manifest.json +1 -1
  9. package/web/.next/build-manifest.json +2 -2
  10. package/web/.next/server/app/(dashboard)/agents/[id]/edit/page.js +2 -2
  11. package/web/.next/server/app/(dashboard)/agents/[id]/edit/page.js.nft.json +1 -1
  12. package/web/.next/server/app/(dashboard)/agents/[id]/edit/page_client-reference-manifest.js +1 -1
  13. package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page.js +1 -1
  14. package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page_client-reference-manifest.js +1 -1
  15. package/web/.next/server/app/(dashboard)/agents/page.js +1 -1
  16. package/web/.next/server/app/(dashboard)/agents/page_client-reference-manifest.js +1 -1
  17. package/web/.next/server/app/(dashboard)/approvals/page.js +1 -1
  18. package/web/.next/server/app/(dashboard)/approvals/page.js.nft.json +1 -1
  19. package/web/.next/server/app/(dashboard)/approvals/page_client-reference-manifest.js +1 -1
  20. package/web/.next/server/app/(dashboard)/automations/page.js +2 -2
  21. package/web/.next/server/app/(dashboard)/automations/page_client-reference-manifest.js +1 -1
  22. package/web/.next/server/app/(dashboard)/billing/page.js +1 -1
  23. package/web/.next/server/app/(dashboard)/billing/page_client-reference-manifest.js +1 -1
  24. package/web/.next/server/app/(dashboard)/connectors/page.js +1 -1
  25. package/web/.next/server/app/(dashboard)/connectors/page.js.nft.json +1 -1
  26. package/web/.next/server/app/(dashboard)/connectors/page_client-reference-manifest.js +1 -1
  27. package/web/.next/server/app/(dashboard)/credentials/page.js +1 -1
  28. package/web/.next/server/app/(dashboard)/credentials/page.js.nft.json +1 -1
  29. package/web/.next/server/app/(dashboard)/credentials/page_client-reference-manifest.js +1 -1
  30. package/web/.next/server/app/(dashboard)/jobs/[id]/page.js +1 -1
  31. package/web/.next/server/app/(dashboard)/jobs/[id]/page_client-reference-manifest.js +1 -1
  32. package/web/.next/server/app/(dashboard)/jobs/page.js +1 -1
  33. package/web/.next/server/app/(dashboard)/jobs/page.js.nft.json +1 -1
  34. package/web/.next/server/app/(dashboard)/jobs/page_client-reference-manifest.js +1 -1
  35. package/web/.next/server/app/(dashboard)/llm-providers/page.js +2 -2
  36. package/web/.next/server/app/(dashboard)/llm-providers/page_client-reference-manifest.js +1 -1
  37. package/web/.next/server/app/(dashboard)/logs/page.js +2 -2
  38. package/web/.next/server/app/(dashboard)/logs/page_client-reference-manifest.js +1 -1
  39. package/web/.next/server/app/(dashboard)/mcp/page.js +1 -1
  40. package/web/.next/server/app/(dashboard)/mcp/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/(dashboard)/memories/page.js +2 -2
  42. package/web/.next/server/app/(dashboard)/memories/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/page.js +1 -1
  44. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  45. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  46. package/web/.next/server/app/(dashboard)/settings/page.js +2 -2
  47. package/web/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page.js +1 -1
  49. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page.js.nft.json +1 -1
  50. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page_client-reference-manifest.js +1 -1
  51. package/web/.next/server/app/(dashboard)/skills/new/page.js +1 -1
  52. package/web/.next/server/app/(dashboard)/skills/new/page.js.nft.json +1 -1
  53. package/web/.next/server/app/(dashboard)/skills/new/page_client-reference-manifest.js +1 -1
  54. package/web/.next/server/app/(dashboard)/skills/page.js +2 -2
  55. package/web/.next/server/app/(dashboard)/skills/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/_global-error.html +1 -1
  58. package/web/.next/server/app/_global-error.rsc +1 -1
  59. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  60. package/web/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  61. package/web/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  62. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  63. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  64. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  65. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/app/_not-found.html +1 -1
  67. package/web/.next/server/app/_not-found.rsc +2 -2
  68. package/web/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  69. package/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  70. package/web/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  71. package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  72. package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  73. package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  74. package/web/.next/server/app/login/page_client-reference-manifest.js +1 -1
  75. package/web/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/onboarding.html +1 -1
  77. package/web/.next/server/app/onboarding.rsc +2 -2
  78. package/web/.next/server/app/onboarding.segments/_full.segment.rsc +2 -2
  79. package/web/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
  80. package/web/.next/server/app/onboarding.segments/_index.segment.rsc +2 -2
  81. package/web/.next/server/app/onboarding.segments/_tree.segment.rsc +2 -2
  82. package/web/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
  83. package/web/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
  84. package/web/.next/server/app-paths-manifest.json +1 -1
  85. package/web/.next/server/chunks/4574.js +1 -1
  86. package/web/.next/server/chunks/5163.js +1 -0
  87. package/web/.next/server/chunks/6680.js +1 -0
  88. package/web/.next/server/chunks/7741.js +2 -2
  89. package/web/.next/server/chunks/8013.js +1 -0
  90. package/web/.next/server/chunks/{8193.js → 9140.js} +1 -1
  91. package/web/.next/server/middleware-build-manifest.js +1 -1
  92. package/web/.next/server/pages/404.html +1 -1
  93. package/web/.next/server/pages/500.html +1 -1
  94. package/web/.next/server/server-reference-manifest.js +1 -1
  95. package/web/.next/server/server-reference-manifest.json +1 -1
  96. package/web/.next/static/chunks/app/(dashboard)/agents/[id]/edit/{page-daa833e779c2b465.js → page-d3724fbf38b71806.js} +1 -1
  97. package/web/.next/static/chunks/app/(dashboard)/automations/page-4807e81e2af3030e.js +1 -0
  98. package/web/.next/static/chunks/app/(dashboard)/mcp/{page-6cd433a027afdf32.js → page-3fa9d4448a31b696.js} +1 -1
  99. package/web/.next/static/chunks/app/(dashboard)/settings/{page-550fcfa4184838ea.js → page-8bc69f353f8d48a3.js} +1 -1
  100. package/web/.next/static/chunks/app/(dashboard)/skills/[id]/edit/{page-5fab5bdd950d7037.js → page-0b61f21847f4c7a0.js} +1 -1
  101. package/web/.next/static/chunks/app/(dashboard)/skills/new/{page-86cfe805e82b43aa.js → page-9de96e643c361732.js} +1 -1
  102. package/web/.next/static/css/90e1bf719df42081.css +3 -0
  103. package/web/.next/server/chunks/1248.js +0 -1
  104. package/web/.next/server/chunks/3362.js +0 -1
  105. package/web/.next/server/chunks/5527.js +0 -1
  106. package/web/.next/static/chunks/app/(dashboard)/automations/page-70005fabd08ae4a5.js +0 -1
  107. package/web/.next/static/css/e7183ce0b0791ec7.css +0 -3
  108. /package/web/.next/static/{4iUNkSxNfwq7_PqLIuvuO → oCvSEboPKulEdUGcfE5Px}/_buildManifest.js +0 -0
  109. /package/web/.next/static/{4iUNkSxNfwq7_PqLIuvuO → oCvSEboPKulEdUGcfE5Px}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -25,7 +25,7 @@ no cloud roundtrip.** Runs on any machine with Node 22+ — Mac, PC, Linux.
25
25
  | 🗂️  **Workspaces** | Multiple isolated workspaces on one install (personal vs work) — each with its own agents, skills, connectors, jobs and memory. Switch from the sidebar. |
26
26
  | 🤖  **Self-extending (ROOT agent)** | Designate an orchestrator as ROOT and let it create skills/agents and assign them on your behalf — gated by per-grant toggles and an autonomy level (propose-confirm → fully-autonomous). |
27
27
  | 📄  **Office files** | Read + edit Excel in place, create Word & PowerPoint, inside the agent's workspace — gated behind the office-editing skill. |
28
- | 📡  **MCP support** | Connect MCP servers over Streamable HTTP *and* stdio (local subprocess) — a growing catalogue (Stripe, n8n, Supabase, Vercel, Airtable, Notion…) plus add *and edit* your own custom servers from the UI. Per-job tool discovery, tool whitelisting, multi-instance. |
28
+ | 📡  **MCP support** | Connect MCP servers over Streamable HTTP *and* stdio (local subprocess) — a growing catalogue (Stripe, n8n, Supabase, Airtable, Notion…) plus add *and edit* your own custom servers from the UI. Per-job tool discovery, tool whitelisting, multi-instance. |
29
29
  | 💬 &nbsp;**Telegram out of the box** | Long-polling, multi-agent routing (`/ask <slug>`), group-chat filters, conversation continuity, delegation gracefulness on Telegram. |
30
30
  | ⚙️ &nbsp;**Real engineering** | TypeScript strict, dependency-cruiser-enforced architecture, full unit + integration suite, Playwright e2e, idempotent migrations, encryption at rest for keys. |
31
31
 
@@ -204,7 +204,7 @@ pnpm deps:check # runs locally and in CI before every release
204
204
 
205
205
  ## Status
206
206
 
207
- **Current release:** `0.3.8` on npm `latest`. Used daily by the
207
+ **Current release:** `0.3.10` on npm `latest`. Used daily by the
208
208
  maintainer, stable enough for personal production. Pre-1.0 — breaking
209
209
  changes are still possible between minors.
210
210
 
@@ -218,17 +218,17 @@ changes are still possible between minors.
218
218
  caps
219
219
  - Multi-instance connectors with OAuth (Gmail, Drive, Sheets, Docs, Notion,
220
220
  Airtable) and API-key (Notion, Airtable, Apify, Firecrawl, Tavily)
221
- - MCP catalog — Streamable HTTP *and* stdio (local subprocess) servers, API-key auth; a growing catalogue (Stripe, n8n, Supabase, Vercel, Airtable, Notion…) with a "test pending" badge on entries not yet verified live, plus add *and edit* your own custom HTTP/stdio servers from the dashboard
221
+ - MCP catalog — Streamable HTTP *and* stdio (local subprocess) servers, API-key auth; a growing catalogue (Stripe, n8n, Supabase, Airtable, Notion…) with a "test pending" badge on entries not yet verified live, plus add *and edit* your own custom HTTP/stdio servers from the dashboard
222
222
  - Top-level workspaces — multiple isolated entities (agents/skills/connectors/jobs/memory per workspace), switch in the sidebar
223
- - ROOT agent — designate an orchestrator that can create skills/agents and assign them, gated by per-grant toggles + an autonomy/approval level
223
+ - ROOT agent — designate an orchestrator that can create *and update* skills, create agents and assign them, gated by per-grant toggles + an autonomy/approval level; skill authoring is grounded in the workspace's real tools (a linter rejects skills referencing tools the agent doesn't have)
224
224
  - Office file editing — Excel in-place edit, Word/PowerPoint create, in the agent workspace (office-editing skill)
225
225
  - Multiple filesystem folders per agent (sandboxed `file_*` tools)
226
226
  - Telegram delivery (long-poll, group filters, multi-agent routing,
227
227
  delegation gracefulness) — exactly-once delivery contract: anti-spam guard
228
228
  against runaway message loops + a guard that re-prompts (then fails loud)
229
229
  rather than completing a job without ever replying
230
- - Approval gates for risky tools (execute-the-approved-action on resume)
231
- - Cron scheduling
230
+ - Approval gates for risky tools (execute-the-approved-action on resume) — on a chat channel, the agent sends a heads-up before the job pauses so the user knows an approval is waiting
231
+ - Cron scheduling — trigger any automation out-of-band ("Run now") + opt-in Telegram confirmation when a scheduled job succeeds
232
232
  - `nodal-agents update` — one-command upgrade + boot version notice
233
233
  - Encryption at rest for LLM keys + MCP keys
234
234
  - Embedded Postgres distribution via npm (no external DB to install)
package/cli.js CHANGED
@@ -12168,6 +12168,7 @@ var init_root_agent = __esm({
12168
12168
  RootGrantsSchema = z19.object({
12169
12169
  createAgent: z19.boolean(),
12170
12170
  createSkill: z19.boolean(),
12171
+ updateSkill: z19.boolean(),
12171
12172
  assignSkill: z19.boolean(),
12172
12173
  autonomy: AutonomyLevelSchema
12173
12174
  });
@@ -12975,6 +12976,10 @@ var init_schedules = __esm({
12975
12976
  nextRun: timestamp("next_run", { withTimezone: true }),
12976
12977
  lastStatus: text("last_status"),
12977
12978
  chatId: text("chat_id"),
12979
+ // Opt-in: when true, a fired job carries a delivery target so the runner
12980
+ // forces the agent to send the user a success confirmation before finishing.
12981
+ // Default false → the cron runs silently (the user must opt in per schedule).
12982
+ notifyOnSuccess: boolean("notify_on_success").notNull().default(false),
12978
12983
  createdAt: timestamp("created_at", { withTimezone: true }).defaultNow(),
12979
12984
  updatedAt: timestamp("updated_at", { withTimezone: true }).defaultNow()
12980
12985
  },
@@ -0,0 +1,10 @@
1
+ -- 0023_agent_schedules_notify_on_success.sql
2
+ -- Per-schedule success confirmation (2026-05-31):
3
+ -- ADD COLUMN agent_schedules.notify_on_success (boolean, not null, default false)
4
+ --
5
+ -- Opt-in flag. When true, the cron tick sets the fired job's chat_id so the
6
+ -- runner forces the agent to deliver a success confirmation before completing.
7
+ -- Idempotent (IF NOT EXISTS guard).
8
+
9
+ ALTER TABLE agent_schedules
10
+ ADD COLUMN IF NOT EXISTS notify_on_success boolean NOT NULL DEFAULT false;
@@ -162,6 +162,13 @@
162
162
  "when": 1780200000000,
163
163
  "tag": "0022_approval_requests_executed_at",
164
164
  "breakpoints": true
165
+ },
166
+ {
167
+ "idx": 23,
168
+ "version": "7",
169
+ "when": 1780300000000,
170
+ "tag": "0023_agent_schedules_notify_on_success",
171
+ "breakpoints": true
165
172
  }
166
173
  ]
167
174
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodal-agents",
3
- "version": "0.3.8",
3
+ "version": "0.3.10",
4
4
  "description": "Local-first AI agent platform with a web dashboard — install in one command.",
5
5
  "license": "MIT",
6
6
  "repository": {