@voltro/cli 0.33.0 → 0.34.0
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/CHANGELOG.md +1801 -0
- package/bin/nodeEnvironment.d.mts +30 -0
- package/bin/nodeEnvironment.mjs +158 -0
- package/bin/voltro.mjs +69 -5
- package/dist/addCommand-BNeoeSxe.js +124 -0
- package/dist/addCommand-aXSQveak.js +2 -0
- package/dist/agentsMd-BTchIZku.js +2 -0
- package/dist/agentsMd-mhQMF1bx.js +254 -0
- package/dist/apiBuild-BICVGnEC.js +2 -0
- package/dist/{apiBuild-h9VHtnlw.js → apiBuild-DZF_f0_I.js} +46 -46
- package/dist/appPort-B_HpJ_ck.js +48 -0
- package/dist/baselineCommand-C2ClWZN3.js +2 -0
- package/dist/baselineCommand-DIttzO8A.js +227 -0
- package/dist/bin.js +71 -28
- package/dist/build-CE7Ca9gm.js +711 -0
- package/dist/cacheCommand-DA4OH9xt.js +42 -0
- package/dist/capabilitiesCommand-nq_pz5xd.js +123 -0
- package/dist/checkCommand-Dv8r9tGO.js +231 -0
- package/dist/checkCommand-YZDmkAGd.js +2 -0
- package/dist/{cliArgs-qdZSElM3.js → cliArgs-D4p8n7EE.js} +12 -1
- package/dist/cliError-BmdYnghb.js +10 -0
- package/dist/cliOutput-D1tSBoRM.js +15 -0
- package/dist/{cliRuntime-Oh517vCV.js → cliRuntime-Dh7UDinH.js} +20 -20
- package/dist/cloudClient-DWL-Hw_T.js +67 -0
- package/dist/cloudCmd-Cvv5HGaZ.js +364 -0
- package/dist/clusterCmd-CNXKlcvD.js +54 -0
- package/dist/codegen-CYM3Zqrf.js +605 -0
- package/dist/codegen-ChBi_hVa.js +2 -0
- package/dist/codegenCommand-DC6w2tNZ.js +30 -0
- package/dist/codemodRunner-DRRqXR74.js +5243 -0
- package/dist/commandRunner-BLAEFLjp.js +47 -0
- package/dist/commands-gutsz-Ac.js +808 -0
- package/dist/connectionConfig-UFlIEiys.js +66 -0
- package/dist/dashboardCommand-3YG8p-UA.js +25 -0
- package/dist/dataCommand-qL0r7fPO.js +535 -0
- package/dist/dataProfile-dW-PsfLB.js +15 -0
- package/dist/{dbCommand-DTLKAfbA.js → dbCommand-B6X0FZbq.js} +551 -401
- package/dist/dbCommand-CpdKLeQq.js +2 -0
- package/dist/{dev-C_P8FLSx.js → dev-CerMd0mW.js} +3122 -3129
- package/dist/dev-CoG-ZPx8.js +3 -0
- package/dist/devActivity-Dx_3nnGv.js +100 -0
- package/dist/devActivity.js +1 -1
- package/dist/dialectDriver-CgXnDfec.js +39 -0
- package/dist/discover-C9XKJDco.js +25 -0
- package/dist/doctorCommand-BvqGBwNG.js +2 -0
- package/dist/{checkCommand-xGhRFFg2.js → doctorCommand-CnDXQxfa.js} +520 -1278
- package/dist/dormancyCommand-Dszo57d6.js +69 -0
- package/dist/e2eCmd-BRabZww-.js +147 -0
- package/dist/embeddingsCommand-C0sKVRo1.js +73 -0
- package/dist/envCommand-DPgdV1Bq.js +60 -0
- package/dist/evalCommand-6RUfPen4.js +118 -0
- package/dist/evolveCommand-DHpkgjgH.js +281 -0
- package/dist/fileTaxonomy-CJfgOllU.js +457 -0
- package/dist/frameworkTableAssembly-BGHmck-x.js +2 -0
- package/dist/{frameworkTableAssembly-BwIrO5nv.js → frameworkTableAssembly-DkkP6BgC.js} +184 -148
- package/dist/generateCommand-oibemh97.js +147 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +4 -3
- package/dist/infoCommand-BJw9nLUR.js +60 -0
- package/dist/{inspect-BUUjt773.js → inspect-CBqFtAKA.js} +82 -40
- package/dist/inspect-C_T_WGvl.js +2 -0
- package/dist/inspectCmd-Bppy-GGw.js +224 -0
- package/dist/inspectFetch-Cm8_wVvp.js +151 -0
- package/dist/inspectMetrics-CfdKLh6t.js +72 -0
- package/dist/loadEnv-D9nEOClM.js +44 -0
- package/dist/logFileSink-C_D2wRN1.js +105 -0
- package/dist/logsCmd-CCca3KRZ.js +260 -0
- package/dist/manifestBuild-ChsKAhmn.js +2 -0
- package/dist/{manifestBuild-BLrVuSlM.js → manifestBuild-sxpwdKY1.js} +1 -1
- package/dist/metaCommands-7MJfZ5cf.js +196 -0
- package/dist/migrate-CBwOt_iV.js +83 -0
- package/dist/mssqlClusterPatch-_4cE_nun.js +44 -0
- package/dist/newCommand-COWOJ1_E.js +156 -0
- package/dist/nodeEnvironment-cGFAj1J8.js +28 -0
- package/dist/packageCommand-Cug_3Ogl.js +271 -0
- package/dist/pageConvention-cEiRxdab.js +5 -0
- package/dist/privacyCommand-C-Df56U_.js +146 -0
- package/dist/projectScaffold-DmzEKHib.js +2 -0
- package/dist/projectScaffold-LMMtaavR.js +814 -0
- package/dist/renderModeScan-D7J1B7Kw.js +105 -0
- package/dist/renderProfile-1OWWAAtx.js +81 -0
- package/dist/runtimeRegistry-DMeKfTHP.js +81 -0
- package/dist/runtimeTrace-CRxalXTs.js +91 -0
- package/dist/scheduleCmd--jksTrf6.js +69 -0
- package/dist/scheduleManifestCmd-D2x0CTTY.js +249 -0
- package/dist/schemaIr-UJybUUZW.js +103 -0
- package/dist/{sdkgen-C81QIkiL.js → sdkgen-CYJscZC7.js} +111 -209
- package/dist/seedRunner-TFHHiToI.js +329 -0
- package/dist/serveCommand-B_isw7q4.js +1647 -0
- package/dist/serveCommand-DOvbgRnQ.js +2 -0
- package/dist/serveEntry.js +5 -5
- package/dist/serverlessCommand-CfJZy6dS.js +482 -0
- package/dist/start-9LiUOfES.js +1087 -0
- package/dist/start-B-9Nsp-S.js +3 -0
- package/dist/startEntry.js +2 -2
- package/dist/staticCommand-Dr2M6tpU.js +304 -0
- package/dist/storageCommand-Co6NfLqN.js +42 -0
- package/dist/templates-De8IR5-c.js +102 -0
- package/dist/test-CI6iDsYc.js +115 -0
- package/dist/tracesCmd-CkEZQrtt.js +232 -0
- package/dist/tsconfigPaths-BWXBWgcl.js +107 -0
- package/dist/tsxLoader-EuXmSJ1K.js +51 -0
- package/dist/typecheckCommand-BlsWiCNq.js +61 -0
- package/dist/updateCommand-Bkptutss.js +585 -0
- package/dist/updateCommand-us1_hdIC.js +2 -0
- package/dist/{inspectMetrics-1xzTKAFx.js → webDev-CBYvPqQr.js} +975 -1559
- package/dist/webDev-Cg-fFiyd2.js +2 -0
- package/dist/webhookDiscovery-CrGAfhIG.js +2 -0
- package/dist/webhookDiscovery-D7VaeMlz.js +51 -0
- package/dist/webhooksCommand-CID96Rga.js +267 -0
- package/dist/workflowsCmd-D1VTmLMY.js +608 -0
- package/package.json +179 -17
- package/templates/AGENTS.core.md +58 -3
- package/templates/AGENTS.md +64 -7
- package/templates/agent-docs/_index.md +6 -4
- package/templates/agent-docs/_manifest.json +22 -5
- package/templates/agent-docs/ai.md +370 -0
- package/templates/agent-docs/authentication.md +265 -31
- package/templates/agent-docs/caching.md +6 -0
- package/templates/agent-docs/cli.md +794 -50
- package/templates/agent-docs/data.md +550 -11
- package/templates/agent-docs/database/migrations.md +174 -25
- package/templates/agent-docs/database/misc.md +156 -40
- package/templates/agent-docs/database/querying.md +19 -1
- package/templates/agent-docs/database/scaling.md +60 -0
- package/templates/agent-docs/database/schema.md +1 -0
- package/templates/agent-docs/database/seedsdialects.md +208 -19
- package/templates/agent-docs/database/transactions.md +68 -0
- package/templates/agent-docs/deployment.md +69 -3
- package/templates/agent-docs/introduction.md +87 -16
- package/templates/agent-docs/local-first-mobile.md +79 -4
- package/templates/agent-docs/multi-tenancy.md +95 -20
- package/templates/agent-docs/observability.md +58 -3
- package/templates/agent-docs/plugins/ai-flows.md +161 -2
- package/templates/agent-docs/plugins/analytics-postgres.md +1 -1
- package/templates/agent-docs/plugins/audit.md +37 -1
- package/templates/agent-docs/plugins/auth-social.md +143 -0
- package/templates/agent-docs/plugins/auth-workos.md +4 -2
- package/templates/agent-docs/plugins/auth.md +131 -6
- package/templates/agent-docs/plugins/billing.md +132 -15
- package/templates/agent-docs/plugins/cdc-out.md +46 -7
- package/templates/agent-docs/plugins/clickhouse.md +1 -1
- package/templates/agent-docs/plugins/duckdb.md +1 -1
- package/templates/agent-docs/plugins/flags.md +132 -0
- package/templates/agent-docs/plugins/governance.md +105 -7
- package/templates/agent-docs/plugins/multitenancy.md +9 -4
- package/templates/agent-docs/plugins/presence.md +13 -2
- package/templates/agent-docs/plugins/ratelimit.md +9 -0
- package/templates/agent-docs/plugins/search.md +157 -6
- package/templates/agent-docs/plugins/sso-saml.md +47 -8
- package/templates/agent-docs/plugins/webhooks.md +105 -0
- package/templates/agent-docs/plugins.md +150 -18
- package/templates/agent-docs/reference.md +60 -3
- package/templates/agent-docs/releases.md +1117 -0
- package/templates/agent-docs/routing.md +43 -25
- package/templates/agent-docs/scheduling.md +10 -0
- package/templates/agent-docs/schema-driven-ui.md +92 -12
- package/templates/agent-docs/security.md +426 -0
- package/templates/agent-docs/templates/apibackends.md +87 -18
- package/templates/agent-docs/templates/appshells.md +32 -14
- package/templates/agent-docs/templates/overview.md +13 -8
- package/templates/agent-docs/testing.md +211 -14
- package/templates/agent-docs/whats-new.md +1700 -104
- package/templates/agent-docs/workflows.md +130 -14
- package/templates/apps/api-ai/actions/summarize.action.ts +11 -0
- package/templates/apps/api-ai/package.json +8 -7
- package/templates/apps/api-auth/actions/me.action.ts +13 -0
- package/templates/apps/api-auth/package.json +9 -8
- package/templates/apps/api-backend/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend/package.json +12 -8
- package/templates/apps/api-backend/queries/notes.query.ts +30 -8
- package/templates/apps/api-backend-deactivation/actions/users.get.action.ts +14 -0
- package/templates/apps/api-backend-deactivation/mutations/users.create.mutation.ts +8 -0
- package/templates/apps/api-backend-deactivation/mutations/users.deactivate.mutation.ts +10 -0
- package/templates/apps/api-backend-deactivation/package.json +8 -7
- package/templates/apps/api-backend-mail/actions/sendWelcome.action.ts +17 -0
- package/templates/apps/api-backend-mail/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend-mail/package.json +9 -8
- package/templates/apps/api-backend-mail/queries/notes.query.ts +30 -8
- package/templates/apps/api-backend-mariadb/.env.example +14 -0
- package/templates/apps/api-backend-mariadb/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend-mariadb/package.json +10 -9
- package/templates/apps/api-backend-mariadb/queries/notes.query.ts +30 -8
- package/templates/apps/api-backend-sqlite/.env.example +14 -0
- package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend-sqlite/package.json +9 -8
- package/templates/apps/api-backend-sqlite/queries/notes.query.ts +30 -8
- package/templates/apps/api-backend-storage/actions/uploadAvatar.action.ts +13 -0
- package/templates/apps/api-backend-storage/actions/uploadDocument.action.ts +12 -0
- package/templates/apps/api-backend-storage/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend-storage/package.json +9 -8
- package/templates/apps/api-backend-storage/queries/notes.query.ts +30 -8
- package/templates/apps/api-cms/actions/content.get.action.ts +7 -0
- package/templates/apps/api-cms/actions/content.types.action.ts +6 -0
- package/templates/apps/api-cms/actions/me.action.ts +13 -0
- package/templates/apps/api-cms/app.config.ts +19 -0
- package/templates/apps/api-cms/authz.ts +63 -0
- package/templates/apps/api-cms/mutations/content.publish.mutation.ts +10 -0
- package/templates/apps/api-cms/mutations/content.saveDraft.mutation.ts +10 -0
- package/templates/apps/api-cms/mutations/content.unpublish.mutation.ts +5 -0
- package/templates/apps/api-cms/package.json +11 -10
- package/templates/apps/api-cms/queries/content.list.query.ts +23 -7
- package/templates/apps/api-cms/tests/accessDecisions.test.ts +121 -0
- package/templates/apps/api-cms/tests/content.descriptors.test.ts +8 -4
- package/templates/apps/api-collab/mutations/documents.create.mutation.ts +8 -0
- package/templates/apps/api-collab/mutations/documents.setBody.mutation.ts +13 -0
- package/templates/apps/api-collab/package.json +9 -8
- package/templates/apps/api-collab/queries/documents.query.ts +19 -7
- package/templates/apps/api-data-advanced/package.json +9 -8
- package/templates/apps/api-data-advanced/queries/authors.withBooks.query.ts +12 -0
- package/templates/apps/api-data-advanced/queries/books.search.query.ts +9 -0
- package/templates/apps/api-durable/mutations/orders.approve.mutation.ts +17 -0
- package/templates/apps/api-durable/mutations/orders.place.mutation.ts +9 -0
- package/templates/apps/api-durable/package.json +9 -8
- package/templates/apps/api-feature-flags/actions/notes.export.action.ts +16 -0
- package/templates/apps/api-feature-flags/mutations/notes.create.mutation.ts +12 -0
- package/templates/apps/api-feature-flags/package.json +10 -9
- package/templates/apps/api-governance/README.md +30 -8
- package/templates/apps/api-governance/actions/profiles.get.action.server.ts +17 -1
- package/templates/apps/api-governance/actions/profiles.get.action.ts +29 -4
- package/templates/apps/api-governance/database/schema.ts +16 -4
- package/templates/apps/api-governance/mutations/profiles.create.mutation.ts +12 -0
- package/templates/apps/api-governance/package.json +9 -8
- package/templates/apps/api-kv/actions/sync.pull.action.ts +15 -0
- package/templates/apps/api-kv/actions/sync.reset.action.ts +13 -0
- package/templates/apps/api-kv/actions/sync.status.action.ts +7 -0
- package/templates/apps/api-kv/package.json +9 -8
- package/templates/apps/api-kv/queries/events.list.query.ts +19 -8
- package/templates/apps/api-moderation/mutations/comments.create.mutation.ts +11 -0
- package/templates/apps/api-moderation/mutations/posts.create.mutation.ts +13 -0
- package/templates/apps/api-moderation/package.json +9 -8
- package/templates/apps/api-observability/mutations/notes.create.mutation.ts +8 -0
- package/templates/apps/api-observability/package.json +9 -8
- package/templates/apps/api-observability/queries/notes.list.query.ts +13 -0
- package/templates/apps/api-ratelimit/mutations/notes.create.mutation.ts +14 -0
- package/templates/apps/api-ratelimit/package.json +9 -8
- package/templates/apps/api-rbac/package.json +9 -8
- package/templates/apps/api-rest/package.json +8 -7
- package/templates/apps/api-saas/mutations/projects.create.mutation.ts +13 -0
- package/templates/apps/api-saas/package.json +12 -11
- package/templates/apps/api-saas/queries/projects.list.query.ts +11 -0
- package/templates/apps/api-saas-starter/actions/me.action.ts +13 -0
- package/templates/apps/api-saas-starter/app.config.ts +19 -0
- package/templates/apps/api-saas-starter/authz.ts +75 -0
- package/templates/apps/api-saas-starter/mutations/invites.create.mutation.ts +10 -0
- package/templates/apps/api-saas-starter/mutations/projects.create.mutation.ts +9 -0
- package/templates/apps/api-saas-starter/package.json +15 -11
- package/templates/apps/api-saas-starter/queries/invites.list.query.ts +19 -8
- package/templates/apps/api-saas-starter/queries/projects.list.query.ts +18 -7
- package/templates/apps/api-saas-starter/tests/accessDecisions.test.ts +135 -0
- package/templates/apps/api-search/mutations/articles.create.mutation.ts +14 -0
- package/templates/apps/api-search/package.json +9 -8
- package/templates/apps/api-search/queries/articles.list.query.ts +21 -8
- package/templates/apps/api-status/README.md +10 -3
- package/templates/apps/api-status/app.config.ts +8 -3
- package/templates/apps/api-status/authz.ts +5 -3
- package/templates/apps/api-status/package.json +9 -8
- package/templates/apps/api-status/queries/components.list.query.ts +14 -6
- package/templates/apps/api-status/queries/incidents.live.query.ts +23 -10
- package/templates/apps/api-status/queries/updates.list.query.ts +16 -9
- package/templates/apps/api-status/tests/status.test.ts +9 -1
- package/templates/apps/api-versioning/actions/documents.asOf.action.ts +12 -0
- package/templates/apps/api-versioning/actions/documents.history.action.ts +13 -0
- package/templates/apps/api-versioning/mutations/documents.create.mutation.ts +9 -0
- package/templates/apps/api-versioning/mutations/documents.update.mutation.ts +12 -0
- package/templates/apps/api-versioning/package.json +9 -8
- package/templates/apps/api-webhooks/mutations/orders.fulfill.mutation.ts +16 -0
- package/templates/apps/api-webhooks/package.json +10 -9
- package/templates/apps/api-webhooks/queries/orders.list.query.ts +10 -0
- package/templates/apps/changelog/package.json +8 -6
- package/templates/apps/edge-functions/package.json +2 -2
- package/templates/apps/frontend-admin/package.json +10 -8
- package/templates/apps/frontend-admin/src/lib/admin.ts +20 -9
- package/templates/apps/frontend-admin/src/locales/de.ts +11 -1
- package/templates/apps/frontend-admin/src/locales/en.ts +13 -1
- package/templates/apps/frontend-admin/src/pages/admin/[entity]/page.tsx +65 -22
- package/templates/apps/frontend-admin/src/pages/admin/entity.test.tsx +130 -23
- package/templates/apps/frontend-admin/src/pages/admin/layout.tsx +3 -2
- package/templates/apps/frontend-admin/src/pages/admin/page.test.tsx +19 -2
- package/templates/apps/frontend-admin/src/pages/admin/page.tsx +9 -4
- package/templates/apps/frontend-app/app.config.ts +4 -3
- package/templates/apps/frontend-app/package.json +11 -8
- package/templates/apps/frontend-app/src/lib/api.ts +25 -0
- package/templates/apps/frontend-app/src/pages/page.test.tsx +130 -82
- package/templates/apps/frontend-app/src/pages/page.tsx +14 -18
- package/templates/apps/frontend-auth/package.json +10 -8
- package/templates/apps/frontend-blank/package.json +9 -7
- package/templates/apps/frontend-cms/package.json +11 -9
- package/templates/apps/frontend-collab/package.json +12 -9
- package/templates/apps/frontend-collab/src/pages/page.test.tsx +122 -78
- package/templates/apps/frontend-contact/package.json +9 -7
- package/templates/apps/frontend-dashboard/package.json +9 -7
- package/templates/apps/frontend-docs/package.json +9 -7
- package/templates/apps/frontend-i18n/package.json +8 -6
- package/templates/apps/frontend-landing/package.json +9 -7
- package/templates/apps/frontend-portal/package.json +10 -8
- package/templates/apps/frontend-saas/app.config.ts +10 -6
- package/templates/apps/frontend-saas/package.json +10 -8
- package/templates/apps/frontend-saas/src/lib/api.ts +27 -32
- package/templates/apps/frontend-saas/src/pages/dashboard/billing/page.tsx +7 -8
- package/templates/apps/frontend-saas/src/pages/dashboard/page.test.tsx +27 -3
- package/templates/apps/frontend-saas/src/pages/dashboard/page.tsx +4 -4
- package/templates/apps/frontend-saas/src/pages/dashboard/team/page.tsx +3 -4
- package/templates/apps/frontend-spa/package.json +9 -7
- package/templates/apps/frontend-ssr/package.json +9 -7
- package/templates/apps/frontend-ssr-api/package.json +10 -8
- package/templates/apps/frontend-static-blog/package.json +8 -6
- package/templates/apps/frontend-status/package.json +10 -8
- package/templates/apps/mobile-app/README.md +1 -0
- package/templates/apps/mobile-app/package.json +4 -2
- package/templates/apps/mobile-app/src/app/index.tsx +22 -12
- package/templates/apps/mobile-app/src/app/orders/[id].tsx +1 -1
- package/templates/apps/mobile-app/src/lib/api.ts +34 -0
- package/templates/apps/mobile-app/voltro.mobile.ts +4 -2
- package/templates/baselines/bare/.env.example +14 -0
- package/templates/baselines/bare/baseline.json +4 -4
- package/templates/baselines/compose/.env.example +14 -0
- package/templates/baselines/compose/README.md +1 -1
- package/templates/baselines/compose/baseline.json +5 -5
- package/templates/baselines/compose-mariadb/.env.example +14 -0
- package/templates/baselines/compose-mariadb/README.md +1 -1
- package/templates/baselines/compose-mariadb/baseline.json +5 -5
- package/templates/baselines/helm/.env.example +14 -0
- package/templates/baselines/helm/baseline.json +4 -4
- package/dist/apiBuild-C-x9YacA.js +0 -2
- package/dist/checkCommand-DRovTKza.js +0 -2
- package/dist/commands-CJfepbm4.js +0 -11541
- package/dist/dbCommand-b1gum4td.js +0 -2
- package/dist/dev-iiMtlkfs.js +0 -3
- package/dist/devActivity-BhIu6ncs.js +0 -159
- package/dist/frameworkTableAssembly-D-EebUQX.js +0 -2
- package/dist/inspect-mmBuRXmy.js +0 -2
- package/dist/manifestBuild-Dj8Jjoto.js +0 -2
- package/dist/seedRunner-Bqxgp7HZ.js +0 -230
- package/dist/serveCommand-DdaM4Hup.js +0 -1608
- package/dist/start-C0koT0UO.js +0 -1084
- /package/templates/apps/api-ai/actions/{summarize.action.server.tsx → summarize.action.server.ts} +0 -0
|
@@ -0,0 +1,608 @@
|
|
|
1
|
+
import { n as e } from "./cliOutput-D1tSBoRM.js";
|
|
2
|
+
import { n as t, o as n, r, t as i } from "./inspectFetch-Cm8_wVvp.js";
|
|
3
|
+
import { ansi as a } from "@voltro/logger";
|
|
4
|
+
//#region src/workflowsCmd.ts
|
|
5
|
+
var o = [
|
|
6
|
+
"retry",
|
|
7
|
+
"cancel",
|
|
8
|
+
"suspend",
|
|
9
|
+
"resume",
|
|
10
|
+
"discard",
|
|
11
|
+
"redrive"
|
|
12
|
+
], s = () => {
|
|
13
|
+
console.log("voltro workflows — inspect + operate workflow runs on every running api"), console.log(""), console.log("Usage:"), console.log(" voltro workflows list [--status S | --statuses a,b | --dead-letter] [--tag T] [--q TEXT] [--source S] [--id-prefix P] [--since ISO] [--until ISO] [--tail N] [--process NAME] [--format pretty|json]"), console.log(" voltro workflows stats [--tag T] [--hours N] [--process NAME] [--format pretty|json]"), console.log(" voltro workflows start <workflowName> [--payload <json>] [--process NAME] [--format pretty|json]"), console.log(" voltro workflows show <runId> [--process NAME] [--format pretty|json]"), console.log(" voltro workflows retry|cancel|suspend|resume|discard|redrive <runId> [--process NAME] [--format pretty|json]"), console.log(" voltro workflows signal <runId> --name <signalName> [--payload <json>] [--process NAME]"), console.log(" voltro workflows update <runId> --name <updateName> [--payload <json>] [--timeout-ms N] [--process NAME]"), console.log(" voltro workflows resume-from-step <runId> <stepName> [--process NAME] [--format pretty|json]"), console.log(" voltro workflows children <parentExecutionId> [--process NAME] [--format pretty|json]"), console.log(" voltro workflows flow [--workflow NAME] [--limit N] [--process NAME] [--format pretty|json]"), console.log(" voltro workflows pause|unpause <workflowName> [--reason TEXT] [--process NAME]"), console.log(" voltro workflows cancel-many --reason TEXT [--workflow N] [--status S] [--started-before ISO] [--limit N] [--commit]"), console.log(" voltro workflows replay-many --mode redrive|retry [--workflow N] [--status S] [--limit N] [--commit]"), console.log(" voltro workflows inferences [--limit N] [--process NAME] [--format pretty|json]"), console.log(""), console.log("Examples:"), console.log(" voltro workflows list --status running --tail 50"), console.log(" voltro workflows list --statuses failed,cancelled --q orders --since 2026-08-01T00:00:00Z"), console.log(" voltro workflows list --id-prefix wfrun_01K # paste either kind of id from a log line"), console.log(" voltro workflows stats --hours 24 # the dashboard chart, in the terminal"), console.log(" voltro workflows list --dead-letter # failed runs not yet discarded"), console.log(" voltro workflows discard wf_01H... # acknowledge a failed run"), console.log(" voltro workflows redrive wf_01H... # re-drive a failed run from where it died"), console.log(" voltro workflows resume-from-step wf_01H... charge-card # rewind to a step and re-run from there"), console.log(" voltro workflows start notes.summarise --payload '{\"noteId\":\"n_1\"}'"), console.log(" voltro workflows show wf_01H..."), console.log(" voltro workflows signal wf_01H... --name approve --payload '{\"by\":\"alice\"}'"), console.log(" voltro workflows update wf_01H... --name approve --payload '{\"decision\":true}'"), console.log(" voltro workflows flow # what is queued, what was admitted or dropped, and why"), console.log(" voltro workflows pause tourNarration --reason \"deploying a fix\" # starts COLLECT; nothing is discarded"), console.log(" voltro workflows unpause tourNarration # drains the backlog"), console.log(" voltro workflows cancel-many --workflow tourNarration --reason \"bad deploy\" # DRY RUN — shows what would stop"), console.log(" voltro workflows cancel-many --workflow tourNarration --reason \"bad deploy\" --commit"), console.log(" voltro workflows replay-many --status failed --mode redrive --limit 200 --commit"), console.log(" voltro workflows inferences # offloaded model calls in flight, and the dispatcher");
|
|
14
|
+
}, c, l = async (e) => {
|
|
15
|
+
let t = await n(e, c);
|
|
16
|
+
return t.length === 0 ? (console.error(e === void 0 ? "voltro workflows: no live api processes found (start one with `voltro dev`)" : `voltro workflows: no live api named '${e}'`), 1) : t;
|
|
17
|
+
}, u = (t, n) => (e(t, { pretty: !1 }), n), d = async (e, t, n, r) => {
|
|
18
|
+
let o = {};
|
|
19
|
+
for (let e = 0; e < t.length; e++) {
|
|
20
|
+
let n = t[e];
|
|
21
|
+
if (n === "--payload") {
|
|
22
|
+
let n = t[++e];
|
|
23
|
+
if (n === void 0) return console.error("voltro workflows start: --payload expects a JSON value"), 2;
|
|
24
|
+
try {
|
|
25
|
+
o = JSON.parse(n);
|
|
26
|
+
} catch {
|
|
27
|
+
return console.error(`voltro workflows start: --payload invalid JSON '${n}'`), 2;
|
|
28
|
+
}
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
return console.error(`voltro workflows start: unknown flag '${n}'`), 2;
|
|
32
|
+
}
|
|
33
|
+
let s = await l(n);
|
|
34
|
+
if (typeof s == "number") return s;
|
|
35
|
+
let c = `/_voltro/inspect/workflows/start/${encodeURIComponent(e)}`, d = await Promise.all(s.map((e) => i(e, c, {
|
|
36
|
+
method: "POST",
|
|
37
|
+
body: { payload: o }
|
|
38
|
+
}))), f = d.find((e) => e.kind === "ok");
|
|
39
|
+
if (r === "json") return f === void 0 ? u({
|
|
40
|
+
workflowName: e,
|
|
41
|
+
error: "no api accepted the start",
|
|
42
|
+
fetchErrors: d.map((e) => e.kind === "err" ? {
|
|
43
|
+
name: e.name,
|
|
44
|
+
error: e.error
|
|
45
|
+
} : {
|
|
46
|
+
name: e.name,
|
|
47
|
+
error: ""
|
|
48
|
+
})
|
|
49
|
+
}, 1) : u({
|
|
50
|
+
workflowName: e,
|
|
51
|
+
process: f.name,
|
|
52
|
+
run: f.data
|
|
53
|
+
}, 0);
|
|
54
|
+
if (f !== void 0) {
|
|
55
|
+
let t = f.data;
|
|
56
|
+
return console.log(`${a.green("ok")} start ${e} ${String(t.id ?? t.executionId ?? "?")} ${a.dim(`@${f.name}`)}`), 0;
|
|
57
|
+
}
|
|
58
|
+
console.error(`voltro workflows: start ${e} failed on every api`);
|
|
59
|
+
for (let e of d) e.kind === "err" && console.error(a.dim(` # ${e.name}: ${e.error}`));
|
|
60
|
+
return 1;
|
|
61
|
+
}, f = async (e, t, n) => {
|
|
62
|
+
let r, o, s, c, d, f, p, m, h = !1, g = 20, _ = (e, t) => {
|
|
63
|
+
if (t === void 0) return console.error(`voltro workflows list: ${e} expects an ISO instant (e.g. 2026-08-01T00:00:00Z)`), 2;
|
|
64
|
+
let n = new Date(t);
|
|
65
|
+
return Number.isNaN(n.getTime()) ? (console.error(`voltro workflows list: ${e} could not parse '${t}' as an instant`), 2) : n.toISOString();
|
|
66
|
+
};
|
|
67
|
+
for (let t = 0; t < e.length; t++) {
|
|
68
|
+
let n = e[t];
|
|
69
|
+
if (n === "--status") {
|
|
70
|
+
r = e[++t];
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (n === "--statuses") {
|
|
74
|
+
o = e[++t];
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (n === "--tag") {
|
|
78
|
+
s = e[++t];
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (n === "--q") {
|
|
82
|
+
c = e[++t];
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (n === "--source") {
|
|
86
|
+
d = e[++t];
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (n === "--id-prefix") {
|
|
90
|
+
f = e[++t];
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (n === "--since") {
|
|
94
|
+
let n = _("--since", e[++t]);
|
|
95
|
+
if (typeof n == "number") return n;
|
|
96
|
+
p = n;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (n === "--until") {
|
|
100
|
+
let n = _("--until", e[++t]);
|
|
101
|
+
if (typeof n == "number") return n;
|
|
102
|
+
m = n;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (n === "--dead-letter" || n === "--failed") {
|
|
106
|
+
h = !0;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (n === "--tail") {
|
|
110
|
+
let n = e[++t], r = n === void 0 ? NaN : Number(n);
|
|
111
|
+
if (!Number.isFinite(r) || r <= 0) return console.error(`voltro workflows list: --tail expects a positive number, got '${n ?? ""}'`), 2;
|
|
112
|
+
g = Math.floor(r);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
return console.error(`voltro workflows list: unknown flag '${n}'`), 2;
|
|
116
|
+
}
|
|
117
|
+
let v = await l(t);
|
|
118
|
+
if (typeof v == "number") return v;
|
|
119
|
+
let y = new URLSearchParams();
|
|
120
|
+
h ? y.set("deadLettered", "1") : r === void 0 ? o !== void 0 && y.set("statuses", o) : y.set("status", r), s !== void 0 && y.set("tag", s), c !== void 0 && y.set("q", c), d !== void 0 && y.set("source", d), f !== void 0 && y.set("idPrefix", f), p !== void 0 && y.set("from", p), m !== void 0 && y.set("to", m), y.set("limit", String(g));
|
|
121
|
+
let b = `/_voltro/inspect/workflows/runs?${y.toString()}`, x = await Promise.all(v.map((e) => i(e, b))), S = [], C = [];
|
|
122
|
+
for (let e of x) if (e.kind === "ok") {
|
|
123
|
+
let t = e.data?.runs;
|
|
124
|
+
Array.isArray(t) && S.push(...t.map((t) => ({
|
|
125
|
+
...t,
|
|
126
|
+
process: e.name
|
|
127
|
+
})));
|
|
128
|
+
} else C.push({
|
|
129
|
+
name: e.name,
|
|
130
|
+
error: e.error
|
|
131
|
+
});
|
|
132
|
+
let w = S.slice(0, g);
|
|
133
|
+
if (n === "json") return u(C.length > 0 ? {
|
|
134
|
+
runs: w,
|
|
135
|
+
fetchErrors: C
|
|
136
|
+
} : { runs: w }, +!!x.every((e) => e.kind === "err"));
|
|
137
|
+
for (let e of w) {
|
|
138
|
+
let t = String(e.runId ?? e.id ?? "?"), n = String(e.workflowName ?? e.workflow ?? e.tag ?? "?"), r = String(e.status ?? "?"), i = typeof e.source == "string" && e.source.length > 0 ? ` ${a.dim(String(e.source))}` : "", o = r === "failed" || r === "cancelled" ? a.red(r) : r === "completed" ? a.green(r) : r === "running" ? a.cyan(r) : r, s = e.discardedAt == null ? "" : ` ${a.dim("discarded")}`;
|
|
139
|
+
console.log(`${t.padEnd(28).slice(0, 28)} ${o.padEnd(12)} ${n}${i}${s} ${a.dim(`@${e.process}`)}`);
|
|
140
|
+
}
|
|
141
|
+
w.length === 0 && console.error("voltro workflows: no runs matched.");
|
|
142
|
+
for (let e of C) console.error(a.dim(`# fetch failed: ${e.name}: ${e.error}`));
|
|
143
|
+
return +!!x.every((e) => e.kind === "err");
|
|
144
|
+
}, p = async (t, n, r) => {
|
|
145
|
+
let o = await l(n);
|
|
146
|
+
if (typeof o == "number") return o;
|
|
147
|
+
let s = encodeURIComponent(t), c = await Promise.all(o.map(async (e) => {
|
|
148
|
+
let [t, n] = await Promise.all([i(e, `/_voltro/inspect/workflows/runs/${s}/steps`), i(e, `/_voltro/inspect/workflows/runs/${s}/events`)]);
|
|
149
|
+
return {
|
|
150
|
+
name: e.name,
|
|
151
|
+
steps: t,
|
|
152
|
+
events: n
|
|
153
|
+
};
|
|
154
|
+
})), d = c.find((e) => e.steps.kind === "ok" && Array.isArray(e.steps.data.steps) && (e.steps.data.steps?.length ?? 0) > 0 || e.events.kind === "ok" && Array.isArray(e.events.data.events) && (e.events.data.events?.length ?? 0) > 0) ?? c.find((e) => e.steps.kind === "ok" || e.events.kind === "ok");
|
|
155
|
+
if (d === void 0) {
|
|
156
|
+
let e = c.map((e) => ({
|
|
157
|
+
name: e.name,
|
|
158
|
+
error: e.steps.kind === "err" ? e.steps.error : "no data"
|
|
159
|
+
}));
|
|
160
|
+
return r === "json" ? u({
|
|
161
|
+
runId: t,
|
|
162
|
+
steps: [],
|
|
163
|
+
events: [],
|
|
164
|
+
fetchErrors: e
|
|
165
|
+
}, 1) : (console.error(`voltro workflows: no data for run ${t}`), 1);
|
|
166
|
+
}
|
|
167
|
+
let f = d.steps.kind === "ok" ? d.steps.data.steps ?? [] : [], p = d.events.kind === "ok" ? d.events.data.events ?? [] : [];
|
|
168
|
+
return r === "json" ? u({
|
|
169
|
+
runId: t,
|
|
170
|
+
process: d.name,
|
|
171
|
+
steps: f,
|
|
172
|
+
events: p
|
|
173
|
+
}, 0) : (console.log(a.bold(`run ${t} @${d.name}`)), console.log(""), console.log(a.bold("steps:")), e(f), console.log(""), console.log(a.bold("events:")), e(p), 0);
|
|
174
|
+
}, m = async (e, t, n, r) => {
|
|
175
|
+
let a = await l(n);
|
|
176
|
+
if (typeof a == "number") return a;
|
|
177
|
+
let o = `/_voltro/inspect/workflows/runs/${encodeURIComponent(t)}/${e}`;
|
|
178
|
+
return y(e, t, await Promise.all(a.map((e) => i(e, o, {
|
|
179
|
+
method: "POST",
|
|
180
|
+
body: {}
|
|
181
|
+
}))), r);
|
|
182
|
+
}, h = async (e, t, n, r) => {
|
|
183
|
+
let a, o;
|
|
184
|
+
for (let e = 0; e < t.length; e++) {
|
|
185
|
+
let n = t[e];
|
|
186
|
+
if (n === "--name" || n === "--signal") {
|
|
187
|
+
a = t[++e];
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (n === "--payload") {
|
|
191
|
+
let n = t[++e];
|
|
192
|
+
if (n === void 0) return console.error("voltro workflows signal: --payload expects a JSON value"), 2;
|
|
193
|
+
try {
|
|
194
|
+
o = JSON.parse(n);
|
|
195
|
+
} catch {
|
|
196
|
+
return console.error(`voltro workflows signal: --payload invalid JSON '${n}'`), 2;
|
|
197
|
+
}
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
return console.error(`voltro workflows signal: unknown flag '${n}'`), 2;
|
|
201
|
+
}
|
|
202
|
+
if (a === void 0 || a.length === 0) return console.error("voltro workflows signal: --name <signalName> is required"), 2;
|
|
203
|
+
let s = await l(n);
|
|
204
|
+
if (typeof s == "number") return s;
|
|
205
|
+
let c = `/_voltro/inspect/workflows/runs/${encodeURIComponent(e)}/signal`;
|
|
206
|
+
return y("signal", e, await Promise.all(s.map((e) => i(e, c, {
|
|
207
|
+
method: "POST",
|
|
208
|
+
body: {
|
|
209
|
+
signalName: a,
|
|
210
|
+
payload: o
|
|
211
|
+
}
|
|
212
|
+
}))), r);
|
|
213
|
+
}, g = async (e, t, n, r) => {
|
|
214
|
+
let a, o, s;
|
|
215
|
+
for (let e = 0; e < t.length; e++) {
|
|
216
|
+
let n = t[e];
|
|
217
|
+
if (n === "--name" || n === "--update") {
|
|
218
|
+
a = t[++e];
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (n === "--payload") {
|
|
222
|
+
let n = t[++e];
|
|
223
|
+
if (n === void 0) return console.error("voltro workflows update: --payload expects a JSON value"), 2;
|
|
224
|
+
try {
|
|
225
|
+
o = JSON.parse(n);
|
|
226
|
+
} catch {
|
|
227
|
+
return console.error(`voltro workflows update: --payload invalid JSON '${n}'`), 2;
|
|
228
|
+
}
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
if (n === "--timeout-ms") {
|
|
232
|
+
let n = t[++e], r = n === void 0 ? NaN : Number(n);
|
|
233
|
+
if (!Number.isFinite(r) || r < 0) return console.error("voltro workflows update: --timeout-ms expects a non-negative number"), 2;
|
|
234
|
+
s = r;
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
return console.error(`voltro workflows update: unknown flag '${n}'`), 2;
|
|
238
|
+
}
|
|
239
|
+
if (a === void 0 || a.length === 0) return console.error("voltro workflows update: --name <updateName> is required"), 2;
|
|
240
|
+
let c = await l(n);
|
|
241
|
+
if (typeof c == "number") return c;
|
|
242
|
+
let u = `/_voltro/inspect/workflows/runs/${encodeURIComponent(e)}/update`, d = {
|
|
243
|
+
updateName: a,
|
|
244
|
+
...o === void 0 ? {} : { payload: o },
|
|
245
|
+
...s === void 0 ? {} : { timeoutMs: s }
|
|
246
|
+
};
|
|
247
|
+
return y("update", e, await Promise.all(c.map((e) => i(e, u, {
|
|
248
|
+
method: "POST",
|
|
249
|
+
body: d
|
|
250
|
+
}))), r);
|
|
251
|
+
}, _ = async (e, t, n, r) => {
|
|
252
|
+
let a;
|
|
253
|
+
for (let e = 0; e < t.length; e++) {
|
|
254
|
+
let n = t[e];
|
|
255
|
+
if (n === "--step") {
|
|
256
|
+
a = t[++e];
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
if (!n.startsWith("--") && a === void 0) {
|
|
260
|
+
a = n;
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
return console.error(`voltro workflows resume-from-step: unexpected argument '${n}'`), 2;
|
|
264
|
+
}
|
|
265
|
+
if (a === void 0 || a.length === 0) return console.error("voltro workflows resume-from-step: <stepName> is required (the step to rewind to)"), 2;
|
|
266
|
+
let o = await l(n);
|
|
267
|
+
if (typeof o == "number") return o;
|
|
268
|
+
let s = `/_voltro/inspect/workflows/runs/${encodeURIComponent(e)}/resume-from-step`;
|
|
269
|
+
return y("resume-from-step", e, await Promise.all(o.map((e) => i(e, s, {
|
|
270
|
+
method: "POST",
|
|
271
|
+
body: { step: a }
|
|
272
|
+
}))), r);
|
|
273
|
+
}, v = async (t, n, r) => {
|
|
274
|
+
let o = await l(n);
|
|
275
|
+
if (typeof o == "number") return o;
|
|
276
|
+
let s = `/_voltro/inspect/workflows/children?parentExecutionId=${encodeURIComponent(t)}`, c = await Promise.all(o.map((e) => i(e, s))), d = [], f = [];
|
|
277
|
+
for (let e of c) if (e.kind === "ok") {
|
|
278
|
+
let t = e.data?.children;
|
|
279
|
+
Array.isArray(t) && d.push(...t.map((t) => ({
|
|
280
|
+
...t,
|
|
281
|
+
process: e.name
|
|
282
|
+
})));
|
|
283
|
+
} else f.push({
|
|
284
|
+
name: e.name,
|
|
285
|
+
error: e.error
|
|
286
|
+
});
|
|
287
|
+
if (r === "json") return u(f.length > 0 ? {
|
|
288
|
+
children: d,
|
|
289
|
+
fetchErrors: f
|
|
290
|
+
} : { children: d }, +!!c.every((e) => e.kind === "err"));
|
|
291
|
+
e(d);
|
|
292
|
+
for (let e of f) console.error(a.dim(`# fetch failed: ${e.name}: ${e.error}`));
|
|
293
|
+
return +!!c.every((e) => e.kind === "err");
|
|
294
|
+
}, y = (e, t, n, r) => {
|
|
295
|
+
let i = n.find((e) => e.kind === "ok");
|
|
296
|
+
if (r === "json") return i === void 0 ? u({
|
|
297
|
+
action: e,
|
|
298
|
+
runId: t,
|
|
299
|
+
error: "no api accepted the action",
|
|
300
|
+
fetchErrors: n.map((e) => e.kind === "err" ? {
|
|
301
|
+
name: e.name,
|
|
302
|
+
error: e.error
|
|
303
|
+
} : {
|
|
304
|
+
name: e.name,
|
|
305
|
+
error: ""
|
|
306
|
+
})
|
|
307
|
+
}, 1) : u({
|
|
308
|
+
action: e,
|
|
309
|
+
runId: t,
|
|
310
|
+
process: i.name,
|
|
311
|
+
result: i.data
|
|
312
|
+
}, 0);
|
|
313
|
+
if (i !== void 0) {
|
|
314
|
+
if (e === "redrive" && i.data !== null && typeof i.data == "object") {
|
|
315
|
+
let e = i.data;
|
|
316
|
+
return e.redriven === !1 ? (console.error(`${a.yellow("skipped")} redrive ${t} @${i.name} — ${e.reason ?? "not re-drivable"}`), 1) : (console.log(`${a.green("ok")} redrive ${t} @${i.name} ` + a.dim(`(reset ${e.activitiesReset ?? 0} failed step(s); completed steps replay)`)), 0);
|
|
317
|
+
}
|
|
318
|
+
if (e === "resume-from-step" && i.data !== null && typeof i.data == "object") {
|
|
319
|
+
let e = i.data;
|
|
320
|
+
return e.redriven === !1 ? (console.error(`${a.yellow("skipped")} resume-from-step ${t} @${i.name} — ${e.reason ?? "not re-drivable"}`), 1) : (console.log(`${a.green("ok")} resume-from-step ${t} → '${e.stepName ?? "?"}' @${i.name} ` + a.dim(`(reset ${e.activitiesReset ?? 0} step(s) from '${e.stepName ?? "?"}'; earlier steps replay)`)), 0);
|
|
321
|
+
}
|
|
322
|
+
return console.log(`${a.green("ok")} ${e} ${t} @${i.name}`), 0;
|
|
323
|
+
}
|
|
324
|
+
console.error(`voltro workflows: ${e} ${t} failed on every api`);
|
|
325
|
+
for (let e of n) e.kind === "err" && console.error(a.dim(` # ${e.name}: ${e.error}`));
|
|
326
|
+
return 1;
|
|
327
|
+
}, b = async (e) => {
|
|
328
|
+
let [n, ...i] = e;
|
|
329
|
+
if (n === void 0 || n === "--help" || n === "-h" || n === "help") return s(), 0;
|
|
330
|
+
let a = t(i);
|
|
331
|
+
if ("error" in a) return console.error(`voltro workflows: ${a.error}`), 2;
|
|
332
|
+
let { process: l, target: u, rest: y } = r(a.rest);
|
|
333
|
+
c = u;
|
|
334
|
+
let b = a.format;
|
|
335
|
+
if (n === "list") return f(y, l, b);
|
|
336
|
+
if (n === "stats") return w(y, l, b);
|
|
337
|
+
if (n === "flow") return T(y, l, b);
|
|
338
|
+
if (n === "inferences") return O(y, l, b);
|
|
339
|
+
if (n === "pause" || n === "unpause") {
|
|
340
|
+
let e = y[0];
|
|
341
|
+
return e === void 0 ? (console.error(`voltro workflows ${n}: <workflowName> is required`), 2) : E(n === "pause" ? "pause" : "resume", e, y.slice(1), l, b);
|
|
342
|
+
}
|
|
343
|
+
if (n === "cancel-many" || n === "replay-many") return D(n === "cancel-many" ? "cancel" : "replay", y, l, b);
|
|
344
|
+
if (n === "start") {
|
|
345
|
+
let e = y[0];
|
|
346
|
+
return e === void 0 ? (console.error("voltro workflows start: <workflowName> is required"), 2) : d(e, y.slice(1), l, b);
|
|
347
|
+
}
|
|
348
|
+
if (n === "show") {
|
|
349
|
+
let e = y[0];
|
|
350
|
+
return e === void 0 ? (console.error("voltro workflows show: <runId> is required"), 2) : p(e, l, b);
|
|
351
|
+
}
|
|
352
|
+
if (n === "children") {
|
|
353
|
+
let e = y[0];
|
|
354
|
+
return e === void 0 ? (console.error("voltro workflows children: <parentExecutionId> is required"), 2) : v(e, l, b);
|
|
355
|
+
}
|
|
356
|
+
if (n === "signal") {
|
|
357
|
+
let e = y[0];
|
|
358
|
+
return e === void 0 ? (console.error("voltro workflows signal: <runId> is required"), 2) : h(e, y.slice(1), l, b);
|
|
359
|
+
}
|
|
360
|
+
if (n === "update") {
|
|
361
|
+
let e = y[0];
|
|
362
|
+
return e === void 0 ? (console.error("voltro workflows update: <runId> is required"), 2) : g(e, y.slice(1), l, b);
|
|
363
|
+
}
|
|
364
|
+
if (n === "resume-from-step") {
|
|
365
|
+
let e = y[0];
|
|
366
|
+
return e === void 0 ? (console.error("voltro workflows resume-from-step: <runId> is required"), 2) : _(e, y.slice(1), l, b);
|
|
367
|
+
}
|
|
368
|
+
if (o.includes(n)) {
|
|
369
|
+
let e = y[0];
|
|
370
|
+
return e === void 0 ? (console.error(`voltro workflows ${n}: <runId> is required`), 2) : m(n, e, l, b);
|
|
371
|
+
}
|
|
372
|
+
return console.error(`voltro workflows: unknown subcommand '${n}'`), s(), 2;
|
|
373
|
+
}, x = (e) => {
|
|
374
|
+
let t = e.split("\0");
|
|
375
|
+
return t.length === 3 && t[0] === "pool" ? t[2] === "" ? `pool:${t[1]}` : `pool:${t[1]}/${t[2]}` : e;
|
|
376
|
+
}, S = [
|
|
377
|
+
"·",
|
|
378
|
+
"▁",
|
|
379
|
+
"▂",
|
|
380
|
+
"▃",
|
|
381
|
+
"▄",
|
|
382
|
+
"▅",
|
|
383
|
+
"▆",
|
|
384
|
+
"▇",
|
|
385
|
+
"█"
|
|
386
|
+
], C = (e) => {
|
|
387
|
+
let t = e.reduce((e, t) => Math.max(e, t), 0);
|
|
388
|
+
return t === 0 ? S[0].repeat(e.length) : e.map((e) => e === 0 ? S[0] : S[Math.max(1, Math.ceil(e / t * 8))]).join("");
|
|
389
|
+
}, w = async (e, t, n) => {
|
|
390
|
+
let r, o;
|
|
391
|
+
for (let t = 0; t < e.length; t++) {
|
|
392
|
+
let n = e[t];
|
|
393
|
+
if (n === "--tag" || n === "--workflow") {
|
|
394
|
+
r = e[++t];
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
if (n === "--hours") {
|
|
398
|
+
let n = Number(e[++t]);
|
|
399
|
+
if (!Number.isFinite(n) || n <= 0) return console.error("voltro workflows stats: --hours expects a positive number"), 2;
|
|
400
|
+
o = Math.floor(n);
|
|
401
|
+
continue;
|
|
402
|
+
}
|
|
403
|
+
return console.error(`voltro workflows stats: unknown flag '${n}'`), 2;
|
|
404
|
+
}
|
|
405
|
+
let s = await l(t);
|
|
406
|
+
if (typeof s == "number") return s;
|
|
407
|
+
let c = new URLSearchParams();
|
|
408
|
+
r !== void 0 && c.set("tag", r), o !== void 0 && c.set("hours", String(o));
|
|
409
|
+
let d = c.toString(), f = await Promise.all(s.map((e) => i(e, `/_voltro/inspect/workflows/stats${d === "" ? "" : `?${d}`}`))), p = f.filter((e) => e.kind === "ok"), m = f.flatMap((e) => e.kind === "err" ? [{
|
|
410
|
+
name: e.name,
|
|
411
|
+
error: e.error
|
|
412
|
+
}] : []);
|
|
413
|
+
if (n === "json") return u({
|
|
414
|
+
stats: p.map((e) => ({
|
|
415
|
+
process: e.name,
|
|
416
|
+
...e.data
|
|
417
|
+
})),
|
|
418
|
+
...m.length > 0 ? { fetchErrors: m } : {}
|
|
419
|
+
}, +!!f.every((e) => e.kind === "err"));
|
|
420
|
+
if (p.length === 0) {
|
|
421
|
+
console.error("voltro workflows stats: no api answered");
|
|
422
|
+
for (let e of m) console.error(a.dim(` # ${e.name}: ${e.error}`));
|
|
423
|
+
return 1;
|
|
424
|
+
}
|
|
425
|
+
for (let e of p) {
|
|
426
|
+
let t = e.data, n = t.buckets ?? [], i = `${a.bold(e.name)} last ${t.windowHours ?? "?"}h · ${t.bucketMinutes ?? "?"}min/bucket · ${t.total ?? 0} started${r === void 0 ? "" : ` ${a.dim(r)}`}`;
|
|
427
|
+
if (console.log(i), t.truncated === !0 && console.log(a.yellow(" ! window exceeded the scan cap — oldest buckets under-count")), n.length === 0 || n.every((e) => e.started === 0)) {
|
|
428
|
+
console.log(a.dim(" no runs in this window"));
|
|
429
|
+
continue;
|
|
430
|
+
}
|
|
431
|
+
console.log(` started ${C(n.map((e) => e.started))}`), console.log(` failed ${C(n.map((e) => e.failed))}`);
|
|
432
|
+
for (let e of (t.byTag ?? []).slice(0, 10)) {
|
|
433
|
+
let t = e.failed > 0 ? a.red(`${e.failed} failed`) : a.dim("0 failed");
|
|
434
|
+
console.log(` ${e.tag.padEnd(32)} ${String(e.started).padStart(6)} started ${a.green(`${e.succeeded} ok`)} ${t}`);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
for (let e of m) console.error(a.dim(` # ${e.name}: ${e.error}`));
|
|
438
|
+
return 0;
|
|
439
|
+
}, T = async (e, t, n) => {
|
|
440
|
+
let r = 50, o;
|
|
441
|
+
for (let t = 0; t < e.length; t++) {
|
|
442
|
+
let n = e[t];
|
|
443
|
+
if (n === "--limit") {
|
|
444
|
+
let n = Number(e[++t]);
|
|
445
|
+
if (!Number.isFinite(n) || n <= 0) return console.error("voltro workflows flow: --limit expects a positive number"), 2;
|
|
446
|
+
r = Math.floor(n);
|
|
447
|
+
continue;
|
|
448
|
+
}
|
|
449
|
+
if (n === "--workflow") {
|
|
450
|
+
o = e[++t];
|
|
451
|
+
continue;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
let s = await l(t);
|
|
455
|
+
if (typeof s == "number") return s;
|
|
456
|
+
let c = await Promise.all(s.map((e) => i(e, `/_voltro/inspect/workflows/flow-control?limit=${r}`))), d = c.filter((e) => e.kind === "ok"), f = c.flatMap((e) => e.kind === "err" ? [{
|
|
457
|
+
name: e.name,
|
|
458
|
+
error: e.error
|
|
459
|
+
}] : []), p = d.map((e) => e.data), m = (e) => o === void 0 ? e : e.filter((e) => e.workflowName === o), h = m(p.flatMap((e) => e.workflows ?? [])), g = m(p.flatMap((e) => e.intents ?? [])), _ = m(p.flatMap((e) => e.admissions ?? [])), v = p.some((e) => e.active === !0);
|
|
460
|
+
if (n === "json") return u({
|
|
461
|
+
workflows: h,
|
|
462
|
+
intents: g,
|
|
463
|
+
admissions: _,
|
|
464
|
+
active: v,
|
|
465
|
+
...f.length > 0 ? { fetchErrors: f } : {}
|
|
466
|
+
}, +!!c.every((e) => e.kind === "err"));
|
|
467
|
+
if (!v) {
|
|
468
|
+
console.log(a.dim("no workflows are registered in this deployment — flow control is not wired"));
|
|
469
|
+
for (let e of f) console.error(a.dim(`# fetch failed: ${e.name}: ${e.error}`));
|
|
470
|
+
return +!!c.every((e) => e.kind === "err");
|
|
471
|
+
}
|
|
472
|
+
console.log(a.bold("workflows")), h.length === 0 && console.log(a.dim(" (none declare a flow control, and none are paused)"));
|
|
473
|
+
for (let e of h) {
|
|
474
|
+
let t = e.paused ? a.yellow("PAUSED") : a.dim("running"), n = e.controls.length === 0 ? a.dim("—") : e.controls.join(" ");
|
|
475
|
+
console.log(` ${e.workflowName.padEnd(28)} ${t} pending=${e.pending} inFlight=${e.inFlight} ${n}`);
|
|
476
|
+
}
|
|
477
|
+
console.log(`\n${a.bold("queued")}`), g.length === 0 && console.log(a.dim(" (nothing waiting)"));
|
|
478
|
+
for (let e of g) {
|
|
479
|
+
let t = `${Math.round(e.pendingAgeMs / 1e3)}s`, n = e.overdue ? a.yellow(" OVERDUE") : "", r = e.attempts > 0 ? a.red(` attempts=${e.attempts}`) : "";
|
|
480
|
+
console.log(` ${e.workflowName}/${x(e.controlKey) || "·"} ${e.mode} collapsed=${e.collapsed} waiting=${t}${n}${r}`), e.lastError !== null && console.log(a.dim(` last error: ${e.lastError}`));
|
|
481
|
+
}
|
|
482
|
+
console.log(`\n${a.bold("recent admissions")}`), _.length === 0 && console.log(a.dim(" (none)"));
|
|
483
|
+
for (let e of _.slice(0, 20)) {
|
|
484
|
+
let t = e.outcome === "admitted" ? a.dim : e.outcome === "dropped" ? a.red : a.yellow, n = e.waitedMs === null ? "" : ` waited=${Math.round(e.waitedMs / 1e3)}s`, r = e.holding ? a.dim(" [holding]") : "";
|
|
485
|
+
console.log(` ${t(e.outcome.padEnd(9))} ${e.workflowName} collapsed=${e.collapsed}${n}${r}`), e.reason !== null && console.log(a.dim(` ${e.reason}`));
|
|
486
|
+
}
|
|
487
|
+
for (let e of f) console.error(a.dim(`# fetch failed: ${e.name}: ${e.error}`));
|
|
488
|
+
return +!!c.every((e) => e.kind === "err");
|
|
489
|
+
}, E = async (e, t, n, r, o) => {
|
|
490
|
+
let s;
|
|
491
|
+
for (let e = 0; e < n.length; e++) n[e] === "--reason" && (s = n[++e]);
|
|
492
|
+
let c = await l(r);
|
|
493
|
+
if (typeof c == "number") return c;
|
|
494
|
+
let d = await Promise.all(c.map((n) => i(n, `/_voltro/inspect/workflows/flow-control/${e}`, {
|
|
495
|
+
method: "POST",
|
|
496
|
+
body: {
|
|
497
|
+
workflow: t,
|
|
498
|
+
...s === void 0 ? {} : { reason: s }
|
|
499
|
+
}
|
|
500
|
+
}))), f = d.filter((e) => e.kind === "ok");
|
|
501
|
+
if (o === "json") return u({
|
|
502
|
+
action: e,
|
|
503
|
+
workflow: t,
|
|
504
|
+
processes: f.map((e) => e.name)
|
|
505
|
+
}, +(f.length === 0));
|
|
506
|
+
if (f.length === 0) {
|
|
507
|
+
console.error(a.red(`no api accepted ${e} for '${t}'`));
|
|
508
|
+
for (let e of d) e.kind === "err" && console.error(a.dim(` ${e.name}: ${e.error}`));
|
|
509
|
+
return 1;
|
|
510
|
+
}
|
|
511
|
+
return console.log(`${a.green("ok")} ${e} ${t} @${f.map((e) => e.name).join(", ")}`), e === "pause" && console.log(a.dim(" starts COLLECT while paused — nothing is discarded. `voltro workflows resume` drains the backlog.")), console.log(a.dim(" other replicas pick this up on their next drain tick (~1s).")), 0;
|
|
512
|
+
}, D = async (e, t, n, r) => {
|
|
513
|
+
let o, s, c, d, f, p, m = 100, h = !1;
|
|
514
|
+
for (let n = 0; n < t.length; n++) {
|
|
515
|
+
let r = t[n];
|
|
516
|
+
if (r === "--workflow") o = t[++n];
|
|
517
|
+
else if (r === "--status") s = t[++n];
|
|
518
|
+
else if (r === "--reason") c = t[++n];
|
|
519
|
+
else if (r === "--mode") d = t[++n];
|
|
520
|
+
else if (r === "--started-after") f = t[++n];
|
|
521
|
+
else if (r === "--started-before") p = t[++n];
|
|
522
|
+
else if (r === "--limit") m = Number(t[++n]);
|
|
523
|
+
else if (r === "--commit") h = !0;
|
|
524
|
+
else if (r !== void 0 && r.startsWith("--")) return console.error(`voltro workflows ${e}-many: unknown flag '${r}'`), 2;
|
|
525
|
+
}
|
|
526
|
+
if (!Number.isInteger(m) || m <= 0) return console.error(`voltro workflows ${e}-many: --limit must be a positive integer`), 2;
|
|
527
|
+
if (e === "cancel" && (c === void 0 || c.trim().length === 0)) return console.error("voltro workflows cancel-many: --reason is required. It is recorded on every affected run, so \"why did these stop\" is answerable from the run's own event log later."), 2;
|
|
528
|
+
if (e === "replay" && d !== "retry" && d !== "redrive") return console.error("voltro workflows replay-many: --mode is required and must be 'redrive' (resume each run from the step it died on, replaying completed steps from the journal) or 'retry' (a fresh execution with an empty journal). They cost very different amounts."), 2;
|
|
529
|
+
let g = await l(n);
|
|
530
|
+
if (typeof g == "number") return g;
|
|
531
|
+
let _ = {
|
|
532
|
+
op: e,
|
|
533
|
+
limit: m,
|
|
534
|
+
dryRun: !h,
|
|
535
|
+
...c === void 0 ? {} : { reason: c },
|
|
536
|
+
...d === void 0 ? {} : { mode: d },
|
|
537
|
+
...o === void 0 ? {} : { workflow: o },
|
|
538
|
+
...s === void 0 ? {} : { status: s },
|
|
539
|
+
...f === void 0 ? {} : { startedAfter: f },
|
|
540
|
+
...p === void 0 ? {} : { startedBefore: p }
|
|
541
|
+
}, v = await Promise.all(g.map((e) => i(e, "/_voltro/inspect/workflows/flow-control/bulk", {
|
|
542
|
+
method: "POST",
|
|
543
|
+
body: _
|
|
544
|
+
}))), y = v.filter((e) => e.kind === "ok");
|
|
545
|
+
if (r === "json") return u({
|
|
546
|
+
op: e,
|
|
547
|
+
dryRun: !h,
|
|
548
|
+
processes: y.map((e) => ({
|
|
549
|
+
name: e.name,
|
|
550
|
+
result: e.data
|
|
551
|
+
}))
|
|
552
|
+
}, +(y.length === 0));
|
|
553
|
+
if (y.length === 0) {
|
|
554
|
+
console.error(a.red(`no api accepted the bulk ${e}`));
|
|
555
|
+
for (let e of v) e.kind === "err" && console.error(a.dim(` ${e.name}: ${e.error}`));
|
|
556
|
+
return 1;
|
|
557
|
+
}
|
|
558
|
+
for (let t of y) {
|
|
559
|
+
let n = t.data, r = h ? a.green("applied") : a.dim("DRY RUN");
|
|
560
|
+
if (console.log(`${r} ${e}${d === void 0 ? "" : `:${d}`} @${t.name}`), console.log(` matched=${n.matched ?? 0} eligible=${n.eligible?.length ?? 0} skipped=${n.skipped?.length ?? 0}`), h) {
|
|
561
|
+
console.log(` succeeded=${n.succeeded?.length ?? 0} failed=${n.failed?.length ?? 0}`);
|
|
562
|
+
for (let e of (n.failed ?? []).slice(0, 10)) console.log(a.red(` ${e.runId}: ${e.reason}`));
|
|
563
|
+
}
|
|
564
|
+
n.truncated === !0 && console.log(a.yellow(` more matched than the --limit of ${m} — run it again for the rest`));
|
|
565
|
+
let i = n.skipped?.[0];
|
|
566
|
+
i !== void 0 && console.log(a.dim(` skipped (${i.status}): ${i.why}`));
|
|
567
|
+
}
|
|
568
|
+
h || console.log(a.dim(" nothing was changed — re-run with --commit to apply"));
|
|
569
|
+
for (let e of v) e.kind === "err" && console.error(a.dim(`# fetch failed: ${e.name}: ${e.error}`));
|
|
570
|
+
return 0;
|
|
571
|
+
}, O = async (e, t, n) => {
|
|
572
|
+
let r = 100;
|
|
573
|
+
for (let t = 0; t < e.length; t++) if (e[t] === "--limit") r = Number(e[++t]);
|
|
574
|
+
else if (e[t]?.startsWith("--")) return console.error(`voltro workflows inferences: unknown flag '${e[t]}'`), 2;
|
|
575
|
+
let o = await l(t);
|
|
576
|
+
if (typeof o == "number") return o;
|
|
577
|
+
let s = await Promise.all(o.map((e) => i(e, `/_voltro/inspect/workflows/flow-control/inferences?limit=${r}`))), c = s.filter((e) => e.kind === "ok");
|
|
578
|
+
if (n === "json") return u({ processes: c.map((e) => ({
|
|
579
|
+
name: e.name,
|
|
580
|
+
data: e.data
|
|
581
|
+
})) }, +(c.length === 0));
|
|
582
|
+
if (c.length === 0) {
|
|
583
|
+
console.error(a.red("no api answered the inference-queue read"));
|
|
584
|
+
for (let e of s) e.kind === "err" && console.error(a.dim(` ${e.name}: ${e.error}`));
|
|
585
|
+
return 1;
|
|
586
|
+
}
|
|
587
|
+
for (let e of c) {
|
|
588
|
+
let t = e.data;
|
|
589
|
+
if (console.log(a.dim(`# ${e.name}`)), t.active === !1) {
|
|
590
|
+
console.log(a.dim(" this app registers no workflows — nothing can enqueue an offloaded call"));
|
|
591
|
+
continue;
|
|
592
|
+
}
|
|
593
|
+
let n = t.counts ?? {
|
|
594
|
+
pending: 0,
|
|
595
|
+
running: 0,
|
|
596
|
+
failed: 0
|
|
597
|
+
};
|
|
598
|
+
console.log(` queued=${n.pending} in-flight=${n.running} failed=${n.failed}`), t.dispatcher ?? console.log(a.yellow(" no dispatcher has reported yet — a queue that never drains and a dispatcher that is not running look identical from the counts"));
|
|
599
|
+
for (let e of (t.queued ?? []).slice(0, 20)) {
|
|
600
|
+
let t = e.waitingMs < 6e4 ? `${Math.round(e.waitingMs / 1e3)}s` : `${Math.round(e.waitingMs / 6e4)}m`, n = e.leaseExpired ? a.red(" lease-expired") : "", r = e.attempts > 0 ? a.yellow(` attempts=${e.attempts}`) : "";
|
|
601
|
+
console.log(` ${e.status.padEnd(9)} ${e.workflowName}·${e.stepName} ${e.model} waiting=${t}${r}${n}`), e.errorMessage && console.log(a.dim(` ${e.errorMessage}`));
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
for (let e of s) e.kind === "err" && console.error(a.dim(`# fetch failed: ${e.name}: ${e.error}`));
|
|
605
|
+
return 0;
|
|
606
|
+
};
|
|
607
|
+
//#endregion
|
|
608
|
+
export { b as runWorkflowsCommand };
|