nodal-agents 0.9.1 → 0.9.3
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/cli.js +1033 -473
- package/docs-index.json +31 -24
- package/migrations/0122_entities_drop_memory_curation_enabled.sql +17 -0
- package/migrations/0123_chat_messages_stopped.sql +10 -0
- package/migrations/0124_chat_messages_cut_reason.sql +12 -0
- package/migrations/0125_shell_checklist.sql +31 -0
- package/migrations/0126_run_budget.sql +57 -0
- package/migrations/0127_agent_budget.sql +86 -0
- package/migrations/0128_shell_policy_retired_kinds.sql +52 -0
- package/migrations/meta/_journal.json +49 -0
- package/package.json +1 -1
- package/runner.js +4824 -2851
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +6 -2
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +5 -5
- package/web/.next/routes-manifest.json +28 -0
- package/web/.next/server/app/(dashboard)/agents/[id]/channels/page.js +1 -1
- package/web/.next/server/app/(dashboard)/agents/[id]/channels/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/agents/[id]/edit/page.js +4 -4
- package/web/.next/server/app/(dashboard)/agents/[id]/edit/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page.js +1 -1
- package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/agents/page.js +1 -1
- package/web/.next/server/app/(dashboard)/agents/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/approvals/page.js +1 -1
- package/web/.next/server/app/(dashboard)/approvals/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/automations/[id]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/automations/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/automations/page.js +1 -1
- package/web/.next/server/app/(dashboard)/automations/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/[id]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/runs/[id]/page.js +1 -0
- package/web/.next/server/app/(dashboard)/chat/runs/[id]/page_client-reference-manifest.js +1 -0
- package/web/.next/server/app/(dashboard)/code/[id]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/code/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/code/page.js +1 -1
- package/web/.next/server/app/(dashboard)/code/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/connectors/page.js +1 -1
- package/web/.next/server/app/(dashboard)/connectors/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/credentials/page.js +1 -1
- package/web/.next/server/app/(dashboard)/credentials/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/dashboard/page.js +1 -1
- package/web/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/jobs/[id]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/jobs/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/jobs/page.js +1 -1
- package/web/.next/server/app/(dashboard)/jobs/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/learned-skills/page.js +1 -1
- package/web/.next/server/app/(dashboard)/learned-skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/llm-providers/page.js +1 -1
- package/web/.next/server/app/(dashboard)/llm-providers/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/logs/page.js +1 -1
- package/web/.next/server/app/(dashboard)/logs/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/mcp/page.js +1 -1
- package/web/.next/server/app/(dashboard)/mcp/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/memories/page.js +1 -1
- package/web/.next/server/app/(dashboard)/memories/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page.js +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/scheduled/[id]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/scheduled/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/scheduled/page.js +1 -1
- package/web/.next/server/app/(dashboard)/scheduled/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/settings/page.js +1 -1
- package/web/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/settings/root-context/page.js +1 -1
- package/web/.next/server/app/(dashboard)/settings/root-context/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/skills/[id]/edit/page.js +1 -1
- package/web/.next/server/app/(dashboard)/skills/[id]/edit/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/skills/new/page.js +1 -1
- package/web/.next/server/app/(dashboard)/skills/new/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/skills/page.js +1 -1
- package/web/.next/server/app/(dashboard)/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/spaces/[id]/files/page.js +1 -1
- package/web/.next/server/app/(dashboard)/spaces/[id]/files/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/spaces/[id]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/spaces/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/spaces/page.js +1 -1
- package/web/.next/server/app/(dashboard)/spaces/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error/page.js +2 -2
- package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +1 -1
- package/web/.next/server/app/_global-error.rsc +2 -2
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
- package/web/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +2 -2
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page.js +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/server/app/_not-found.rsc +3 -3
- package/web/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -3
- package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/web/.next/server/app/api/auth/[...all]/route.js +1 -1
- package/web/.next/server/app/api/chat/live/route.js +4 -0
- package/web/.next/server/app/api/chat/live/route_client-reference-manifest.js +1 -0
- package/web/.next/server/app/api/chat/stop/route.js +1 -0
- package/web/.next/server/app/api/chat/stop/route_client-reference-manifest.js +1 -0
- package/web/.next/server/app/api/chat/stream/route.js +3 -3
- package/web/.next/server/app/api/health/route.js +1 -1
- package/web/.next/server/app/api/oauth/[provider]/callback/route.js +1 -1
- package/web/.next/server/app/api/oauth/[provider]/start/route.js +1 -1
- package/web/.next/server/app/api/runs/[jobId]/media/route.js +1 -0
- package/web/.next/server/app/api/runs/[jobId]/media/route_client-reference-manifest.js +1 -0
- package/web/.next/server/app/auth/callback/route.js +1 -1
- package/web/.next/server/app/login/page.js +1 -1
- package/web/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/onboarding/page.js +2 -2
- package/web/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app-paths-manifest.json +6 -2
- package/web/.next/server/chunks/1326.js +136 -0
- package/web/.next/server/chunks/1406.js +1773 -0
- package/web/.next/server/chunks/1615.js +1 -0
- package/web/.next/server/chunks/1873.js +1 -0
- package/web/.next/server/chunks/2443.js +3 -0
- package/web/.next/server/chunks/3483.js +1 -0
- package/web/.next/server/chunks/3675.js +1 -1
- package/web/.next/server/chunks/3920.js +1 -0
- package/web/.next/server/chunks/42.js +3 -3
- package/web/.next/server/chunks/4546.js +1 -0
- package/web/.next/server/chunks/494.js +1 -1
- package/web/.next/server/chunks/5648.js +1 -0
- package/web/.next/server/chunks/5804.js +1 -1
- package/web/.next/server/chunks/592.js +1 -1
- package/web/.next/server/chunks/5976.js +1 -0
- package/web/.next/server/chunks/6915.js +1 -0
- package/web/.next/server/chunks/692.js +15 -15
- package/web/.next/server/chunks/7465.js +1 -0
- package/web/.next/server/chunks/7651.js +812 -0
- package/web/.next/server/chunks/7663.js +22 -22
- package/web/.next/server/chunks/7876.js +1 -0
- package/web/.next/server/chunks/7915.js +1 -1
- package/web/.next/server/chunks/796.js +1 -1
- package/web/.next/server/chunks/8030.js +1 -0
- package/web/.next/server/chunks/8104.js +1 -0
- package/web/.next/server/chunks/8697.js +1 -1
- package/web/.next/server/chunks/8794.js +1 -0
- package/web/.next/server/chunks/8830.js +1 -0
- package/web/.next/server/chunks/9009.js +1 -0
- package/web/.next/server/chunks/{4208.js → 9066.js} +1 -1
- package/web/.next/server/chunks/965.js +1 -1
- package/web/.next/server/chunks/{6213.js → 9844.js} +2 -2
- package/web/.next/server/chunks/9882.js +36 -0
- package/web/.next/server/middleware-build-manifest.js +1 -1
- package/web/.next/server/middleware.js +27 -27
- package/web/.next/server/pages/404.html +1 -1
- package/web/.next/server/pages/500.html +1 -1
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +1 -1
- package/web/.next/static/chunks/1091-9485133bd943918f.js +1 -0
- package/web/.next/static/chunks/{1332-0e4a72eac08cebb9.js → 1409-fe80b5952e1f40cb.js} +1 -1
- package/web/.next/static/chunks/1789-2566ac18a25fb387.js +1 -0
- package/web/.next/static/chunks/{3051-466a9da3e351fd0d.js → 3051-26ddd67461f743c4.js} +1 -1
- package/web/.next/static/chunks/3844-36a00411beee6253.js +1 -0
- package/web/.next/static/chunks/4020-ec67a80b0e0b651e.js +1 -0
- package/web/.next/static/chunks/4666-5fd532303d09a950.js +1 -0
- package/web/.next/static/chunks/4771-47261da3c38b4746.js +1 -0
- package/web/.next/static/chunks/494-a34a6a0b36862877.js +1 -0
- package/web/.next/static/chunks/5034-9aff8cbeb288ac20.js +1 -0
- package/web/.next/static/chunks/5216-528f63f54d56b47a.js +1 -0
- package/web/.next/static/chunks/5575-444e6f49e2d2a328.js +1 -0
- package/web/.next/static/chunks/560-59e02268ee5fe11e.js +1 -0
- package/web/.next/static/chunks/5954-7c92f3e7812dce11.js +1 -0
- package/web/.next/static/chunks/{5925-76337eacde3c3bc8.js → 6724-8a6d2dc777961105.js} +11 -11
- package/web/.next/static/chunks/6861-5edebd867f40e3a6.js +3 -0
- package/web/.next/static/chunks/764-a883257e15345ae8.js +1 -0
- package/web/.next/static/chunks/825-c876657b507df9d8.js +1 -0
- package/web/.next/static/chunks/9052-33a3c725444cb518.js +1 -0
- package/web/.next/static/chunks/9287-41590f18e747f14c.js +1 -0
- package/web/.next/static/chunks/9484-f972307c1c78a8e8.js +1 -0
- package/web/.next/static/chunks/9643-03e18abc622d33f5.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/agents/[id]/channels/page-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/agents/[id]/edit/page-16e26ece80055943.js +6 -0
- package/web/.next/static/chunks/app/(dashboard)/agents/[id]/telegram/page-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/agents/{page-a26d15238b4c55d3.js → page-ca54871a8009f0aa.js} +1 -1
- package/web/.next/static/chunks/app/(dashboard)/approvals/page-a5d31137ad6c86c0.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/automations/[id]/{page-bebc71312e736828.js → page-2ea773c99f54f674.js} +1 -1
- package/web/.next/static/chunks/app/(dashboard)/automations/{page-04c38b0a633b5c94.js → page-095be3edd6287d73.js} +1 -1
- package/web/.next/static/chunks/app/(dashboard)/chat/[id]/page-00acae0653281839.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/chat/page-056975f6c9d5625b.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/chat/runs/[id]/page-899772b15670d3de.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/code/[id]/page-83535784a61e8e36.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/code/page-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/connectors/page-af5150e89038a92b.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/dashboard/{page-5002d088b635d8f9.js → page-241109c80363cab1.js} +1 -1
- package/web/.next/static/chunks/app/(dashboard)/jobs/[id]/page-899772b15670d3de.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/jobs/page-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/layout-2b492fe5d87e7a8c.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/learned-skills/page-d3d0521187a02e31.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/llm-providers/page-1b5aef6848173842.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/logs/page-fd939bac9a74004e.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/mcp/page-11decdc1d91b079d.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/memories/page-2dda98de596fe53c.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/page-40b43271735f5935.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/scheduled/[id]/page-899772b15670d3de.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/scheduled/page-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/settings/page-420c62b3fbec2901.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/settings/root-context/page-7840e0f90ad51fd3.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/skills/page-497d3e268b76b0eb.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/spaces/[id]/files/page-d13f877dfd34c6c0.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/spaces/[id]/page-bf466093877ab1c5.js +1 -0
- package/web/.next/static/chunks/app/(dashboard)/spaces/page-1d264307964cfdfe.js +1 -0
- package/web/.next/static/chunks/app/_global-error/page-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/_not-found/page-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/api/auth/[...all]/route-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/api/chat/live/route-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/api/chat/stop/route-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/api/chat/stream/route-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/api/health/route-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/api/oauth/[provider]/callback/route-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/api/oauth/[provider]/start/route-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/api/runs/[jobId]/media/route-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/auth/callback/route-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/app/login/{page-031e915b40cb5be6.js → page-d260a3be0b6857ef.js} +1 -1
- package/web/.next/static/chunks/app/onboarding/{page-06209a6e3a31fb73.js → page-07908ee9b2b6d6b5.js} +2 -2
- package/web/.next/static/chunks/next/dist/client/components/builtin/app-error-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/next/dist/client/components/builtin/forbidden-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/chunks/next/dist/client/components/builtin/unauthorized-7b6e8b91210cb2ee.js +1 -0
- package/web/.next/static/css/55c009e1dd52d5a7.css +1 -0
- package/web/.next/static/uWxfL1NbU-xFtwNtkF4Wb/_buildManifest.js +1 -0
- package/web/.next/server/chunks/3592.js +0 -1
- package/web/.next/server/chunks/3650.js +0 -1
- package/web/.next/server/chunks/385.js +0 -1
- package/web/.next/server/chunks/409.js +0 -1
- package/web/.next/server/chunks/4194.js +0 -1
- package/web/.next/server/chunks/4357.js +0 -1
- package/web/.next/server/chunks/616.js +0 -1
- package/web/.next/server/chunks/6724.js +0 -1
- package/web/.next/server/chunks/7134.js +0 -947
- package/web/.next/server/chunks/7190.js +0 -1
- package/web/.next/server/chunks/7273.js +0 -3
- package/web/.next/server/chunks/7416.js +0 -1
- package/web/.next/server/chunks/7709.js +0 -1
- package/web/.next/server/chunks/7975.js +0 -1
- package/web/.next/server/chunks/8022.js +0 -1
- package/web/.next/server/chunks/8153.js +0 -1
- package/web/.next/server/chunks/8974.js +0 -1808
- package/web/.next/static/bG6cdQqQw9o06-WZ6DrN2/_buildManifest.js +0 -1
- package/web/.next/static/chunks/1054-5f8b510bbf6ff3e9.js +0 -1
- package/web/.next/static/chunks/1091-8f1b68252431e271.js +0 -1
- package/web/.next/static/chunks/1577-09f4d5183fb172de.js +0 -1
- package/web/.next/static/chunks/1789-b436bca079b82fcc.js +0 -1
- package/web/.next/static/chunks/296-1b50dd61ac3198f4.js +0 -1
- package/web/.next/static/chunks/3388-530c6d429c484862.js +0 -3
- package/web/.next/static/chunks/3815-aa88c216677b6c3f.js +0 -1
- package/web/.next/static/chunks/4020-dcde3e62f67473f3.js +0 -1
- package/web/.next/static/chunks/4771-a0aadf337f224b72.js +0 -1
- package/web/.next/static/chunks/494-ed02d105fa0ac132.js +0 -1
- package/web/.next/static/chunks/5034-11fd1b56b43dc6e5.js +0 -1
- package/web/.next/static/chunks/6883-73dc26cf02070115.js +0 -1
- package/web/.next/static/chunks/7039-7a3b6bdbfda78038.js +0 -1
- package/web/.next/static/chunks/7920-40dc6aa63e653d6b.js +0 -1
- package/web/.next/static/chunks/870-b7151716d04a13c3.js +0 -1
- package/web/.next/static/chunks/8794-2a616d1f9c210117.js +0 -1
- package/web/.next/static/chunks/8861-a108ed6178a56b21.js +0 -1
- package/web/.next/static/chunks/9643-b0b049bb41a7cba4.js +0 -1
- package/web/.next/static/chunks/9901-24977d0da68dcf77.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/agents/[id]/channels/page-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/agents/[id]/edit/page-4594e5fc99cc04ed.js +0 -6
- package/web/.next/static/chunks/app/(dashboard)/agents/[id]/telegram/page-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/approvals/page-3de0cc34d6dbeaf5.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/chat/[id]/page-faa53d8decd24a6a.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/chat/page-c45d840d7ca4faa7.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/code/[id]/page-52a3e2140bd0d64a.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/code/page-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/connectors/page-081ca4b9bbeb2fcb.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/jobs/[id]/page-5573e316921e5315.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/jobs/page-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/layout-b542af6fe3f7621e.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/learned-skills/page-950bf08720e4b3aa.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/llm-providers/page-8ada985ee9578d2f.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/logs/page-a2cf705f0ddb7329.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/mcp/page-17498336e813cd6c.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/memories/page-5c8fc395823f4823.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/page-48d1d32604854d18.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/scheduled/[id]/page-5573e316921e5315.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/scheduled/page-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/settings/page-f4d50d3900c7387a.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/settings/root-context/page-edace0d3a7f0134a.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/skills/page-7dc32162faa0e762.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/spaces/[id]/files/page-4e2d27f80456a1ba.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/spaces/[id]/page-c81023eaa26c2c7a.js +0 -1
- package/web/.next/static/chunks/app/(dashboard)/spaces/page-b516d5b0664dffee.js +0 -1
- package/web/.next/static/chunks/app/_global-error/page-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/app/_not-found/page-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/app/api/auth/[...all]/route-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/app/api/chat/stream/route-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/app/api/health/route-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/app/api/oauth/[provider]/callback/route-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/app/api/oauth/[provider]/start/route-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/app/auth/callback/route-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/next/dist/client/components/builtin/app-error-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/next/dist/client/components/builtin/forbidden-523c5d229e8520bf.js +0 -1
- package/web/.next/static/chunks/next/dist/client/components/builtin/unauthorized-523c5d229e8520bf.js +0 -1
- package/web/.next/static/css/099c0b54fc41e5b0.css +0 -1
- /package/web/.next/static/{bG6cdQqQw9o06-WZ6DrN2 → uWxfL1NbU-xFtwNtkF4Wb}/_ssgManifest.js +0 -0
package/docs-index.json
CHANGED
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
"pageTitle": "Memory",
|
|
119
119
|
"heading": "Memory",
|
|
120
120
|
"url": "/nodal-agents/docs/concepts/memory",
|
|
121
|
-
"text": "How
|
|
121
|
+
"text": "How an agent remembers something for later, and how the fact comes back next time it works. Agents accumulate facts in a persistent agent_memory table. These facts survive across sessions, restarts, and model swaps — whenever a job runs, relevant memories are already waiting in the system prompt before the first LLM call. When you tell an agent to remember this, to keep something for later, or to do it this way next time, a memory is what you are asking for: the fact is written once, and read back on its own every time it is needed."
|
|
122
122
|
},
|
|
123
123
|
{
|
|
124
124
|
"page": "concepts/memory",
|
|
@@ -130,8 +130,8 @@
|
|
|
130
130
|
{
|
|
131
131
|
"page": "concepts/memory",
|
|
132
132
|
"pageTitle": "Memory",
|
|
133
|
-
"heading": "Auto-injection into every job",
|
|
134
|
-
"url": "/nodal-agents/docs/concepts/memory#auto-injection-into-every-job",
|
|
133
|
+
"heading": "Auto-injection into every job — the fact is there next time",
|
|
134
|
+
"url": "/nodal-agents/docs/concepts/memory#auto-injection-into-every-job--the-fact-is-there-next-time",
|
|
135
135
|
"text": "Before a job starts, the runner selects memories from the entity-wide pool and injects them as a frozen block inside the agent's system prompt. No tool call is needed — the agent already has context. Selection works in two stages: Candidate fetch — up to 200 non-archived, non-expired memories for the entity (MAX_CANDIDATES in packages/memory/src/inject.ts). The ordering depends on the current job: Task-relevant ranking. When the job's task is tokenizable, candidates are ordered by ts_rank against the task text (full-text relevance), with importance and recency only as a tie-break. A fact relevant to this task can surface even if it sits outside the importance/recency top tier. Fallback ranking. When the task has no usable tokens, candidates are ordered by importance DESC, then last_accessed_at DESC. Budget pack — a greedy selector fits as many as possible under a character budget derived from agents.memoryTokenBudget. In the relevance path, the FTS order is authoritative and is not re-sorted by importance. A single oversized fact is skipped rather than truncated. Memory is entity-scoped, not agent-scoped — every agent in the same entity sees the same pool. This matches the query_memory tool's behaviour: knowledge follows the user across agents, not the individual agent."
|
|
136
136
|
},
|
|
137
137
|
{
|
|
@@ -151,9 +151,9 @@
|
|
|
151
151
|
{
|
|
152
152
|
"page": "concepts/memory",
|
|
153
153
|
"pageTitle": "Memory",
|
|
154
|
-
"heading": "Writing memories",
|
|
155
|
-
"url": "/nodal-agents/docs/concepts/memory#writing-memories",
|
|
156
|
-
"text": "Agents write memories with save_memory. Duplicate detection runs on a normalized hash of the fact text — an identical (non-archived) fact already in the store is rejected before it reaches the DB, so the pool stays clean. Content is sanitized before storage to guard against injection payloads being embedded into the entity-wide pool."
|
|
154
|
+
"heading": "Writing memories — remember this, for later",
|
|
155
|
+
"url": "/nodal-agents/docs/concepts/memory#writing-memories--remember-this-for-later",
|
|
156
|
+
"text": "Agents write memories with save_memory — the tool behind \"remember that I prefer short answers\" and \"keep that for later\". Duplicate detection runs on a normalized hash of the fact text — an identical (non-archived) fact already in the store is rejected before it reaches the DB, so the pool stays clean. Content is sanitized before storage to guard against injection payloads being embedded into the entity-wide pool."
|
|
157
157
|
},
|
|
158
158
|
{
|
|
159
159
|
"page": "concepts/memory",
|
|
@@ -620,9 +620,9 @@
|
|
|
620
620
|
{
|
|
621
621
|
"page": "guides/coding",
|
|
622
622
|
"pageTitle": "Coding with an agent",
|
|
623
|
-
"heading": "The
|
|
624
|
-
"url": "/nodal-agents/docs/guides/coding#the-
|
|
625
|
-
"text": "
|
|
623
|
+
"heading": "The budget",
|
|
624
|
+
"url": "/nodal-agents/docs/guides/coding#the-budget",
|
|
625
|
+
"text": "A coding run counts in the agent's budget, set on the agent's Settings tab: a daily and a monthly ceiling in USD (0 = none). The same ceilings count the agent's API calls to any provider, so one number says what the agent may spend, whatever does the work. Two things are worth knowing about what a coding run adds: It is notional. Claude Code reports a cost even when the work is covered by your subscription, and that reported figure is what counts. It is a brake on runaway usage, not a bill. Codex reports no cost at all, so its runs add nothing. What bounds them is the per-call timeout. An agent that already spent its day on API calls is still stopped, Codex or not. When a ceiling is reached, code_task refuses to start and says so, and the agent's runs stop between two turns, keeping what they wrote, until the day or the month ends. Before 0.9.3 this was a daily cap on coding runs only, on the Autonomy tab; an agent that had it keeps it as its daily ceiling."
|
|
626
626
|
},
|
|
627
627
|
{
|
|
628
628
|
"page": "guides/coding",
|
|
@@ -902,7 +902,7 @@
|
|
|
902
902
|
"pageTitle": "Shell commands",
|
|
903
903
|
"heading": "Shell commands",
|
|
904
904
|
"url": "/nodal-agents/docs/guides/shell-commands",
|
|
905
|
-
"text": "Let an agent run shell commands in its workspace — with a human-in-the-loop approval gate by default. The command-execution skill unlocks the run_command built-in tool, which runs a shell command in the agent's workspace and returns stdout, stderr, and the exit code. Use it for installing dependencies, running scripts, build steps, or any CLI tool.
|
|
905
|
+
"text": "Let an agent run shell commands in its workspace — with a human-in-the-loop approval gate by default. The command-execution skill unlocks the run_command built-in tool, which runs a shell command in the agent's workspace and returns stdout, stderr, and the exit code. Use it for installing dependencies, running scripts, build steps, or any CLI tool. By default, a command asks for your approval before it runs. The agent proposes the command; you approve or reject it in the dashboard. What can run without asking is set per agent, in two places on its Autonomy tab: whether ordinary commands need you at all, and what the agent may not do with a shell, kind of action by kind of action."
|
|
906
906
|
},
|
|
907
907
|
{
|
|
908
908
|
"page": "guides/shell-commands",
|
|
@@ -914,30 +914,37 @@
|
|
|
914
914
|
{
|
|
915
915
|
"page": "guides/shell-commands",
|
|
916
916
|
"pageTitle": "Shell commands",
|
|
917
|
-
"heading": "How approval works",
|
|
918
|
-
"url": "/nodal-agents/docs/guides/shell-commands#how-approval-works",
|
|
919
|
-
"text": "When the agent calls run_command, the runner creates an approval request and suspends the job. You see the exact command in the dashboard and approve or reject it. If you approve, the runner executes the command and the job resumes with the output. If you reject, the agent receives an error and can try a different approach. On a Telegram-bound agent, the agent gets a bounded number of turns to tell you via chat that it is waiting — so you are not left wondering why it went quiet."
|
|
917
|
+
"heading": "How approval works — you approve a command before it runs",
|
|
918
|
+
"url": "/nodal-agents/docs/guides/shell-commands#how-approval-works--you-approve-a-command-before-it-runs",
|
|
919
|
+
"text": "When the agent calls run_command, the runner creates an approval request and suspends the job. You see the exact command in the dashboard and approve or reject it. If you approve, the runner executes the command and the job resumes with the output. If you reject, the agent receives an error and can try a different approach. Where you approve a command: the Approvals page of the dashboard, which lists every command waiting for you. By default, nothing an agent proposes runs until you approve that call. Two things let commands through without that question: a Run without asking choice on the agent's Run commands row, optionally confined to one of its folders — the card's Approve for this project writes exactly that choice for one folder; and, when the agent has no choice set, the workspace's autonomy level set to Autonomous, gate destructive, under which an ordinary command runs unasked. In both cases, the agent's shell checklist still applies: a kind of action set to Ask me asks, one set to Never is refused. The Run commands section of the Autonomy tab says in one sentence what really happens for that agent, given its rule and the workspace level. On a Telegram-bound agent, the agent gets a bounded number of turns to tell you via chat that it is waiting — so you are not left wondering why it went quiet."
|
|
920
920
|
},
|
|
921
921
|
{
|
|
922
922
|
"page": "guides/shell-commands",
|
|
923
923
|
"pageTitle": "Shell commands",
|
|
924
|
-
"heading": "
|
|
925
|
-
"url": "/nodal-agents/docs/guides/shell-commands#
|
|
926
|
-
"text": "
|
|
924
|
+
"heading": "The Run commands row: three choices",
|
|
925
|
+
"url": "/nodal-agents/docs/guides/shell-commands#the-run-commands-row-three-choices",
|
|
926
|
+
"text": "On the agent's Autonomy tab, Run commands offers the same three choices as every other tool, in every auth mode: Run without asking: the agent runs commands immediately, after you confirm the choice once. Commands are still logged, and the kinds of action on the agent's shell checklist still follow their setting. Ask for approval: every command waits for you. Block: the agent cannot run commands. With no choice set, none is lit and the workspace autonomy decides; the sentence above the row says what that means for this agent. Let the workspace autonomy decide removes a choice. Before 0.9.3 this row was a \"Yolo\" switch, whose Off position could not block and did not always mean \"asks\". Only the workspace owner can change it, both in the dashboard and on the approval card. That was already true on both sides, which is why the separate LAN-only master switch was removed in 0.8.7: it was a second lock for the same key, and it only existed outside local-trust — a red button that works in one auth mode is not a red button. The brake: Settings → Safety → Auto-run brake What survived, and became its only job, is the emergency brake. It is workspace-wide, inactive by default, and it applies in every auth mode. While it is engaged, on every job: any auto_approve rule on a code-execution tool is dropped, and if no tool-specific rule then remains, an explicit require_approval rule is injected, so a blanket wildcard (*) auto-approve cannot sweep the tool back in. Nothing is deleted from the database: releasing the brake re-arms your rules exactly as they were. The brake also outranks the agent's autonomy level — a fully_autonomous ROOT cannot auto-approve past it. The tools it covers are the ones that can end up spawning something on your machine: run_command, run_skill_script, skill_file_write, code_task, create_mcp and attach_mcp (a stdio server _is_ a local subprocess), and declare_verification — because declaring a proof command is causing it to run later, at finalisation, outside any approval flow. The list lives in one place in the code, so a tool added to the autonomy guard cannot be forgotten here."
|
|
927
|
+
},
|
|
928
|
+
{
|
|
929
|
+
"page": "guides/shell-commands",
|
|
930
|
+
"pageTitle": "Shell commands",
|
|
931
|
+
"heading": "What an agent may not do with a shell",
|
|
932
|
+
"url": "/nodal-agents/docs/guides/shell-commands#what-an-agent-may-not-do-with-a-shell",
|
|
933
|
+
"text": "The agent's Autonomy tab lists, under What it may do with a shell, six kinds of action Nodal recognises in what the agent asks to run. Each one is Allowed, Ask me or Never: Kind of action Recognised by Run code written into a command python -c, node -e, bash -c, a script piped into an interpreter… Delete files or discard changes rm, del, Remove-Item, git reset --hard, git clean… Install software or packages npm, pip, winget, choco, brew install… Download files from the internet wget, curl -o, git clone, Invoke-WebRequest… Stop other programs or services kill, taskkill, Stop-Process, systemctl… Change system settings, permissions or disks icacls, chmod, format, diskpart… Ask me waits for you, and the approval card names the kinds of action it saw. Never refuses it. The agent is told what it may not do, so it does not look for a way around. The list applies at every autonomy level, and under Run without asking too: it only ever adds a question or a refusal, it never removes one. A rule that blocks the shell tool, and the hard floor below, still win. A new agent asks for all six. An agent already set to Run without asking everywhere when this list appeared kept what it could do. The checklist also judges a declared proof (declare_verification), because its steps run later without asking again. Nodal recognises each kind by the program started (rm, npm i, curl … > file), including what bash -c, cmd /c or $(…) wrap. A mention in an argument (git commit -m \"rm old refs\") is not the action. What this list does not do. It reads the text the agent asks to run, not what a program does once it runs. A script run from a file (python analyse.py) is not opened: it can read, delete or download anything your user account can reach without the list seeing it. The list does not keep the shell inside the agent's folders either; only the file tools are confined to them. Keeping a shell inside a folder takes an operating-system sandbox, which Nodal does not have yet. Folded under Advanced, the same tab keeps the older list of programs an agent may start, for people who know exactly what to write there."
|
|
927
934
|
},
|
|
928
935
|
{
|
|
929
936
|
"page": "guides/shell-commands",
|
|
930
937
|
"pageTitle": "Shell commands",
|
|
931
938
|
"heading": "The safety floor — commands that never auto-run",
|
|
932
939
|
"url": "/nodal-agents/docs/guides/shell-commands#the-safety-floor--commands-that-never-auto-run",
|
|
933
|
-
"text": "Shell commands split into two tiers of danger, and each tier is handled differently. The hard floor: refused even if you click Approve A small, fixed set of commands is machine-wide destructive: wiping the disk root, formatting a drive, repartitioning, or powering off/rebooting the machine. These patterns can never run,
|
|
940
|
+
"text": "Shell commands split into two tiers of danger, and each tier is handled differently. The hard floor: refused even if you click Approve A small, fixed set of commands is machine-wide destructive: wiping the disk root, formatting a drive, repartitioning, or powering off/rebooting the machine. These patterns can never run, with Run without asking or not, approved or not: rm -rf (or Remove-Item -Recurse -Force, del /s /q, rd /s /q) against /, ~, a Windows drive root, or a wildcard a fork bomb mkfs (any filesystem) dd ... of=/dev/... or a shell redirection to a raw device (> /dev/sda) a Windows format <drive>: diskpart, or a destructive PowerShell disk cmdlet (Format-Volume, Clear-Disk, Initialize-Disk) shutdown / reboot / halt / poweroff (or the PowerShell equivalents, Stop-Computer / Restart-Computer) init 0 / init 6 (Unix runlevel shutdown/reboot) Hiding one behind a wrapper (sudo, cmd /c, powershell -Command \"…\") does not help: the classifier unwraps those before checking. They always force a human decision, and even if you click Approve, the command still does not execute. A single tap should never be able to greenlight machine-wide destruction. When one is refused, the agent (and you) get a plain-language explanation of why, so nothing fails silently. Destructive or heavy: gated, but approvable Everything else dangerous is not on the hard floor. It follows the agent's shell checklist: Ask me by default, and once you approve it, it actually runs. This class covers ordinary destructive actions (deleting files, killing a process, installing a package, a large download, recursive permission changes, force-pushing git) plus one opaque category worth calling out: Inline interpreter code. Running arbitrary code passed on the command line to a general-purpose interpreter, such as python -c \"…\", node -e \"…\", perl -e, ruby -e, php -r, sh -c, bash -c, or powershell -Command. The code inside the quotes is an opaque program that could do anything, so it cannot be safety-checked line by line. The same applies to piping code into a bare interpreter (curl … | bash, echo '…' | python) and to awk programs that shell out (awk 'BEGIN{system(…)}'). All of these require approval by default (they count as Run code written into a command), but they are not refused: once you approve one, it runs. This does not block scripts. A script file (python my_script.py, node build.js, bash deploy.sh) runs like any ordinary command, whoever wrote it. This floor is deliberately narrow: only the 8 machine-wide destroyers above are un-bypassable. The floor is the last-resort circuit breaker, not a general safety net."
|
|
934
941
|
},
|
|
935
942
|
{
|
|
936
943
|
"page": "guides/shell-commands",
|
|
937
944
|
"pageTitle": "Shell commands",
|
|
938
945
|
"heading": "Command environment",
|
|
939
946
|
"url": "/nodal-agents/docs/guides/shell-commands#command-environment",
|
|
940
|
-
"text": "Shell: cmd.exe on Windows, /bin/sh on Unix. Shell features (&&, |, quoting) work. Working directory: the agent's workspace root. Pass a workspace-relative cwd to run somewhere else inside the workspace — the path cannot point outside it. Default timeout: 300 seconds. Pass timeout_seconds to override. On timeout the command and its child processes are killed. Output cap: approximately 100 000 characters per stream. For verbose commands, redirect output to a file in the workspace and read it back with the file tools. Non-interactive only: commands that wait for input will hang until the timeout. Use non-interactive flags (e.g. npm install --yes, --no-input)."
|
|
947
|
+
"text": "Shell: cmd.exe on Windows, /bin/sh on Unix. Shell features (&&, |, quoting) work. Working directory: the agent's workspace root. Pass a workspace-relative cwd to run somewhere else inside the workspace — the path cannot point outside it. That sets where the command starts, not what it can reach: see what this list does not do. Default timeout: 300 seconds. Pass timeout_seconds to override. On timeout the command and its child processes are killed. Output cap: approximately 100 000 characters per stream. For verbose commands, redirect output to a file in the workspace and read it back with the file tools. Non-interactive only: commands that wait for input will hang until the timeout. Use non-interactive flags (e.g. npm install --yes, --no-input)."
|
|
941
948
|
},
|
|
942
949
|
{
|
|
943
950
|
"page": "guides/shell-commands",
|
|
@@ -1252,7 +1259,7 @@
|
|
|
1252
1259
|
"pageTitle": "Dashboard reference",
|
|
1253
1260
|
"heading": "Agents",
|
|
1254
1261
|
"url": "/nodal-agents/docs/reference/dashboard#agents",
|
|
1255
|
-
"text": "Agents — /agents The fleet, grouped under their orchestrators, with per-agent job counts and live activity. Drag a row to reorder it within its group. Create New Agent opens a modal that asks how to start: Customize a new agent — an empty form, you pick everything. Pre-filled agent profiles — a profile family pre-fills the name, the role, the model and the skills that fit. Recommended connectors are suggested, never imposed, and nothing is written to the database until you create the agent. One agent — /agents/<id>/edit Eight tabs: Tab What it holds Overview Name, persona, role, and the model — including Claude Code or Codex as the agent's whole runtime Channels Telegram, Discord, Slack and WhatsApp bindings Skills Assign and unassign skills Tools The built-in tools this agent holds Connectors Connectors and MCP servers, with the per-operation allowlist Runs This agent's runs Approvals Per-tool rule — Run without asking, Ask for approval or Block
|
|
1262
|
+
"text": "Agents — /agents The fleet, grouped under their orchestrators, with per-agent job counts and live activity. Drag a row to reorder it within its group. Create New Agent opens a modal that asks how to start: Customize a new agent — an empty form, you pick everything. Pre-filled agent profiles — a profile family pre-fills the name, the role, the model and the skills that fit. Recommended connectors are suggested, never imposed, and nothing is written to the database until you create the agent. One agent — /agents/<id>/edit Eight tabs: Tab What it holds Overview Name, persona, role, and the model — including Claude Code or Codex as the agent's whole runtime Channels Telegram, Discord, Slack and WhatsApp bindings Skills Assign and unassign skills Tools The built-in tools this agent holds Connectors Connectors and MCP servers, with the per-operation allowlist Runs This agent's runs Approvals Per-tool rule — Run without asking, Ask for approval or Block, run_command included Settings Workspaces, budgets, memory budget, team permissions, delete Tabs that mean nothing for an agent running on a coding CLI are disabled with a reason rather than hidden. Skills — /skills Two tabs: Workspace — every skill installed here, grouped by provenance: Community, Custom, Learned, Built-in. Built-ins are editable; Reset to default undoes the override. Community — the community catalog as category-filtered tiles, plus Install a community skill from GitHub or a skills.sh path. Learned Skills — /learned-skills Skills the agents wrote themselves through the learning loop. Review, archive, restore, delete, or assign to an agent. The two workspace-level controls live on this page: Reflection on or off. Assignment mode — auto-assign learned skills, or require approval. Memory — /memories Persistent facts, in two tabs (Active / Archived). Create, archive, restore, delete; filter by agent, search by fact text, and see each fact's category and last-access date. API Connectors — /connectors Third-party integrations in two tabs, Installed and Marketplace. Connect one (an OAuth flow or an API key), then enable it on an agent's Connectors tab. The OAuth round-trip reports its success or failure on this page. MCP Connectors — /mcp The same two-tab shape for Model Context Protocol servers, plus a custom MCP form for your own stdio or HTTP server. Credentials — /credentials The credential vault: stored API keys and OAuth tokens, reused across connectors. Create through a wizard, rename inline, delete, and read the account name and token expiry. The wizard also shows the authorized redirect URI to paste into your OAuth app, with a copy button."
|
|
1256
1263
|
},
|
|
1257
1264
|
{
|
|
1258
1265
|
"page": "reference/dashboard",
|
|
@@ -1264,9 +1271,9 @@
|
|
|
1264
1271
|
{
|
|
1265
1272
|
"page": "reference/dashboard",
|
|
1266
1273
|
"pageTitle": "Dashboard reference",
|
|
1267
|
-
"heading": "Approvals — /approvals",
|
|
1268
|
-
"url": "/nodal-agents/docs/reference/dashboard#approvals--approvals",
|
|
1269
|
-
"text": "Everything that needs your sign-off, and everything that got it. Tabs: pending, approved, rejected, expired, all. Each card shows the tool input, the agent's stated purpose and impact, and a link to the run that asked. Approve or reject, optionally with a note. ?show=<id> opens one request on its own, whatever its decision — it is what the sidebar's Recents rows link to. The list narrows to that card and the page says so in its subtitle. See the autonomy model in Agents."
|
|
1274
|
+
"heading": "Approvals — approve or refuse a command, /approvals",
|
|
1275
|
+
"url": "/nodal-agents/docs/reference/dashboard#approvals--approve-or-refuse-a-command-approvals",
|
|
1276
|
+
"text": "Everything that needs your sign-off, and everything that got it. Tabs: pending, approved, rejected, expired, all. This is where you approve a command — or any other tool call an agent asked to make — and where you refuse one. Each card shows the tool input, the agent's stated purpose and impact, and a link to the run that asked. Approve or reject, optionally with a note. An approval covers that one call. To stop confirming every time, you allow the tool rather than the command: on the agent's Approvals tab, set run_command to Run without asking, for that agent, and — if you name one — only inside one of its folders. The card's Approve for this project writes that same rule for the folder the run is in. A rule never reads what the command says, so it cannot allow one command line and keep asking about another; set without a folder, it covers every command that agent runs. A second way does not come from that tab at all: with the workspace's autonomy level set to Autonomous, gate destructive and no rule on the tool, an ordinary command runs unasked, while a destructive or heavy one (deleting files, installing a package, killing a process, a disk operation) stays gated. See Shell commands. ?show=<id> opens one request on its own, whatever its decision — it is what the sidebar's Recents rows link to. The list narrows to that card and the page says so in its subtitle. See the autonomy model in Agents."
|
|
1270
1277
|
},
|
|
1271
1278
|
{
|
|
1272
1279
|
"page": "reference/dashboard",
|
|
@@ -1357,7 +1364,7 @@
|
|
|
1357
1364
|
"pageTitle": "Operating & observability",
|
|
1358
1365
|
"heading": "Cost and budget caps",
|
|
1359
1366
|
"url": "/nodal-agents/docs/reference/operate#cost-and-budget-caps",
|
|
1360
|
-
"text": "The runner
|
|
1367
|
+
"text": "The runner stops a run that crosses one of these ceilings, between two turns. It keeps what the run already wrote: the result holds that text, then a line such as [stopped: run budget — $2.40 spent, ceiling $2.00, turn 3]. Ceiling Where it is set Default Error code Cost of one run Settings → Safety → Run budget $2.00 (0 = none) cost_budget_exceeded Working time of one run Settings → Safety → Run budget none run_time_exceeded Tokens of one run MAX_TOTAL_TOKENS_PER_JOB on the runner 1500000 (1.5M) token_budget_exceeded What one agent spends in a day or a month the agent's Settings → Budget none agent_budget_exceeded The agent's budget counts every API call of that agent, whatever the provider, and the cost its coding CLI runs report. Days and months start at midnight and on the 1st in the workspace time zone. Once a ceiling is reached, each of the agent's runs stops before its next call until the window ends, and a coding CLI run does not start. The working time counts only the time the run spends working: waiting for an approval or for a delegated agent does not count. While a time ceiling is set, one model call never waits for its first token longer than half of what remains, with a 60 s floor. The cost is what the provider reports per call, or, when it reports nothing, the tokens times the model's list price from the catalogue. A model with neither stays at $0, and the token ceiling is then the backstop. Before 0.9.3 the cost ceiling was the MAX_COST_PER_JOB_USD environment variable. It is no longer read: a runner that still has it writes max_cost_env_ignored in its log. These are last-resort backstops. The anti-loop guards baked into the runtime — max delegation depth, max tool calls per turn, max chain length, and a no-progress detector — stop most runaways long before a budget cap is reached."
|
|
1361
1368
|
},
|
|
1362
1369
|
{
|
|
1363
1370
|
"page": "reference/operate",
|
|
@@ -1504,7 +1511,7 @@
|
|
|
1504
1511
|
"pageTitle": "Troubleshooting & FAQ",
|
|
1505
1512
|
"heading": "Jobs",
|
|
1506
1513
|
"url": "/nodal-agents/docs/troubleshooting#jobs",
|
|
1507
|
-
"text": "token_budget_exceeded Symptom. A job fails with token_budget_exceeded. Cause. Cumulative tokens for the job crossed the per-job ceiling — a runaway loop or a very large context. The default is 1,500,000 tokens. Fix. Investigate the loop first (a job burning 1.5M tokens is usually stuck, not legitimately large). To genuinely raise the ceiling, set MAX_TOTAL_TOKENS_PER_JOB in the runner's environment. Leveraging prompt caching (supported models) also stretches the budget, since the budget counts effective input tokens.
|
|
1514
|
+
"text": "token_budget_exceeded Symptom. A job fails with token_budget_exceeded. Cause. Cumulative tokens for the job crossed the per-job ceiling — a runaway loop or a very large context. The default is 1,500,000 tokens. Fix. Investigate the loop first (a job burning 1.5M tokens is usually stuck, not legitimately large). To genuinely raise the ceiling, set MAX_TOTAL_TOKENS_PER_JOB in the runner's environment. Leveraging prompt caching (supported models) also stretches the budget, since the budget counts effective input tokens. agent_budget_exceeded (the agent's budget stopped the job) Symptom. A job fails with agent_budget_exceeded, or code_task refuses to start with the same code. The result ends with [stopped: agent budget — …]. Cause. The agent spent its daily or monthly ceiling: API calls of every provider and coding CLI runs, counted together. Fix. Raise or clear the ceiling on the agent's Settings tab, in Budget (0 = none), or wait for the day or the month to end. cost_budget_exceeded or run_time_exceeded (the run budget stopped the job) Symptom. A job fails with cost_budget_exceeded or run_time_exceeded. Its result keeps what it wrote, then a [stopped: run budget — …] line. Cause. The run crossed the workspace's run budget: its cost (default $2.00 per run) or its working time (no limit by default). Fix. Raise or clear the ceiling in Settings → Safety → Run budget (0 = none). The MAX_COST_PER_JOB_USD environment variable is no longer read."
|
|
1508
1515
|
},
|
|
1509
1516
|
{
|
|
1510
1517
|
"page": "troubleshooting",
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-- LA COLONNE QUE PERSONNE NE POUVAIT ATTEINDRE (issue #411).
|
|
2
|
+
--
|
|
3
|
+
-- `memory_curation_enabled` est née avec la 0.7.0 (migration 0052) pour
|
|
4
|
+
-- découpler la curation de la mémoire de `reflection_enabled`, qui gardait la
|
|
5
|
+
-- boucle d'apprentissage des skills éteinte. Le runner la lisait à chaque
|
|
6
|
+
-- passage ; aucun écran ne l'a jamais montrée ni changée. Un réglage qu'on ne
|
|
7
|
+
-- peut poser qu'en SQL n'est pas un réglage, c'est une colonne.
|
|
8
|
+
--
|
|
9
|
+
-- Décision de Quentin, 22/09 : la supprimer. Ce qui reste dit « ne touche pas
|
|
10
|
+
-- à ça » est le geste que le produit propose déjà : l'épingle sur le fait
|
|
11
|
+
-- (`agent_memory.importance_locked`), que le curateur respecte, et le
|
|
12
|
+
-- coupe-circuit global `MEMORY_CURATION_ENABLED=false` côté runner.
|
|
13
|
+
--
|
|
14
|
+
-- Cette migration ne touche PAS `agent_memory` : aucun fait, aucune
|
|
15
|
+
-- importance, aucune archive ne bouge. Seule la ligne de l'espace perd un
|
|
16
|
+
-- booléen que rien ne lisait hors du cron.
|
|
17
|
+
ALTER TABLE "entities" DROP COLUMN IF EXISTS "memory_curation_enabled";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
-- UNE RÉPONSE ARRÊTÉE EST UN FAIT, PAS UNE PHRASE (#456).
|
|
2
|
+
--
|
|
3
|
+
-- Le bouton Stop du chat coupe une réponse en cours d'écriture ; ce qui avait
|
|
4
|
+
-- été écrit est gardé. La première version écrivait `[stopped by the user]` à
|
|
5
|
+
-- la fin du texte — une phrase du runner montrée telle quelle, contraire à
|
|
6
|
+
-- l'invariant #2 (revue Codex de #459). Le runner pose désormais ce FAIT, et
|
|
7
|
+
-- c'est l'écran qui le dit avec ses propres mots.
|
|
8
|
+
--
|
|
9
|
+
-- Faux par défaut : toutes les réponses d'avant ont été rendues entières.
|
|
10
|
+
ALTER TABLE "chat_messages" ADD COLUMN IF NOT EXISTS "stopped" boolean NOT NULL DEFAULT false;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
-- UNE RÉPONSE COUPÉE PAR UNE HORLOGE EST UN FAIT, COMME UNE RÉPONSE ARRÊTÉE (#458).
|
|
2
|
+
--
|
|
3
|
+
-- La réponse du chat passe désormais sous les deux horloges de silence des
|
|
4
|
+
-- jobs (#440). Quand l'une d'elles coupe une réponse qui avait commencé à
|
|
5
|
+
-- s'écrire, ce texte est gardé comme la réponse du tour, et la raison de la
|
|
6
|
+
-- coupure est enregistrée ici : `idle_before_first_token`,
|
|
7
|
+
-- `idle_between_tokens`, `absolute` ou `stream_error` — les raisons de
|
|
8
|
+
-- `LLMTimeoutError`. L'écran le dit avec ses mots ; le runner n'écrit aucune
|
|
9
|
+
-- phrase (invariant #2, même décision que `stopped`, migration 0123).
|
|
10
|
+
--
|
|
11
|
+
-- NULL par défaut : toutes les réponses d'avant ont été rendues entières.
|
|
12
|
+
ALTER TABLE "chat_messages" ADD COLUMN IF NOT EXISTS "cut_reason" text;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
-- CE QU'UN AGENT N'A PAS LE DROIT DE FAIRE AVEC UN SHELL, PAR SORTE D'ACTION (#464).
|
|
2
|
+
--
|
|
3
|
+
-- Run 06a949cb → b4b493e8 (23/09) : sous `destructive_gate`, un agent a lancé
|
|
4
|
+
-- des commandes sans que personne soit consulté, et le seul réglage fin était
|
|
5
|
+
-- une liste de programmes à écrire à la main.
|
|
6
|
+
--
|
|
7
|
+
-- `agents.shell_policy` porte, par agent, l'état de chaque sorte d'action :
|
|
8
|
+
-- `allow`, `ask` ou `never` (liste dans packages/shared/src/shell-checklist.ts).
|
|
9
|
+
-- NULL, ou une sorte absente, veut dire `ask`.
|
|
10
|
+
--
|
|
11
|
+
-- `approval_requests.gate_reasons` porte POURQUOI la liste a retenu une
|
|
12
|
+
-- commande (les sortes d'action lues) : la carte d'approbation les montre.
|
|
13
|
+
ALTER TABLE "agents" ADD COLUMN IF NOT EXISTS "shell_policy" jsonb;
|
|
14
|
+
--> statement-breakpoint
|
|
15
|
+
ALTER TABLE "approval_requests" ADD COLUMN IF NOT EXISTS "gate_reasons" jsonb;
|
|
16
|
+
--> statement-breakpoint
|
|
17
|
+
-- Un agent à qui le propriétaire a déjà donné le shell sans demander, PARTOUT
|
|
18
|
+
-- (le toggle Yolo : une règle `run_command → auto_approve` sans condition)
|
|
19
|
+
-- garde ce qu'il avait : chaque sorte d'action y est permise. Une règle
|
|
20
|
+
-- confinée à un dossier (`condition_json.workspacePath`, #360) ne vaut que là :
|
|
21
|
+
-- l'étendre à toute la liste rendrait `rm` permis hors de ce dossier (revue
|
|
22
|
+
-- Codex de #464, P1). Ces agents-là, comme tous les autres, demandent pour tout
|
|
23
|
+
-- (NULL).
|
|
24
|
+
UPDATE "agents"
|
|
25
|
+
SET "shell_policy" = '{"inline_code":"allow","delete_files":"allow","install_software":"allow","download":"allow","stop_programs":"allow","system_settings":"allow"}'::jsonb
|
|
26
|
+
WHERE "shell_policy" IS NULL
|
|
27
|
+
AND "id" IN (
|
|
28
|
+
SELECT "agent_id" FROM "approval_rules"
|
|
29
|
+
WHERE "tool_name" = 'run_command' AND "action" = 'auto_approve' AND "agent_id" IS NOT NULL
|
|
30
|
+
AND ("condition_json" IS NULL OR "condition_json" = '{}'::jsonb)
|
|
31
|
+
);
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
-- UN BUDGET PAR RUN, ET UN DÉLAI D'ATTENTE PAR AGENT (issue #442).
|
|
2
|
+
--
|
|
3
|
+
-- 1. `entities.max_run_cost_usd` : ce qu'un run peut coûter avant d'être
|
|
4
|
+
-- arrêté, par l'espace. Le plafond existait déjà (garde 1e du runner, 2 $),
|
|
5
|
+
-- mais il ne se réglait que par la variable d'environnement
|
|
6
|
+
-- `MAX_COST_PER_JOB_USD`, invisible depuis le produit, et il ARRÊTAIT le
|
|
7
|
+
-- run sans livrer ce qui était déjà écrit. LE DÉFAUT EST 2, la valeur que
|
|
8
|
+
-- le runner applique aujourd'hui : une migration ne change le comportement
|
|
9
|
+
-- de personne. `0` = aucun plafond, un choix explicite.
|
|
10
|
+
--
|
|
11
|
+
-- 2. `entities.max_run_hours` : combien de temps un run peut TOURNER (les
|
|
12
|
+
-- attentes d'approbation et de délégation ne comptent pas, c'est
|
|
13
|
+
-- `agent_jobs.total_duration_ms`). `0` = aucune limite, le défaut, puisque
|
|
14
|
+
-- rien ne limitait la durée avant.
|
|
15
|
+
--
|
|
16
|
+
-- 3. `agents.idle_timeout_seconds` : combien de temps un appel au modèle peut
|
|
17
|
+
-- rester sans premier jeton pour CET agent (Researcher, qui réfléchit
|
|
18
|
+
-- longtemps). NULL = la plateforme décide (120 s, relevé avec la taille du
|
|
19
|
+
-- contexte et l'effort de raisonnement). Une valeur posée GAGNE toujours
|
|
20
|
+
-- sur la valeur implicite (Hermes, `_stale_timeout_is_explicit`).
|
|
21
|
+
--
|
|
22
|
+
-- LES CHECK SONT ICI, pas seulement dans le formulaire : ces colonnes bornent
|
|
23
|
+
-- une boucle du runner (invariant #8). Mille dollars, trois jours, une heure
|
|
24
|
+
-- d'attente : au-delà, ce n'est plus un réglage, c'est une faute de frappe.
|
|
25
|
+
ALTER TABLE "entities"
|
|
26
|
+
ADD COLUMN IF NOT EXISTS "max_run_cost_usd" real NOT NULL DEFAULT 2;
|
|
27
|
+
ALTER TABLE "entities"
|
|
28
|
+
ADD COLUMN IF NOT EXISTS "max_run_hours" real NOT NULL DEFAULT 0;
|
|
29
|
+
ALTER TABLE "agents"
|
|
30
|
+
ADD COLUMN IF NOT EXISTS "idle_timeout_seconds" integer;
|
|
31
|
+
|
|
32
|
+
DO $$
|
|
33
|
+
BEGIN
|
|
34
|
+
ALTER TABLE "entities"
|
|
35
|
+
ADD CONSTRAINT "entities_max_run_cost_usd_check"
|
|
36
|
+
CHECK ("max_run_cost_usd" >= 0 AND "max_run_cost_usd" <= 1000);
|
|
37
|
+
EXCEPTION
|
|
38
|
+
WHEN duplicate_object THEN NULL;
|
|
39
|
+
END $$;
|
|
40
|
+
|
|
41
|
+
DO $$
|
|
42
|
+
BEGIN
|
|
43
|
+
ALTER TABLE "entities"
|
|
44
|
+
ADD CONSTRAINT "entities_max_run_hours_check"
|
|
45
|
+
CHECK ("max_run_hours" >= 0 AND "max_run_hours" <= 72);
|
|
46
|
+
EXCEPTION
|
|
47
|
+
WHEN duplicate_object THEN NULL;
|
|
48
|
+
END $$;
|
|
49
|
+
|
|
50
|
+
DO $$
|
|
51
|
+
BEGIN
|
|
52
|
+
ALTER TABLE "agents"
|
|
53
|
+
ADD CONSTRAINT "agents_idle_timeout_seconds_check"
|
|
54
|
+
CHECK ("idle_timeout_seconds" IS NULL OR ("idle_timeout_seconds" >= 30 AND "idle_timeout_seconds" <= 3600));
|
|
55
|
+
EXCEPTION
|
|
56
|
+
WHEN duplicate_object THEN NULL;
|
|
57
|
+
END $$;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
-- UN BUDGET PAR AGENT, TOUS FOURNISSEURS CONFONDUS (issue #447).
|
|
2
|
+
--
|
|
3
|
+
-- Décision de Quentin, 23/09 : un budget par agent, dans l'onglet Settings de
|
|
4
|
+
-- l'agent, qui compte ENSEMBLE les appels d'API de n'importe quel fournisseur
|
|
5
|
+
-- (`llm_calls.cost_usd`) et les runs des CLI de code (`cli_runs.cost_usd`).
|
|
6
|
+
--
|
|
7
|
+
-- Avant : un seul champ, `agents.cli_daily_budget_usd` (défaut 10), qui ne
|
|
8
|
+
-- bornait QUE les runs de CLI de code, vivait dans la carte « Call a coding
|
|
9
|
+
-- CLI » de l'onglet Autonomy et n'apparaissait que si ce groupe d'outils était
|
|
10
|
+
-- actif. Deux autres budgets existaient sans que rien ne les lise :
|
|
11
|
+
-- `agents.max_tokens_per_job` et toute la table `agent_budgets` (0 ligne).
|
|
12
|
+
--
|
|
13
|
+
-- 1. Trois colonnes : plafond du jour, plafond du mois (0 = aucun), et le
|
|
14
|
+
-- pourcentage à partir duquel l'écran prévient (80 par défaut, la valeur de
|
|
15
|
+
-- l'ancienne `agent_budgets.alert_threshold_pct`).
|
|
16
|
+
-- 2. Le plafond CLI d'un agent devient son plafond du jour SEULEMENT là où il
|
|
17
|
+
-- s'appliquait (runtime CLI, ou outil code-task rattaché). Ailleurs il ne
|
|
18
|
+
-- bornait rien, et en faire un plafond de 10 $ sur les appels d'API
|
|
19
|
+
-- arrêterait des agents qui ne l'ont jamais eu. Il compte désormais aussi
|
|
20
|
+
-- leurs appels d'API : c'est la décision, et l'écran le dit.
|
|
21
|
+
-- UNE EXCEPTION, voulue : un agent au runtime Codex. L'ancienne garde
|
|
22
|
+
-- l'exemptait, son plafond (10 $ par défaut) ne bornait donc rien ; il
|
|
23
|
+
-- devient un plafond actif, puisque Codex n'est plus exempté (#447). Ces
|
|
24
|
+
-- agents GAGNENT un plafond qu'ils n'avaient pas en pratique, visible dans
|
|
25
|
+
-- leur onglet Settings (revue de la PR #496).
|
|
26
|
+
-- 3. Les colonnes et la table mortes partent.
|
|
27
|
+
--
|
|
28
|
+
-- IDEMPOTENTE : le repli ne tourne que tant que la colonne CLI existe.
|
|
29
|
+
ALTER TABLE "agents"
|
|
30
|
+
ADD COLUMN IF NOT EXISTS "budget_daily_usd" real NOT NULL DEFAULT 0;
|
|
31
|
+
ALTER TABLE "agents"
|
|
32
|
+
ADD COLUMN IF NOT EXISTS "budget_monthly_usd" real NOT NULL DEFAULT 0;
|
|
33
|
+
ALTER TABLE "agents"
|
|
34
|
+
ADD COLUMN IF NOT EXISTS "budget_alert_pct" integer NOT NULL DEFAULT 80;
|
|
35
|
+
|
|
36
|
+
DO $$
|
|
37
|
+
BEGIN
|
|
38
|
+
ALTER TABLE "agents"
|
|
39
|
+
ADD CONSTRAINT "agents_budget_daily_usd_check"
|
|
40
|
+
CHECK ("budget_daily_usd" >= 0 AND "budget_daily_usd" <= 1000);
|
|
41
|
+
EXCEPTION
|
|
42
|
+
WHEN duplicate_object THEN NULL;
|
|
43
|
+
END $$;
|
|
44
|
+
|
|
45
|
+
DO $$
|
|
46
|
+
BEGIN
|
|
47
|
+
ALTER TABLE "agents"
|
|
48
|
+
ADD CONSTRAINT "agents_budget_monthly_usd_check"
|
|
49
|
+
CHECK ("budget_monthly_usd" >= 0 AND "budget_monthly_usd" <= 10000);
|
|
50
|
+
EXCEPTION
|
|
51
|
+
WHEN duplicate_object THEN NULL;
|
|
52
|
+
END $$;
|
|
53
|
+
|
|
54
|
+
DO $$
|
|
55
|
+
BEGIN
|
|
56
|
+
ALTER TABLE "agents"
|
|
57
|
+
ADD CONSTRAINT "agents_budget_alert_pct_check"
|
|
58
|
+
CHECK ("budget_alert_pct" >= 1 AND "budget_alert_pct" <= 100);
|
|
59
|
+
EXCEPTION
|
|
60
|
+
WHEN duplicate_object THEN NULL;
|
|
61
|
+
END $$;
|
|
62
|
+
|
|
63
|
+
DO $$
|
|
64
|
+
BEGIN
|
|
65
|
+
IF EXISTS (
|
|
66
|
+
SELECT 1 FROM information_schema.columns
|
|
67
|
+
WHERE table_name = 'agents' AND column_name = 'cli_daily_budget_usd'
|
|
68
|
+
) THEN
|
|
69
|
+
UPDATE "agents" a
|
|
70
|
+
SET "budget_daily_usd" = LEAST(a."cli_daily_budget_usd", 1000)
|
|
71
|
+
WHERE a."cli_daily_budget_usd" > 0
|
|
72
|
+
AND (
|
|
73
|
+
a."runtime" IN ('claude-code', 'codex')
|
|
74
|
+
OR EXISTS (
|
|
75
|
+
SELECT 1
|
|
76
|
+
FROM "agent_skill_assignments" x
|
|
77
|
+
JOIN "agent_skills" k ON k."id" = x."skill_id"
|
|
78
|
+
WHERE x."agent_id" = a."id" AND k."slug" = 'code-task'
|
|
79
|
+
)
|
|
80
|
+
);
|
|
81
|
+
ALTER TABLE "agents" DROP COLUMN "cli_daily_budget_usd";
|
|
82
|
+
END IF;
|
|
83
|
+
END $$;
|
|
84
|
+
|
|
85
|
+
ALTER TABLE "agents" DROP COLUMN IF EXISTS "max_tokens_per_job";
|
|
86
|
+
DROP TABLE IF EXISTS "agent_budgets";
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
-- LES DEUX SORTES D'ACTION RETIRÉES DE LA LISTE DU SHELL (#464, PR #476).
|
|
2
|
+
--
|
|
3
|
+
-- La première version de la liste (PR #474, fermée) portait deux sortes que la
|
|
4
|
+
-- version réduite n'a plus : `outside_folders` (lire des chemins dans la
|
|
5
|
+
-- commande et les scripts) et `own_script` (un script écrit par l'agent). Une
|
|
6
|
+
-- lecture du texte ne pouvait pas tenir ces promesses ; garder un agent dans
|
|
7
|
+
-- ses dossiers demande un bac à sable de l'OS (#475).
|
|
8
|
+
--
|
|
9
|
+
-- Seule une base qui a fait tourner la première 0125 porte ces clés. Le schéma
|
|
10
|
+
-- strict (`resolveShellPolicy`) les refuse, et un job s'arrêterait alors sur
|
|
11
|
+
-- `shell_policy_invalid`. Ici : `own_script` couvrait aussi le code en ligne
|
|
12
|
+
-- (`python -c`), son état passe donc à `inline_code` quand celui-ci n'est pas
|
|
13
|
+
-- déjà réglé ; `outside_folders` disparaît, il ne correspond plus à rien.
|
|
14
|
+
-- Ailleurs, ces deux ordres ne touchent aucune ligne.
|
|
15
|
+
UPDATE "agents"
|
|
16
|
+
SET "shell_policy" = ("shell_policy" - 'outside_folders' - 'own_script')
|
|
17
|
+
|| CASE
|
|
18
|
+
-- `inline_code` absent OU à null JSON : dans les deux cas rien n'y est
|
|
19
|
+
-- réglé, et un null resterait refusé par le schéma strict (revue de la
|
|
20
|
+
-- PR #497).
|
|
21
|
+
WHEN "shell_policy" ? 'own_script'
|
|
22
|
+
AND jsonb_typeof("shell_policy" -> 'inline_code') IS DISTINCT FROM 'string'
|
|
23
|
+
THEN jsonb_build_object('inline_code', "shell_policy" -> 'own_script')
|
|
24
|
+
ELSE '{}'::jsonb
|
|
25
|
+
END
|
|
26
|
+
WHERE "shell_policy" ?| ARRAY['outside_folders', 'own_script'];
|
|
27
|
+
--> statement-breakpoint
|
|
28
|
+
UPDATE "agents" SET "shell_policy" = NULL WHERE "shell_policy" = '{}'::jsonb;
|
|
29
|
+
--> statement-breakpoint
|
|
30
|
+
-- Les raisons déjà posées sur une demande : la carte ne sait plus les nommer.
|
|
31
|
+
-- Ne restent que les raisons LISIBLES : une catégorie, et pas une des deux
|
|
32
|
+
-- retirées. Un élément sans catégorie part aussi, et c'est voulu : la carte lit
|
|
33
|
+
-- le tableau d'un bloc (`ShellGateReasonsSchema`), et un seul élément illisible
|
|
34
|
+
-- lui faisait perdre toutes les raisons, les valides comprises (revue de la
|
|
35
|
+
-- PR #497, passes 1 et 2).
|
|
36
|
+
UPDATE "approval_requests"
|
|
37
|
+
SET "gate_reasons" = (
|
|
38
|
+
SELECT jsonb_agg(e)
|
|
39
|
+
FROM jsonb_array_elements("gate_reasons") AS e
|
|
40
|
+
WHERE e ->> 'category' IS NOT NULL
|
|
41
|
+
AND e ->> 'category' NOT IN ('outside_folders', 'own_script')
|
|
42
|
+
)
|
|
43
|
+
-- Le CASE ordonne les deux tests : Postgres ne garantit pas l'ordre d'un AND,
|
|
44
|
+
-- et `jsonb_array_elements` sur une valeur qui n'est pas un tableau lève une
|
|
45
|
+
-- erreur (revue de la PR #497).
|
|
46
|
+
WHERE CASE
|
|
47
|
+
WHEN jsonb_typeof("gate_reasons") = 'array' THEN EXISTS (
|
|
48
|
+
SELECT 1 FROM jsonb_array_elements("gate_reasons") AS e
|
|
49
|
+
WHERE e ->> 'category' IN ('outside_folders', 'own_script')
|
|
50
|
+
)
|
|
51
|
+
ELSE false
|
|
52
|
+
END;
|
|
@@ -848,6 +848,55 @@
|
|
|
848
848
|
"when": 1786001340000,
|
|
849
849
|
"tag": "0121_entities_proof_repair_attempts",
|
|
850
850
|
"breakpoints": true
|
|
851
|
+
},
|
|
852
|
+
{
|
|
853
|
+
"idx": 122,
|
|
854
|
+
"version": "7",
|
|
855
|
+
"when": 1786001400000,
|
|
856
|
+
"tag": "0122_entities_drop_memory_curation_enabled",
|
|
857
|
+
"breakpoints": true
|
|
858
|
+
},
|
|
859
|
+
{
|
|
860
|
+
"idx": 123,
|
|
861
|
+
"version": "7",
|
|
862
|
+
"when": 1786001500000,
|
|
863
|
+
"tag": "0123_chat_messages_stopped",
|
|
864
|
+
"breakpoints": true
|
|
865
|
+
},
|
|
866
|
+
{
|
|
867
|
+
"idx": 124,
|
|
868
|
+
"version": "7",
|
|
869
|
+
"when": 1786001600000,
|
|
870
|
+
"tag": "0124_chat_messages_cut_reason",
|
|
871
|
+
"breakpoints": true
|
|
872
|
+
},
|
|
873
|
+
{
|
|
874
|
+
"idx": 125,
|
|
875
|
+
"version": "7",
|
|
876
|
+
"when": 1786001700000,
|
|
877
|
+
"tag": "0125_shell_checklist",
|
|
878
|
+
"breakpoints": true
|
|
879
|
+
},
|
|
880
|
+
{
|
|
881
|
+
"idx": 126,
|
|
882
|
+
"version": "7",
|
|
883
|
+
"when": 1786001800000,
|
|
884
|
+
"tag": "0126_run_budget",
|
|
885
|
+
"breakpoints": true
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
"idx": 127,
|
|
889
|
+
"version": "7",
|
|
890
|
+
"when": 1786001900000,
|
|
891
|
+
"tag": "0127_agent_budget",
|
|
892
|
+
"breakpoints": true
|
|
893
|
+
},
|
|
894
|
+
{
|
|
895
|
+
"idx": 128,
|
|
896
|
+
"version": "7",
|
|
897
|
+
"when": 1786002000000,
|
|
898
|
+
"tag": "0128_shell_policy_retired_kinds",
|
|
899
|
+
"breakpoints": true
|
|
851
900
|
}
|
|
852
901
|
]
|
|
853
902
|
}
|