nodal-agents 0.7.8 → 0.7.9

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 (191) hide show
  1. package/README.md +1 -1
  2. package/cli.js +35 -15
  3. package/package.json +1 -1
  4. package/runner.js +130 -24
  5. package/web/.next/BUILD_ID +1 -1
  6. package/web/.next/app-path-routes-manifest.json +8 -8
  7. package/web/.next/build-manifest.json +2 -2
  8. package/web/.next/prerender-manifest.json +3 -3
  9. package/web/.next/server/app/(dashboard)/agents/[id]/channels/page.js +2 -2
  10. package/web/.next/server/app/(dashboard)/agents/[id]/channels/page.js.nft.json +1 -1
  11. package/web/.next/server/app/(dashboard)/agents/[id]/channels/page_client-reference-manifest.js +1 -1
  12. package/web/.next/server/app/(dashboard)/agents/[id]/edit/page.js +5 -5
  13. package/web/.next/server/app/(dashboard)/agents/[id]/edit/page.js.nft.json +1 -1
  14. package/web/.next/server/app/(dashboard)/agents/[id]/edit/page_client-reference-manifest.js +1 -1
  15. package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page.js +1 -1
  16. package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page_client-reference-manifest.js +1 -1
  17. package/web/.next/server/app/(dashboard)/agents/page.js +2 -2
  18. package/web/.next/server/app/(dashboard)/agents/page.js.nft.json +1 -1
  19. package/web/.next/server/app/(dashboard)/agents/page_client-reference-manifest.js +1 -1
  20. package/web/.next/server/app/(dashboard)/approvals/page.js +2 -2
  21. package/web/.next/server/app/(dashboard)/approvals/page.js.nft.json +1 -1
  22. package/web/.next/server/app/(dashboard)/approvals/page_client-reference-manifest.js +1 -1
  23. package/web/.next/server/app/(dashboard)/automations/page.js +2 -2
  24. package/web/.next/server/app/(dashboard)/automations/page.js.nft.json +1 -1
  25. package/web/.next/server/app/(dashboard)/automations/page_client-reference-manifest.js +1 -1
  26. package/web/.next/server/app/(dashboard)/chat/page.js +2 -2
  27. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  28. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  29. package/web/.next/server/app/(dashboard)/connectors/page.js +2 -2
  30. package/web/.next/server/app/(dashboard)/connectors/page.js.nft.json +1 -1
  31. package/web/.next/server/app/(dashboard)/connectors/page_client-reference-manifest.js +1 -1
  32. package/web/.next/server/app/(dashboard)/credentials/page.js +2 -2
  33. package/web/.next/server/app/(dashboard)/credentials/page.js.nft.json +1 -1
  34. package/web/.next/server/app/(dashboard)/credentials/page_client-reference-manifest.js +1 -1
  35. package/web/.next/server/app/(dashboard)/jobs/[id]/page.js +2 -2
  36. package/web/.next/server/app/(dashboard)/jobs/[id]/page.js.nft.json +1 -1
  37. package/web/.next/server/app/(dashboard)/jobs/[id]/page_client-reference-manifest.js +1 -1
  38. package/web/.next/server/app/(dashboard)/jobs/page.js +2 -2
  39. package/web/.next/server/app/(dashboard)/jobs/page.js.nft.json +1 -1
  40. package/web/.next/server/app/(dashboard)/jobs/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/(dashboard)/learned-skills/page.js +2 -2
  42. package/web/.next/server/app/(dashboard)/learned-skills/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/learned-skills/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/llm-providers/page.js +2 -2
  45. package/web/.next/server/app/(dashboard)/llm-providers/page.js.nft.json +1 -1
  46. package/web/.next/server/app/(dashboard)/llm-providers/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/(dashboard)/logs/page.js +2 -2
  48. package/web/.next/server/app/(dashboard)/logs/page.js.nft.json +1 -1
  49. package/web/.next/server/app/(dashboard)/logs/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/app/(dashboard)/mcp/page.js +2 -2
  51. package/web/.next/server/app/(dashboard)/mcp/page.js.nft.json +1 -1
  52. package/web/.next/server/app/(dashboard)/mcp/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/(dashboard)/memories/page.js +2 -2
  54. package/web/.next/server/app/(dashboard)/memories/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/memories/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/(dashboard)/page.js +4 -4
  57. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  58. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  59. package/web/.next/server/app/(dashboard)/settings/page.js +2 -2
  60. package/web/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  61. package/web/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  62. package/web/.next/server/app/(dashboard)/settings/root-context/page.js +2 -2
  63. package/web/.next/server/app/(dashboard)/settings/root-context/page.js.nft.json +1 -1
  64. package/web/.next/server/app/(dashboard)/settings/root-context/page_client-reference-manifest.js +1 -1
  65. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page.js +2 -2
  66. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page.js.nft.json +1 -1
  67. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page_client-reference-manifest.js +1 -1
  68. package/web/.next/server/app/(dashboard)/skills/new/page.js +1 -1
  69. package/web/.next/server/app/(dashboard)/skills/new/page.js.nft.json +1 -1
  70. package/web/.next/server/app/(dashboard)/skills/new/page_client-reference-manifest.js +1 -1
  71. package/web/.next/server/app/(dashboard)/skills/page.js +2 -2
  72. package/web/.next/server/app/(dashboard)/skills/page.js.nft.json +1 -1
  73. package/web/.next/server/app/(dashboard)/skills/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/_global-error/page.js +2 -2
  75. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/_global-error.html +1 -1
  77. package/web/.next/server/app/_global-error.rsc +3 -3
  78. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +3 -3
  79. package/web/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  80. package/web/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  81. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  82. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  83. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  84. package/web/.next/server/app/_not-found/page.js +1 -1
  85. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  86. package/web/.next/server/app/_not-found.html +1 -1
  87. package/web/.next/server/app/_not-found.rsc +4 -4
  88. package/web/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  89. package/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  90. package/web/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  91. package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  92. package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  93. package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  94. package/web/.next/server/app/login/page.js +2 -2
  95. package/web/.next/server/app/login/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/onboarding/page.js +53 -53
  97. package/web/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app-paths-manifest.json +8 -8
  99. package/web/.next/server/chunks/1957.js +1 -0
  100. package/web/.next/server/chunks/2313.js +1 -0
  101. package/web/.next/server/chunks/2314.js +1 -0
  102. package/web/.next/server/chunks/2747.js +1 -0
  103. package/web/.next/server/chunks/3422.js +1 -0
  104. package/web/.next/server/chunks/3847.js +3 -3
  105. package/web/.next/server/chunks/4162.js +1 -1
  106. package/web/.next/server/chunks/4574.js +1 -1
  107. package/web/.next/server/chunks/4761.js +1 -0
  108. package/web/.next/server/chunks/5128.js +1 -0
  109. package/web/.next/server/chunks/6128.js +1 -0
  110. package/web/.next/server/chunks/7124.js +2 -2
  111. package/web/.next/server/chunks/9000.js +1 -0
  112. package/web/.next/server/chunks/9857.js +1 -0
  113. package/web/.next/server/middleware-build-manifest.js +1 -1
  114. package/web/.next/server/pages/404.html +1 -1
  115. package/web/.next/server/pages/500.html +1 -1
  116. package/web/.next/server/server-reference-manifest.js +1 -1
  117. package/web/.next/server/server-reference-manifest.json +1 -1
  118. package/web/.next/static/chunks/2281-928529ce483ceb72.js +1 -0
  119. package/web/.next/static/chunks/2406-66d8aa55b97d75c3.js +1 -0
  120. package/web/.next/static/chunks/3966-679a4c07d6db8ee6.js +1 -0
  121. package/web/.next/static/chunks/4766-0433c4d93110e059.js +1 -0
  122. package/web/.next/static/chunks/7357-df6d26fbdbae296b.js +1 -0
  123. package/web/.next/static/chunks/{2491-cc8dee1fc55e1e38.js → 7536-169aab9ed2feeab6.js} +1 -1
  124. package/web/.next/static/chunks/7831-b5f0e41f306942cc.js +1 -0
  125. package/web/.next/static/chunks/8719-8ab59c5faa49c9ab.js +1 -0
  126. package/web/.next/static/chunks/8943-8619f44ee3282119.js +1 -0
  127. package/web/.next/static/chunks/8992-1b711ff6a77d023a.js +1 -0
  128. package/web/.next/static/chunks/app/(dashboard)/agents/[id]/channels/page-5c6067025edafbc0.js +1 -0
  129. package/web/.next/static/chunks/app/(dashboard)/agents/[id]/edit/page-fc4002bde145810b.js +6 -0
  130. package/web/.next/static/chunks/app/(dashboard)/agents/page-be616beb457238ca.js +1 -0
  131. package/web/.next/static/chunks/app/(dashboard)/approvals/page-ca87808aaa42a079.js +1 -0
  132. package/web/.next/static/chunks/app/(dashboard)/automations/page-88c5b2061235936a.js +1 -0
  133. package/web/.next/static/chunks/app/(dashboard)/chat/page-197ee8afc4ef48b2.js +1 -0
  134. package/web/.next/static/chunks/app/(dashboard)/connectors/page-7bee350e3c9d4682.js +1 -0
  135. package/web/.next/static/chunks/app/(dashboard)/credentials/page-567d0e2e3c255976.js +1 -0
  136. package/web/.next/static/chunks/app/(dashboard)/jobs/[id]/page-2a5d3e0fd5248864.js +1 -0
  137. package/web/.next/static/chunks/app/(dashboard)/jobs/page-0d50850f43cb7ccb.js +1 -0
  138. package/web/.next/static/chunks/app/(dashboard)/layout-7f9bdb14405ef107.js +1 -0
  139. package/web/.next/static/chunks/app/(dashboard)/learned-skills/page-17878b5d662400b2.js +1 -0
  140. package/web/.next/static/chunks/app/(dashboard)/llm-providers/page-e38d2642e44278b1.js +1 -0
  141. package/web/.next/static/chunks/app/(dashboard)/logs/page-7ac6dbdcd9cf7042.js +1 -0
  142. package/web/.next/static/chunks/app/(dashboard)/mcp/page-a5b036571bb575b8.js +1 -0
  143. package/web/.next/static/chunks/app/(dashboard)/memories/page-1d7007962535c0db.js +1 -0
  144. package/web/.next/static/chunks/app/(dashboard)/page-55efec02eb59c413.js +1 -0
  145. package/web/.next/static/chunks/app/(dashboard)/settings/page-db76b2ad9934ead0.js +1 -0
  146. package/web/.next/static/chunks/app/(dashboard)/settings/root-context/page-5ffdba723e59a369.js +1 -0
  147. package/web/.next/static/chunks/app/(dashboard)/skills/[id]/edit/page-eaa016de6c6d8b02.js +1 -0
  148. package/web/.next/static/chunks/app/(dashboard)/skills/new/page-07669c2c3c9e3b0e.js +1 -0
  149. package/web/.next/static/chunks/app/(dashboard)/skills/page-393ec6f04d00e50f.js +1 -0
  150. package/web/.next/static/chunks/app/error-5e6b38c936ae1a78.js +1 -0
  151. package/web/.next/static/chunks/app/login/page-1063bbdf158045cf.js +1 -0
  152. package/web/.next/static/chunks/app/onboarding/page-799f8658aea94b41.js +26 -0
  153. package/web/.next/static/css/110d6e5ec0dc635f.css +3 -0
  154. package/web/.next/server/chunks/6823.js +0 -1
  155. package/web/.next/server/chunks/715.js +0 -1
  156. package/web/.next/server/chunks/8308.js +0 -1
  157. package/web/.next/server/chunks/8430.js +0 -1
  158. package/web/.next/static/chunks/1361-5bc59efe9312f6ad.js +0 -1
  159. package/web/.next/static/chunks/2716-55970bc6e3910ccf.js +0 -1
  160. package/web/.next/static/chunks/370-554f47928c2648ee.js +0 -1
  161. package/web/.next/static/chunks/3865-9aa6dedee678d08f.js +0 -1
  162. package/web/.next/static/chunks/9775-dad785c12d658539.js +0 -1
  163. package/web/.next/static/chunks/9836-5beba80ab70ed698.js +0 -1
  164. package/web/.next/static/chunks/app/(dashboard)/agents/[id]/channels/page-f2413d131f4e0bdf.js +0 -1
  165. package/web/.next/static/chunks/app/(dashboard)/agents/[id]/edit/page-5ab1dcbc58720645.js +0 -6
  166. package/web/.next/static/chunks/app/(dashboard)/agents/page-6ac1ebd6598d7da7.js +0 -1
  167. package/web/.next/static/chunks/app/(dashboard)/approvals/page-76247d88c06bf203.js +0 -1
  168. package/web/.next/static/chunks/app/(dashboard)/automations/page-901227b6d047b2b7.js +0 -1
  169. package/web/.next/static/chunks/app/(dashboard)/chat/page-72f0688180411e7e.js +0 -1
  170. package/web/.next/static/chunks/app/(dashboard)/connectors/page-59b11d68fd1107c3.js +0 -1
  171. package/web/.next/static/chunks/app/(dashboard)/credentials/page-445228b74058e9c2.js +0 -1
  172. package/web/.next/static/chunks/app/(dashboard)/jobs/[id]/page-d7153b1b30dc6b78.js +0 -1
  173. package/web/.next/static/chunks/app/(dashboard)/jobs/page-65cb4b9970d04210.js +0 -1
  174. package/web/.next/static/chunks/app/(dashboard)/layout-16531dffd6974eb5.js +0 -1
  175. package/web/.next/static/chunks/app/(dashboard)/learned-skills/page-0211eb7caae5531d.js +0 -1
  176. package/web/.next/static/chunks/app/(dashboard)/llm-providers/page-c06f48cf0fbe5d63.js +0 -1
  177. package/web/.next/static/chunks/app/(dashboard)/logs/page-5080105f905f2d05.js +0 -1
  178. package/web/.next/static/chunks/app/(dashboard)/mcp/page-1aed0a1ab4459e69.js +0 -1
  179. package/web/.next/static/chunks/app/(dashboard)/memories/page-addb7eb81a34188b.js +0 -1
  180. package/web/.next/static/chunks/app/(dashboard)/page-5e99a1628397f82c.js +0 -1
  181. package/web/.next/static/chunks/app/(dashboard)/settings/page-ffff6582f6a33a65.js +0 -1
  182. package/web/.next/static/chunks/app/(dashboard)/settings/root-context/page-f42cc0aff627bd35.js +0 -1
  183. package/web/.next/static/chunks/app/(dashboard)/skills/[id]/edit/page-6022f41d61c64f4f.js +0 -1
  184. package/web/.next/static/chunks/app/(dashboard)/skills/new/page-a421b5020aa53715.js +0 -1
  185. package/web/.next/static/chunks/app/(dashboard)/skills/page-e8f83c423960e91d.js +0 -1
  186. package/web/.next/static/chunks/app/error-dc3b2db3bdb5b34e.js +0 -1
  187. package/web/.next/static/chunks/app/login/page-a6993d175f94d322.js +0 -1
  188. package/web/.next/static/chunks/app/onboarding/page-9619ad033b220394.js +0 -26
  189. package/web/.next/static/css/637b48680bc0d57a.css +0 -3
  190. /package/web/.next/static/{29LavAHsyomtNE9YjHNlk → xZ_yeD2bqK-_EOEqMMFYk}/_buildManifest.js +0 -0
  191. /package/web/.next/static/{29LavAHsyomtNE9YjHNlk → xZ_yeD2bqK-_EOEqMMFYk}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -10,7 +10,7 @@ A self-hosted platform for building and orchestrating a **team of AI agents** on
10
10
  [![Node](https://img.shields.io/badge/node-22%2B-339933?logo=node.js&logoColor=white)](https://nodejs.org)
11
11
  [![TypeScript](https://img.shields.io/badge/typescript-strict-3178c6?logo=typescript&logoColor=white)](https://www.typescriptlang.org)
12
12
  [![Docs](https://img.shields.io/badge/docs-online-3565ff)](https://kwintspiracy.github.io/nodal-agents/)
13
- [![Changelog](https://img.shields.io/badge/changelog-v0.6.8-d4ff2e)](CHANGELOG.md)
13
+ [![Changelog](https://img.shields.io/npm/v/nodal-agents?label=changelog&color=d4ff2e)](CHANGELOG.md)
14
14
 
15
15
  | Home dashboard — light theme | Agent detail — dark theme |
16
16
  | :---: | :---: |
package/cli.js CHANGED
@@ -12216,17 +12216,30 @@ var init_model_catalog = __esm({
12216
12216
  contextWindow: 4e5
12217
12217
  }
12218
12218
  ],
12219
+ // ─── Native Google (generativelanguage.googleapis.com) ──────────────────────
12220
+ // gemini-2.0-flash and gemini-2.5-pro were verified live (2026-07-12, real
12221
+ // key) to 404 / be shut down — dropped per product decision (family 3.x
12222
+ // only in the native catalog; gemini-2.5-flash deliberately NOT added).
12223
+ // Both entries below confirmed alive via ai.google.dev/gemini-api/docs/models
12224
+ // and openrouter.ai/google/… (2026-07-12): 1M-token context window, native
12225
+ // reasoning ("thinking") models, multimodal (text/image/video/audio/PDF).
12226
+ // forcedToolChoice:false — matches this file's reasoning-model convention
12227
+ // (MiniMax M3, Moonshot, GLM 5.2): don't force tool_choice on a thinking
12228
+ // model, let the runtime completion floor relax it to 'auto'. google.ts's
12229
+ // fetch shim injects generationConfig.thinkingConfig for these two entries
12230
+ // (reasoning:true gates it) so the API returns the chain-of-thought the
12231
+ // execute.ts round-trip needs across tool-call turns.
12219
12232
  google: [
12220
12233
  {
12221
- modelId: "gemini-2.0-flash",
12222
- label: "Gemini 2.0 Flash",
12223
- capabilities: { tools: true, forcedToolChoice: true },
12234
+ modelId: "gemini-3.5-flash",
12235
+ label: "Gemini 3.5 Flash",
12236
+ capabilities: { tools: true, forcedToolChoice: false, reasoning: true },
12224
12237
  contextWindow: 1048576
12225
12238
  },
12226
12239
  {
12227
- modelId: "gemini-2.5-pro",
12228
- label: "Gemini 2.5 Pro",
12229
- capabilities: { tools: true, forcedToolChoice: true },
12240
+ modelId: "gemini-3.1-pro-preview",
12241
+ label: "Gemini 3.1 Pro (preview)",
12242
+ capabilities: { tools: true, forcedToolChoice: false, reasoning: true },
12230
12243
  contextWindow: 1048576
12231
12244
  }
12232
12245
  ],
@@ -12314,23 +12327,30 @@ var init_model_catalog = __esm({
12314
12327
  contextWindow: 1048576,
12315
12328
  providerOrder: ["deepseek"]
12316
12329
  },
12317
- // Google
12330
+ // Google — all three are thinking models on OpenRouter (supported_parameters
12331
+ // includes "reasoning", verified via openrouter.ai/google/… 2026-07-12).
12332
+ // reasoning:true makes the OpenRouter provider enable reasoning + round-trip
12333
+ // reasoning_details across tool-call turns. Unlike the M-series/Kimi/GLM
12334
+ // reasoning entries above, forcedToolChoice stays true here — no evidence
12335
+ // (live or documented) that OpenRouter's Gemini routes reject a forced
12336
+ // tool_choice, matching how deepseek/deepseek-v4-flash (also reasoning:true)
12337
+ // keeps forcedToolChoice:true in this file.
12318
12338
  {
12319
12339
  modelId: "google/gemini-3.1-flash-lite-preview",
12320
12340
  label: "Gemini 3.1 Flash Lite (preview)",
12321
- capabilities: { tools: true, forcedToolChoice: true },
12341
+ capabilities: { tools: true, forcedToolChoice: true, reasoning: true },
12322
12342
  contextWindow: 1048576
12323
12343
  },
12324
12344
  {
12325
12345
  modelId: "google/gemini-3.1-pro-preview",
12326
12346
  label: "Gemini 3.1 Pro (preview)",
12327
- capabilities: { tools: true, forcedToolChoice: true },
12347
+ capabilities: { tools: true, forcedToolChoice: true, reasoning: true },
12328
12348
  contextWindow: 1048576
12329
12349
  },
12330
12350
  {
12331
12351
  modelId: "google/gemini-3.5-flash",
12332
12352
  label: "Gemini 3.5 Flash",
12333
- capabilities: { tools: true, forcedToolChoice: true },
12353
+ capabilities: { tools: true, forcedToolChoice: true, reasoning: true },
12334
12354
  contextWindow: 1048576
12335
12355
  },
12336
12356
  {
@@ -12408,8 +12428,8 @@ var init_model_catalog = __esm({
12408
12428
  "claude-haiku-4-5-20251001",
12409
12429
  "gpt-5",
12410
12430
  "gpt-5-mini",
12411
- "gemini-2.0-flash",
12412
- "gemini-2.5-pro",
12431
+ "gemini-3.5-flash",
12432
+ "gemini-3.1-pro-preview",
12413
12433
  "mistral-large-latest",
12414
12434
  "MiniMax-M3",
12415
12435
  "kimi-k2.6",
@@ -14753,13 +14773,13 @@ async function waitForHealth(url, timeoutMs = 3e4) {
14753
14773
  }
14754
14774
  throw new Error(`Service at ${url} did not become healthy within ${timeoutMs}ms`);
14755
14775
  }
14756
- async function assertWebRenders(url, timeoutMs = 6e4) {
14776
+ async function assertWebRenders(url, timeoutMs = 3e5) {
14757
14777
  const deadline = Date.now() + timeoutMs;
14758
14778
  let lastStatus = 0;
14759
14779
  while (Date.now() < deadline) {
14760
14780
  try {
14761
14781
  const controller = new AbortController();
14762
- const t = setTimeout(() => controller.abort(), 5e3);
14782
+ const t = setTimeout(() => controller.abort(), 6e4);
14763
14783
  const res = await fetch(`${url}/`, { signal: controller.signal });
14764
14784
  clearTimeout(t);
14765
14785
  lastStatus = res.status;
@@ -14984,7 +15004,7 @@ async function runUp(opts = {}) {
14984
15004
  waitForHealth(runnerUrl, runnerHealthMs),
14985
15005
  waitForHealth(webUrl, webHealthMs)
14986
15006
  ]);
14987
- await assertWebRenders(webUrl);
15007
+ await assertWebRenders(webUrl, webHealthMs);
14988
15008
  healthSpinner.succeed(chalk.green("All services healthy"));
14989
15009
  } catch (err) {
14990
15010
  healthSpinner.fail("Health check timed out");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodal-agents",
3
- "version": "0.7.8",
3
+ "version": "0.7.9",
4
4
  "description": "Local-first AI agent platform with a web dashboard — install in one command.",
5
5
  "license": "MIT",
6
6
  "repository": {
package/runner.js CHANGED
@@ -1438,17 +1438,30 @@ var init_model_catalog = __esm({
1438
1438
  contextWindow: 4e5
1439
1439
  }
1440
1440
  ],
1441
+ // ─── Native Google (generativelanguage.googleapis.com) ──────────────────────
1442
+ // gemini-2.0-flash and gemini-2.5-pro were verified live (2026-07-12, real
1443
+ // key) to 404 / be shut down — dropped per product decision (family 3.x
1444
+ // only in the native catalog; gemini-2.5-flash deliberately NOT added).
1445
+ // Both entries below confirmed alive via ai.google.dev/gemini-api/docs/models
1446
+ // and openrouter.ai/google/… (2026-07-12): 1M-token context window, native
1447
+ // reasoning ("thinking") models, multimodal (text/image/video/audio/PDF).
1448
+ // forcedToolChoice:false — matches this file's reasoning-model convention
1449
+ // (MiniMax M3, Moonshot, GLM 5.2): don't force tool_choice on a thinking
1450
+ // model, let the runtime completion floor relax it to 'auto'. google.ts's
1451
+ // fetch shim injects generationConfig.thinkingConfig for these two entries
1452
+ // (reasoning:true gates it) so the API returns the chain-of-thought the
1453
+ // execute.ts round-trip needs across tool-call turns.
1441
1454
  google: [
1442
1455
  {
1443
- modelId: "gemini-2.0-flash",
1444
- label: "Gemini 2.0 Flash",
1445
- capabilities: { tools: true, forcedToolChoice: true },
1456
+ modelId: "gemini-3.5-flash",
1457
+ label: "Gemini 3.5 Flash",
1458
+ capabilities: { tools: true, forcedToolChoice: false, reasoning: true },
1446
1459
  contextWindow: 1048576
1447
1460
  },
1448
1461
  {
1449
- modelId: "gemini-2.5-pro",
1450
- label: "Gemini 2.5 Pro",
1451
- capabilities: { tools: true, forcedToolChoice: true },
1462
+ modelId: "gemini-3.1-pro-preview",
1463
+ label: "Gemini 3.1 Pro (preview)",
1464
+ capabilities: { tools: true, forcedToolChoice: false, reasoning: true },
1452
1465
  contextWindow: 1048576
1453
1466
  }
1454
1467
  ],
@@ -1536,23 +1549,30 @@ var init_model_catalog = __esm({
1536
1549
  contextWindow: 1048576,
1537
1550
  providerOrder: ["deepseek"]
1538
1551
  },
1539
- // Google
1552
+ // Google — all three are thinking models on OpenRouter (supported_parameters
1553
+ // includes "reasoning", verified via openrouter.ai/google/… 2026-07-12).
1554
+ // reasoning:true makes the OpenRouter provider enable reasoning + round-trip
1555
+ // reasoning_details across tool-call turns. Unlike the M-series/Kimi/GLM
1556
+ // reasoning entries above, forcedToolChoice stays true here — no evidence
1557
+ // (live or documented) that OpenRouter's Gemini routes reject a forced
1558
+ // tool_choice, matching how deepseek/deepseek-v4-flash (also reasoning:true)
1559
+ // keeps forcedToolChoice:true in this file.
1540
1560
  {
1541
1561
  modelId: "google/gemini-3.1-flash-lite-preview",
1542
1562
  label: "Gemini 3.1 Flash Lite (preview)",
1543
- capabilities: { tools: true, forcedToolChoice: true },
1563
+ capabilities: { tools: true, forcedToolChoice: true, reasoning: true },
1544
1564
  contextWindow: 1048576
1545
1565
  },
1546
1566
  {
1547
1567
  modelId: "google/gemini-3.1-pro-preview",
1548
1568
  label: "Gemini 3.1 Pro (preview)",
1549
- capabilities: { tools: true, forcedToolChoice: true },
1569
+ capabilities: { tools: true, forcedToolChoice: true, reasoning: true },
1550
1570
  contextWindow: 1048576
1551
1571
  },
1552
1572
  {
1553
1573
  modelId: "google/gemini-3.5-flash",
1554
1574
  label: "Gemini 3.5 Flash",
1555
- capabilities: { tools: true, forcedToolChoice: true },
1575
+ capabilities: { tools: true, forcedToolChoice: true, reasoning: true },
1556
1576
  contextWindow: 1048576
1557
1577
  },
1558
1578
  {
@@ -1630,8 +1650,8 @@ var init_model_catalog = __esm({
1630
1650
  "claude-haiku-4-5-20251001",
1631
1651
  "gpt-5",
1632
1652
  "gpt-5-mini",
1633
- "gemini-2.0-flash",
1634
- "gemini-2.5-pro",
1653
+ "gemini-3.5-flash",
1654
+ "gemini-3.1-pro-preview",
1635
1655
  "mistral-large-latest",
1636
1656
  "MiniMax-M3",
1637
1657
  "kimi-k2.6",
@@ -206109,11 +206129,51 @@ function buildOpenAICompatibleModel(config) {
206109
206129
  }
206110
206130
 
206111
206131
  // ../../packages/llm/src/providers/google.ts
206132
+ init_src();
206112
206133
  import { createGoogleGenerativeAI } from "@ai-sdk/google";
206134
+ var GOOGLE_HOSTS = /* @__PURE__ */ new Set(["generativelanguage.googleapis.com"]);
206135
+ function requestHost(input) {
206136
+ try {
206137
+ if (typeof input === "string") return new URL(input).host;
206138
+ if (input instanceof URL) return input.host;
206139
+ return new URL(input.url).host;
206140
+ } catch {
206141
+ return void 0;
206142
+ }
206143
+ }
206144
+ function injectGoogleThinking(body) {
206145
+ if (typeof body !== "object" || body === null) return body;
206146
+ const b = body;
206147
+ const generationConfig = typeof b["generationConfig"] === "object" && b["generationConfig"] !== null ? b["generationConfig"] : {};
206148
+ if (generationConfig["thinkingConfig"] === void 0) {
206149
+ generationConfig["thinkingConfig"] = { includeThoughts: true };
206150
+ }
206151
+ b["generationConfig"] = generationConfig;
206152
+ return body;
206153
+ }
206154
+ function createGoogleFetch(opts, baseFetch = globalThis.fetch) {
206155
+ return async (input, init2) => {
206156
+ const host = requestHost(input);
206157
+ if (!opts.injectThinking || !host || !GOOGLE_HOSTS.has(host) || !init2?.body) {
206158
+ return baseFetch(input, init2);
206159
+ }
206160
+ let patchedInit = init2;
206161
+ try {
206162
+ const rawBody = typeof init2.body === "string" ? init2.body : await new Response(init2.body).text();
206163
+ const patched = injectGoogleThinking(JSON.parse(rawBody));
206164
+ patchedInit = { ...init2, body: JSON.stringify(patched) };
206165
+ } catch {
206166
+ }
206167
+ return baseFetch(input, patchedInit);
206168
+ };
206169
+ }
206113
206170
  function buildGoogleModel(config) {
206171
+ const entry = findModelCatalogEntry("google", config.model);
206172
+ const isReasoning = entry?.capabilities.reasoning === true;
206114
206173
  const provider = createGoogleGenerativeAI({
206115
206174
  apiKey: config.apiKey,
206116
- ...config.baseURL ? { baseURL: config.baseURL } : {}
206175
+ ...config.baseURL ? { baseURL: config.baseURL } : {},
206176
+ fetch: createGoogleFetch({ injectThinking: isReasoning })
206117
206177
  });
206118
206178
  return provider(config.model);
206119
206179
  }
@@ -206346,7 +206406,13 @@ var nodalToolCallMiddleware = createNativeToolCallMiddleware(nodalNativeParser);
206346
206406
  // ../../packages/llm/src/providers/moonshot-schema.ts
206347
206407
  var SCHEMA_MAP_KEYS = /* @__PURE__ */ new Set(["properties", "patternProperties", "$defs", "definitions"]);
206348
206408
  var SCHEMA_LIST_KEYS = /* @__PURE__ */ new Set(["anyOf", "oneOf", "allOf", "prefixItems"]);
206349
- var SCHEMA_NODE_KEYS = /* @__PURE__ */ new Set(["items", "contains", "not", "additionalProperties", "propertyNames"]);
206409
+ var SCHEMA_NODE_KEYS = /* @__PURE__ */ new Set([
206410
+ "items",
206411
+ "contains",
206412
+ "not",
206413
+ "additionalProperties",
206414
+ "propertyNames"
206415
+ ]);
206350
206416
  function isPlainObject(value) {
206351
206417
  return typeof value === "object" && value !== null && !Array.isArray(value);
206352
206418
  }
@@ -206712,7 +206778,7 @@ function buildMiniMaxModel(config) {
206712
206778
  init_src();
206713
206779
  import { createOpenAICompatible as createOpenAICompatible2 } from "@ai-sdk/openai-compatible";
206714
206780
  var MOONSHOT_HOSTS = /* @__PURE__ */ new Set(["api.moonshot.ai", "api.moonshot.cn"]);
206715
- function requestHost(input) {
206781
+ function requestHost2(input) {
206716
206782
  try {
206717
206783
  if (typeof input === "string") return new URL(input).host;
206718
206784
  if (input instanceof URL) return input.host;
@@ -206737,7 +206803,7 @@ function patchMoonshotRequestBody(body, opts) {
206737
206803
  function createMoonshotFetch(opts, baseFetch = globalThis.fetch) {
206738
206804
  const tolerant = createTolerantFetch(baseFetch);
206739
206805
  return async (input, init2) => {
206740
- const host = requestHost(input);
206806
+ const host = requestHost2(input);
206741
206807
  if (!host || !MOONSHOT_HOSTS.has(host) || !init2?.body) {
206742
206808
  return tolerant(input, init2);
206743
206809
  }
@@ -335522,7 +335588,32 @@ async function resolveRecipientChatId(explicitChatId, ctx, noRecipientErrorName,
335522
335588
  return chatId;
335523
335589
  }
335524
335590
  async function assertLocalSourceAllowed(source, ctx) {
335525
- const real3 = await realpath3(source);
335591
+ let candidate = source;
335592
+ if (!path.isAbsolute(source)) {
335593
+ try {
335594
+ candidate = await resolveAndCheckPath(ctx, source);
335595
+ } catch (err) {
335596
+ if (err instanceof WorkspaceError) {
335597
+ const wrapped = new Error(`source_path_not_allowed: ${err.message}`);
335598
+ wrapped.name = "source_path_not_allowed";
335599
+ throw wrapped;
335600
+ }
335601
+ throw err;
335602
+ }
335603
+ }
335604
+ let real3;
335605
+ try {
335606
+ real3 = await realpath3(candidate);
335607
+ } catch (err) {
335608
+ if (err.code === "ENOENT") {
335609
+ const wrapped = new Error(
335610
+ path.isAbsolute(source) ? `source_path_not_allowed: no file found at "${source}".` : `source_path_not_allowed: no file found at workspace-relative path "${source}" (resolved to "${candidate}").`
335611
+ );
335612
+ wrapped.name = "source_path_not_allowed";
335613
+ throw wrapped;
335614
+ }
335615
+ throw err;
335616
+ }
335526
335617
  const roots = [
335527
335618
  ...(ctx.workspaces ?? []).map((w) => w.path),
335528
335619
  ...ctx.skillStoreDir ? [ctx.skillStoreDir] : [],
@@ -354179,17 +354270,21 @@ ${notice}` : notice;
354179
354270
  return part.providerMetadata != null && part.providerOptions == null ? { ...p, providerOptions: part.providerMetadata } : p;
354180
354271
  });
354181
354272
  const hasText = (response.text ?? "").trim().length > 0;
354273
+ const toolCallParts = rawToolCalls.map((tc) => {
354274
+ const base = {
354275
+ type: "tool-call",
354276
+ toolCallId: tc.toolCallId,
354277
+ toolName: tc.toolName,
354278
+ input: tc.input
354279
+ };
354280
+ return tc.providerMetadata != null ? { ...base, providerOptions: tc.providerMetadata } : base;
354281
+ });
354182
354282
  const assistantMsg = {
354183
354283
  role: "assistant",
354184
354284
  content: rawToolCalls.length > 0 ? [
354185
354285
  ...reasoningParts,
354186
354286
  ...hasText ? [{ type: "text", text: response.text || "" }] : [],
354187
- ...rawToolCalls.map((tc) => ({
354188
- type: "tool-call",
354189
- toolCallId: tc.toolCallId,
354190
- toolName: tc.toolName,
354191
- input: tc.input
354192
- }))
354287
+ ...toolCallParts
354193
354288
  ] : reasoningParts.length > 0 ? [...reasoningParts, { type: "text", text: response.text || "" }] : response.text || ""
354194
354289
  };
354195
354290
  messages = [...messages, assistantMsg];
@@ -359351,7 +359446,18 @@ function startSlackSocket(opts) {
359351
359446
  );
359352
359447
  });
359353
359448
  });
359354
- void app.start().catch((err) => {
359449
+ void app.start().then(async () => {
359450
+ try {
359451
+ const identity = await app.client.auth.test();
359452
+ console.warn(
359453
+ `[slack-socket agent=${agentId}] connected (socket mode) as ${identity.user ?? "unknown"} (team=${identity.team ?? "unknown"})`
359454
+ );
359455
+ } catch (err) {
359456
+ console.warn(
359457
+ `[slack-socket agent=${agentId}] connected (socket mode), but auth.test failed: ${err instanceof Error ? err.message : String(err)}`
359458
+ );
359459
+ }
359460
+ }).catch((err) => {
359355
359461
  console.warn(
359356
359462
  `[slack-socket agent=${agentId}] start failed (invalid token(s)?): ${err instanceof Error ? err.message : String(err)}; will retry on the manager's next refresh`
359357
359463
  );
@@ -1 +1 @@
1
- 29LavAHsyomtNE9YjHNlk
1
+ xZ_yeD2bqK-_EOEqMMFYk
@@ -9,25 +9,25 @@
9
9
  "/login/page": "/login",
10
10
  "/onboarding/page": "/onboarding",
11
11
  "/(dashboard)/skills/new/page": "/skills/new",
12
- "/(dashboard)/agents/[id]/channels/page": "/agents/[id]/channels",
13
- "/(dashboard)/agents/[id]/edit/page": "/agents/[id]/edit",
14
12
  "/(dashboard)/agents/[id]/telegram/page": "/agents/[id]/telegram",
13
+ "/(dashboard)/agents/[id]/edit/page": "/agents/[id]/edit",
15
14
  "/(dashboard)/agents/page": "/agents",
16
15
  "/(dashboard)/automations/page": "/automations",
17
- "/(dashboard)/approvals/page": "/approvals",
18
- "/(dashboard)/chat/page": "/chat",
19
16
  "/(dashboard)/connectors/page": "/connectors",
20
17
  "/(dashboard)/credentials/page": "/credentials",
21
- "/(dashboard)/jobs/[id]/page": "/jobs/[id]",
18
+ "/(dashboard)/chat/page": "/chat",
19
+ "/(dashboard)/agents/[id]/channels/page": "/agents/[id]/channels",
22
20
  "/(dashboard)/jobs/page": "/jobs",
23
- "/(dashboard)/learned-skills/page": "/learned-skills",
24
21
  "/(dashboard)/llm-providers/page": "/llm-providers",
25
- "/(dashboard)/logs/page": "/logs",
22
+ "/(dashboard)/learned-skills/page": "/learned-skills",
26
23
  "/(dashboard)/mcp/page": "/mcp",
27
24
  "/(dashboard)/memories/page": "/memories",
28
25
  "/(dashboard)/page": "/",
29
26
  "/(dashboard)/settings/page": "/settings",
30
27
  "/(dashboard)/settings/root-context/page": "/settings/root-context",
28
+ "/(dashboard)/jobs/[id]/page": "/jobs/[id]",
31
29
  "/(dashboard)/skills/[id]/edit/page": "/skills/[id]/edit",
32
- "/(dashboard)/skills/page": "/skills"
30
+ "/(dashboard)/skills/page": "/skills",
31
+ "/(dashboard)/approvals/page": "/approvals",
32
+ "/(dashboard)/logs/page": "/logs"
33
33
  }
@@ -4,8 +4,8 @@
4
4
  ],
5
5
  "devFiles": [],
6
6
  "lowPriorityFiles": [
7
- "static/29LavAHsyomtNE9YjHNlk/_buildManifest.js",
8
- "static/29LavAHsyomtNE9YjHNlk/_ssgManifest.js"
7
+ "static/xZ_yeD2bqK-_EOEqMMFYk/_buildManifest.js",
8
+ "static/xZ_yeD2bqK-_EOEqMMFYk/_ssgManifest.js"
9
9
  ],
10
10
  "rootMainFiles": [
11
11
  "static/chunks/webpack-3741bf0a7636d65e.js",
@@ -54,8 +54,8 @@
54
54
  "dynamicRoutes": {},
55
55
  "notFoundRoutes": [],
56
56
  "preview": {
57
- "previewModeId": "021d806a4666c38317acd0de3293f4a3",
58
- "previewModeSigningKey": "83f0a0c3865db532f21f5863ff21e3a0af76daf05324b12de9e418fcf3f4cc44",
59
- "previewModeEncryptionKey": "6316572c43e14ef033271113b31df17ae4eb3ac77ba3ef58d53f440001e5376c"
57
+ "previewModeId": "5019c6d540777f4d1c95599b49498fca",
58
+ "previewModeSigningKey": "56d9a49144ccde66362e8d5617974a1056034f38c160f8e00ac3adf53bbc75e7",
59
+ "previewModeEncryptionKey": "ad6d75e1f6d2bdb08f7fbac18b98a025b31404408128b59b9f81b5bc5c699845"
60
60
  }
61
61
  }