@genne/genne-cli 0.0.0-stage → 0.1.33
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/GR.md +83 -0
- package/README.md +27 -2
- package/package.json +29 -4
- package/skills/genne-cli/SKILL.md +152 -0
- package/src/api.js +1 -0
- package/src/cli.js +7 -0
- package/src/commands/access.js +1 -0
- package/src/commands/companies.js +1 -0
- package/src/commands/content.js +2 -0
- package/src/commands/crm.js +4 -0
- package/src/commands/desktop-integrations.js +1 -0
- package/src/commands/driver-routes.js +1 -0
- package/src/commands/driver.js +1 -0
- package/src/commands/feedback.js +3 -0
- package/src/commands/financial.js +1 -0
- package/src/commands/gr.js +1 -0
- package/src/commands/identity.js +1 -0
- package/src/commands/logistics.js +1 -0
- package/src/commands/notifications.js +2 -0
- package/src/commands/operational-input.js +1 -0
- package/src/commands/operations-config.js +1 -0
- package/src/commands/orders.js +1 -0
- package/src/commands/routes.js +1 -0
- package/src/commands/support.js +2 -0
- package/src/commands/tower.js +1 -0
- package/src/commands/users.js +1 -0
- package/src/core-fetch.js +1 -0
- package/src/device-login.js +1 -0
- package/src/global.js +5 -0
- package/src/help.js +1 -0
- package/src/local-file.js +1 -0
- package/src/mcp-administration.js +1 -0
- package/src/mcp-desktop-operations.js +1 -0
- package/src/mcp-logistics.js +1 -0
- package/src/mcp-operational.js +1 -0
- package/src/mcp-routes-tower.js +1 -0
- package/src/mcp-support-feedback.js +1 -0
- package/src/mcp.js +2 -0
- package/src/operations.js +1 -0
- package/src/private-file.js +1 -0
- package/src/remote-auth-store.js +31 -0
- package/src/remote-auth.js +1 -0
- package/src/remote-core.js +1 -0
- package/src/remote-http.js +1 -0
- package/src/remote-mcp.js +1 -0
- package/src/remote-server.js +2 -0
- package/src/request-scope.js +1 -0
- package/src/session.js +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var f=Object.defineProperty;var a=(e,t)=>f(e,"name",{value:t,configurable:!0});import{appendLocalFile as m}from"../local-file.js";const u=new Set(["personal_document_type","personal_document_number","issuing_country_code","cpf","cnpj","mei_cnpj","personal_document_value","cnh_number","naturalness","cnh_state","cnh_security_code","whatsapp_phone","emergency_whatsapp","emergency_contact_relationship","has_antt","antt_status","ownership_pending","has_vehicle","vehicle_owner_is_driver","vehicle_profile","vehicle_plate_state","vehicle_plate_city","vehicle_fleet_number","vehicle_axle_count","vehicle_bodywork","transportadora_client","client","operation_base","magazine_base","operation_state","operation_city","operation_region","operation_notes","has_mei","no_mei","mei_absence_reason","referral_whatsapp","residential_street","residential_number","residential_complement","residential_neighborhood","residential_city","residential_state","residential_postal_code","training_watched"]),h=new Set(["cnh","crlv","antt","ownership_document","selfie","address_proof"]),y={".pdf":"application/pdf",".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png"},b=12*1024*1024,j=new Set(["cnh","cnpj_mei","vehicle","residential_address","operation_preferences","antt"]),d=["id","status","complete","ready_for_gr","has_vehicle","vehicle_owner_is_driver","has_mei","operation_preferences","training_watched"],w=[...d,"whatsapp_phone","emergency_whatsapp","emergency_contact_relationship","has_antt","antt_status","ownership_pending","vehicle_profile","vehicle_plate_state","vehicle_plate_city","vehicle_fleet_number","vehicle_axle_count","vehicle_bodywork","transportadora_client","operation_base","no_mei","mei_absence_reason","referral_whatsapp","residential_address","completed_at"],v=new Set(["market_code","rail","requirements_version","expected_projection_version","institution_identifier","branch_identifier","routing_number","account_number","account_type","holder_type","holder_name","holder_document_type","holder_document_value","holder_phone","idempotency_key"]),A=["market_code","rail","requirements_version","expected_projection_version","account_number","account_type","holder_name","idempotency_key"],T=["id","purpose","market_code","country_code","currency_code","rail","institution_identifier","account_type","account_last4","holder_type","holder_name","status","projection_version"];function _(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&t.fail("INPUT","A entrada deve ser um objeto JSON",422),e}a(_,"objectInput");async function I(e,t){if(!("documents"in e))return e;const r=_(e.documents,t);Object.keys(r).length===0&&t.fail("INPUT","Informe ao menos um documento",422);const n=new FormData;for(const[i,o]of Object.entries(e))i!=="documents"&&((o===null||!["string","number","boolean"].includes(typeof o))&&t.fail("INPUT",`Valor inv\xE1lido para ${i}`,422),n.append(i,String(o)));for(const[i,o]of Object.entries(r))h.has(i)||t.fail("INPUT",`Documento inv\xE1lido: ${i}`,422),await m(n,i,o,y,b,t);return n}a(I,"profileBody");function E(e){return!e||typeof e!="object"||Array.isArray(e)?e:Object.fromEntries(d.filter(t=>t in e).map(t=>[t,e[t]]))}a(E,"projectDriverProfile");function U(e){if(!e||typeof e!="object"||Array.isArray(e))return e;const t=Object.fromEntries(w.filter(r=>r in e).map(r=>[r,e[r]]));if(Array.isArray(e.validation_blocks)){const r=["block_key","status","user_message","technical_code","expected_action","validated_at"];t.validation_blocks=e.validation_blocks.map(n=>Object.fromEntries(r.filter(i=>i in n).map(i=>[i,n[i]])))}if(Array.isArray(e.documents)){const r=["document_type","status","processing_status","uploaded_at"];t.documents=e.documents.map(n=>Object.fromEntries(r.filter(i=>i in n).map(i=>[i,n[i]])))}return t}a(U,"projectDriverProfileDetails");function l(e){return!e||typeof e!="object"||Array.isArray(e)?e:Object.fromEntries(T.filter(t=>t in e).map(t=>[t,e[t]]))}a(l,"projectPayout");async function g(e,t){if(!Array.isArray(e)||e[0]!=="driver"||!["profile","payout"].includes(e[1]))return null;if(t.requireRole("driver"),e[1]==="payout"){if(e.length===4&&["requirements","accounts"].includes(e[2])){["BR","US"].includes(e[3])||t.fail("USAGE","Mercado deve ser BR ou US",422);const n=e[2]==="requirements"?"payout-requirements":"payout-accounts",i=await t.api("GET",`/driver/${n}?market_code=${e[3]}`);return e[2]==="accounts"&&Array.isArray(i?.data)?{...i,data:i.data.map(l)}:i}if(e.length===3&&e[2]==="primary"){const n=_(await t.input(),t),i=Object.keys(n).find(c=>!v.has(c));i&&t.fail("INPUT",`Campo n\xE3o permitido: ${i}`,422),A.some(c=>n[c]===void 0||n[c]===null||n[c]==="")&&t.fail("INPUT","Informe os campos obrigat\xF3rios e a chave de idempot\xEAncia",422),(!["BR","US"].includes(n.market_code)||!["bank_transfer","ach"].includes(n.rail)||!Number.isInteger(n.expected_projection_version)||n.expected_projection_version<0||typeof n.requirements_version!="string"||typeof n.account_number!="string"||typeof n.account_type!="string"||typeof n.holder_name!="string"||typeof n.idempotency_key!="string"||!/^[A-Za-z0-9._:-]{16,255}$/.test(n.idempotency_key))&&t.fail("INPUT","Mercado, rail, vers\xE3o ou chave de idempot\xEAncia inv\xE1lidos",422);const{idempotency_key:o,...p}=n;await t.confirm(`Substituir a conta de repasse prim\xE1ria em ${p.market_code}?`,p.market_code);const s=await t.api("PUT","/driver/payout-accounts/primary",p,{idempotencyKey:o});return s?.data?{...s,data:l(s.data)}:s}return null}if(e[1]!=="profile")return null;if(e.length===3&&e[2]==="show"){const n=await t.api("GET","/driver/profile");return n?.data?{...n,data:U(n.data)}:n}let r;if(e.length===3&&["draft","complete"].includes(e[2])){const n=_(await t.input(),t),i=Object.keys(n).find(o=>!u.has(o)&&o!=="documents");i&&t.fail("INPUT",`Campo n\xE3o permitido: ${i}`,422),n.training_watched!==void 0&&typeof n.training_watched!="boolean"&&t.fail("INPUT","training_watched deve ser booleano",422),r=await t.api("POST",`/driver/profile/${e[2]}`,await I(n,t))}else if(e.length===4&&e[2]==="revalidate")j.has(e[3])||t.fail("USAGE","Bloco de cadastro inv\xE1lido",422),r=await t.api("POST",`/driver/profile/blocks/${e[3]}/revalidate`);else if(e.length===4&&e[2]==="mei"&&["consult","confirm"].includes(e[3])){const n=_(await t.input(),t);(Object.keys(n).length!==1||typeof n.cnpj!="string"||!/^\d{14}$/.test(n.cnpj))&&t.fail("INPUT","Informe cnpj com 14 d\xEDgitos em stdin",422),r=await t.api("POST",`/driver/profile/mei-cnpj/${e[3]}`,n)}else return null;return!r||typeof r!="object"?r:r.data&&typeof r.data=="object"&&!Array.isArray(r.data)?{...r,data:E(r.data)}:r}a(g,"driverCommand");export{g as driverCommand,E as projectDriverProfile};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var y=Object.defineProperty;var m=(n,i)=>y(n,"name",{value:i,configurable:!0});const _=new Set(["pending","in_progress","prioritized","resolved","canceled","duplicate"]),k=new Set(["votes","recent","oldest"]);function p(n,i,a){const t=new URLSearchParams;for(const e of n){const d=e.indexOf("="),o=e.slice(0,d),r=e.slice(d+1);(d<1||!i.includes(o)||!r||t.has(o))&&a.fail("USAGE",`Filtro n\xE3o suportado: ${e}`,422),o==="status"&&!_.has(r)&&a.fail("INPUT","Status inv\xE1lido",422),o==="order"&&!k.has(r)&&a.fail("INPUT","Ordena\xE7\xE3o inv\xE1lida",422),o==="terminal_intents"&&r!=="pending"&&a.fail("INPUT","Filtro de intent terminal inv\xE1lido",422),o==="user_id"&&a.uuid(r),o==="limit"&&(!/^\d+$/.test(r)||Number(r)<1||Number(r)>100)&&a.fail("INPUT","Limit deve estar entre 1 e 100",422),t.set(o,r)}return t.size?`?${t}`:""}m(p,"query");function E(n,i,a){const t=n?.data;return(!t||typeof t!="object"||Array.isArray(t)||t.id!==i||typeof t.status!="string"||!t.status.trim()||t.title!==void 0&&t.title!==null&&typeof t.title!="string")&&a.fail("RESPONSE","Pr\xE9via de feedback inv\xE1lida"),{id:i,...typeof t.title=="string"&&t.title.trim()?{title:t.title.trim()}:{},status:t.status}}m(E,"feedbackPreview");async function A(n,i){if(n[0]!=="admin"||n[1]!=="feedbacks")return null;if(i.requireRole("admin"),n[2]==="list")return i.api("GET",`/admin/feedbacks${p(n.slice(3),["status","user_id","order","limit","cursor","terminal_intents"],i)}`);if(n[2]==="show"&&n.length===4){const a=i.uuid(n[3]);return i.api("GET",`/admin/feedbacks/${a}`)}if(n[2]==="delete"){n.length!==4&&i.fail("USAGE","Use: genne admin feedbacks delete FEEDBACK_ID",2);const a=i.uuid(n[3]),t=E(await i.api("GET",`/admin/feedbacks/${a}`),a,i);return await i.confirm(`Excluir permanentemente o feedback ${t.id}${t.title?` "${t.title}"`:""}? Estado atual: ${t.status}`,a),i.api("DELETE",`/admin/feedbacks/${a}`,void 0,{withStatus:!0})}if(n[2]==="comments"&&n.length>=4){const a=i.uuid(n[3]),t=n[5];if(["delete","restore"].includes(t)){n.length!==6&&i.fail("USAGE","Use: genne admin feedbacks comments FEEDBACK_ID COMMENT_ID delete|restore",2);const e=i.uuid(n[4]),d=E(await i.api("GET",`/admin/feedbacks/${a}`),a,i);await i.confirm(`${t==="delete"?"Ocultar":"Restaurar"} coment\xE1rio ${e} do feedback ${d.id}? Estado do feedback: ${d.status}`,e);const o=t==="delete"?"DELETE":"PATCH";return i.api(o,`/admin/feedbacks/${a}/comments/${e}${t==="restore"?"/restore":""}`,void 0,{withStatus:!0})}return i.api("GET",`/admin/feedbacks/${a}/comments${p(n.slice(4),["limit","cursor"],i)}`)}if(n[2]==="comment"&&n.length>=4){const a=i.uuid(n[3]),t=n.slice(4);(t.length!==1||!t[0].startsWith("key=")||t[0].length<20||t[0].length>259)&&i.fail("USAGE","Informe key=CHAVE est\xE1vel de 16 a 255 caracteres",2);const e=await i.input();(!e||typeof e!="object"||Array.isArray(e)||Object.keys(e).some(r=>!["content","image_url"].includes(r))||typeof e.content!="string"||!e.content.trim()||e.image_url!==void 0&&(typeof e.image_url!="string"||!e.image_url.trim()))&&i.fail("INPUT","Informe content e, opcionalmente, image_url",422);const d={content:e.content.trim(),...e.image_url?{image_url:e.image_url.trim()}:{}},o=t[0].slice(4);return await i.api("GET",`/admin/feedbacks/${a}`),await i.confirm(`Comentar no feedback?
|
|
2
|
+
${JSON.stringify(d,null,2)}`,a),i.api("POST",`/admin/feedbacks/${a}/comments`,d,{idempotencyKey:o})}if(n[2]==="status"){const a=i.uuid(n[3]),t=n[4];(n.length!==5||!t?.startsWith("key=")||!/^[A-Za-z0-9._:-]{16,255}$/.test(t.slice(4)))&&i.fail("USAGE","Informe key=CHAVE est\xE1vel de 16 a 255 caracteres",2);const e=await i.input(),d=["linear_association","terminal_intent","terminal_observation"].filter(s=>e?.[s]!==void 0);if((!e||typeof e!="object"||Array.isArray(e)||Object.keys(e).some(s=>!["new_status","closing_comment_id","reason","linear_association","terminal_intent","terminal_observation"].includes(s))||!_.has(e.new_status)||e.closing_comment_id!==void 0&&typeof e.closing_comment_id!="string"||e.reason!==void 0&&(typeof e.reason!="string"||!e.reason.trim()||Buffer.byteLength(e.reason)>2e3)||e.linear_association!==void 0&&(!e.linear_association||typeof e.linear_association!="object"||Array.isArray(e.linear_association))||d.length>1||e.terminal_intent!==void 0&&(e.terminal_intent!==!0||!["resolved","canceled"].includes(e.new_status))||e.terminal_observation!==void 0&&(!e.terminal_observation||typeof e.terminal_observation!="object"||Array.isArray(e.terminal_observation)))&&i.fail("INPUT","Payload de status inv\xE1lido",422),e.linear_association!==void 0){const s=e.linear_association,c=Object.keys(s),l=s.linear_issue_id,f=s.no_issue_reason;(c.some(b=>!["linear_issue_id","no_issue_reason"].includes(b))||!(typeof l=="string"&&l.trim()&&Buffer.byteLength(l)<=120&&f===void 0||l===void 0&&f==="human_handled"))&&i.fail("INPUT","Associa\xE7\xE3o Linear inv\xE1lida",422)}if(e.terminal_observation!==void 0){const s=e.terminal_observation,c=Object.keys(s),l=["receipt_id","linear_issue_id","linear_state","linear_observed_at","closing_comment_id"];(c.length!==l.length||c.some(f=>!l.includes(f))||!["Done","Canceled","not_applicable"].includes(s.linear_state)||!(s.linear_issue_id===null||typeof s.linear_issue_id=="string"&&s.linear_issue_id.trim())||typeof s.linear_observed_at!="string"||!Number.isFinite(Date.parse(s.linear_observed_at))||!["resolved","canceled"].includes(e.new_status))&&i.fail("INPUT","Observa\xE7\xE3o terminal inv\xE1lida",422),i.uuid(s.receipt_id),i.uuid(s.closing_comment_id)}const o={new_status:e.new_status,...e.closing_comment_id===void 0?{}:{closing_comment_id:i.uuid(e.closing_comment_id)},...e.reason===void 0?{}:{reason:e.reason},...e.linear_association===void 0?{}:{linear_association:e.linear_association},...e.terminal_intent===void 0?{}:{terminal_intent:!0},...e.terminal_observation===void 0?{}:{terminal_observation:e.terminal_observation}},r=await i.api("GET",`/admin/feedbacks/${a}`);r?.data?.id!==a&&i.fail("RESPONSE","Resposta inv\xE1lida da API"),await i.confirm(`Solicitar status do feedback ${a}?
|
|
3
|
+
${JSON.stringify({atual:r.data.status,pedido:o},null,2)}`,a);const u=await i.api("PATCH",`/admin/feedbacks/${a}/status`,o,{idempotencyKey:t.slice(4),withStatus:!0});return["resolved","canceled"].includes(o.new_status)&&!(u?.http_status===202&&u?.status_receipt?.state==="pending"||u?.http_status===200&&u?.status_receipt?.state==="completed")&&i.fail("RESPONSE","Status HTTP e receipt terminal incompat\xEDveis"),u}if(n[2]==="receipt"&&n.length===5){const a=i.uuid(n[3]),t=i.uuid(n[4]),e=await i.api("GET",`/admin/feedbacks/${a}?status_receipt_id=${t}`);return(e?.status_receipt?.id!==t||!["pending","completed"].includes(e.status_receipt.state))&&i.fail("RESPONSE","Receipt terminal ausente ou inv\xE1lido"),e}i.fail("USAGE","Use: genne admin feedbacks list|show FEEDBACK_ID|delete FEEDBACK_ID|comments FEEDBACK_ID [limit=N] [cursor=X]|comments FEEDBACK_ID COMMENT_ID delete|restore|comment FEEDBACK_ID key=CHAVE|status FEEDBACK_ID key=CHAVE < status.json|receipt FEEDBACK_ID RECEIPT_ID",2)}m(A,"feedbackCommand");export{A as feedbackCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var s=Object.defineProperty;var a=(n,r)=>s(n,"name",{value:r,configurable:!0});import{jsonBody as d,requireRole as f}from"./operational-input.js";const t=["client_id","owner_user_id","origin_id","shipper_account_id","base_id","reference_shipper_id","reference_carrier_id"],_=["origin_name","origin_address","name","period_type","reference_payer_label","currency"],l=["start_day","end_day","invoice_day","payment_day"],u=["active","is_default"],p=[...t,..._,...l,...u,"profile_mode","configuration"];function c(n,r){const e=d(n,p,["profile_mode","configuration"],r);["shipper_owned","carrier_managed","driver_self_managed"].includes(e.profile_mode)||r.fail("INPUT","profile_mode inv\xE1lido",422),(typeof e.configuration!="object"||Array.isArray(e.configuration))&&r.fail("INPUT","configuration deve ser um objeto",422);for(const i of t)e[i]!==void 0&&e[i]!==null&&(typeof e[i]!="string"&&r.fail("INPUT",`${i} deve ser UUID ou null`,422),r.uuid(e[i]));for(const i of _)e[i]!==void 0&&e[i]!==null&&typeof e[i]!="string"&&r.fail("INPUT",`${i} deve ser texto ou null`,422);for(const i of l)e[i]!==void 0&&e[i]!==null&&!Number.isInteger(e[i])&&r.fail("INPUT",`${i} deve ser inteiro ou null`,422);for(const i of u)e[i]!==void 0&&typeof e[i]!="boolean"&&r.fail("INPUT",`${i} deve ser booleano`,422);return e}a(c,"paymentProfile");async function y(n,r){if(n[0]!=="admin"||n[1]!=="financial")return null;if(n.length===4&&n[2]==="payment-profiles"&&n[3]==="create"){f(r,["admin"]);const e=c(await r.input(),r),i=e.base_id??e.origin_id??e.owner_user_id??e.client_id??"payment-profiles";return await r.confirm(`Criar e publicar perfil ${e.profile_mode} no contexto ${i}, carrier ${e.reference_carrier_id??"n\xE3o informado"}? Pode desativar o perfil ativo do mesmo contexto.`,i),r.api("POST","/admin/financial/payment-profiles",e)}if(n.length===5&&n[2]==="carrier-margins"&&n[4]==="upsert"){f(r,["admin"]);const e=r.uuid(n[3]),i=d(await r.input(),["carrier_id","origin_id","margin_percent"],["carrier_id","margin_percent"],r);(typeof i.carrier_id!="string"||i.origin_id!==void 0&&typeof i.origin_id!="string")&&r.fail("INPUT","carrier_id e origin_id devem ser UUIDs",422),r.uuid(i.carrier_id),i.origin_id!==void 0&&r.uuid(i.origin_id).toLowerCase()!==e.toLowerCase()&&r.fail("INPUT","origin_id deve corresponder ao UUID do path",422);const o=i.margin_percent;return!(typeof o=="number"&&Number.isFinite(o))&&!(typeof o=="string"&&/^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?$/.test(o))&&r.fail("INPUT","margin_percent deve ser n\xFAmero ou string decimal",422),await r.confirm(`Substituir a margem ativa do carrier ${i.carrier_id} na origem financeira ${e}?`,e),r.api("PUT",`/admin/financial/carrier-margins/${e}`,{...i,origin_id:e})}return null}a(y,"financialCommand");export{y as financialCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var P=Object.defineProperty;var l=(r,i)=>P(r,"name",{value:i,configurable:!0});import{jsonBody as _,query as v,requireRole as U}from"./operational-input.js";const h=["carrier_account_id","provider_key","status","phase","operation_key","search","limit","cursor"],$=["limit","cursor","provider_account_id","search","document","status","training_pending"],R=["m3risk","angellira"],T=["crawler","api","ftp","browser","api_jwt"],I=["active","paused","disabled"],G=["carrier_account_id","carrier_account_public_id","provider_key","provider_label","mode","status","config","credentials"],S=["provider_label","mode","status","config","credentials"],A=["provider_label","mode","status","config"],N=["operation_key","provider_client_id","provider_client_label","metadata","active"],g=["sex","marital_status"],O=["cnh","crlv","address_proof","antt","ownership_document"];function m(r,i,e,n){r!==void 0&&!i.includes(r)&&n.fail("INPUT",`${e} inv\xE1lido`,422)}l(m,"validateEnum");function y(r,i,e){r[i]!==void 0&&(!r[i]||typeof r[i]!="object"||Array.isArray(r[i]))&&e.fail("INPUT",`${i} deve ser um objeto`,422)}l(y,"validateNested");function D(r,i){y(r,"credentials",i),r.credentials&&Object.entries(r.credentials).some(([,e])=>typeof e!="string")&&i.fail("INPUT","credentials deve conter somente valores de texto",422)}l(D,"validateCredentials");function b(r,i,e,n){const o=_(r,e?G:S,e?["provider_key","provider_label","mode"]:[],n);if(!e&&!Object.keys(o).length&&n.fail("INPUT","Informe ao menos um campo",422),m(o.provider_key,R,"provider_key",n),m(o.mode,T,"mode",n),m(o.status,I,"status",n),y(o,"config",n),D(o,n),!e||i==="carrier")return(o.carrier_account_id||o.carrier_account_public_id)&&n.fail("INPUT","A conta carrier vem da sess\xE3o",422),o;const t=o.carrier_account_public_id??o.carrier_account_id;t||n.fail("INPUT","Informe carrier_account_public_id",422),n.uuid(t),o.carrier_account_id&&o.carrier_account_public_id&&o.carrier_account_id!==o.carrier_account_public_id&&n.fail("INPUT","carrier_account_id e carrier_account_public_id devem coincidir",422);const{carrier_account_id:s,carrier_account_public_id:p,...c}=o;return{...c,carrier_account_public_id:t}}l(b,"providerAccountInput");function q(r,i,e){const n=_(r,N,["operation_key","provider_client_id"],e);return(typeof n.operation_key!="string"||!n.operation_key.trim())&&e.fail("INPUT","operation_key inv\xE1lida",422),(typeof n.provider_client_id!="string"||!n.provider_client_id.trim())&&e.fail("INPUT","provider_client_id inv\xE1lido",422),n.provider_client_label!==void 0&&typeof n.provider_client_label!="string"&&e.fail("INPUT","provider_client_label inv\xE1lido",422),n.metadata!==void 0&&(!n.metadata||typeof n.metadata!="object"||Array.isArray(n.metadata))&&e.fail("INPUT","metadata deve ser um objeto",422),n.active!==void 0&&typeof n.active!="boolean"&&e.fail("INPUT","active deve ser booleano",422),i==="carrier"&&e.uuid(n.operation_key),n}l(q,"mappingInput");function C(r,i){for(const e of r){const[n,u]=e.split("=",2);n==="active"&&!["true","false"].includes(u)&&i.fail("INPUT","active inv\xE1lido",422)}return v(r,["active"],i)}l(C,"mappingQuery");function j(r,i){const e=_(r,g,[],i);return Object.keys(e).length||i.fail("INPUT","Informe sex ou marital_status",422),e.sex!==void 0&&!["male","female","other"].includes(e.sex)&&i.fail("INPUT","sex inv\xE1lido",422),e.marital_status!==void 0&&!["single","married","divorced","widowed","other"].includes(e.marital_status)&&i.fail("INPUT","marital_status inv\xE1lido",422),e}l(j,"declarationInput");function V(r,i){const e=_(r,["recovery_revision","operations"],["recovery_revision","operations"],i);return(typeof e.recovery_revision!="string"||!e.recovery_revision.trim()||!Array.isArray(e.operations)||!e.operations.length||e.operations.some(n=>typeof n!="string"||!n.trim()))&&i.fail("INPUT","Informe recovery_revision e operations n\xE3o vazios",422),e}l(V,"recoveryInput");function F(r,i){const e=_(r,["document_id","registration_request_id","requirements_revision"],[],i);for(const n of["document_id","registration_request_id"])e[n]!==void 0&&i.uuid(e[n]);return e.requirements_revision!==void 0&&(typeof e.requirements_revision!="string"||!e.requirements_revision.trim())&&i.fail("INPUT","requirements_revision inv\xE1lida",422),e}l(F,"reprocessInput");async function E(r,i,e,n){return await n.confirm(`${e==="blacklist"?"Bloquear":"Desbloquear"} o v\xEDnculo GR ${i}?`,i),n.api("POST",`${r}/${e}`)}l(E,"linkAction");async function k(r,i,e,n){const u=_(await n.input(),["approved"],["approved"],n);typeof u.approved!="boolean"&&n.fail("INPUT","approved deve ser booleano",422);const d=e?`transportadora ${e}`:"transportadora da sess\xE3o";return await n.confirm(`${u.approved?"Aprovar":"Revogar aprova\xE7\xE3o manual de"} GR do v\xEDnculo ${i} na ${d}?`,i),n.api("PUT",`${r}/manual-approval`,u)}l(k,"manualApprovalAction");async function L(r,i,e){const n=_(await e.input(),["training_watched"],["training_watched"],e);return typeof n.training_watched!="boolean"&&e.fail("INPUT","training_watched deve ser booleano",422),await e.confirm(`Atualizar treinamento GR do perfil ${i}?`,i),e.api("PATCH",`${r}/driver-profiles/${i}/training`,n)}l(L,"trainingAction");async function w(r,i,e){O.includes(i)||e.fail("INPUT","document_type inv\xE1lido",422);const n=F(await e.input(),e);return await e.confirm(`Reprocessar documento ${i} do motorista?`,i),e.api("POST",`${r}/documents/${i}/reprocess`,n,{withStatus:!0})}l(w,"reprocessAction");async function z(r,i,e){const n=`/${r}/gr`,[,,u,d,o]=i;if(u==="provider-definitions"){if(d==="list"&&i.length===4)return e.api("GET",`${n}/provider-definitions`);if(r==="admin"&&d&&o==="update"&&i.length===5){const t=e.uuid(d),s=_(await e.input(),A,[],e);return Object.keys(s).length||e.fail("INPUT","Informe ao menos um campo",422),m(s.mode,T,"mode",e),m(s.status,I,"status",e),y(s,"config",e),await e.confirm(`Alterar defini\xE7\xE3o do provider ${t}?`,t),e.api("PUT",`${n}/provider-definitions/${t}`,{provider_definition:s})}e.fail("USAGE","Use: genne admin|carrier gr provider-definitions list; admin pode usar PROVIDER_ID update",2)}if(u==="providers"){if(d==="list"&&i.length>=4){const s=r==="admin"?["carrier_account_id","provider_key","status","limit","cursor"]:["provider_key","status","limit","cursor","search"];return e.api("GET",`${n}/provider-accounts${v(i.slice(4),s,e)}`)}if(d==="create"&&i.length===4){const s=b(await e.input(),r,!0,e);return await e.confirm(`Criar conta GR ${s.provider_key}${s.carrier_account_public_id?` para ${s.carrier_account_public_id}`:""}?`,s.provider_key),e.api("POST",`${n}/provider-accounts`,{provider_account:s})}const t=d&&o!=="list"?e.uuid(d):null;if(t&&o==="update"&&i.length===5){const s=b(await e.input(),r,!1,e);return await e.confirm(`Alterar conta GR ${t}?`,t),e.api("PUT",`${n}/provider-accounts/${t}`,{provider_account:s})}if(t&&o==="test"&&i.length===5)return await e.confirm(`Testar a conta GR ${t}?`,t),e.api("POST",`${n}/provider-accounts/${t}/test`,void 0,{withStatus:!0});if(t&&o==="operations"&&i.length===5)return e.api("GET",`${n}/provider-accounts/${t}/operations`);if(t&&o==="mappings"&&i.length>=6){const s=i[5];if(s==="list"&&i.length>=6)return e.api("GET",`${n}/provider-accounts/${t}/mappings${C(i.slice(6),e)}`);if(s==="upsert"&&i.length===6){const p=q(await e.input(),r,e);return await e.confirm(`Atualizar mapeamento ${p.operation_key} na conta GR ${t}?`,t),e.api("POST",`${n}/provider-accounts/${t}/mappings`,{operation_mapping:p})}}e.fail("USAGE","Use: genne admin|carrier gr providers list|create|PROVIDER_ID update|test|operations|mappings list|upsert",2)}}l(z,"providerCommand");async function B(r,i){const[e,n,u,d,o]=r;if(n!=="gr"||(["driver","shipper"].includes(e)&&i.fail("HTTP_403","Gest\xE3o de GR exige sess\xE3o Admin ou carrier",403),!["admin","carrier"].includes(e)))return null;U(i,[e]);const t=`/${e}/gr`;if(u==="provider-definitions"||u==="providers")return z(e,r,i);if(e==="admin"&&u==="carriers"&&r.length>=5){const a=i.uuid(d);if(o==="dashboard"&&r.length===5)return i.api("GET",`${t}/carriers/${a}/dashboard-summary`);if(o==="blacklist"&&r[5]==="list")return i.api("GET",`${t}/carriers/${a}/blacklisted-drivers${v(r.slice(6),["limit","cursor","search"],i)}`);if(o==="links"&&r.length===7&&["blacklist","unblock"].includes(r[6])){const f=i.uuid(r[5]);return E(`${t}/carriers/${a}/driver-links/${f}`,f,r[6],i)}if(o==="links"&&r.length===7&&r[6]==="manual-approval"){const f=i.uuid(r[5]);return k(`${t}/carriers/${a}/driver-links/${f}`,f,a,i)}if(o==="drivers"&&r.length===7&&r[6]==="export")return i.api("GET",`${t}/carriers/${a}/drivers/${i.uuid(r[5])}/export`);if(o==="drivers"&&r.length===9&&r[6]==="documents"&&r[8]==="reprocess")return w(`${t}/carriers/${a}/drivers/${i.uuid(r[5])}`,r[7],i);if(o==="drivers")return i.api("GET",`${t}/carriers/${a}/drivers${v(r.slice(5),$,i)}`)}if(e==="admin"&&u==="drivers")return i.api("GET",`${t}/drivers${v(r.slice(3),["carrier_account_id",...$],i)}`);if(e==="carrier"&&u==="dashboard"&&r.length===3)return i.api("GET",`${t}/dashboard-summary`);if(e==="carrier"&&u==="blacklist"&&d==="list")return i.api("GET",`${t}/blacklisted-drivers${v(r.slice(4),["limit","cursor","search"],i)}`);if(e==="carrier"&&u==="links"&&o&&r.length===5&&["blacklist","unblock"].includes(o)){const a=i.uuid(d);return E(`${t}/driver-links/${a}`,a,o,i)}if(e==="carrier"&&u==="links"&&o==="manual-approval"&&r.length===5){const a=i.uuid(d);return k(`${t}/driver-links/${a}`,a,null,i)}if(u==="driver-profiles"&&d){const a=i.uuid(d);if(e==="admin"&&o==="show"&&r.length===5)return i.api("GET",`${t}/driver-profiles/${a}`);if(o==="training"&&r.length===5)return L(t,a,i)}if(e==="carrier"&&u==="drivers"&&r.length>=3)return r.length===5&&r[4]==="export"?i.api("GET",`${t}/drivers/${i.uuid(d)}/export`):r.length===7&&r[4]==="documents"&&r[6]==="reprocess"?w(`${t}/drivers/${i.uuid(d)}`,r[5],i):i.api("GET",`${t}/drivers${v(r.slice(3),$,i)}`);u!=="requests"&&i.fail("USAGE","Use genne help admin|carrier gr para os comandos dispon\xEDveis",2);const s=`${t}/registration-requests`;if(d==="list"){const a=v(r.slice(4),e==="admin"?h:h.slice(1),i);return i.api("GET",`${s}${a?`${a}&`:"?"}pagination=cursor`)}if(d==="create"&&r.length===4){const a=_(await i.input(),["driver_profile_id","provider_account_id","operation_key","priority"],["driver_profile_id","provider_account_id","operation_key"],i);return i.uuid(a.driver_profile_id),i.uuid(a.provider_account_id),(typeof a.operation_key!="string"||!a.operation_key.trim())&&i.fail("INPUT","operation_key inv\xE1lida",422),await i.confirm(`Enfileirar GR do perfil ${a.driver_profile_id} no provider ${a.provider_account_id}, opera\xE7\xE3o ${a.operation_key}?`,a.driver_profile_id),i.api("POST",s,a,{withStatus:!0})}const p=i.uuid(d),c=`${s}/${p}`;if(o==="show"&&r.length===5)return i.api("GET",c);if(["attempts","evidence","orchestration-events"].includes(o)){const a=v(r.slice(5),["limit","cursor"],i),f=o==="attempts"?`${a?"&":"?"}pagination=cursor`:"";return i.api("GET",`${c}/${o}${a}${f}`)}if(["retry","verify","cancel"].includes(o)&&r.length===5){const a=await i.api("GET",c);return await i.confirm(`${o} GR ${p}? Estado atual: ${a.data?.status??"desconhecido"}`,p),i.api("POST",`${c}/${o}`,void 0,{withStatus:!0})}if(o==="confirm-recovery"&&r.length===5){const a=V(await i.input(),i),f=await i.api("GET",c);return await i.confirm(`Confirmar recupera\xE7\xE3o GR ${p}? Estado atual: ${f.data?.status??"desconhecido"}. Revis\xE3o: ${a.recovery_revision}. Opera\xE7\xF5es: ${a.operations.join(", ")}`,p),i.api("POST",`${c}/confirm-recovery`,{recovery:a},{withStatus:!0})}if(o==="operation"&&r.length===5){const a=_(await i.input(),["operation_key"],["operation_key"],i);i.uuid(a.operation_key);const f=await i.api("GET",c);return await i.confirm(`Selecionar opera\xE7\xE3o ${a.operation_key} para GR ${p}? Estado atual: ${f.data?.status??"desconhecido"}`,p),i.api("PUT",`${c}/operation`,{operation:a},{withStatus:!0})}if(o==="personal-declarations"&&r.length===5){const a=j(await i.input(),i);return await i.confirm(`Atualizar declara\xE7\xF5es pessoais da solicita\xE7\xE3o GR ${p}?`,p),i.api("PUT",`${c}/personal-declarations`,{declarations:a},{withStatus:!0})}i.fail("USAGE","Use: genne admin|carrier gr requests list|create|REQUEST_ID show|attempts|evidence|orchestration-events|retry|verify|cancel|confirm-recovery|operation|personal-declarations",2)}l(B,"grCommand");export{B as grCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var y=Object.defineProperty;var s=(i,e)=>y(i,"name",{value:e,configurable:!0});import{appendLocalFile as I}from"../local-file.js";const T=new Set(["name","phone","vehicle_type","navigation_app_preference"]),S=new Set(["token","name","phone","password","cpf","registration_market_code"]),b=new Set(["scope_type","scope_id","market_id"]),P={".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png",".webp":"image/webp",".heic":"image/heic",".heif":"image/heif"},U=new Set(["name","email","password","phone","is_internal","registration_market_code"]),E=new Set(["name","email","phone","is_internal"]),N=new Set(["id","public_id","name","email","phone","vehicle_type","navigation_app_preference","display_timezone","role","roles","admin_access_level","is_internal","status","primary_phone","profile_photo_url","registration_market_code","inserted_at"]);function p(i){return!i||typeof i!="object"||Array.isArray(i)?i:Object.fromEntries(Object.entries(i).filter(([e])=>N.has(e)))}s(p,"projectUser");function u(i){return!i||typeof i!="object"?i:Array.isArray(i.data)?{...i,data:i.data.map(p)}:i.data&&typeof i.data=="object"?{...i,data:p(i.data)}:i}s(u,"projectUserEnvelope");function w(i,e,a=!1){const n=i?.data;return(n?.status!=="enabled"||typeof n.changed!="boolean"||n.reauthentication_required!==n.changed)&&e.fail("RESPONSE",a?"Resposta inv\xE1lida da API; fa\xE7a genne login e consulte genne user me antes de repetir":"Resposta inv\xE1lida da API; confira os pap\xE9is do usu\xE1rio alvo antes de repetir"),{data:{status:n.status,changed:n.changed,reauthentication_required:n.reauthentication_required},...a&&n.reauthentication_required?{message:"Perfil de motorista habilitado; fa\xE7a genne login novamente."}:{}}}s(w,"projectDriverAccess");const A=new Set(["id","name","email","status","reviewed_at","inserted_at"]);function c(i){return!i||typeof i!="object"||Array.isArray(i)?i:Object.fromEntries(Object.entries(i).filter(([e])=>A.has(e)))}s(c,"projectDeletion");function m(i){return!i||typeof i!="object"?i:Array.isArray(i.data)?{...i,data:i.data.map(c)}:i.data&&typeof i.data=="object"?{...i,data:c(i.data)}:i}s(m,"projectDeletionEnvelope");function _(i,e){return(!i||typeof i!="object"||Array.isArray(i))&&e.fail("INPUT","A entrada deve ser um objeto JSON",422),i}s(_,"objectInput");function r(i,e,a){const n=_(i,a),t=Object.keys(n).filter(d=>!e.has(d));return t.length&&a.fail("INPUT",`Campo n\xE3o permitido: ${t[0]}`,422),Object.keys(n).length||a.fail("INPUT","Informe ao menos um campo",422),n}s(r,"pick");function h(i,e){try{return e.uuid(i)}catch{e.fail("USAGE","O identificador deve ser um UUID",422)}}s(h,"id");function l(i,e){i.requireRole(e)}s(l,"role");async function o(i){return _(await i.input(),i)}s(o,"input");function O(i,e){const a=r(i,S,e);return(typeof a.token!="string"||!a.token.trim())&&e.fail("INPUT","Informe token",422),a.name!==void 0&&(typeof a.name!="string"||!a.name.trim())&&e.fail("INPUT","name inv\xE1lido",422),a.password!==void 0&&(typeof a.password!="string"||a.password.length<6)&&e.fail("INPUT","A senha deve ter pelo menos 6 caracteres",422),a.phone!==void 0&&(typeof a.phone!="string"||!/^\+[1-9][0-9]{7,14}$/.test(a.phone))&&e.fail("INPUT","phone deve usar formato E.164",422),a.registration_market_code!==void 0&&!["BR","US"].includes(a.registration_market_code)&&e.fail("INPUT","registration_market_code deve ser BR ou US",422),a.cpf!==void 0&&typeof a.cpf!="string"&&e.fail("INPUT","cpf inv\xE1lido",422),a}s(O,"invitationBody");function k(i,e){const a=r(i,b,e);if(["shipper_base","carrier_base","independent"].includes(a.scope_type)||e.fail("INPUT","scope_type inv\xE1lido",422),a.scope_type!=="independent"){a.scope_id===void 0&&e.fail("INPUT","scope_id \xE9 obrigat\xF3rio para uma base",422),a.market_id!==void 0&&e.fail("INPUT","market_id n\xE3o \xE9 aceito para uma base",422);try{e.uuid(a.scope_id)}catch{e.fail("INPUT","scope_id deve ser um UUID",422)}}else{a.scope_id!==void 0&&e.fail("INPUT","scope_id n\xE3o \xE9 aceito para independent",422),a.market_id===void 0&&e.fail("INPUT","market_id \xE9 obrigat\xF3rio para independent",422);try{e.uuid(a.market_id)}catch{e.fail("INPUT","market_id deve ser um UUID",422)}}return a}s(k,"marketContextBody");async function $(i,e){if(!Array.isArray(i)||!i.length)return null;if(i[0]==="password"&&i[1]==="forgot"&&i.length===2){const a=r(await o(e),new Set(["email"]),e);return e.api("POST","/auth/forgot-password",a)}if(i[0]==="password"&&i[1]==="reset"&&i.length===2){const a=r(await o(e),new Set(["email","code","password"]),e);return e.api("POST","/auth/reset-password",a)}if(i[0]==="auth"&&i[1]==="membership-invitations"&&i[2]==="accept"&&i.length===3)return e.api("POST","/auth/membership-invitations/accept",O(await o(e),e));if(i[0]==="driver"&&i[1]==="market-context"){if(l(e,"driver"),i.length===3&&i[2]==="set")return e.api("PUT","/driver/market-context",k(await o(e),e));e.fail("USAGE","Use: genne driver market-context set",2)}if(i[0]==="session"&&i.length===2){if(i[1]==="logout")return await e.api("POST","/auth/logout"),{data:{revoked:"current"}};if(i[1]==="logout-all")return await e.confirm("Encerrar todas as suas sess\xF5es do Genne?","logout-all"),await e.api("POST","/auth/logout-all"),{data:{revoked:"all"}}}if(i[0]==="user"&&i[1]==="me"){if(i.length===2)return{data:p(e.user)};if(i[2]==="driver-access"&&i[3]==="enable"&&i.length===4){l(e,"carrier");const a=r(await o(e),new Set(["current_password"]),e);(typeof a.current_password!="string"||!a.current_password.trim())&&e.fail("INPUT","Informe current_password",422),await e.confirm("Habilitar seu perfil de motorista e encerrar suas sess\xF5es?",String(e.user.id));const n=await e.api("PUT","/auth/me/driver-access",a);return w(n,e,!0)}if(i.length===3&&i[2]==="update"){const a=await e.api("PATCH","/auth/me",await o(e).then(n=>r(n,T,e)));return{...a,...a?.data?{data:p(a.data)}:{}}}if(i.length===3&&i[2]==="photo"){const a=r(await o(e),new Set(["path"]),e),n=new FormData;return await I(n,"profile_photo",a.path,P,6*1024*1024,e),u(await e.api("POST","/auth/me/profile-photo",n))}if(i.length===3&&i[2]==="deletion-request"){const a=r(await o(e),new Set(["accepted_terms"]),e);return a.accepted_terms!==!0&&e.fail("INPUT","\xC9 necess\xE1rio aceitar os termos",422),await e.confirm("Solicitar a exclus\xE3o dos seus dados?",String(e.user.id)),m(await e.api("POST","/auth/me/deletion-request",a))}if(i[2]==="email-change"&&i[3]==="request"&&i.length===4){const a=r(await o(e),new Set(["current_password","new_email"]),e);return e.api("POST","/auth/me/email-change",a)}if(i[2]==="email-change"&&i[3]==="confirm"&&i.length===4){const a=r(await o(e),new Set(["code"]),e);return await e.confirm("Confirmar a troca de email e encerrar todas as sess\xF5es?",String(e.user.id)),e.api("POST","/auth/me/email-change/confirm",a)}return null}if(i[0]==="password"&&i[1]==="change"&&i.length===2){const a=r(await o(e),new Set(["current_password","new_password"]),e);return e.api("POST","/auth/me/password",a)}if(i[0]==="admin"&&i[1]==="users"){if(l(e,"admin"),i[2]==="create"&&i.length===3){const n=r(await o(e),U,e);for(const t of["name","email","password","phone"])(typeof n[t]!="string"||!n[t].trim())&&e.fail("INPUT",`Campo obrigat\xF3rio: ${t}`,422);return["BR","US"].includes(n.registration_market_code)||e.fail("INPUT","Informe registration_market_code como BR ou US",422),/^\+[1-9]\d{7,14}$/.test(n.phone)||e.fail("INPUT","Telefone deve usar formato E.164",422),n.is_internal!==void 0&&typeof n.is_internal!="boolean"&&e.fail("INPUT","is_internal deve ser booleano",422),await e.confirm(`Criar usu\xE1rio staff ${n.email}?`,String(n.email)),u(await e.api("POST","/admin/users",{user:n}))}const a=h(i[2],e);if(i[3]==="driver-access"&&i[4]==="enable"&&i.length===5){const n=r(await o(e),new Set(["reason"]),e);return(typeof n.reason!="string"||!n.reason.trim())&&e.fail("INPUT","Informe reason",422),await e.confirm(`Habilitar perfil de motorista do usu\xE1rio ${a} e encerrar as sess\xF5es dele?`,a),w(await e.api("PUT",`/admin/users/${a}/driver-access`,n),e)}if(i[3]==="update"&&i.length===4){const n=r(await o(e),E,e);return await e.confirm(`Atualizar o usu\xE1rio ${a}?`,a),u(await e.api("PATCH",`/admin/users/${a}`,{user:n}))}if((i[3]==="block"||i[3]==="unblock")&&i.length===4)return await e.confirm(`${i[3]==="block"?"Bloquear":"Desbloquear"} o usu\xE1rio ${a}?`,a),u(await e.api("POST",`/admin/users/${a}/${i[3]}`));if(i[3]==="roles"&&i.length===4){const n=r(await o(e),new Set(["roles","reason"]),e);return await e.confirm(`Alterar os pap\xE9is do usu\xE1rio ${a}?`,a),u(await e.api("PUT",`/admin/users/${a}/roles`,n))}if(i[3]==="password"&&i.length===4){const n=r(await o(e),new Set(["password","reason"]),e);return await e.confirm(`Redefinir a senha do usu\xE1rio ${a}?`,a),u(await e.api("POST",`/admin/users/${a}/password`,n))}if(i[3]==="delete"&&i.length===4){const n=await o(e),t=r(n,new Set(["email"]),e);(typeof t.email!="string"||!t.email.trim())&&e.fail("INPUT","Informe o email para confirmar a exclus\xE3o",422);const d=await e.api("GET",`/admin/privacy/delete-user/preview?user_id=${encodeURIComponent(a)}`),f=d?.data?.user?.email;return(typeof f!="string"||f.toLowerCase()!==t.email.trim().toLowerCase())&&e.fail("CONFLICT","O email n\xE3o corresponde ao usu\xE1rio consultado",409),d?.data?.can_delete_without_force!==!0&&e.fail("CONFLICT","O usu\xE1rio possui registros dependentes e n\xE3o pode ser exclu\xEDdo com seguran\xE7a",409),typeof d?.data?.deletion_intent!="string"&&e.fail("RESPONSE","A pr\xE9via n\xE3o autorizou a exclus\xE3o",409),await e.confirm(t.email?`Excluir permanentemente o usu\xE1rio ${a} (${t.email})?`:`Excluir permanentemente o usu\xE1rio ${a}?`,a),e.api("DELETE",`/admin/users/${a}`,void 0,{deletionIntent:d.data.deletion_intent})}return null}if(i[0]==="admin"&&i[1]==="privacy"&&i[2]==="requests"){if(l(e,"admin"),i.length===3)return m(await e.api("GET","/admin/privacy/deletion-requests"));if(i.length===5&&i[3]==="status"){const a=String(i[4]??"").trim();(!a||a.length>100||!/^[0-9a-f-]+$/i.test(a))&&e.fail("USAGE","REQUEST_ID inv\xE1lido",422);const n=r(await o(e),new Set(["new_status"]),e);["solicitado","excluido","nao_ha_dados"].includes(n.new_status)||e.fail("INPUT","Status de exclus\xE3o inv\xE1lido",422);const t=n.new_status==="excluido"?"Esta marca\xE7\xE3o n\xE3o executa nem comprova a exclus\xE3o dos dados.":"";return await e.confirm(`Atualizar o status do pedido ${a} para ${n.new_status}? ${t}`.trim(),a),m(await e.api("PATCH",`/admin/privacy/deletion-requests/${encodeURIComponent(a)}/status`,n))}return null}if(i[0]==="admin"&&i[1]==="privacy"&&i[2]==="preview"&&i.length===3){l(e,"admin");const a=await o(e),t=r(a,new Set(["user_id","email"]),e);(t.user_id&&t.email||!t.user_id&&!t.email)&&e.fail("INPUT","Informe user_id ou email, mas n\xE3o os dois",422);const d=t.user_id?`?user_id=${encodeURIComponent(h(t.user_id,e))}`:`?email=${encodeURIComponent(t.email)}`,f=await e.api("GET",`/admin/privacy/delete-user/preview${d}`);return delete f.data?.deletion_intent,f}return null}s($,"identityCommand");export{$ as identityCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var U=Object.defineProperty;var p=(i,e)=>U(i,"name",{value:e,configurable:!0});import{jsonBody as l,requireRole as m}from"./operational-input.js";import{desktopIntegrationsCommand as S}from"./desktop-integrations.js";const E=["shipper_id","base_id","source_type","external_id","primary_barcode","aliases","postal_code","destination_address","destination_lat","destination_lng","destination_complement","geocode","recipient_name","recipient_doc","recipient_phone","packages_count","raw_payload","metadata"],T=["shipper_id","base_id","code","name","postal_code_start","postal_code_end","priority_order","status","metadata"],N=["shipper_id","base_id","query","cursor","status_sync"],A=["shipper_id","base_id","connection_id","device_id","order_id","status","cursor"],I=["sack_receipt","package_receipt","route_creation","dispatch","transfer","return"],O=["sack_receipt","package_receipt"],$=/^[A-Za-z0-9._:-]+$/;function v(i,e){if(i[0]==="carrier")return m(e,["carrier"]),{root:"/carrier",rest:i.slice(1),suffix:"",target:"my-account"};if(i[0]==="admin"&&i[1]==="operations"){m(e,["admin"]);const r=e.uuid(i[2]);return{root:"/admin",rest:i.slice(3),suffix:`?carrier_account_id=${r}`,target:r}}return null}p(v,"scope");function y(i,e){return`${i}${e}`}p(y,"path");function b(i,e){return(typeof i!="string"||i.length<8||i.length>128||!$.test(i))&&e.fail("INPUT","device_id deve ter 8 a 128 caracteres alfanum\xE9ricos",422),i}p(b,"deviceId");function g(i,e){return(typeof i!="string"||i.length<16||i.length>128||!$.test(i))&&e.fail("INPUT","idempotency_key deve ter 16 a 128 caracteres alfanum\xE9ricos",422),i}p(g,"idempotencyKey");function R(i,e){return(!Array.isArray(i)||i.length<1||i.length>100||new Set(i).size!==i.length)&&e.fail("INPUT","order_ids deve conter de 1 a 100 IDs p\xFAblicos \xFAnicos",422),i.forEach(r=>e.uuid(r)),i}p(R,"orderIds");function h(i,e,r){const o=new URLSearchParams;for(const d of i){const s=d.indexOf("="),c=d.slice(0,s),t=d.slice(s+1);(s<1||!e.includes(c)||!t||o.has(c))&&r.fail("USAGE",`Filtro n\xE3o suportado: ${d}`,422),["shipper_id","base_id","connection_id","order_id"].includes(c)&&r.uuid(t),c==="device_id"&&b(t,r),c==="status_sync"&&t!=="true"&&r.fail("INPUT","status_sync deve ser true",422),o.set(c,t)}return o.size?`?${o}`:""}p(h,"desktopQuery");function k(i,e,r){const o=new URLSearchParams(i.slice(1));return o.has(e)||r.fail("INPUT",`${e} obrigat\xF3rio`,422),o.get(e)}p(k,"requireQueryParam");function D(i,e){(!Array.isArray(i)||i.length<1||i.length>1e3)&&e.fail("INPUT","external_orders deve conter de 1 a 1000 itens",422);const r=new Set;for(const o of i){(!o||typeof o!="object"||Array.isArray(o)||Object.keys(o).some(s=>!["external_id","external_base_code"].includes(s))||typeof o.external_id!="string"||!o.external_id.trim()||typeof o.external_base_code!="string"||!o.external_base_code.trim())&&e.fail("INPUT","external_orders deve usar apenas external_id e external_base_code",422);const d=`${o.external_id}\0${o.external_base_code}`;r.has(d)&&e.fail("INPUT","external_orders n\xE3o pode repetir itens",422),r.add(d)}return i}p(D,"knownExternalOrders");function G(i,e,r){return(!Array.isArray(i)||i.length<1||i.length>100||new Set(i).size!==i.length)&&r.fail("INPUT",`${e} deve conter de 1 a 100 IDs p\xFAblicos \xFAnicos`,422),i.forEach(o=>r.uuid(o)),i}p(G,"publicIds");function j(i,e){const r=new URLSearchParams,o=["base_id","shipper_id","operation_kind","device_id","monitor","cursor","limit"];for(const d of i){const s=d.indexOf("="),c=d.slice(0,s),t=d.slice(s+1);(s<1||!o.includes(c)||!t||r.has(c))&&e.fail("USAGE",`Filtro n\xE3o suportado: ${d}`,422),["base_id","shipper_id"].includes(c)&&e.uuid(t),c==="device_id"&&b(t,e),c==="operation_kind"&&!I.includes(t)&&e.fail("INPUT","operation_kind inv\xE1lido",422),c==="monitor"&&!["true","false"].includes(t)&&e.fail("INPUT","monitor deve ser true ou false",422),c==="limit"&&(!/^\d+$/.test(t)||Number(t)<1||Number(t)>100)&&e.fail("INPUT","limit inv\xE1lido",422),r.set(c,t)}return r.get("monitor")!=="true"&&!r.has("device_id")&&e.fail("INPUT","device_id obrigat\xF3rio; use monitor=true para a vis\xE3o da transportadora",422),r.size?`?${r}`:""}p(j,"operationQuery");function C(i,e){(!Array.isArray(i)||i.length<1||i.length>100)&&e.fail("INPUT","scans deve conter de 1 a 100 itens",422);for(const r of i)if((!r||typeof r!="object"||Array.isArray(r)||Object.keys(r).some(o=>!["scan_id","barcode","occurred_at","association"].includes(o))||r.scan_id===void 0||r.barcode===void 0||r.occurred_at===void 0)&&e.fail("INPUT","cada scan deve conter scan_id, barcode e occurred_at",422),e.uuid(r.scan_id),(typeof r.barcode!="string"||!r.barcode.trim()||typeof r.occurred_at!="string"||!r.occurred_at.trim())&&e.fail("INPUT","scan com barcode ou occurred_at inv\xE1lido",422),r.association!==void 0&&r.association!==null){const o=r.association;(!o||typeof o!="object"||Array.isArray(o)||Object.keys(o).some(d=>!["kind","scan_id","barcode"].includes(d))||Object.keys(o).length!==3||o.kind!=="sack")&&e.fail("INPUT","association deve ser uma associa\xE7\xE3o de saca v\xE1lida",422),e.uuid(o.scan_id),(typeof o.barcode!="string"||!o.barcode.trim())&&e.fail("INPUT","barcode da association inv\xE1lido",422)}return i}p(C,"operationScans");async function K(i,e){if(i[0]==="grants"&&i[1]==="list"&&i.length===2)return e.api("GET","/carrier/desktop/provider-grants");if(i[0]==="orders"&&i[1]==="list")return e.api("GET",`/carrier/desktop/orders${h(i.slice(2),N,e)}`);if(i[0]==="orders"&&i[2]==="show"&&i.length===3)return e.api("GET",`/carrier/desktop/orders/${e.uuid(i[1])}`);if(i[0]==="orders"&&["refresh","resync"].includes(i[1])&&i.length===2){const r=l(await e.input(),["order_ids","idempotency_key"],["order_ids","idempotency_key"],e);R(r.order_ids,e);const o=g(r.idempotency_key,e),{idempotency_key:d,...s}=r;return await e.confirm(`Executar ${i[1]} Desktop para ${r.order_ids.length} pedido(s)?`,o),e.api("POST",`/carrier/desktop/orders/${i[1]}`,s,{idempotencyKey:o,withStatus:!0})}if(i[0]==="sync-runs"&&i[1]==="list")return e.api("GET",`/carrier/desktop/order-sync-runs${h(i.slice(2),A,e)}`);if(i[0]==="sync-runs"&&i.length===3&&i[2]==="show")return e.api("GET",`/carrier/desktop/flow-executions/${e.uuid(i[1])}`);if(i[0]==="sync-runs"&&i.length===3&&i[2]==="cancel"){const r=e.uuid(i[1]);return await e.confirm(`Cancelar a sincroniza\xE7\xE3o Desktop ${r}?`,r),e.api("POST",`/carrier/desktop/order-sync-runs/${r}/cancel`)}if(i[0]==="executions"&&i.length===3&&i[2]==="show")return e.api("GET",`/carrier/desktop/flow-executions/${e.uuid(i[1])}`);if(i[0]==="executions"&&i[2]==="candidates"&&i[3]==="list"){const r=e.uuid(i[1]),o=h(i.slice(4),["device_id","cursor"],e);return k(o,"device_id",e),e.api("GET",`/carrier/desktop/flow-executions/${r}/order-sync-candidates${o}`)}if(i[0]==="executions"&&i[2]==="known-ids"&&i.length===3){const r=e.uuid(i[1]),o=l(await e.input(),["device_id","external_orders"],["device_id","external_orders"],e);return b(o.device_id,e),D(o.external_orders,e),e.api("POST",`/carrier/desktop/flow-executions/${r}/order-sync-known-ids`,o)}if(i[0]==="executions"&&i[2]==="receipt"&&i.length>=3){const r=e.uuid(i[1]),o=h(i.slice(3),["device_id","batch_key"],e);return k(o,"device_id",e),g(k(o,"batch_key",e),e),e.api("GET",`/carrier/desktop/flow-executions/${r}/order-import-receipts${o}`)}if(i[0]==="operation-routes"&&i[1]==="list"&&i.length===2)return e.api("GET","/carrier/desktop/operation-routes");if(i[0]==="operation-routes"&&i[1]==="publish"&&i.length===2){const r=l(await e.input(),["base_id","shipper_id","operation_kind","target","bindings","handler_key"],["base_id","shipper_id","operation_kind","target"],e);return e.uuid(r.base_id),e.uuid(r.shipper_id),I.includes(r.operation_kind)||e.fail("INPUT","operation_kind inv\xE1lido",422),["core","flow"].includes(r.target)||e.fail("INPUT","target deve ser core ou flow",422),r.target==="flow"&&(!Array.isArray(r.bindings)||r.bindings.length<1||r.bindings.length>10)&&e.fail("INPUT","bindings deve conter de 1 a 10 instala\xE7\xF5es para target=flow",422),await e.confirm(`Publicar nova revis\xE3o da opera\xE7\xE3o ${r.operation_kind} na base ${r.base_id}?`,r.base_id),e.api("PUT","/carrier/desktop/operation-routes",r,{withStatus:!0})}if(i[0]==="operation-contexts"&&i[1]==="open"&&i.length===2){const r=l(await e.input(),["base_id","shipper_id","operation_kind","mode","device_id"],["base_id","shipper_id","operation_kind","mode","device_id"],e);return e.uuid(r.base_id),e.uuid(r.shipper_id),O.includes(r.operation_kind)||e.fail("INPUT","operation_kind deve ser sack_receipt ou package_receipt",422),["fast","standard"].includes(r.mode)||e.fail("INPUT","mode deve ser fast ou standard",422),b(r.device_id,e),e.api("POST","/carrier/desktop/operation-contexts",r)}if(i[0]==="operation-contexts"&&i[2]==="close"&&i.length===3){const r=e.uuid(i[1]);return await e.confirm(`Encerrar o contexto de recebimento ${r}?`,r),e.api("DELETE",`/carrier/desktop/operation-contexts/${r}`)}if(i[0]==="operation-scans"&&i[1]==="batch"&&i.length===2){const r=l(await e.input(),["context_token","scans"],["context_token","scans"],e);return(typeof r.context_token!="string"||!r.context_token.trim())&&e.fail("INPUT","context_token obrigat\xF3rio",422),C(r.scans,e),await e.confirm(`Aceitar ${r.scans.length} leitura(s) no contexto Desktop?`,String(r.scans.length)),e.api("POST","/carrier/desktop/operation-scans/batch",r)}if(i[0]==="operation-runs"&&i[1]==="list"){const r=j(i.slice(2),e);return e.api("GET",`/carrier/desktop/operation-runs${r}`)}if(i[0]==="operation-runs"&&i[2]==="retry"&&i.length===3){const r=e.uuid(i[1]);return await e.confirm(`Reprocessar o fluxo de recebimento ${r}?`,r),e.api("POST",`/carrier/desktop/operation-flow-runs/${r}/retry`,void 0,{withStatus:!0})}if(i[0]==="operation-runs"&&i[1]==="retry-batch"&&i.length===2){const r=l(await e.input(),["flow_run_ids"],["flow_run_ids"],e);return G(r.flow_run_ids,"flow_run_ids",e),await e.confirm(`Reprocessar ${r.flow_run_ids.length} fluxo(s) de recebimento?`,String(r.flow_run_ids.length)),e.api("POST","/carrier/desktop/operation-flow-runs/retry-batch",r,{withStatus:!0})}if(i[0]==="flow-actions"&&i[2]==="run"&&i.length===3){const r=i[1];(typeof r!="string"||!r.trim()||r.length>128)&&e.fail("INPUT","ACTION_KEY inv\xE1lida",422);const o=l(await e.input(),["shipper_id","base_id","input","idempotency_key"],["shipper_id","base_id","input","idempotency_key"],e);e.uuid(o.shipper_id),e.uuid(o.base_id);const d=g(o.idempotency_key,e);(!o.input||typeof o.input!="object"||Array.isArray(o.input))&&e.fail("INPUT","input deve ser um objeto",422);const{idempotency_key:s,...c}=o;return await e.confirm(`Executar a a\xE7\xE3o Desktop ${r}?`,r),e.api("POST",`/carrier/desktop/flow-actions/${encodeURIComponent(r)}/runs`,c,{idempotencyKey:d,withStatus:!0})}e.fail("USAGE","Use: desktop orders|sync-runs|executions; operation-routes list|publish; operation-contexts open|SESSION_ID close; operation-scans batch; operation-runs list|FLOW_RUN_ID retry|retry-batch; flow-actions ACTION_KEY run",2)}p(K,"desktop");async function Q(i,e){if(i[0]==="carrier"&&i[1]==="desktop"){m(e,["carrier"]);const n=await S(i,e);return n!==null?n:K(i.slice(2),e)}const r=v(i,e);if(!r)return null;const{root:o,rest:d,suffix:s,target:c}=r,[t,_,f,P]=d;if(!["orders","receiving","dispatch"].includes(t))return null;if(t==="orders"&&_==="lookup"&&d.length===3)return(typeof f!="string"||!f.trim())&&e.fail("INPUT","barcode obrigat\xF3rio",422),e.api("GET",`${o}/orders/lookup${s?`${s}&`:"?"}barcode=${encodeURIComponent(f)}`);if(t==="orders"&&_==="upsert"&&d.length===2){const n=l(await e.input(),E,["source_type","external_id","postal_code","destination_address"],e);for(const a of["shipper_id","base_id"])n[a]&&e.uuid(n[a]);return(!["upload","proceda"].includes(n.source_type)||[n.external_id,n.postal_code,n.destination_address].some(a=>typeof a!="string"||!a.trim()))&&e.fail("INPUT","Informe source_type, external_id, postal_code e destination_address v\xE1lidos",422),await e.confirm(`Criar ou atualizar pedido ${n.external_id}${n.base_id?` na base ${n.base_id}`:""}?`,n.external_id),e.api("POST",y(`${o}/orders`,s),n)}if(t==="receiving"&&_==="scan"&&d.length===2){const n=l(await e.input(),["barcode","shipper_id","base_id","metadata"],["barcode"],e);(typeof n.barcode!="string"||!n.barcode.trim())&&e.fail("INPUT","barcode obrigat\xF3rio",422);for(const u of["shipper_id","base_id"])n[u]&&e.uuid(n[u]);const a=await e.api("GET",`${o}/orders/lookup${s?`${s}&`:"?"}barcode=${encodeURIComponent(n.barcode)}`);return await e.confirm(`Receber ${n.barcode}? Pedido: ${a.data?.order?.id??"n\xE3o identificado"}`,n.barcode),e.api("POST",y(`${o}/orders/receipts`,s),n)}if(t==="receiving"&&_==="rules"){const n=y(`${o}/receiving/rules`,s);if(f==="list"&&d.length===3)return e.api("GET",n);if(f==="create"&&d.length===3){const a=l(await e.input(),T,["code","name","postal_code_start","postal_code_end"],e);for(const u of["shipper_id","base_id"])a[u]!=null&&e.uuid(a[u]);return await e.confirm(`Criar regra de recebimento ${a.code}?`,a.code),e.api("POST",n,a,{withStatus:!0})}if(P==="update"&&d.length===4){const a=e.uuid(f),u=l(await e.input(),T,[],e);Object.keys(u).length||e.fail("INPUT","Informe ao menos um campo",422);for(const w of["shipper_id","base_id"])u[w]!=null&&e.uuid(u[w]);return await e.confirm(`Alterar regra de recebimento ${a}? Campos: ${Object.keys(u).join(", ")}`,a),e.api("PUT",y(`${o}/receiving/rules/${a}`,s),u)}}if(t==="dispatch"&&_==="create"&&d.length===2){const n=l(await e.input(),["driver_user_id","barcodes","route_name","metadata"],["driver_user_id","barcodes"],e);return e.uuid(n.driver_user_id),(!Array.isArray(n.barcodes)||!n.barcodes.length||n.barcodes.some(a=>typeof a!="string"||!a.trim())||new Set(n.barcodes).size!==n.barcodes.length)&&e.fail("INPUT","barcodes inv\xE1lidos",422),await e.confirm(`Expedir ${n.barcodes.length} pedido(s) ao motorista ${n.driver_user_id}?`,n.driver_user_id),e.api("POST",y(`${o}/dispatch-routes`,s),n,{withStatus:!0})}if(t==="dispatch"&&f==="add-orders"&&d.length===3){const n=e.uuid(_),a=l(await e.input(),["barcodes","reason"],["barcodes"],e);return(!Array.isArray(a.barcodes)||!a.barcodes.length||a.barcodes.some(u=>typeof u!="string"||!u.trim())||new Set(a.barcodes).size!==a.barcodes.length||a.reason!==void 0&&(typeof a.reason!="string"||!a.reason.trim()))&&e.fail("INPUT","Informe barcodes \xFAnicos e reason opcional",422),await e.confirm(`Adicionar ${a.barcodes.length} pedido(s) \xE0 rota ${n} em ${c}?`,n),e.api("POST",y(`${o}/dispatch-routes/${n}/orders`,s),a,{withStatus:!0})}e.fail("USAGE","Use: orders lookup|upsert; receiving scan|rules list|create|ID update; dispatch create|ROUTE_ID add-orders",2)}p(Q,"logisticsCommand");export{Q as logisticsCommand};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var l=Object.defineProperty;var r=(i,t)=>l(i,"name",{value:t,configurable:!0});const c=new Set(["user_id","title","body","action_url","action_label"]);function u(i){if(typeof i!="string")return!1;const t=i.trim();if(!t)return!1;if(t.startsWith("/")&&!t.startsWith("//"))return!0;try{const n=new URL(t);return["http:","https:"].includes(n.protocol)&&!!n.hostname}catch{return!1}}r(u,"validActionUrl");function _(i,t){(!i||typeof i!="object"||Array.isArray(i))&&t.fail("INPUT","A entrada deve ser um objeto JSON",422);const n=Object.keys(i).find(a=>!c.has(a));n&&t.fail("INPUT",`Campo n\xE3o permitido: ${n}`,422),(typeof i.user_id!="string"||!i.user_id.trim())&&t.fail("INPUT","Informe user_id como UUID em JSON pelo stdin",422);const o=t.uuid(i.user_id.trim());(typeof i.title!="string"||!i.title.trim())&&t.fail("INPUT","Informe title n\xE3o vazio em JSON pelo stdin",422),(typeof i.body!="string"||!i.body.trim())&&t.fail("INPUT","Informe body n\xE3o vazio em JSON pelo stdin",422);const e={user_id:o,title:i.title.trim(),body:i.body.trim()};return i.action_url!==void 0&&((typeof i.action_url!="string"||!u(i.action_url))&&t.fail("INPUT","action_url deve ser http(s) ou caminho do app",422),e.action_url=i.action_url.trim()),i.action_label!==void 0&&((typeof i.action_label!="string"||!i.action_label.trim())&&t.fail("INPUT","action_label deve ser texto n\xE3o vazio",422),e.action_url||t.fail("INPUT","action_url \xE9 obrigat\xF3rio quando action_label \xE9 informado",422),e.action_label=i.action_label.trim()),e}r(_,"sendInput");function f(i){return!i||typeof i!="object"?i:Object.fromEntries(["id","title","body","action_url","action_label","target_type","sent_at","delivery_status","recipients_count","processed_recipients_count","failed_recipients_count","read_count","push_opened_count","in_app_opened_count","recipients_with_tokens","completed_at"].filter(n=>n in i).map(n=>[n,i[n]]))}r(f,"projectDispatch");function d(i){return Array.isArray(i?.data)?{...i,data:i.data.map(f)}:i?.data&&typeof i.data=="object"?{...i,data:f(i.data)}:i}r(d,"projectDispatchEnvelope");function p(i,t){const n=new URLSearchParams;for(const o of i){const e=o.indexOf("="),a=o.slice(0,e),s=o.slice(e+1);(e<1||!["limit","cursor"].includes(a)||!s||n.has(a))&&t.fail("USAGE",`Filtro n\xE3o suportado: ${o}`,422),a==="limit"&&(!/^\d+$/.test(s)||Number(s)<1||Number(s)>100)&&t.fail("INPUT","Limit deve estar entre 1 e 100",422),n.set(a,s)}return n.size?`?${n}`:""}r(p,"query");async function y(i,t){if(i[0]!=="admin"||i[1]!=="notifications")return null;if(t.requireRole("admin"),i[2]==="list")return d(await t.api("GET",`/admin/notifications${p(i.slice(3),t)}`));if(i[2]==="show"&&i.length===4)return d(await t.api("GET",`/admin/notifications/${t.uuid(i[3])}`));if(i[2]==="send"&&i.length===3){const n=_(await t.input(),t);await t.confirm(`Enfileirar notifica\xE7\xE3o para o usu\xE1rio ${n.user_id}?
|
|
2
|
+
${JSON.stringify(n,null,2)}`,n.user_id);const o=d(await t.api("POST","/admin/notifications/send",{...n,target_type:"individual"}));return(!o?.data?.id||o.data.delivery_status!=="queued")&&t.fail("RESPONSE","Resposta inv\xE1lida da API"),o}t.fail("USAGE","Use: genne admin notifications list|show MESSAGE_GROUP_ID|send",2)}r(y,"notificationsCommand");export{y as notificationsCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var d=Object.defineProperty;var c=(i,e)=>d(i,"name",{value:e,configurable:!0});function u(i,e){e.includes(i.user?.role)||i.fail("HTTP_403","Acesso negado",403)}c(u,"requireRole");function l(i,e,t,s){return(!i||typeof i!="object"||Array.isArray(i)||Object.keys(i).some(o=>!e.includes(o))||t.some(o=>i[o]===void 0||i[o]===null||i[o]===""))&&s.fail("INPUT","JSON ausente ou com campos inv\xE1lidos",422),i}c(l,"jsonBody");function m(i,e,t){const s=new URLSearchParams;for(const o of i){const f=o.indexOf("="),n=o.slice(0,f),r=o.slice(f+1);(f<1||!e.includes(n)||!r||s.has(n))&&t.fail("USAGE",`Filtro n\xE3o suportado: ${o}`,422),n==="limit"&&(!/^\d+$/.test(r)||Number(r)<1||Number(r)>100)&&t.fail("INPUT","limit inv\xE1lido",422),(n.endsWith("_id")||n==="batch_id")&&t.uuid(r),s.set(n,r)}return s.size?`?${s}`:""}c(m,"query");export{l as jsonBody,m as query,u as requireRole};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var d=Object.defineProperty;var a=(t,n)=>d(t,"name",{value:n,configurable:!0});import{jsonBody as u,requireRole as i}from"./operational-input.js";const s=["integration_type","order_entry_mode","status_query_mode","receiving_enabled","dispatch_enabled","routing_enabled","quotation_enabled","status","metadata"],c=new Set(["upload","proceda"]),f=new Set(["upload","proceda"]),l=new Set(["disabled"]),p=new Set(["active","inactive"]),_=["receiving_enabled","dispatch_enabled","routing_enabled","quotation_enabled"];function m(t,n){const e=u(t,s,[],n);Object.keys(e).length===0&&n.fail("INPUT","Informe ao menos um campo",422),e.integration_type!==void 0&&!c.has(e.integration_type)&&n.fail("INPUT","integration_type inv\xE1lido",422),e.order_entry_mode!==void 0&&!f.has(e.order_entry_mode)&&n.fail("INPUT","order_entry_mode inv\xE1lido",422),e.status_query_mode!==void 0&&!l.has(e.status_query_mode)&&n.fail("INPUT","status_query_mode inv\xE1lido",422),e.status!==void 0&&!p.has(e.status)&&n.fail("INPUT","status inv\xE1lido",422);for(const o of _)e[o]!==void 0&&typeof e[o]!="boolean"&&n.fail("INPUT",`${o} deve ser booleano`,422);return e.metadata!==void 0&&(!e.metadata||typeof e.metadata!="object"||Array.isArray(e.metadata))&&n.fail("INPUT","metadata deve ser um objeto",422),e}a(m,"validateUpdate");function y(t,n){if(t[0]==="carrier"&&t[1]==="operations"&&t[2]==="config"&&["show","update"].includes(t[3])&&t.length===4)return i(n,["carrier"]),{action:t[3],scope:"carrier",target:"my-account",path:"/carrier/operations/config"};if(t[0]==="admin"&&t[1]==="operations"&&t[3]==="config"&&["show","update"].includes(t[4])&&t.length===5){i(n,["admin"]);const e=n.uuid(t[2]);return{action:t[4],scope:"admin",target:e,path:`/admin/operations/config?carrier_account_id=${encodeURIComponent(e)}`}}return null}a(y,"selectedCommand");async function h(t,n){const e=y(t,n);if(!e)return null;if(e.action==="show")return n.api("GET",e.path);const o=m(await n.input(),n),r=e.scope==="carrier"?"conta ativa":`carrier ${e.target}`;return await n.confirm(`Alterar configura\xE7\xE3o operacional da ${r}? Campos: ${Object.keys(o).join(", ")}`,e.target),n.api("PUT",e.path,o)}a(h,"operationsConfigCommand");export{h as operationsConfigCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var h=Object.defineProperty;var u=(n,e)=>h(n,"name",{value:e,configurable:!0});import{appendLocalFile as g}from"../local-file.js";import{jsonBody as p,query as y,requireRole as l}from"./operational-input.js";const $={".csv":"text/csv",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".pdf":"application/pdf"},b=["destination_address","destination_street","destination_number","destination_neighborhood","destination_city","destination_state","destination_postal_code","destination_complement","recipient_name","recipient_phone","nfe_key"],w=["legal_name","trading_name","document","issuing_country_code","legal_identifier"],T=["market_id","code","name","origin_address","origin_lat","origin_lng","postal_code","place_id","street","street_number","neighborhood","city","state","state_code","country","country_code","currency_code","geocode_provider","timezone","triage_rules","balancing_policy","metadata"];function m(n,e,i){return new URLSearchParams(y(n,e,i).slice(1))}u(m,"options");async function _(n,e,i){const o=new FormData;await g(o,"file",n,$,28e7,i);for(const[a,d]of Object.entries(e))o.append(a,typeof d=="object"?JSON.stringify(d):String(d));return o}u(_,"importFile");async function c(n,e,i,o){const a=i?{carrier_account_id:i}:{};if(n[0]==="list"&&n.length===1)return o.api("GET",`${e}${i?`?carrier_account_id=${i}`:""}`);if(n[0]==="create"&&n.length===1){const r=p(await o.input(),w,["legal_name"],o);return!r.document&&!(r.issuing_country_code&&r.legal_identifier)&&o.fail("INPUT","Informe document ou issuing_country_code e legal_identifier",422),await o.confirm(`Criar ou reutilizar o embarcador ${r.legal_name}?`,r.legal_name),o.api("POST",e,{...r,...a},{withStatus:!0})}const d=o.uuid(n[0]),t=`${e}/${d}/bases`;if(n[1]==="bases"&&n[2]==="list"&&n.length===3)return o.api("GET",`${t}${i?`?carrier_account_id=${i}`:""}`);if(n[1]==="bases"&&n[2]==="create"&&n.length===3){const r=p(await o.input(),T,["code","name"],o);return r.market_id&&o.uuid(r.market_id),await o.confirm(`Criar ou reutilizar a base ${r.name} do embarcador ${d}?`,d),o.api("POST",t,{...r,...a},{withStatus:!0})}o.fail("USAGE","Use genne help carrier shippers",2)}u(c,"managedShippers");async function S(n,e,i){const o=`/${n}/shipper-order-imports`;if(e[0]==="preview"&&e.length>=2){const t=m(e.slice(2),["shipper_id","base_id"],i),r=await _(e[1],Object.fromEntries(t),i);return i.api("POST",`${o}/preview`,r)}if(e[0]==="create"&&e.length===2){const t=n==="shipper"?["base_id"]:["shipper_id","base_id"],r=p(await i.input(),["shipper_id","base_id","column_mapping","import_context"],t,i);for(const s of["shipper_id","base_id"])r[s]&&i.uuid(r[s]);for(const s of["column_mapping","import_context"])r[s]!==void 0&&(!r[s]||typeof r[s]!="object"||Array.isArray(r[s]))&&i.fail("INPUT",`${s} deve ser um objeto`,422);const f=await _(e[1],r,i);return await i.confirm(`Iniciar importa\xE7\xE3o de ${f.get("file").name} para a base ${r.base_id}?`,r.base_id),i.api("POST",o,f,{withStatus:!0})}const a=i.uuid(e[0]),d=`${o}/${a}`;if(e[1]==="show"){const t=m(e.slice(2),["include_orders"],i);return t.has("include_orders")&&!["true","false"].includes(t.get("include_orders"))&&i.fail("INPUT","include_orders deve ser true ou false",422),i.api("GET",`${d}${t.size?`?${t}`:""}`)}if(e[1]==="source-preview"&&e.length===2)return i.api("GET",`${d}/source-preview`);if(e[1]==="orders"&&e[2]==="list"){const t=m(e.slice(3),["limit","cursor","search","geocode_status","only_errors"],i);return t.has("only_errors")&&!["true","false"].includes(t.get("only_errors"))&&i.fail("INPUT","only_errors deve ser true ou false",422),i.api("GET",`${d}/orders${t.size?`?${t}`:""}`)}if(e[1]==="orders"&&e[3]==="update"&&e.length===4){const t=i.uuid(e[2]),r=p(await i.input(),b,[],i);return Object.keys(r).length||i.fail("INPUT","Informe ao menos um campo do pedido",422),await i.confirm(`Corrigir o pedido ${t} da importa\xE7\xE3o ${a}?`,t),i.api("PATCH",`${d}/orders/${t}`,{order:r})}if(e[1]==="remap"&&e.length===2){const t=p(await i.input(),["column_mapping","import_context"],[],i);return(!Object.keys(t).length||Object.values(t).some(r=>!r||typeof r!="object"||Array.isArray(r)))&&i.fail("INPUT","Informe column_mapping ou import_context como objeto",422),await i.confirm(`Reenfileirar a importa\xE7\xE3o ${a} com novo mapeamento?`,a),i.api("POST",`${d}/remap`,t,{withStatus:!0})}if(e[1]==="requeue-geocode"&&e.length===2)return await i.confirm(`Reenfileirar geocode da importa\xE7\xE3o ${a}?`,a),i.api("POST",`${d}/requeue-geocode`,void 0,{withStatus:!0});i.fail("USAGE",`Use genne help ${n} orders imports`,2)}u(S,"imports");async function P(n,e){if(n[0]!=="batches"&&e.fail("USAGE","Use genne help admin triage",2),n[1]==="list"&&n.length>=2){const a=m(n.slice(2),["limit","cursor","search"],e);return e.api("GET",`/admin/triage/batches${a.size?`?${a}`:""}`)}const i=e.uuid(n[1]),o=`/admin/triage/batches/${i}`;if(n[2]==="show"&&n.length===3)return e.api("GET",o);if(n[2]==="run"&&n.length===3)return await e.confirm(`Executar triagem do lote ${i}?`,i),e.api("POST",`${o}/run`,void 0,{withStatus:!0});if(n[2]==="orders"&&n[4]==="update"&&n.length===5){const a=e.uuid(n[3]),d=p(await e.input(),["destination_address","destination_lat","destination_lng"],["destination_address"],e);return await e.confirm(`Corrigir o pedido ${a} do lote ${i}?`,a),e.api("PATCH",`${o}/orders/${a}`,d)}e.fail("USAGE","Use genne help admin triage",2)}u(P,"triage");async function v(n,e){const i=n[0];if(i==="carrier"&&n[1]==="shippers")return l(e,["carrier"]),c(n.slice(2),"/carrier/shippers",null,e);if(i==="admin"&&n[1]==="operations"&&n[3]==="shippers")return l(e,["admin"]),c(n.slice(4),"/admin/carrier-shippers",e.uuid(n[2]),e);if(i==="admin"&&n[1]==="triage")return l(e,["admin"]),P(n.slice(2),e);if(["admin","carrier"].includes(i)&&(i==="admin"?n[1]==="operations"&&n[3]==="status-outbox":n[1]==="status-outbox")){l(e,[i]);const o=i==="admin"?e.uuid(n[2]):null,a=m(n.slice(i==="admin"?4:2),["sink_type","shipper_id","adapter_type"],e);return o&&a.set("carrier_account_id",o),a.has("sink_type")&&!["webhook","ocoren","adapter"].includes(a.get("sink_type"))&&e.fail("INPUT","sink_type inv\xE1lido",422),e.api("GET",`/${i}/status-outbox${a.size?`?${a}`:""}`)}if(!["admin","carrier","shipper"].includes(i)||n[1]!=="orders")return null;if(n[2]==="imports")return l(e,[i]),S(i,n.slice(3),e);if(n[3]==="retry-geocode"&&n.length===4){l(e,[i]);const o=e.uuid(n[2]),a=p(await e.input(),["raw_address"],["raw_address"],e);return(typeof a.raw_address!="string"||a.raw_address.trim().length<3)&&e.fail("INPUT","raw_address deve ter ao menos tr\xEAs caracteres",422),await e.confirm(`Reexecutar geocode do pedido ${o}?`,o),e.api("POST",`/${i}/deliveries/orders/${o}/retry_geocode`,a)}return null}u(v,"ordersCommand");export{v as ordersCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var v=Object.defineProperty;var _=(o,i)=>v(o,"name",{value:i,configurable:!0});import{jsonBody as u,query as l,requireRole as m}from"./operational-input.js";const w=["batch_id","shipper_account_id","base_id"];function f(o,i){const e=l(o,w,i),d=new URLSearchParams(e.slice(1));return!d.has("batch_id")&&!(d.has("shipper_account_id")&&d.has("base_id"))&&i.fail("INPUT","Informe batch_id ou shipper_account_id e base_id",422),e}_(f,"scopedQuery");async function g(o,i){const[e,d,t,n]=o;if(!["admin","carrier","shipper"].includes(e)||!["routes","route-candidates","workbench","tower"].includes(d))return null;if(m(i,[e]),d==="routes"){const s=e==="admin"?"/admin/logistics/routes":`/${e}/operational-routes`;if(t==="list"){const c=e==="admin"?["limit","cursor","source_type","status","operation_mode","search"]:e==="carrier"?["limit","cursor","status","search","shipper_id","base_id"]:["limit","cursor","status","search","base_id"];return i.api("GET",`${s}${l(o.slice(3),c,i)}`)}const r=i.uuid(t),a=`${s}/${r}`;if(n==="show"&&o.length===4)return i.api("GET",a);if(e==="admin"&&["assign-driver","pause","cancel","reopen","occurrence"].includes(n)&&o.length===4){const c=n==="assign-driver"?["driver_user_id","reason"]:["reason","notes","occurrence_type"],h=n==="assign-driver"?["driver_user_id"]:n==="occurrence"?["notes"]:[],p=u(await i.input(),c,h,i);p.driver_user_id&&i.uuid(p.driver_user_id);const b=await i.api("GET",a);return await i.confirm(`${n} rota ${r}? Estado atual: ${b.data?.status??"desconhecido"}`,r),i.api("POST",`${a}/${n==="occurrence"?"occurrences":n}`,p)}if(e==="carrier"&&n==="assign-driver"&&o.length===4){const c=u(await i.input(),["driver_user_id"],["driver_user_id"],i);return i.uuid(c.driver_user_id),await i.confirm(`Atribuir motorista \xE0 rota ${r}?`,r),i.api("POST",`/carrier/routes/${r}/assign-driver`,c)}}if(d==="route-candidates"){if(t==="list"){if(e==="carrier"&&o.length===3)return i.api("GET","/carrier/routes");if(e==="carrier"&&i.fail("USAGE","A listagem de candidatos carrier n\xE3o aceita filtros",2),e==="shipper")return i.api("GET",`/shipper/routes${l(o.slice(3),["base_id","status"],i)}`);i.fail("USAGE","A listagem de candidatos est\xE1 dispon\xEDvel para carrier e shipper",2)}const s=i.uuid(t),r=`/${e}/route-candidates/${s}`;if(n==="publish"&&o.length===4){const a=u(await i.input(),["override","reason"],[],i);return a.override!==void 0&&typeof a.override!="boolean"&&i.fail("INPUT","override deve ser booleano",422),a.override===!0&&(typeof a.reason!="string"||!a.reason.trim())&&i.fail("INPUT","override exige reason",422),await i.confirm(`Publicar candidato ${s}?`,s),i.api("POST",`${r}/publish`,a)}if(["admin","shipper"].includes(e)&&n==="reassign-stop"&&o.length===4){const a=u(await i.input(),["stop_id","target_route_candidate_id","reason"],["stop_id","target_route_candidate_id"],i);return i.uuid(a.stop_id),i.uuid(a.target_route_candidate_id),await i.confirm(`Realocar ponto no candidato ${s}?`,s),i.api("POST",`${r}/reassign-stop`,a)}if(["admin","shipper"].includes(e)&&n==="ai-assist"&&o.length===4){const a=u(await i.input(),["objective"],e==="admin"?["objective"]:[],i);return a.objective!==void 0&&(typeof a.objective!="string"||!a.objective.trim())&&i.fail("INPUT","objective deve ser texto n\xE3o vazio",422),await i.confirm(`Solicitar assist\xEAncia para o candidato ${s}?`,s),i.api("POST",`${r}/ai-assist`,a,{withStatus:!0})}if(e==="admin"&&n==="assign-driver"&&o.length===4){const a=u(await i.input(),["carrier_account_id","driver_user_id"],["carrier_account_id","driver_user_id"],i);return i.uuid(a.carrier_account_id),i.uuid(a.driver_user_id),await i.confirm(`Atribuir motorista ao candidato ${s}?`,s),i.api("POST",`${r}/assign-driver`,a)}}if(d==="workbench"){const s=`/${e}/route-workbench`;if(t==="scopes"&&o.length===3)return i.api("GET",`${s}/scopes`);if(t==="show")return i.api("GET",`${s}${f(o.slice(3),i)}`);if(t==="run"&&o.length===3){const r=u(await i.input(),["shipper_account_id","base_id"],["shipper_account_id","base_id"],i);return i.uuid(r.shipper_account_id),i.uuid(r.base_id),await i.confirm(`Executar workbench da base ${r.base_id}?`,r.base_id),i.api("POST",`${s}/run`,r,{withStatus:!0})}if(t==="refresh-quotation"&&o.length===3){const r=u(await i.input(),["shipper_account_id","base_id"],["shipper_account_id","base_id"],i);return i.uuid(r.shipper_account_id),i.uuid(r.base_id),await i.confirm(`Atualizar cota\xE7\xE3o da base ${r.base_id}?`,r.base_id),i.api("POST",`${s}/refresh-quotation`,r,{withStatus:!0})}}if(d==="tower"){if(t==="cockpit")return i.api("GET",`/${e}/logistics/cockpit${f(o.slice(3),i)}`);if(e==="admin"&&t==="overview"&&o.length===3)return i.api("GET","/admin/logistics/control-center");if(e==="admin"&&t==="failure-reasons"&&n==="catalog"&&o.length===4)return i.api("GET","/admin/control-tower/failure-reasons/catalog")}i.fail("USAGE","Use: routes list|ROUTE_ID show|assign-driver; route-candidates list|CANDIDATE_ID publish|reassign-stop|ai-assist|assign-driver; workbench scopes|show|run|refresh-quotation; tower cockpit|overview|failure-reasons catalog|catalog-global",2)}_(g,"routesCommand");export{g as routesCommand};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var p=Object.defineProperty;var l=(e,a)=>p(e,"name",{value:a,configurable:!0});function u(e,a,t){const o=new URLSearchParams;for(const s of e){const r=s.indexOf("="),n=s.slice(0,r),i=s.slice(r+1);(r<1||!a.includes(n)||!i||o.has(n))&&t.fail("USAGE",`Filtro n\xE3o suportado: ${s}`,422),n==="status"&&!["open","closed"].includes(i)&&t.fail("INPUT","Status inv\xE1lido",422),n==="limit"&&(!/^\d+$/.test(i)||Number(i)<1||Number(i)>100)&&t.fail("INPUT","Limit deve estar entre 1 e 100",422),o.set(n,i)}return o.size?`?${o}`:""}l(u,"query");async function f(e,a){if(e[0]!=="admin"||e[1]!=="support")return null;if(a.requireRole("admin"),e[2]!=="threads"&&a.fail("USAGE","Use: genne admin support threads list|THREAD_ID messages|reply|close|reopen",2),e[3]==="list")return a.api("GET",`/admin/support/threads${u(e.slice(4),["status","limit","cursor"],a)}`);const t=a.uuid(e[3]),o=`/admin/support/threads/${t}/messages`;if(e[4]==="messages")return a.api("GET",`${o}${u(e.slice(5),["limit","cursor"],a)}`);if(["close","reopen"].includes(e[4])&&e.length===5){const s=await a.api("GET",`${o}?limit=100`),r=s?.data?.thread;(r?.id!==t||!["open","closed"].includes(r.status)||!Array.isArray(s?.data?.messages?.data))&&a.fail("RESPONSE","Resposta inv\xE1lida da API");const n=e[4]==="close"?"closed":"open";await a.confirm(`Alterar atendimento ${t} de ${r.status} para ${n}?`,t);const i=await a.api("PATCH",`/admin/support/threads/${t}`,{status:n}),d=i?.data?.thread??i?.data;return(d?.id!==t||d.status!==n)&&a.fail("RESPONSE","Resposta inv\xE1lida da API"),{data:{id:d.id,status:d.status}}}if(e[4]==="reply"&&e.length===5){const s=await a.input();(!s||typeof s!="object"||Array.isArray(s)||Object.keys(s).length!==1||typeof s.body!="string"||!s.body.trim()||s.body.length>4e3)&&a.fail("INPUT","Informe somente body com 1 a 4000 caracteres em JSON pelo stdin",422);const r=await a.api("GET",`${o}?limit=100`);(r?.data?.thread?.id!==t||!Array.isArray(r?.data?.messages?.data))&&a.fail("RESPONSE","Resposta inv\xE1lida da API"),await a.confirm(`Responder \xE0 conversa ${t}?
|
|
2
|
+
${JSON.stringify({conversation:r.data,reply:s.body},null,2)}`,t);const n=await a.api("POST",o,s),i=n?.data?.thread,d=n?.data?.message;return(!i?.id||!d?.id)&&a.fail("RESPONSE","Resposta inv\xE1lida da API"),{data:{thread:{id:i.id,status:i.status},message:{id:d.id,author_role:d.author_role,inserted_at:d.inserted_at}}}}a.fail("USAGE","Use: genne admin support threads list|THREAD_ID messages|reply|close|reopen",2)}l(f,"supportCommand");export{f as supportCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var c=Object.defineProperty;var f=(r,e)=>c(r,"name",{value:e,configurable:!0});import{jsonBody as l,query as _,requireRole as m}from"./operational-input.js";async function $(r,e){const[a,p,n,t,d,u]=r;if(p!=="tower"||!["driver","carrier","shipper","admin"].includes(a))return null;if(m(e,[a]),a==="driver"&&["validate","assist","fallback"].includes(n)&&r.length===3){const o=n==="validate"?["nf_key","reason"]:n==="assist"?["assist_token","reason","force_refresh"]:["document","reason","force_refresh"],i=[n==="validate"?"nf_key":n==="assist"?"assist_token":"document"],s=l(await e.input(),o,i,e);return await e.confirm(`Consultar torre de controle (${n})?`,n),e.api("POST",`/control-tower/${n}`,s)}if(a==="driver"&&n==="queries"&&d==="show"&&r.length===5)return e.api("GET",`/control-tower/queries/${e.uuid(t)}`);if(["driver","carrier","admin"].includes(a)&&n==="chat"){const o=a==="admin"?"/admin/control-tower/chat/threads":"/control-tower/chat/threads";if(a==="admin"&&t==="threads"&&r.length===4)return e.api("GET",o);if(a!=="admin"&&t==="open"&&r.length===4){const i=l(await e.input(),["route_id","waypoint_id","driver_user_id"],["route_id","waypoint_id"],e);return e.uuid(i.route_id),e.uuid(i.waypoint_id),i.driver_user_id&&e.uuid(i.driver_user_id),await e.confirm(`Abrir chat da parada ${i.waypoint_id}?`,i.waypoint_id),e.api("POST",o,i)}if(t==="thread"&&d&&r.length>=6){const i=e.uuid(d);if(u==="messages"&&r.length===6)return e.api("GET",`${o}/${i}/messages`);if(u==="send"&&r.length===6){const s=l(await e.input(),["body","message_type","metadata"],["body"],e);return await e.confirm(`Enviar mensagem \xE0 thread ${i}?`,i),e.api("POST",`${o}/${i}/messages`,s)}if(["carrier","admin"].includes(a)&&u==="authorize"&&r.length===6)return await e.confirm(`Gerar c\xF3digo de autoriza\xE7\xE3o da thread ${i}?`,i),e.api("POST",`${o}/${i}/authorization-codes`,{})}}if(n==="failure-reasons"){if(t==="catalog-global"&&r.length>=4)return e.api("GET",`/failure-reasons/catalog${_(r.slice(4),["search"],e)}`);if(["carrier","shipper"].includes(a)&&t==="policy"){const o=`/${a}/failure-reason-policy`;if(d==="show"&&r.length===5)return e.api("GET",o);if(d==="set"&&r.length===5){const i=l(await e.input(),["reason_codes"],["reason_codes"],e);return(!Array.isArray(i.reason_codes)||i.reason_codes.some(s=>typeof s!="string"))&&e.fail("INPUT","reason_codes inv\xE1lidos",422),await e.confirm(`Alterar policy de insucesso ${a}?`,a),e.api("PUT",o,i)}}if(a==="admin"&&["shippers","carriers"].includes(t)&&d&&u){const o=e.uuid(d),i=`/admin/control-tower/failure-reasons/${t}/${o}/policy`;if(u==="show"&&r.length===6)return e.api("GET",i);if(u==="set"&&r.length===6){const s=l(await e.input(),["reason_codes"],["reason_codes"],e);return(!Array.isArray(s.reason_codes)||s.reason_codes.some(h=>typeof h!="string"))&&e.fail("INPUT","reason_codes inv\xE1lidos",422),await e.confirm(`Alterar policy de insucesso ${o}?`,o),e.api("PUT",i,s)}}}return null}f($,"towerCommand");export{$ as towerCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var T=Object.defineProperty;var c=(r,e)=>T(r,"name",{value:e,configurable:!0});import{projectDriverProfile as I}from"./driver.js";const O=["id","public_id","name","email","phone","vehicle_type","navigation_app_preference","display_timezone","role","roles","admin_access_level","is_internal","status","primary_phone","profile_photo_url","registration_market_code","inserted_at"],b=["operation_base","operation_state","operation_city","operation_region","operation_notes","work_status","work_status_active","has_vehicle","vehicle_profile","vehicle_plate_state","vehicle_plate_city","vehicle_fleet_number","vehicle_axle_count","vehicle_bodywork"];function m(r){return!r||typeof r!="object"||Array.isArray(r)?r:Object.fromEntries(O.filter(e=>e in r).map(e=>[e,r[e]]))}c(m,"projectUser");function h(r){return!r||typeof r!="object"?r:Array.isArray(r.data)?{...r,data:r.data.map(m)}:r.data&&typeof r.data=="object"?{...r,data:m(r.data)}:r}c(h,"projectEnvelope");function P(r){if(!Array.isArray(r?.data))return r;const e=["id","user_id","name","email","primary_phone","status","context_items","inserted_at"];return{...r,data:r.data.map(i=>Object.fromEntries(e.filter(t=>t in i).map(t=>[t,i[t]])))}}c(P,"projectDriverDirectory");function U(r){return Object.fromEntries(["link_id","id","name","email","phone","status","base_ids"].filter(i=>i in r).map(i=>[i,r[i]]))}c(U,"projectCarrierDriver");function j(r){const e=r?.data;if(!e||typeof e!="object")return r;const i=["id","updated_at",...b];return{...r,data:{...Object.fromEntries(i.filter(t=>t in e).map(t=>[t,e[t]])),user:m(e.user)}}}c(j,"projectOperationalProfile");function k(r){return!r||typeof r!="object"||!r.data||typeof r.data!="object"?r:{...r,data:Object.fromEntries(["id","carrier_account_id","driver_user_id","active","base_ids","eligible_bases","uses_compatibility_fallback"].filter(i=>i in r.data).map(i=>[i,r.data[i]]))}}c(k,"projectDriverLinkEnvelope");function w(r){return Object.fromEntries(["id","carrier_account_id","link_id","name","legal_name","trading_name","status","active","bases"].filter(i=>i in r).map(i=>[i,r[i]]))}c(w,"projectOwnCarrier");function _(r,e,i,t,n=new Set){if(e.length===0)return r;const[a,o]=r.split("?"),d=new URLSearchParams(o);for(const s of e){const p=s.indexOf("="),u=p<1?s:s.slice(0,p);(p<1||!t.has(u)||n.has(u))&&i.fail("USAGE",`Filtro n\xE3o suportado: ${u}`,422),d.set(u,s.slice(p+1))}const f=d.toString();return f?`${a}?${f}`:a}c(_,"queryPath");const $=new Set(["name","email","password","phone","registration_market_code"]);function y(r,e){if(!r||typeof r!="object"||Array.isArray(r))return null;const t=Object.fromEntries(["id","status","created_at","expires_at","responded_at","cancelled_at"].filter(n=>typeof r[n]=="string"||r[n]===null).map(n=>[n,r[n]]));if(e&&typeof r.cpf_masked=="string"&&/^\*{3}\.\*{3}\.\*{3}-\d{2}$/.test(r.cpf_masked)&&(t.cpf_masked=r.cpf_masked),r.carrier&&typeof r.carrier=="object"&&!Array.isArray(r.carrier)){const n=["id","name","trading_name","legal_name","cnpj","logo_url"];t.carrier=Object.fromEntries(n.filter(a=>typeof r.carrier[a]=="string"||r.carrier[a]===null).map(a=>[a,r.carrier[a]]))}return t}c(y,"projectInvitation");function l(r,e){return{data:Array.isArray(r?.data)?r.data.map(i=>y(i,e)):y(r?.data,e),...r?.meta?{meta:{next_cursor:r.meta.next_cursor,has_more:r.meta.has_more}}:{}}}c(l,"invitationEnvelope");function A(r,e,i){const t=e?["cpf","idempotency_key"]:["idempotency_key"];return(!r||typeof r!="object"||Array.isArray(r)||Object.keys(r).some(n=>!t.includes(n))||typeof r.idempotency_key!="string"||!r.idempotency_key.isWellFormed()||r.idempotency_key.includes("\0")||r.idempotency_key.length===0||[...r.idempotency_key].length>128||e&&(typeof r.cpf!="string"||!r.cpf.trim()))&&i.fail("INPUT","Informe JSON em stdin com idempotency_key (Unicode v\xE1lido sem U+0000, 1 a 128 codepoints) e, para create, cpf; outros campos n\xE3o s\xE3o aceitos",422),r}c(A,"invitationInput");function E(r,e){return/^[\x20-\x7e]+$/.test(e)&&!e.startsWith(" ")&&!e.endsWith(" ")?{body:r,options:{idempotencyKey:e}}:{body:{...r,idempotency_key:e},options:{}}}c(E,"invitationMutation");function R(r,e){(!r||typeof r!="object"||Array.isArray(r))&&e.fail("INPUT","A entrada deve ser um objeto JSON",422);const i=Object.keys(r).filter(t=>!$.has(t));i.length&&e.fail("INPUT",`Campo n\xE3o permitido: ${i[0]}`,422);for(const t of["name","email","password","phone","registration_market_code"])(typeof r[t]!="string"||!r[t].trim())&&e.fail("INPUT",`Campo obrigat\xF3rio: ${t}`,422);return["BR","US"].includes(r.registration_market_code)||e.fail("INPUT","Informe registration_market_code como BR ou US",422),/^\+[1-9]\d{7,14}$/.test(r.phone)||e.fail("INPUT","Telefone deve usar formato E.164",422),r}c(R,"registerInput");function S(r){if(!r||typeof r!="object"||Array.isArray(r))return r;const i=Object.fromEntries(["id","public_id","name","email","role","primary_phone","registration_market_code"].filter(t=>t in r).map(t=>[t,r[t]]));return r.market_context&&typeof r.market_context=="object"&&(i.market_context={market_code:r.market_context.market_code,currency_code:r.market_context.currency_code}),i}c(S,"projectRegisteredUser");function N(r){if(!r||typeof r!="object")return r;const e={...r};return r.data&&typeof r.data=="object"&&(e.data=S(r.data)),r.meta&&typeof r.meta=="object"&&(e.meta={requires_billing:r.meta.requires_billing,billing_coupon_code:r.meta.billing_coupon_code,billing_plan_slug:r.meta.billing_plan_slug}),e}c(N,"projectRegisterEnvelope");async function D(r,e){if(r[0]!=="users")return null;if(r[3]==="invitations"&&(r[1]==="carrier"&&r[2]==="drivers"||r[1]==="driver"&&r[2]==="carriers")){const i=r[1]==="carrier";e.requireRole(r[1]);const t=i?"/carrier/driver-invitations":"/driver/carrier-invitations",n=c((a,o,d,f)=>e.api(a,o,d,{...f,invitationErrorProjection:c(s=>y(s,i),"invitationErrorProjection")}),"api");if(r[4]==="list"){const a=_(t,r.slice(5),e,new Set(["status","limit","cursor"])),o=new URLSearchParams(a.split("?")[1]);return(o.has("status")&&!["pending","accepted","declined","cancelled","expired"].includes(o.get("status"))||o.has("limit")&&(!/^\d+$/.test(o.get("limit"))||Number(o.get("limit"))<1||Number(o.get("limit"))>100))&&e.fail("INPUT","status deve ser pending|accepted|declined|cancelled|expired; limit deve estar entre 1 e 100",422),l(await n("GET",a),i)}if(r[4]==="show"&&r.length===6)return l(await n("GET",`${t}/${e.uuid(r[5])}`),i);if(i&&r[4]==="create"&&r.length===5){const a=A(await e.input(),!0,e);await e.confirm("Enviar convite de v\xEDnculo ao motorista? O v\xEDnculo depende do aceite.","invite");const o=E({cpf:a.cpf},a.idempotency_key);return l(await n("POST",t,o.body,o.options),!0)}if(r.length===6&&(i?r[4]==="cancel":["accept","decline"].includes(r[4]))){const a=e.uuid(r[5]),o=A(await e.input(),!1,e),d=r[4];await e.confirm(`${d==="cancel"?"Cancelar":d==="accept"?"Aceitar":"Recusar"} o convite ${a}?`,a);const s=E(i?{}:{decision:d},o.idempotency_key);return l(await n("POST",`${t}/${a}/${i?"cancel":"respond"}`,s.body,s.options),i)}return null}if(r.length===3&&r[1]==="driver"&&r[2]==="register"){const i=R(await e.input(),e),t=await e.api("POST","/auth/register",{...i,role:"driver"},{clientPlatform:"genne-cli"});return N(t)}if(r.length===2&&r[1]==="me")return{data:m(e.user)};if(r.length===3&&r[1]==="driver"&&r[2]==="profile"){e.requireRole("driver");const i=await e.api("GET","/driver/profile");return i?.data?{...i,data:I(i.data)}:i}if(r[1]==="driver"&&r[2]==="carriers"){if(e.requireRole("driver"),r.length===4&&r[3]==="list"){const i=await e.api("GET","/driver/carriers");return Array.isArray(i?.data?.carriers)?{...i,data:{...i.data,carriers:i.data.carriers.map(w)}}:i}if(r.length===4&&r[3]==="link"){const i=await e.input();if(!i||typeof i!="object"||Array.isArray(i)||Object.keys(i).length!==1||typeof i.driver_link_code!="string"||!/^[A-Za-z0-9]{5}$/.test(i.driver_link_code))return e.fail("INPUT","Informe driver_link_code com cinco caracteres em stdin",422);await e.confirm("Vincular sua conta \xE0 transportadora desse c\xF3digo?","link");const t=await e.api("POST","/driver/carriers/link-code",i);return t?.data?{...t,data:w(t.data)}:t}if(r.length===5&&r[3]==="unlink"){const i=e.uuid(r[4]);return await e.confirm(`Remover o v\xEDnculo com a transportadora ${i}?`,i),e.api("DELETE",`/driver/carriers/${i}`)}if(r.length===4&&r[3]==="preference"){const i=await e.input();if(!i||typeof i!="object"||Array.isArray(i)||Object.keys(i).some(n=>!["preference","carrier_account_id"].includes(n))||!["independent_driver","carrier_direct"].includes(i.preference))return e.fail("INPUT","Prefer\xEAncia de rota inv\xE1lida",422);if(i.preference==="carrier_direct"&&!i.carrier_account_id)return e.fail("INPUT","Informe carrier_account_id",422);if(i.preference==="independent_driver"&&i.carrier_account_id!=null)return e.fail("INPUT","carrier_account_id n\xE3o se aplica",422);const t=i.carrier_account_id?e.uuid(i.carrier_account_id):null;return await e.confirm(`Alterar a prefer\xEAncia de rota para ${i.preference}?`,i.preference),e.api("PUT","/driver/carriers/route-preference",{preference:i.preference,...t?{carrier_account_id:t}:{}})}}if(r[1]==="admin"&&r[2]==="list")return e.requireRole("admin"),h(await e.api("GET",_("/admin/users",r.slice(3),e,new Set(["limit","cursor","role","search"]))));if(r[1]==="admin"&&r[2]==="show"&&r.length===4)return e.requireRole("admin"),h(await e.api("GET",`/admin/users/${e.uuid(r[3])}`));if(r[1]==="admin"&&r[2]==="driver-profile"&&r.length===5){e.requireRole("admin");const i=e.uuid(r[3]),t=`/admin/drivers/${i}/operational-profile`;if(r[4]==="show")return j(await e.api("GET",t));if(r[4]==="update"){const n=await e.input();return!n||typeof n!="object"||Array.isArray(n)||Object.keys(n).some(a=>!["profile","reason"].includes(a))||typeof n.reason!="string"||!n.reason.trim()||!n.profile||typeof n.profile!="object"||Array.isArray(n.profile)||Object.keys(n.profile).length===0||Object.keys(n.profile).some(a=>!b.includes(a))?e.fail("INPUT","Informe profile com campos operacionais e reason; documentos e dados banc\xE1rios n\xE3o s\xE3o aceitos",422):(await e.confirm(`Corrigir o perfil operacional do motorista ${i}?`,i),j(await e.api("PATCH",t,n)))}}if(r[1]==="drivers"&&r[2]==="list")return e.requireRole("admin"),P(await e.api("GET",_("/admin/directory?subject=drivers",r.slice(3),e,new Set(["limit","cursor","search","status","carrier_account_id","shipper_account_id"]))));if(r[1]==="carrier"&&r[2]==="drivers"&&r[3]==="list"){e.requireRole("carrier");const i=await e.api("GET",_("/carrier/drivers",r.slice(4),e,new Set(["limit","cursor","search","base_id"])));return{...i,data:i.data.map(U)}}if(r[1]==="carrier"&&r[2]==="drivers"&&r[3]==="link"&&r.length>=5){e.requireRole("carrier");const i=e.uuid(r[4]),t=`/carrier/drivers/${i}/link`;if(r.length===5)return k(await e.api("GET",t));if(r.length===6&&r[5]==="set-bases"){const n=await e.input();if(!n||typeof n!="object"||Array.isArray(n)||Object.keys(n).some(o=>o!=="base_ids")||!Array.isArray(n.base_ids))return e.fail("INPUT","O corpo deve conter base_ids como lista",422);const a=n.base_ids.map(o=>e.uuid(o));return await e.confirm(`Alterar as bases do motorista ${i}?`,i),k(await e.api("PUT",t,{base_ids:a}))}}return null}c(D,"usersCommand");export{D as usersCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var i=Object.defineProperty;var s=(r,e)=>i(r,"name",{value:e,configurable:!0});import{currentRequestSignal as a}from"./request-scope.js";function g(r=fetch){return(e,n={})=>{const t=[AbortSignal.timeout(15e3)],o=a();return o&&t.push(o),n.signal&&t.push(n.signal),r(e,{...n,redirect:"error",signal:AbortSignal.any(t)})}}s(g,"bindCoreFetch");export{g as bindCoreFetch};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var _=Object.defineProperty;var c=(i,n)=>_(i,"name",{value:n,configurable:!0});import{apiOrigin as p,createApi as h,fail as o}from"./api.js";import{clearSession as w,saveSession as m,selectedOrigin as f}from"./session.js";const S=c(i=>new Promise(n=>setTimeout(n,i)),"wait");function N(i){i.protocol!=="https:"&&!["localhost","127.0.0.1","[::1]"].includes(i.hostname)&&o("CONFIG","Login exige HTTPS fora da m\xE1quina local")}c(N,"requireSecure");async function g(i,n,a){const r=await fetch(`${i}/api/v1${n}`,{method:"POST",redirect:"error",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify(a),signal:AbortSignal.timeout(15e3)});let e;try{e=await r.json()}catch{o("RESPONSE","Resposta inv\xE1lida da API")}return{response:r,result:e}}c(g,"post");async function E(i,n){const a=p(f(i));let r;try{r=await g(a,"/auth/device/authorization",{client_id:"genne-cli"})}catch(t){if(t.code)throw t;o("NETWORK","N\xE3o foi poss\xEDvel iniciar o login")}r.response.ok||o(`HTTP_${r.response.status}`,"N\xE3o foi poss\xEDvel iniciar o login",r.response.status);const e=r.result?.data;(typeof e?.device_code!="string"||!e.device_code||typeof e?.user_code!="string"||!/^[A-Z2-7]{4}-[A-Z2-7]{4}-[A-Z2-7]{4}$/.test(e.user_code)||typeof e?.verification_uri!="string"||!Number.isInteger(e?.expires_in)||e.expires_in<1||!Number.isInteger(e?.interval)||e.interval<1)&&o("RESPONSE","Resposta inv\xE1lida da API");let s;try{s=new URL(e.verification_uri)}catch{o("RESPONSE","URL de verifica\xE7\xE3o inv\xE1lida")}N(s),(s.username||s.password||s.hash)&&o("RESPONSE","URL de verifica\xE7\xE3o inv\xE1lida"),n({verification_uri:s.href,user_code:e.user_code,expires_in:e.expires_in});const v=Date.now()+e.expires_in*1e3;let d=e.interval*1e3;for(;Date.now()+d<v;){await S(d);let t;try{t=await g(a,"/auth/device/token",{device_code:e.device_code,client_id:"genne-cli"})}catch(u){if(u.code)throw u;d=Math.min(d+5e3,3e4);continue}if(t.response.ok)return await m(i,a,t.result?.data),{data:{authenticated:!0}};const l=t.result?.error||t.result?.error_code;if(l!=="authorization_pending"){if(l==="slow_down"){d+=5e3;continue}l==="access_denied"&&o("AUTH","Login recusado no navegador"),l==="expired_token"&&o("AUTH","C\xF3digo expirado; execute genne login novamente"),o(`HTTP_${t.response.status}`,"N\xE3o foi poss\xEDvel concluir o login",t.response.status)}}o("AUTH","C\xF3digo expirado; execute genne login novamente")}c(E,"deviceLogin");async function A(i){const n=p(f(i));try{return await h(i)("POST","/auth/logout"),{data:{revoked:"current"}}}catch(a){throw i.GENNE_ACCESS_TOKEN||(await w(i,n),o("AUTH","Credencial local removida; revoga\xE7\xE3o no Core n\xE3o confirmada")),a}}c(A,"deviceLogout");export{E as deviceLogin,A as deviceLogout};
|
package/src/global.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var J=Object.defineProperty;var c=(e,t)=>J(e,"name",{value:t,configurable:!0});import{execFileSync as N,spawnSync as B}from"node:child_process";import{existsSync as I,lstatSync as L,mkdirSync as g,mkdtempSync as M,readFileSync as d,readlinkSync as C,realpathSync as h,renameSync as y,rmSync as m,symlinkSync as w,writeFileSync as k}from"node:fs";import{homedir as F}from"node:os";import r from"node:path";import{fileURLToPath as z}from"node:url";const E="https://registry.npmjs.org",l="@genne/genne-cli",O=l.split("/")[0],j=h(z(import.meta.url)),x=3600*1e3,X=[["global install",`Instala latest de ${E} e os launchers genne, genne-cli e genne-mcp em ~/.local/bin; registry privado exige npm autenticado.`],["global update","Verifica latest e ativa uma instala\xE7\xE3o validada; os launchers tamb\xE9m verificam automaticamente a cada hora."],["global status","Mostra vers\xE3o, diret\xF3rios e pol\xEDtica de update da instala\xE7\xE3o global gerenciada, sem autentica\xE7\xE3o Core."]];function S(e){const t=e.HOME||F();return{root:r.resolve(e.GENNE_CLI_HOME||r.join(e.XDG_DATA_HOME||r.join(t,".local/share"),"genne-cli")),bin:r.resolve(e.GENNE_CLI_BIN_DIR||r.join(t,".local/bin"))}}c(S,"locations");function A(e){const t=JSON.parse(d(r.join(e,"node_modules",l,"package.json"),"utf8"));if(t.name!==l||typeof t.version!="string"||!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.test(t.version))throw new Error("Pacote CLI inv\xE1lido");return t}c(A,"manifest");function G(e,t){const o=A(e),a=JSON.parse(d(r.join(e,"package-lock.json"),"utf8")).packages?.[`node_modules/${l}`];if(o.version!==t.version||a?.version!==t.version||a?.integrity!==t.dist.integrity)throw new Error("A instala\xE7\xE3o n\xE3o corresponde \xE0 identidade latest selecionada")}c(G,"verifyInstallation");function $(e){try{const t=h(r.join(e,"current"));return{directory:t,version:A(t).version}}catch{return null}}c($,"current");function D(e,t){const o=`${e}.${process.pid}.tmp`;k(o,t,{mode:493}),y(o,e)}c(D,"atomicWrite");function q(e){const t=r.join(e,".update-lock"),o=`${process.pid}-${Date.now()}`;try{g(t)}catch(i){if(i.code==="EEXIST")return null;throw i}try{k(r.join(t,"owner.json"),JSON.stringify({pid:process.pid,token:o}))}catch(i){throw m(t,{recursive:!0,force:!0}),i}return()=>{try{JSON.parse(d(r.join(t,"owner.json"),"utf8")).token===o&&m(t,{recursive:!0,force:!0})}catch{}}}c(q,"lock");function T(e,t,o){try{return N("npm",e,{env:t,encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:o})}catch{throw new Error(`N\xE3o foi poss\xEDvel consultar ou instalar a CLI; confira rede e acesso de leitura a ${E}`)}}c(T,"npm");function P(e,t=r.join(e,"node_modules",l,"src/global.js")){const o=r.join(e,"launcher.mjs");I(o)||D(o,d(I(t)?t:j))}c(P,"prepareReleaseLauncher");function U(e,t,o){g(t,{recursive:!0});const i=r.join(e,"launcher.mjs");for(const n of["genne","genne-cli","genne-mcp"]){const u=r.join(t,n);try{if(!L(u).isSymbolicLink()||r.resolve(t,C(u))!==i)throw new Error(`O comando ${u} j\xE1 existe; escolha GENNE_CLI_BIN_DIR`)}catch(s){if(s.code!=="ENOENT")throw s}}o&&P(o.directory,j);let a=!1;try{a=L(i).isSymbolicLink()&&C(i)==="current/launcher.mjs"}catch(n){if(n.code!=="ENOENT")throw n}if(!a){const n=`${i}.${process.pid}.tmp`;w("current/launcher.mjs",n);try{y(n,i)}finally{m(n,{force:!0})}}for(const n of["genne","genne-cli","genne-mcp"]){const u=r.join(t,n);try{w(i,u)}catch(s){if(s.code!=="EEXIST")throw s}}}c(U,"prepareLauncher");function H(e,t=!1){const{root:o,bin:i}=S(e);g(o,{recursive:!0});const a=q(o);if(!a)throw new Error("Lock da CLI existente; outra atualiza\xE7\xE3o pode estar em andamento. Lock abandonado exige remo\xE7\xE3o manual ap\xF3s confirmar que n\xE3o h\xE1 updater ativo");let n;try{D(r.join(o,"checked-at"),String(Date.now()));const u=JSON.parse(T(["view",`${l}@latest`,"name","version","gitHead","dist.integrity","--json",`--${O}:registry=${E}`],e,1e4)),s={name:u?.name,version:u?.version,gitHead:u?.gitHead,dist:{integrity:u?.["dist.integrity"]}},{version:p}=s;if(s.name!==l||typeof p!="string"||!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.test(p)||typeof s.gitHead!="string"||!/^[a-f0-9]{40}$/i.test(s.gitHead)||typeof s.dist.integrity!="string"||!/^sha512-[A-Za-z0-9+/]{86}==$/.test(s.dist.integrity))throw new Error("Metadata latest inv\xE1lido ou incompleto");const f=$(o);if(f?.version===p)return G(f.directory,s),t&&U(o,i,f),{version:p,updated:!1};const v=r.join(o,"releases");g(v,{recursive:!0}),n=h(M(r.join(v,".staging-"))),k(r.join(n,"package.json"),'{"private":true}'),T(["install","--prefix",n,"--ignore-scripts","--no-audit","--no-fund","--package-lock=true",`--${O}:registry=${E}`,`${l}@${p}`],e,9e4),G(n,s);const R=r.join(n,"node_modules",l);N(process.execPath,[r.join(R,"src/cli.js"),"--help"],{env:e,stdio:"pipe",timeout:1e4}),N(process.execPath,["--input-type=module","-e",`const {createProductServer}=await import(${JSON.stringify(`${l}/src/mcp.js`)}); await createProductServer().close();`],{cwd:n,env:e,stdio:"pipe",timeout:1e4}),P(n),U(o,i,f);const b=r.join(v,`${p}-${r.basename(n).slice(9)}`);y(n,b),n=null;const _=r.join(o,`.current-${process.pid}`);w(r.relative(o,b),_);try{y(_,r.join(o,"current"))}finally{m(_,{force:!0})}return{version:p,updated:!0}}finally{n&&m(n,{recursive:!0,force:!0}),a()}}c(H,"update");function K(e,t=process.env){if(e.length===1&&["--help","help"].includes(e[0]))return{data:{query:"global",commands:X.map(([a,n])=>({usage:`genne ${a}`,roles:["public"],description:n}))}};if(e.length!==1||!["install","update","status"].includes(e[0]))throw new Error("Use genne global install|update|status");const{root:o,bin:i}=S(t);return e[0]!=="status"&&H(t,e[0]==="install"),{...$(o),root:o,bin:i,channel:"latest",auto_update:t.GENNE_CLI_AUTO_UPDATE!=="0",check_interval_ms:x}}if(c(K,"globalCommand"),process.argv[1]&&(r.basename(j)==="launcher.mjs"||h(process.argv[1])===j))try{let e=process.argv.slice(2);e.join(" ")==="help global"&&(e=["global","--help"]);const{root:t}=S(process.env);if(e[0]==="global")process.stdout.write(`${JSON.stringify(K(e.slice(1)))}
|
|
3
|
+
`);else{let o=0;try{o=Number(d(r.join(t,"checked-at"),"utf8"))}catch{}if(process.env.GENNE_CLI_AUTO_UPDATE!=="0"&&(!Number.isFinite(o)||o>Date.now()||Date.now()-o>=x))try{H(process.env)}catch{process.stderr.write(`genne: atualiza\xE7\xE3o autom\xE1tica falhou; usando a instala\xE7\xE3o anterior. Execute genne global update para tentar novamente.
|
|
4
|
+
`)}const i=$(t);if(!i)throw new Error("CLI gerenciada ausente; execute genne global install pelo pacote ou checkout");const a=r.basename(process.argv[1])==="genne-mcp"?"mcp.js":"cli.js",n=B(process.execPath,[r.join(i.directory,"node_modules",l,"src",a),...e],{stdio:"inherit"});if(n.error)throw n.error;n.signal?process.kill(process.pid,n.signal):process.exitCode=n.status??1}}catch(e){process.stderr.write(`${JSON.stringify({error:{code:"GLOBAL",message:e.message}})}
|
|
5
|
+
`),process.exitCode=1}export{K as globalCommand,X as globalHelp};
|
package/src/help.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var v=Object.defineProperty;var n=(e,r)=>v(e,"name",{value:r,configurable:!0});import{globalHelp as g}from"./global.js";const u=[],a=n((e,r)=>{for(const[o,t,s,i]of r)u.push({usage:`genne ${o}`,roles:e,description:t,...s?{input:s}:{},...i?{confirmation:"terminal interativo"}:{}})},"add");a(["public"],[["help [CAMINHO]","Lista comandos ou detalha um caminho, sem autentica\xE7\xE3o."],["login","Autoriza uma sess\xE3o CLI pelo navegador em Prod por padr\xE3o; herda o papel e a conta selecionados na sess\xE3o que aprova."],["env show","Mostra a origem API (Prod por padr\xE3o ou GENNE_API_URL) e a disponibilidade da sess\xE3o salva, sem expor credenciais."],["users driver register","Cadastra uma conta de motorista.","JSON: name, email, password, phone E.164, registration_market_code BR|US"],["auth membership-invitations accept","Aceita convite de v\xEDnculo B2B; identidade j\xE1 ativa pode enviar s\xF3 token.","JSON obrigat\xF3rio: token; para ativar identidade convidada, name, phone E.164, password, registration_market_code BR|US; cpf opcional"],["password forgot","Solicita recupera\xE7\xE3o de senha.","JSON: email"],["password reset","Redefine senha com o c\xF3digo recebido.","JSON: email, code, password"]]),a(["public"],g),a(["driver","admin","carrier","shipper"],[["whoami","Mostra identidade, papel ativo e, para cliente B2B, conta selecionada."],["users me","Consulta o resumo do pr\xF3prio usu\xE1rio."],["user me","Consulta o resumo do pr\xF3prio usu\xE1rio."],["user me update","Atualiza o pr\xF3prio perfil.","JSON: name, phone, vehicle_type, navigation_app_preference"],["user me photo","Envia a pr\xF3pria foto.","JSON: path para JPG, PNG, WebP, HEIC ou HEIF at\xE9 6 MiB"],["user me email-change request","Solicita troca do pr\xF3prio email.","JSON: current_password, new_email"],["user me email-change confirm","Confirma troca de email e encerra as sess\xF5es.","JSON: code",!0],["user me deletion-request","Solicita exclus\xE3o dos pr\xF3prios dados.","JSON: accepted_terms=true",!0],["password change","Altera a pr\xF3pria senha.","JSON: current_password, new_password"],["logout","Revoga a sess\xE3o CLI salva."],["session logout","Revoga a sess\xE3o atual."],["session logout-all","Revoga todas as sess\xF5es da identidade.",null,!0]]),a(["carrier"],[["user me driver-access enable","Habilita motorista para o pr\xF3prio owner carrier ativo. Preserva a empresa; altera\xE7\xE3o efetiva encerra suas sess\xF5es e exige genne login. Ap\xF3s timeout, fa\xE7a login e consulte user me antes de repetir.","JSON em stdin: current_password obrigat\xF3rio; confirma o UUID da pr\xF3pria identidade",!0]]),a(["driver"],[["users driver carriers invitations list [status=S] [limit=N] [cursor=X]","Lista convites do motorista; status=pending|accepted|declined|cancelled|expired, limit=1..100 (padr\xE3o 20), cursor opaco."],["users driver carriers invitations show INVITATION_ID","Consulta identidade da carrier, validade e estado can\xF4nico do pr\xF3prio convite."],["users driver carriers invitations accept INVITATION_ID","Aceita convite e cria v\xEDnculo atomicamente no Core. Retry com a mesma chave preserva resultado; decis\xE3o oposta gera conflito. N\xE3o altera prefer\xEAncia ou outras carriers.","JSON em stdin: idempotency_key (Unicode v\xE1lido sem U+0000, 1 a 128 codepoints), sem normaliza\xE7\xE3o; header Idempotency-Key para ASCII printable sem espa\xE7os nas bordas, body idempotency_key para os demais valores",!0],["users driver carriers invitations decline INVITATION_ID","Recusa convite sem criar v\xEDnculo; retry com a mesma chave preserva resultado. Consulte show ap\xF3s conflito.","JSON em stdin: idempotency_key (Unicode v\xE1lido sem U+0000, 1 a 128 codepoints), sem normaliza\xE7\xE3o; header Idempotency-Key para ASCII printable sem espa\xE7os nas bordas, body idempotency_key para os demais valores",!0],["users driver profile","Consulta o resumo do pr\xF3prio cadastro de motorista."],["users driver carriers list","Lista v\xEDnculos com transportadoras."],["users driver carriers link","Vincula-se por c\xF3digo da transportadora.","JSON: driver_link_code (5 caracteres)",!0],["users driver carriers unlink CARRIER_ID","Remove um v\xEDnculo com transportadora.",null,!0],["users driver carriers preference","Define prefer\xEAncia de rota.","JSON: preference=independent_driver|carrier_direct; carrier_account_id se carrier_direct",!0],["driver profile show","Consulta cadastro operacional, prontid\xE3o GR, treinamento e estado dos documentos pr\xF3prios."],["driver profile draft","Salva rascunho do cadastro; campos opcionais conforme etapa.","JSON: personal_document_type, personal_document_number, personal_document_value, issuing_country_code, cpf, cnpj, mei_cnpj, cnh_number, cnh_state, cnh_security_code, naturalness, whatsapp_phone, emergency_whatsapp, emergency_contact_relationship, has_antt, antt_status, ownership_pending, has_vehicle, vehicle_owner_is_driver, vehicle_profile, vehicle_plate_state, vehicle_plate_city, vehicle_fleet_number, vehicle_axle_count, vehicle_bodywork, transportadora_client, client, operation_base, magazine_base, operation_state, operation_city, operation_region, operation_notes, has_mei, no_mei, mei_absence_reason, referral_whatsapp, residential_street, residential_number, residential_complement, residential_neighborhood, residential_city, residential_state, residential_postal_code, training_watched (booleano); documents opcional com caminhos cnh, crlv, antt, ownership_document, selfie, address_proof (PDF/JPG/PNG at\xE9 12 MiB)"],["driver profile complete","Envia cadastro completo; o Core valida a completude.","JSON: mesmos campos e documents de driver profile draft; consulte genne help driver profile draft"],["driver profile revalidate BLOCK","Revalida cnh, cnpj_mei, vehicle, residential_address, operation_preferences ou antt."],["driver profile mei consult","Consulta o CNPJ MEI do titular.","JSON: cnpj (14 d\xEDgitos)"],["driver profile mei confirm","Confirma o CNPJ MEI do titular.","JSON: cnpj (14 d\xEDgitos)"],["driver payout requirements BR|US","Consulta contrato de dados banc\xE1rios por mercado."],["driver payout accounts BR|US","Consulta repasse mascarado e vers\xE3o de proje\xE7\xE3o."],["driver payout primary","Substitui conta prim\xE1ria de repasse com controle de vers\xE3o e idempot\xEAncia.","JSON obrigat\xF3rio: market_code BR|US, rail bank_transfer|ach, requirements_version, expected_projection_version, account_number, account_type, holder_name, idempotency_key; opcionais: institution_identifier, branch_identifier, routing_number, holder_type, holder_document_type/value, holder_phone",!0],["driver market-context set","Seleciona a base operacional ou o mercado independente do motorista.","JSON: scope_type=shipper_base|carrier_base e scope_id=UUID, ou scope_type=independent e market_id=UUID"]]),a(["driver"],[["driver places search CONSULTA","Busca endere\xE7os para obter place_id no mercado do motorista."],["driver places details PLACE_ID","Resolve o lugar escolhido em endere\xE7o e coordenadas; confira o resultado antes de salvar."],["driver routes list [limit=N] [cursor=X] [status=X] [is_favorite=X] [date_from=X] [date_to=X] [search=X]","Lista SavedRoutes do motorista; status=open|completed|closed, is_favorite=true|false e datas AAAA-MM-DD."],["driver routes plan create","Enfileira planejamento com endere\xE7os ou waypoints; optimize=true \xE9 opcional e 202 retorna plan_public_id sem criar SavedRoute.","JSON: locations ou waypoints (2 a 500 itens), cada item pode ser endere\xE7o ou objeto com address/lat/lng; optimize, optimize_start, optimize_end, return_to_start, current_location e vehicle_type opcionais",!0],["driver routes plan JOB_ID show","Consulta o job de planejamento at\xE9 status completed ou failed; use os waypoints e a geometria conclu\xEDdos para criar o draft."],["driver routes imports preview ARQUIVO [persist_order_id_choice=true|false] [column_mapping=JSON]","Pr\xE9via de CSV, XLS, XLSX ou PDF local at\xE9 50 MiB; n\xE3o cria rota. Envie o arquivo original, inclusive sem cabe\xE7alho. Se data.ai_inference.status for failed em resposta de sucesso, a pr\xE9via continua utiliz\xE1vel: revise as colunas e repita com column_mapping=JSON. Erros de processamento 422 conhecidos retornam error.code, error.message seguro e error.data.reason/stage."],["driver routes draft create","Cria draft manual_app. Informe origem pura e paradas; use places details para preencher coordenadas.","JSON: name e waypoints obrigat\xF3rios; waypoints com type, address e, quando resolvidos, lat/lng; return_to_start e driver_payment_profile_public_id opcionais",!0],["driver routes ROUTE_ID show","Consulta SavedRoute, waypoints, manifesto e estado de execu\xE7\xE3o."],["driver routes ROUTE_ID waypoints set","Salva a lista completa de waypoints execut\xE1veis; preserve IDs e manifesto da rota operacional.","JSON: waypoints (lista completa com type; id para pontos existentes, sequence, address, lat/lng, stop_kind, reference_kind e demais campos execut\xE1veis)",!0],["driver routes ROUTE_ID coordinates validate","Verifica localmente as coordenadas dos waypoints salvos; endere\xE7o sozinho n\xE3o basta para otimizar."],["driver routes ROUTE_ID optimize","Enfileira otimiza\xE7\xE3o de waypoints com coordenadas; 202 retorna optimize_public_id e n\xE3o altera a SavedRoute.",null,!0],["driver optimization JOB_ID show","Consulta job de otimiza\xE7\xE3o at\xE9 status completed ou failed."],["driver routes ROUTE_ID optimize apply JOB_ID","Aplica ordem e geometria de job completed; o Core rejeita a escrita se a rota mudar ap\xF3s a leitura.","JSON: expected_waypoint_ids e expected_updated_at exibidos em routes ROUTE_ID show antes de otimizar",!0],["driver routes ROUTE_ID calculate","Enfileira c\xE1lculo sem otimizar; 202 retorna calculate_public_id e n\xE3o altera a SavedRoute.",null,!0],["driver calculation JOB_ID show","Consulta job de c\xE1lculo at\xE9 status completed ou failed."],["driver routes ROUTE_ID calculate apply JOB_ID","Aplica geometria de c\xE1lculo completed sem mudar a sequ\xEAncia; o Core rejeita snapshot alterado.","JSON: expected_waypoint_ids e expected_updated_at exibidos em routes ROUTE_ID show antes de calcular",!0],["driver routes ROUTE_ID start","Inicia execu\xE7\xE3o da SavedRoute pr\xF3pria ap\xF3s revisar rota e cota\xE7\xE3o aplic\xE1vel.",null,!0],["driver routes ROUTE_ID reactivate","Reabre uma rota manual antiga para o dia civil atual; rota operacional exige o fluxo B2B.",null,!0],["driver routes ROUTE_ID clone","Clona a SavedRoute pr\xF3pria em um novo draft, preservando waypoints e reiniciando execu\xE7\xE3o.",null,!0],["driver routes ROUTE_ID waypoints WAYPOINT_ID failure-policy","Consulta motivos de insucesso e exig\xEAncia de autoriza\xE7\xE3o do waypoint."],["driver routes ROUTE_ID waypoints WAYPOINT_ID notes","Atualiza a observa\xE7\xE3o da parada pr\xF3pria; string vazia limpa a observa\xE7\xE3o.","JSON: notes (string)",!0],["driver routes ROUTE_ID waypoints WAYPOINT_ID packages","Atualiza a quantidade de pacotes da parada; o Core recusa manifesto gerido por importa\xE7\xE3o.","JSON: packages_count (inteiro n\xE3o negativo)",!0],["driver routes ROUTE_ID waypoints WAYPOINT_ID navigation start","Registra o evento de in\xEDcio de navega\xE7\xE3o; n\xE3o abre um navegador ou aplicativo de mapas.","JSON: {} ou navigation_provider, nav_sdk_version, boot_duration_ms, waypoint_index e packages_count opcionais",!0],["driver routes ROUTE_ID waypoints WAYPOINT_ID items ITEM_ID enrich","Consulta os dados do item a partir da DANFE importada, com o cache existente do Core.",null,!0],["driver routes ROUTE_ID waypoints WAYPOINT_ID check-in","Registra a posi\xE7\xE3o informada para o check-in da parada; o Core calcula dist\xE2ncia e alerta.","JSON obrigat\xF3rio: lat e lng num\xE9ricos; accuracy_meters opcional",!0],["driver routes ROUTE_ID waypoints WAYPOINT_ID status","Registra baixa de waypoint pela Route.Execution; failed exige motivo e observa\xE7\xE3o.","JSON: status=pending|delivered|failed; para failed, failure_reason_code, failure_observation e failure_authorization_code se exigido",!0],["driver routes ROUTE_ID waypoints WAYPOINT_ID items ITEM_ID status","Registra baixa de item do manifesto pela Route.Execution.","JSON: status=pending|delivered|failed; para failed, failure_reason_code, failure_observation e failure_authorization_code se exigido",!0],["driver routes ROUTE_ID finish","Conclui rota pr\xF3pria depois que os waypoints exigidos tiverem baixa.",null,!0]]),a(["admin"],[["users admin list [limit=N] [cursor=X] [role=R] [search=X]","Lista usu\xE1rios vis\xEDveis \xE0 ACL interna."],["users admin show USER_ID","Consulta um usu\xE1rio."],["users admin driver-profile DRIVER_ID show","Consulta perfil operacional autorizado de um motorista."],["users admin driver-profile DRIVER_ID update","Corrige campos operacionais do motorista.","JSON: reason e profile com operation_base, operation_state, operation_city, operation_region, operation_notes, work_status, work_status_active, has_vehicle, vehicle_profile, vehicle_plate_state, vehicle_plate_city, vehicle_fleet_number, vehicle_axle_count, vehicle_bodywork",!0],["users drivers list [limit=N] [cursor=X] [search=X] [status=S] [carrier_account_id=UUID] [shipper_account_id=UUID]","Lista o diret\xF3rio de motoristas."],["admin users create","Cria usu\xE1rio; admin comum nasce staff sem grants.","JSON: name, email, password, phone E.164, registration_market_code BR|US, is_internal opcional",!0],["admin users USER_ID update","Atualiza usu\xE1rio.","JSON: um ou mais de name, email, phone, is_internal",!0],["admin users USER_ID block|unblock","Bloqueia ou desbloqueia usu\xE1rio.",null,!0],["admin users USER_ID roles","Altera pap\xE9is da identidade.","JSON: roles, reason",!0],["admin users USER_ID driver-access enable","Habilita motorista para um owner carrier ativo. Exige users.internal_admin.manage e access_governance.manage; encerra as sess\xF5es do alvo e preserva a sess\xE3o do executor. J\xE1 habilitado retorna changed=false.","JSON em stdin: reason obrigat\xF3rio; confirma o UUID da identidade alvo",!0],["admin users USER_ID password","Redefine senha de usu\xE1rio.","JSON: password, reason",!0],["admin users USER_ID delete","Exclui usu\xE1rio ap\xF3s pr\xE9via; depend\xEAncias bloqueiam a exclus\xE3o.","JSON: email do usu\xE1rio",!0],["admin privacy preview","Consulta pr\xE9via de exclus\xE3o sem expor a inten\xE7\xE3o.","JSON: user_id ou email"],["admin privacy requests","Lista pedidos de exclus\xE3o."],["admin privacy requests status REQUEST_ID","Marca status de pedido; excluido n\xE3o prova apagamento.","JSON: new_status=solicitado|excluido|nao_ha_dados",!0],["access catalog","Consulta cat\xE1logo de permiss\xF5es internas."],["access accounts list [account_type=carrier|shipper] [limit=N] [cursor=X] [search=X]","Lista contas no escopo da ACL interna."],["access members list [status=X] [membership_role=X] [carrier_account_id=UUID] [shipper_account_id=UUID] [limit=N] [cursor=X] [search=X]","Lista v\xEDnculos B2B vis\xEDveis."],["access internal list","Lista acesso de usu\xE1rios internos."],["access internal show USER_ID","Consulta grants internos de um usu\xE1rio."],["access internal set USER_ID","Altera ACL interna conforme grants do ator.","JSON: access com admin_access_level ou permission_keys",!0],["access account ACCOUNT_ID members","Lista membros da conta."],["access account ACCOUNT_ID members create","Convida membro para a conta.","JSON: member com email, membership_role, workspace_role",!0],["access account ACCOUNT_ID members MEMBERSHIP_ID update","Atualiza v\xEDnculo do membro.","JSON: member com status, membership_role, workspace_role ou metadata",!0],["access account ACCOUNT_ID members MEMBERSHIP_ID resend-invitation","Reenvia convite pendente.",null,!0],["access account ACCOUNT_ID entitlements","Consulta m\xF3dulos da conta."],["access account ACCOUNT_ID entitlements set","Altera m\xF3dulos da conta.","JSON: access.module_keys",!0],["access account ACCOUNT_ID member-access MEMBERSHIP_ID","Consulta permiss\xF5es do membro."],["access account ACCOUNT_ID member-access MEMBERSHIP_ID set","Altera permiss\xF5es do membro.","JSON: access.permission_keys",!0],["access account ACCOUNT_ID member-bases MEMBERSHIP_ID","Consulta bases do membro."],["access account ACCOUNT_ID member-bases MEMBERSHIP_ID set","Altera bases do membro.","JSON: access.base_ids",!0]]),a(["carrier","shipper"],[["company my-account show","Consulta a empresa da sess\xE3o."],["company my-account update","Atualiza dados permitidos da empresa da sess\xE3o.","JSON: um ou mais de legal_name, trading_name, document, issuing_country_code, legal_identifier, contact_points, addresses",!0],["access my-account catalog","Consulta cat\xE1logo de permiss\xF5es B2B."],["access my-account members","Lista membros da conta da sess\xE3o."],["access my-account members create","Convida membro para a conta da sess\xE3o.","JSON: member com email e membership_role",!0],["access my-account members MEMBERSHIP_ID update","Atualiza v\xEDnculo de membro.","JSON: member com status, membership_role ou metadata",!0],["access my-account members MEMBERSHIP_ID resend-invitation","Reenvia convite pendente.",null,!0],["access my-account entitlements","Consulta m\xF3dulos da conta da sess\xE3o."],["access my-account entitlements set","Altera m\xF3dulos conforme a ACL B2B.","JSON: access.module_keys",!0],["access my-account member-access MEMBERSHIP_ID","Consulta permiss\xF5es do membro."],["access my-account member-access MEMBERSHIP_ID set","Altera permiss\xF5es do membro.","JSON: access.permission_keys",!0]]),a(["carrier"],[["users carrier drivers invitations create","Envia convite por CPF para motorista registrado. Exige m\xF3dulo carrier_driver_invitations ativo e permiss\xE3o manage no Core; nenhum grant \xE9 autom\xE1tico. Retorna convite pending, n\xE3o v\xEDnculo. Retry deve reutilizar chave e CPF.","JSON em stdin: cpf (string), idempotency_key (Unicode v\xE1lido sem U+0000, 1 a 128 codepoints), sem normaliza\xE7\xE3o; header Idempotency-Key para ASCII printable sem espa\xE7os nas bordas, body idempotency_key para os demais valores; CPF n\xE3o \xE9 argumento de shell",!0],["users carrier drivers invitations list [status=S] [limit=N] [cursor=X]","Lista convites da conta ativa com CPF mascarado; Core exige m\xF3dulo ativo e view OU manage. status=pending|accepted|declined|cancelled|expired, limit=1..100 (padr\xE3o 20), cursor opaco."],["users carrier drivers invitations show INVITATION_ID","Consulta convite da conta ativa com CPF mascarado; Core exige m\xF3dulo ativo e view OU manage."],["users carrier drivers invitations cancel INVITATION_ID","Cancela convite pendente da conta ativa; Core exige m\xF3dulo ativo e manage. Retry reutiliza a chave; consulte show ap\xF3s conflito.","JSON em stdin: idempotency_key (Unicode v\xE1lido sem U+0000, 1 a 128 codepoints), sem normaliza\xE7\xE3o; header Idempotency-Key para ASCII printable sem espa\xE7os nas bordas, body idempotency_key para os demais valores",!0],["users carrier drivers list [base_id=UUID] [limit=N] [cursor=X] [search=X]","Lista motoristas da transportadora."],["users carrier drivers link DRIVER_USER_ID","Consulta v\xEDnculo com motorista."],["users carrier drivers link DRIVER_USER_ID set-bases","Altera bases do v\xEDnculo.","JSON: base_ids",!0]]),a(["admin"],[["admin support threads list [status=open|closed] [limit=N] [cursor=X]","Lista conversas de suporte."],["admin support threads THREAD_ID messages [limit=N] [cursor=X]","Consulta mensagens da conversa."],["admin support threads THREAD_ID reply","Mostra at\xE9 100 mensagens antes da resposta; pagine o hist\xF3rico se houver mais.","JSON: body (1 a 4000 caracteres)",!0],["admin support threads THREAD_ID close","Fecha a conversa ap\xF3s pr\xE9via e confirma\xE7\xE3o pelo UUID. Exige messaging.manage no Core; resultado s\xEDncrono.","Sem JSON de entrada",!0],["admin support threads THREAD_ID reopen","Reabre a conversa ap\xF3s pr\xE9via e confirma\xE7\xE3o pelo UUID. Exige messaging.manage no Core; resultado s\xEDncrono.","Sem JSON de entrada",!0],["admin feedbacks list [status=S] [user_id=UUID] [order=recent|votes|oldest] [limit=N] [cursor=X]","Lista feedbacks."],["admin feedbacks show FEEDBACK_ID","Consulta feedback."],["admin feedbacks comments FEEDBACK_ID [limit=N] [cursor=X]","Lista coment\xE1rios."],["admin feedbacks delete FEEDBACK_ID","Exclui permanentemente o feedback ap\xF3s pr\xE9via e confirma\xE7\xE3o pelo UUID. O Core exige feedbacks.manage; HTTP 204 confirma conclus\xE3o.","Sem JSON de entrada; n\xE3o h\xE1 restore de feedback",!0],["admin feedbacks comments FEEDBACK_ID COMMENT_ID delete","Oculta o coment\xE1rio do feedback ap\xF3s pr\xE9via e confirma\xE7\xE3o pelo UUID do coment\xE1rio. O Core verifica v\xEDnculo e feedbacks.manage; HTTP 204 confirma conclus\xE3o.","Sem JSON de entrada",!0],["admin feedbacks comments FEEDBACK_ID COMMENT_ID restore","Restaura um coment\xE1rio oculto do feedback ap\xF3s pr\xE9via e confirma\xE7\xE3o pelo UUID do coment\xE1rio. O Core verifica v\xEDnculo e feedbacks.manage; HTTP 204 confirma conclus\xE3o.","Sem JSON de entrada",!0],["admin feedbacks comment FEEDBACK_ID key=CHAVE","Comenta com chave idempotente de 16 a 255 caracteres.","JSON: content, image_url opcional",!0],["admin feedbacks status FEEDBACK_ID key=CHAVE","Solicita mudan\xE7a de status; 202 pending exige consulta do receipt. Reuse chave e payload no retry.","JSON: new_status=pending|in_progress|prioritized|resolved|canceled|duplicate; closing_comment_id e reason opcionais",!0],["admin feedbacks receipt FEEDBACK_ID RECEIPT_ID","Consulta o resultado de uma mudan\xE7a terminal."],["admin crm assignees","Lista respons\xE1veis eleg\xEDveis por leads."],["admin crm leads list [status=S] [search=X] [limit=N] [cursor=X]","Lista leads."],["admin crm leads show LEAD_ID","Consulta lead e eventos."],["admin crm leads LEAD_ID status","Altera status do lead.","JSON: new_status=novo|em_contato|qualificado|perdido|convertido",!0],["admin crm leads LEAD_ID note","Adiciona nota ao lead.","JSON: note",!0],["admin crm leads LEAD_ID assign","Atribui respons\xE1vel eleg\xEDvel.","JSON: admin_id",!0],["admin notifications list [limit=N] [cursor=X]","Lista notifica\xE7\xF5es."],["admin notifications show MESSAGE_GROUP_ID","Consulta processamento e destinat\xE1rios autorizados."],["admin notifications send","Enfileira notifica\xE7\xE3o individual; 202 n\xE3o prova entrega.","JSON: user_id, title, body; action_url e action_label opcionais",!0],["admin blog posts list [locale=pt-BR|en|es] [translation_group_id=UUID]","Lista posts, inclusive rascunhos."],["admin blog posts create key=CHAVE","Cria post com idempot\xEAncia; chave est\xE1vel de 16 a 255 caracteres.","JSON obrigat\xF3rio: slug, title, description, author, category, content_markdown, content_html; opcionais: locale, tags, cover_image_url, published",!0],["--non-interactive admin blog posts create key=CHAVE","Exce\xE7\xE3o exclusiva do Growth para criar post sem confirma\xE7\xE3o no terminal; n\xE3o libera outras muta\xE7\xF5es.","JSON: mesmo contrato de admin blog posts create"],["admin blog posts POST_ID update","Atualiza post com If-Match.","JSON: version e campos alterados",!0],["admin blog posts POST_ID publish|unpublish version=N","Altera publica\xE7\xE3o com vers\xE3o esperada.",null,!0],["admin blog posts POST_ID delete","Exclui post.",null,!0],["admin blog images upload ARQUIVO","Envia imagem PNG, JPEG, WebP ou GIF at\xE9 8 MiB.",null,!0],["admin faqs list [path=X] [route_key=X] [locale=pt-BR|en|es] [category=X] [featured=true|false] [q=X]","Lista FAQs, inclusive rascunhos."],["admin faqs create key=CHAVE","Cria FAQ com idempot\xEAncia; chave est\xE1vel de 16 a 255 caracteres.","JSON obrigat\xF3rio: question, answer, category, paths ou route_keys; opcionais: locale, tags, featured_on_home, position, published",!0],["admin faqs FAQ_ID update","Atualiza FAQ com If-Match.","JSON: version e campos alterados",!0],["admin faqs FAQ_ID publish|unpublish version=N","Altera publica\xE7\xE3o com vers\xE3o esperada.",null,!0],["admin faqs FAQ_ID delete","Exclui FAQ.",null,!0],["admin companies list [account_type=carrier|shipper] [search=X] [limit=N] [cursor=X]","Lista empresas B2B."],["admin companies show BUSINESS_ACCOUNT_ID","Consulta empresa pelo ID jur\xEDdico; IDs operacionais de shipper/carrier s\xE3o distintos."],["admin companies consult","Consulta primeiro empresa persistida ou reaproveita a consulta Assertiva latest aprovada e confirmada para o mesmo CNPJ atual do alvo; usa Assertiva somente como fallback e n\xE3o exige nova consulta. Retorna CNPJ, nomes e endere\xE7o vindos do Core, sem confirma\xE7\xE3o.","JSON em stdin: cnpj (string) e user_id opcional (UUID); o reaproveitamento dos dados e o fallback, al\xE9m da valida\xE7\xE3o empresarial, pertencem ao Core"],["admin companies onboard-existing-user","Registra usu\xE1rio ativo existente como owner da conta carrier; o Core valida empresa, membership e ACL. Retorna empresa, v\xEDnculo, m\xF3dulos ativos e email_delivery.status=disabled|pending|sent|failed.","JSON em stdin: user_id (UUID), cnpj (string), send_email (booleano opcional; padr\xE3o false)",!0],["admin companies onboarding-users list [search=X] [limit=N] [cursor=X]","Lista identidades ativas de pap\xE9is can\xF4nicos para onboarding; exige business_accounts_registry.manage no Core e retorna somente user_id, nome, email e status."],["admin companies create","Cria empresa B2B.","JSON obrigat\xF3rio: legal_name e document ou issuing_country_code+legal_identifier; opcionais: trading_name, status, account_type, account_types, contact_points, addresses",!0],["admin companies BUSINESS_ACCOUNT_ID update","Atualiza empresa B2B.","JSON: um ou mais de legal_name, trading_name, document, issuing_country_code, legal_identifier, status, account_type, account_types, contact_points, addresses",!0],["admin shippers OPERATIONAL_ACCOUNT_ID bases list","Lista bases do embarcador."],["admin shippers OPERATIONAL_ACCOUNT_ID bases create","Cria base do embarcador.","JSON: market_id, country_code, currency_code, timezone, code, name e endere\xE7o",!0],["admin shippers OPERATIONAL_ACCOUNT_ID bases BASE_ID update|deactivate|reactivate","Altera ou ativa/desativa base do embarcador; update recebe JSON.","JSON para update: code, name, origin_address, origin_lat, origin_lng, postal_code, place_id, street, street_number, neighborhood, city, state, state_code, country, geocode_provider, timezone, triage_rules, balancing_policy, metadata",!0],["admin shippers|carriers OPERATIONAL_ACCOUNT_ID bases BASE_ID cutoff-windows set","Substitui todos os hor\xE1rios de corte no timezone da base; windows=[] limpa. Resultado s\xEDncrono; a CLI confirma no terminal, MCP remoto exige aprova\xE7\xE3o Core. Base shipper com execu\xE7\xF5es vinculadas \xE9 recusada com 409 cutoff_dispatches_exist.","JSON: windows (lista de weekday 0..6, cutoff_time HH:MM[:SS], auto_publish opcional)",!0],["admin shippers|carriers OPERATIONAL_ACCOUNT_ID bases BASE_ID service-area set|clear","Substitui ou remove a cobertura regional da base.","JSON para set: reference_zone_public_ids (lista de UUIDs)",!0],["admin shippers|carriers OPERATIONAL_ACCOUNT_ID bases BASE_ID region-groups create","Cria agrupamento nomeado de regi\xF5es para a base.","JSON: name, reference_zone_public_ids (lista de UUIDs)",!0],["admin shippers|carriers OPERATIONAL_ACCOUNT_ID bases BASE_ID zone-overrides list","Consulta zonas efetivas salvas da base; verifica a refer\xEAncia \xE0 conta operacional; exige network_configuration.view ou manage no Core. Resultado s\xEDncrono, sem JSON ou confirma\xE7\xE3o."],["admin shippers OPERATIONAL_ACCOUNT_ID bases BASE_ID carrier-shares list","Consulta distribui\xE7\xE3o configurada de carriers da base shipper; verifica a refer\xEAncia \xE0 conta operacional; exige network_configuration.view ou manage no Core. Resultado s\xEDncrono, sem JSON ou confirma\xE7\xE3o."],["admin carriers OPERATIONAL_ACCOUNT_ID bases list","Lista bases da transportadora."],["admin carriers OPERATIONAL_ACCOUNT_ID bases create","Cria base da transportadora.","JSON: market_id, country_code, currency_code, timezone, code, name e endere\xE7o",!0],["admin carriers OPERATIONAL_ACCOUNT_ID bases BASE_ID update|deactivate|reactivate","Altera ou ativa/desativa base da transportadora; update recebe JSON.","JSON para update: code, name, origin_address, origin_lat, origin_lng, postal_code, place_id, street, street_number, neighborhood, city, state, state_code, country, geocode_provider, timezone, triage_rules",!0]]),a(["carrier"],[["carrier bases BASE_ID reference-zone-features list [limit=N] [cursor=X] [search=X] [min_lng=X] [min_lat=X] [max_lng=X] [max_lat=X] [include_geometry=true|false]","Consulta cat\xE1logo OSM de refer\xEAncia para base pr\xF3pria da conta carrier ativa, com membership e route_operations.view, workbench ou publish no Core; n\xE3o \xE9 cobertura operacional salva. Resultado s\xEDncrono com meta de pagina\xE7\xE3o, sem JSON ou confirma\xE7\xE3o."]]),a(["shipper"],[["shipper bases list","Lista as bases da conta embarcadora ativa."],["shipper bases create","Cria uma base na conta embarcadora ativa.","JSON obrigat\xF3rio: code, name; opcionais: origin_address, origin_lat, origin_lng, timezone, triage_rules, metadata",!0],["shipper bases BASE_ID carrier-shares list","Lista a distribui\xE7\xE3o de carriers configurada na base."],["shipper bases BASE_ID carrier-shares create","Adiciona share de carrier \xE0 base.","JSON: carrier_account_id, target_share_percent; quality_weight, priority_order e allocation_enabled opcionais",!0],["shipper bases BASE_ID carrier-shares replace","Substitui a distribui\xE7\xE3o de carriers da base.","JSON: carriers (lista de carrier_account_id, target_share_percent e campos opcionais)",!0],["shipper bases BASE_ID reference-zone-features list [limit=N] [cursor=X] [search=X] [min_lng=X] [min_lat=X] [max_lng=X] [max_lat=X] [include_geometry=true|false]","Lista fei\xE7\xF5es de refer\xEAncia para compor a cobertura da base."],["shipper bases BASE_ID reference-zone-features merge","Mescla fei\xE7\xF5es de refer\xEAncia em uma zona da base.","JSON: reference_zone_public_ids (lista de UUIDs); code e name opcionais",!0]]);for(const e of["admin","carrier"])a([e],[[`${e} gr provider-definitions list`,"Lista providers GR dispon\xEDveis no papel ativo."],[`${e} gr providers list [${e==="admin"?"carrier_account_id=UUID] [":""}provider_key=X] [status=X] [limit=N] [cursor=X]${e==="carrier"?" [search=X]":""}`,"Lista contas de providers GR no papel ativo."],[`${e} gr providers create`,"Cria conta de provider GR; credenciais s\xE3o aceitas somente via stdin.",`JSON: provider_key=m3risk|angellira, provider_label, mode=crawler|api|ftp|browser|api_jwt; status, config e credentials opcionais${e==="admin"?"; carrier_account_id ou carrier_account_public_id obrigat\xF3rio":""}`,!0],[`${e} gr providers PROVIDER_ID update`,"Atualiza conta de provider GR no escopo da sess\xE3o.","JSON: provider_label, mode, status, config e/ou credentials",!0],[`${e} gr providers PROVIDER_ID test`,"Testa a configura\xE7\xE3o da conta GR e retorna o healthcheck.",null,!0],[`${e} gr providers PROVIDER_ID operations`,"Descobre opera\xE7\xF5es expostas pela conta GR."],[`${e} gr providers PROVIDER_ID mappings list [active=true|false]`,"Lista mapeamentos de opera\xE7\xE3o da conta GR."],[`${e} gr providers PROVIDER_ID mappings upsert`,"Cria ou atualiza mapeamento de opera\xE7\xE3o GR.","JSON: operation_key, provider_client_id; provider_client_label, metadata e active opcionais",!0],[`${e} gr requests list [provider_key=X] [status=X] [phase=X] [operation_key=X] [search=X] [limit=N] [cursor=X]${e==="admin"?" [carrier_account_id=UUID]":""}`,"Lista solicita\xE7\xF5es GR no escopo da sess\xE3o."],[`${e} gr requests create`,"Enfileira solicita\xE7\xE3o GR; 202 n\xE3o prova conclus\xE3o.","JSON: driver_profile_id, provider_account_id, operation_key; priority opcional",!0],[`${e} gr requests REQUEST_ID show`,"Consulta solicita\xE7\xE3o GR."],[`${e} gr requests REQUEST_ID attempts|evidence|orchestration-events [limit=N] [cursor=X]`,"Consulta hist\xF3rico da solicita\xE7\xE3o GR."],[`${e} gr requests REQUEST_ID retry|verify|cancel`,"Altera solicita\xE7\xE3o GR conforme ACL e estado do Core.",null,!0],[`${e} gr requests REQUEST_ID confirm-recovery`,"Confirma a revis\xE3o exata de opera\xE7\xF5es de escrita ap\xF3s a pr\xE9via read-only.","JSON: recovery_revision, operations",!0],[`${e} gr requests REQUEST_ID operation`,"Seleciona opera\xE7\xE3o ativa para solicita\xE7\xE3o legada antes de qualquer escrita externa.","JSON: operation_key (UUID da base operacional)",!0],[`${e} gr requests REQUEST_ID personal-declarations`,"Atualiza declara\xE7\xF5es pessoais criptografadas e agenda reconcilia\xE7\xE3o.","JSON: sex=male|female|other e/ou marital_status=single|married|divorced|widowed|other",!0]]);a(["admin"],[["admin gr provider-definitions PROVIDER_ID update","Atualiza defini\xE7\xE3o global do provider GR; infraestrutura global continua restrita ao Admin.","JSON: provider_label, mode, status e/ou config com base_url, runner_url, runner_command",!0]]),a(["admin"],[["admin gr carriers CARRIER_ID dashboard","Consulta resumo GR da transportadora."],["admin gr drivers [carrier_account_id=UUID] [limit=N] [cursor=X] [provider_account_id=UUID] [search=X] [document=X] [status=X] [training_pending=true|false]","Consulta diret\xF3rio GR global, incluindo motoristas sem v\xEDnculo; o Core exige gr.view ou gr.manage."],["admin gr carriers CARRIER_ID drivers [limit=N] [cursor=X] [provider_account_id=UUID] [search=X] [document=X] [status=X] [training_pending=true|false]","Consulta motoristas GR da transportadora."],["admin gr carriers CARRIER_ID blacklist list [limit=N] [cursor=X] [search=X]","Lista v\xEDnculos de motoristas bloqueados na transportadora."],["admin gr carriers CARRIER_ID links LINK_ID blacklist|unblock","Bloqueia ou desbloqueia v\xEDnculo; bloquear cancela solicita\xE7\xF5es GR abertas.",null,!0],["admin gr carriers CARRIER_ID links LINK_ID manual-approval","Aprova ou revoga GR externo somente nesse v\xEDnculo e transportadora; exige gr.manage no Core e confirma\xE7\xE3o do LINK_ID. Retorna manual_approval com autor e data.",'JSON obrigat\xF3rio: {"approved":true} para aprovar ou {"approved":false} para revogar; CARRIER_ID e LINK_ID s\xE3o UUIDs p\xFAblicos',!0],["admin gr carriers CARRIER_ID drivers PROFILE_ID export","Consulta o perfil e a prontid\xE3o GR do motorista vinculado."],["admin gr carriers CARRIER_ID drivers PROFILE_ID documents TYPE reprocess","Reprocessa documento j\xE1 armazenado; 202 n\xE3o prova conclus\xE3o.","TYPE=cnh|crlv|address_proof|antt|ownership_document; JSON: {} ou document_id, registration_request_id e/ou requirements_revision",!0],["admin gr driver-profiles PROFILE_ID show","Consulta detalhe GR do motorista no escopo Admin."],["admin gr driver-profiles PROFILE_ID training","Registra se o treinamento GR foi assistido.","JSON obrigat\xF3rio: training_watched=true|false",!0]]),a(["carrier"],[["carrier gr dashboard","Consulta resumo GR da pr\xF3pria transportadora."],["carrier gr drivers [limit=N] [cursor=X] [provider_account_id=UUID] [search=X] [document=X] [status=X] [training_pending=true|false]","Consulta motoristas GR da pr\xF3pria transportadora."],["carrier gr blacklist list [limit=N] [cursor=X] [search=X]","Lista v\xEDnculos de motoristas bloqueados na pr\xF3pria transportadora."],["carrier gr links LINK_ID blacklist|unblock","Bloqueia ou desbloqueia v\xEDnculo pr\xF3prio; bloquear cancela solicita\xE7\xF5es GR abertas.",null,!0],["carrier gr links LINK_ID manual-approval","Aprova ou revoga GR externo no v\xEDnculo da transportadora da sess\xE3o; exige gr.manage no Core e confirma\xE7\xE3o do LINK_ID. Retorna manual_approval com autor e data.",'JSON obrigat\xF3rio: {"approved":true} para aprovar ou {"approved":false} para revogar; LINK_ID \xE9 o UUID p\xFAblico do v\xEDnculo',!0],["carrier gr drivers PROFILE_ID export","Consulta o perfil e a prontid\xE3o GR do motorista vinculado."],["carrier gr drivers PROFILE_ID documents TYPE reprocess","Reprocessa documento j\xE1 armazenado; 202 n\xE3o prova conclus\xE3o.","TYPE=cnh|crlv|address_proof|antt|ownership_document; JSON: {} ou document_id, registration_request_id e/ou requirements_revision",!0],["carrier gr driver-profiles PROFILE_ID training","Registra se o treinamento GR foi assistido para motorista vinculado.","JSON obrigat\xF3rio: training_watched=true|false",!0]]);for(const[e,r]of[["carrier","carrier"],["admin","admin operations CARRIER_ID"]])a([e],[[`${r} orders lookup BARCODE`,"Consulta pedido por c\xF3digo."],[`${r} orders upsert`,"Cria ou atualiza pedido.","JSON obrigat\xF3rio: source_type=upload|proceda, external_id, postal_code, destination_address; opcionais: shipper_id, base_id, primary_barcode, aliases, destination_lat, destination_lng, destination_complement, geocode, recipient_name, recipient_doc, recipient_phone, packages_count, raw_payload, metadata",!0],[`${r} receiving scan`,"Registra recebimento ap\xF3s consultar o pedido.","JSON obrigat\xF3rio: barcode; opcionais: shipper_id, base_id, metadata",!0],[`${r} receiving rules list`,"Lista regras de recebimento."],[`${r} receiving rules create`,"Cria regra de recebimento global, por embarcador ou por base.","JSON obrigat\xF3rio: code, name, postal_code_start, postal_code_end; opcionais: shipper_id, base_id, priority_order, status, metadata. IDs s\xE3o UUIDs p\xFAblicos; sem shipper_id/base_id, a regra \xE9 global",!0],[`${r} receiving rules RULE_ID update`,"Atualiza parcialmente uma regra de recebimento.","JSON: um ou mais de shipper_id, base_id, code, name, postal_code_start, postal_code_end, priority_order, status, metadata. Campos omitidos s\xE3o preservados. base_id:null remove a base; shipper_id:null e base_id:null tornam a regra global",!0],[`${r} dispatch create`,"Expede pedidos ao motorista.","JSON: driver_user_id, barcodes; route_name/metadata opcionais",!0],[`${r} dispatch ROUTE_ID add-orders`,"Adiciona pedidos \xE0 rota manual ativa; a rota pode j\xE1 ter iniciado.","JSON obrigat\xF3rio: barcodes; reason opcional",!0]]);a(["carrier"],[["carrier desktop providers list","Lista providers publicados para ativa\xE7\xE3o; exige carrier_integrations.view ou manage no Core."],["carrier desktop providers PROVIDER_ID activate","Ativa a integra\xE7\xE3o Desktop ap\xF3s confirmar o UUID do provider; n\xE3o habilita automaticamente a entrada de pedidos. Exige carrier_integrations.manage.",null,!0],["carrier desktop grants GRANT_ID flow-installations list","Consulta fluxos dispon\xEDveis e instala\xE7\xF5es do grant autorizado pelo Core."],["carrier desktop grants GRANT_ID flow-installations create","Instala um fluxo no grant; exige carrier_integrations.manage e confirma\xE7\xE3o do grant.","JSON obrigat\xF3rio: flow_id; opcionais: connection_id, base_id, trigger, trigger_key, schedule, timezone, enabled, policies. O Core valida os gatilhos e agendamentos",!0],["carrier desktop flow-installations INSTALLATION_ID update","Altera uma instala\xE7\xE3o ap\xF3s confirmar seu UUID; o Core valida escopo, pol\xEDticas e concorr\xEAncia de vers\xE3o.","JSON parcial: enabled, schedule, timezone, policies, flow_version_id, expected_current_version_id. Para trocar vers\xE3o, informe a vers\xE3o atual esperada",!0],["carrier desktop flow-installations INSTALLATION_ID run","Enfileira um fluxo autorizado. 201 com execu\xE7\xE3o queued n\xE3o comprova conclus\xE3o; acompanhe por carrier desktop executions EXECUTION_ID show.","JSON obrigat\xF3rio: idempotency_key (16 a 128 caracteres) e input (objeto). Preserve os mesmos dados e a chave nos retries",!0],["carrier desktop grants GRANT_ID order-import-batches create","Importa um lote da execu\xE7\xE3o e dispositivo autorizados; exige order_intake.import. Confirma o grant e preserva o receipt de idempot\xEAncia.","JSON obrigat\xF3rio: idempotency_key, execution_id, device_id, records (at\xE9 100 itens com external_id, order_requested_at, destination_address e packages_count); next_cursor e checkpoint opcionais. A chave \xE9 enviada em Idempotency-Key",!0],["carrier desktop grants GRANT_ID extractions preview","Obt\xE9m pr\xE9via estruturada de uma p\xE1gina autorizada; exige order_intake.import. Confirma o grant, sem persistir pedidos.","JSON obrigat\xF3rio: run_id, base_id, flow_version=1, page_url, instruction, fields e snapshot. N\xE3o passe o conte\xFAdo da p\xE1gina em argumentos de shell",!0],["carrier desktop grants list","Lista integra\xE7\xF5es Desktop autorizadas para a transportadora."],["carrier desktop orders list [shipper_id=UUID] [base_id=UUID] [query=X] [cursor=X] [status_sync=true]","Lista pedidos can\xF4nicos da integra\xE7\xE3o Desktop dentro das bases autorizadas."],["carrier desktop orders ORDER_ID show","Consulta um pedido can\xF4nico da integra\xE7\xE3o Desktop."],["carrier desktop orders refresh","Enfileira atualiza\xE7\xE3o de pedidos selecionados no provedor; 202 \xE9 aceita\xE7\xE3o, n\xE3o conclus\xE3o.","JSON obrigat\xF3rio: order_ids (1 a 100 UUIDs) e idempotency_key (16 a 128 caracteres)",!0],["carrier desktop orders resync","Enfileira ressincroniza\xE7\xE3o dos pedidos selecionados; 202 \xE9 aceita\xE7\xE3o, n\xE3o conclus\xE3o.","JSON obrigat\xF3rio: order_ids (1 a 100 UUIDs) e idempotency_key (16 a 128 caracteres)",!0],["carrier desktop sync-runs list [shipper_id=UUID] [base_id=UUID] [connection_id=UUID] [device_id=X] [order_id=UUID] [status=X] [cursor=X]","Lista execu\xE7\xF5es de sincroniza\xE7\xE3o Desktop."],["carrier desktop sync-runs RUN_ID show","Consulta uma execu\xE7\xE3o de sincroniza\xE7\xE3o Desktop."],["carrier desktop sync-runs RUN_ID cancel","Cancela uma execu\xE7\xE3o ativa de sincroniza\xE7\xE3o Desktop.",null,!0],["carrier desktop executions EXECUTION_ID show","Consulta uma execu\xE7\xE3o Desktop pelo identificador."],["carrier desktop executions EXECUTION_ID candidates list [device_id=X] [cursor=X]","Lista candidatos de sincroniza\xE7\xE3o ap\xF3s a execu\xE7\xE3o assumir o dispositivo."],["carrier desktop executions EXECUTION_ID known-ids","Consulta no Core quais pedidos externos j\xE1 s\xE3o conhecidos.","JSON obrigat\xF3rio: device_id e external_orders; cada item usa external_id e external_base_code"],["carrier desktop executions EXECUTION_ID receipt device_id=X batch_key=CHAVE","Consulta o receipt conclu\xEDdo de um lote de importa\xE7\xE3o Desktop."],["carrier desktop operation-routes list","Lista rotas publicadas de recebimento Desktop no escopo da transportadora."],["carrier desktop operation-routes publish","Publica uma nova revis\xE3o da opera\xE7\xE3o Desktop na base.","JSON: base_id, shipper_id, operation_kind e target=core|flow; para flow, bindings com installation_id e requirement=required|optional; handler_key conforme a opera\xE7\xE3o Core",!0],["carrier desktop operation-contexts open","Abre contexto de recebimento e retorna context_token para as leituras.","JSON: base_id, shipper_id, operation_kind=sack_receipt|package_receipt, mode=fast|standard, device_id"],["carrier desktop operation-contexts SESSION_ID close","Encerra contexto de recebimento Desktop.",null,!0],["carrier desktop operation-scans batch","Aceita lote idempotente de leituras f\xEDsicas; cada resultado informa accepted, duplicate ou erro.","JSON: context_token e scans (1 a 100 itens com scan_id, barcode, occurred_at; association opcional)",!0],["carrier desktop operation-runs list [base_id=UUID] [shipper_id=UUID] [operation_kind=X] [device_id=X] [monitor=true|false] [cursor=X] [limit=N]","Lista resultados de recebimento do pr\xF3prio dispositivo ou o monitor da transportadora; device_id \xE9 obrigat\xF3rio sem monitor=true."],["carrier desktop operation-runs FLOW_RUN_ID retry","Reenfileira um fluxo de recebimento terminal usando a vers\xE3o publicada atual.",null,!0],["carrier desktop operation-runs retry-batch","Reenfileira de 1 a 100 fluxos de recebimento terminais.","JSON obrigat\xF3rio: flow_run_ids (UUIDs)",!0],["carrier desktop flow-actions ACTION_KEY run","Enfileira uma a\xE7\xE3o Desktop nomeada para uma base; 202 \xE9 aceita\xE7\xE3o, n\xE3o conclus\xE3o.","JSON obrigat\xF3rio: shipper_id, base_id, input (objeto) e idempotency_key",!0]]),a(["admin"],[["admin financial payment-profiles create","Cria perfil e publica a vers\xE3o de forma s\xEDncrona; pode desativar o perfil ativo do mesmo contexto/base/carrier. Exige network_configuration.manage no Core. Confirma o UUID de base, origem, owner ou client, ou payment-profiles quando ausentes; retorna o envelope Core.","JSON stdin obrigat\xF3rio: profile_mode=shipper_owned|carrier_managed|driver_self_managed e configuration (objeto opaco validado pelo Core). Opcionais: shipper_account_id, base_id (operacionais), client_id, origin_id, reference_shipper_id, reference_carrier_id (financeiros), owner_user_id, origin_name, origin_address, name, period_type, start_day, end_day, invoice_day, payment_day (inteiros ou null), active, is_default (booleanos), reference_payer_label, currency. Zeros, null e strings decimais da configuration s\xE3o preservados",!0],["admin financial carrier-margins ORIGIN_ID upsert","Substitui a regra ativa do par carrier/origem financeira, preservando hist\xF3rico no Core. S\xEDncrono; exige network_configuration.manage, confirma ORIGIN_ID e retorna o envelope Core. ORIGIN_ID vem de data.origin.id do perfil, n\xE3o do base_id operacional.","JSON stdin obrigat\xF3rio: carrier_id (UUID financeiro), margin_percent (n\xFAmero ou string decimal, sem convers\xE3o; faixa validada pelo Core). origin_id opcional deve corresponder ao path; o body enviado usa ORIGIN_ID. Zero \xE9 v\xE1lido",!0]]);for(const e of["carrier","admin"]){const r=e==="carrier"?"carrier operations":"admin operations CARRIER_ID";a([e],[[`${r} config show`,"Consulta configura\xE7\xE3o operacional; o Core verifica ACL e retorna erro se ela ainda n\xE3o existir."],[`${r} config update`,"Atualiza parcialmente a configura\xE7\xE3o ap\xF3s confirmar a conta; exige carrier_clients.manage ou physical_receiving.manage no Core. Campos omitidos s\xE3o preservados.","JSON: um ou mais de integration_type=upload|proceda, order_entry_mode=upload|proceda, status_query_mode=disabled, receiving_enabled, dispatch_enabled, routing_enabled, quotation_enabled (booleanos), status=active|inactive, metadata (objeto). O Core deriva os modos quando aplic\xE1vel",!0]])}for(const[e,r]of[["carrier","carrier"],["admin","admin operations CARRIER_ID"]])a([e],[[`${r} shippers list`,"Lista embarcadores geridos pela transportadora."],[`${r} shippers create`,"Cria ou reutiliza embarcador vinculado \xE0 transportadora.","JSON: legal_name e document ou issuing_country_code + legal_identifier; trading_name opcional",!0],[`${r} shippers SHIPPER_ID bases list`,"Lista bases do embarcador vinculado."],[`${r} shippers SHIPPER_ID bases create`,"Cria ou reutiliza base do embarcador vinculado.","JSON: code, name; market_id, endere\xE7o, timezone, triage_rules, balancing_policy e metadata opcionais",!0],[`${r} status-outbox [sink_type=X] [shipper_id=UUID] [adapter_type=X]`,"Consulta eventos de status enviados ou pendentes da transportadora."]]);for(const e of["admin","carrier","shipper"])a([e],[[`${e} orders imports preview ARQUIVO [shipper_id=UUID] [base_id=UUID]`,"Pr\xE9via de CSV, XLS, XLSX ou PDF local antes da importa\xE7\xE3o."],[`${e} orders imports create ARQUIVO`,"Cria lote de importa\xE7\xE3o; a resposta \xE9 enfileiramento, consulte o lote para o resultado.",`JSON: base_id${e==="shipper"?"":", shipper_id"} obrigat\xF3rios; column_mapping e import_context opcionais`,!0],[`${e} orders imports BATCH_ID show [include_orders=true|false]`,"Consulta estado e resultado do lote."],[`${e} orders imports BATCH_ID source-preview`,"Consulta pr\xE9via da origem do lote."],[`${e} orders imports BATCH_ID orders list [limit=N] [cursor=X] [search=X] [geocode_status=X] [only_errors=true|false]`,"Lista pedidos do lote."],[`${e} orders imports BATCH_ID orders ORDER_ID update`,"Corrige endere\xE7o ou destinat\xE1rio de um pedido do lote.","JSON: um ou mais de destination_address, destination_street, destination_number, destination_neighborhood, destination_city, destination_state, destination_postal_code, destination_complement, recipient_name, recipient_phone, nfe_key",!0],[`${e} orders imports BATCH_ID remap`,"Cria novo lote com mapeamento corrigido; consulte o lote retornado.","JSON: column_mapping ou import_context como objeto",!0],[`${e} orders imports BATCH_ID requeue-geocode`,"Reenfileira geocode do lote; 202 n\xE3o prova conclus\xE3o.",null,!0],[`${e} orders ORDER_ID retry-geocode`,"Reexecuta geocode de um pedido vis\xEDvel ao papel ativo.","JSON: raw_address com pelo menos 3 caracteres",!0]]);a(["admin"],[["admin triage batches list [limit=N] [cursor=X] [search=X]","Lista lotes de importa\xE7\xE3o para triagem; search cobre ID, status, origem, arquivo, embarcador e base."],["admin triage batches BATCH_ID show","Consulta o lote, relat\xF3rio, runtime e candidatos de rota."],["admin triage batches BATCH_ID run","Enfileira a triagem do lote; 202 \xE9 aceita\xE7\xE3o, n\xE3o conclus\xE3o.",null,!0],["admin triage batches BATCH_ID orders ORDER_ID update","Corrige endere\xE7o de um pedido com falha de triagem e invalida candidatos antigos.","JSON obrigat\xF3rio: destination_address; destination_lat e destination_lng opcionais",!0]]);for(const e of["admin","carrier","shipper"])a([e],[[`${e} routes list [limit=N] [cursor=X] [status=X] [search=X]${e==="admin"?" [source_type=X] [operation_mode=X]":e==="carrier"?" [shipper_id=UUID] [base_id=UUID]":" [base_id=UUID]"}`,"Lista rotas operacionais vis\xEDveis ao papel ativo."],...e==="shipper"?[["shipper route-candidates list [base_id=UUID] [status=X]","Lista candidatos de planejamento da conta shipper; consulta s\xEDncrona, sem confirma\xE7\xE3o. O handler atual ignora base_id/status e n\xE3o retorna cursor."]]:e==="carrier"?[["carrier route-candidates list","Lista candidatos de planejamento atribu\xEDdos \xE0 conta carrier; consulta s\xEDncrona, sem confirma\xE7\xE3o."]]:[],[`${e} routes ROUTE_ID show`,"Consulta rota operacional vis\xEDvel."],...e==="carrier"?[[`${e} routes ROUTE_ID assign-driver`,"Atribui motorista eleg\xEDvel \xE0 rota candidata da transportadora.","JSON obrigat\xF3rio: driver_user_id",!0]]:[],[`${e} route-candidates CANDIDATE_ID publish`,"Publica candidato como SavedRoute operacional; o Core valida readiness, blockers e ACL.","JSON opcional: override booleano e reason obrigat\xF3rio quando override=true",!0],...["admin","shipper"].includes(e)?[[`${e} route-candidates CANDIDATE_ID reassign-stop`,"Move um ponto para outro candidato antes da publica\xE7\xE3o.","JSON obrigat\xF3rio: stop_id e target_route_candidate_id; reason opcional",!0],[`${e} route-candidates CANDIDATE_ID ai-assist`,"Solicita ou consulta assist\xEAncia de rearranjo do candidato; 202 significa processamento.",`${e==="admin"?"JSON obrigat\xF3rio":"JSON opcional"}: objective`,!0]]:[],...e==="admin"?[[`${e} route-candidates CANDIDATE_ID assign-driver`,"Atribui motorista vinculado \xE0 transportadora do candidato.","JSON obrigat\xF3rio: carrier_account_id e driver_user_id",!0]]:[],[`${e} workbench scopes`,"Lista escopos do workbench."],[`${e} workbench show batch_id=UUID`,"Consulta workbench pelo lote."],[`${e} workbench show shipper_account_id=UUID base_id=UUID`,"Consulta workbench pela base."],[`${e} workbench run`,"Executa workbench; 202 \xE9 aceita\xE7\xE3o, n\xE3o conclus\xE3o.","JSON: shipper_account_id, base_id",!0],[`${e} workbench refresh-quotation`,"Atualiza a cota\xE7\xE3o da workbench; 202 \xE9 aceita\xE7\xE3o, n\xE3o conclus\xE3o.","JSON: shipper_account_id, base_id",!0],[`${e} tower cockpit batch_id=UUID`,"Consulta cockpit pelo lote."],[`${e} tower cockpit shipper_account_id=UUID base_id=UUID`,"Consulta cockpit pela base."]]);a(["shipper"],[["shipper route show PUBLIC_ID","Consulta uma rota operacional do embarcador."]]),a(["admin"],[["admin routes ROUTE_ID assign-driver","Atribui motorista \xE0 rota conforme ACL e estado do Core.","JSON obrigat\xF3rio: driver_user_id; reason opcional",!0],["admin routes ROUTE_ID pause|cancel|reopen","Altera estado da rota conforme ACL do Core.","JSON: reason, notes e occurrence_type opcionais",!0],["admin routes ROUTE_ID occurrence","Registra ocorr\xEAncia na rota.","JSON obrigat\xF3rio: notes; reason e occurrence_type opcionais",!0],["admin tower overview","Consulta vis\xE3o geral da torre."],["admin tower failure-reasons catalog","Consulta cat\xE1logo de motivos de insucesso."]]),a(["driver"],[["driver tower validate","Valida DANFE e recebe assist_token de uso \xFAnico.","JSON: nf_key obrigat\xF3rio; reason opcional",!0],["driver tower assist","Consulta enriquecimento com token de validate; retorna query_id.","JSON: assist_token obrigat\xF3rio; reason e force_refresh opcionais",!0],["driver tower fallback","Consulta enriquecimento por documento informado; retorna query_id.","JSON: document obrigat\xF3rio; reason e force_refresh opcionais",!0],["driver tower queries QUERY_ID show","Consulta resultado de enriquecimento pr\xF3prio."]]);for(const e of["driver","carrier"])a([e],[[`${e} tower chat open`,"Abre ou retoma thread de rota e parada autorizadas.","JSON: route_id e waypoint_id obrigat\xF3rios; driver_user_id opcional",!0],[`${e} tower chat thread THREAD_ID messages`,"Consulta mensagens da thread autorizada."],[`${e} tower chat thread THREAD_ID send`,"Envia mensagem \xE0 thread autorizada.","JSON: body obrigat\xF3rio; message_type e metadata opcionais",!0]]);for(const e of["carrier","shipper"])a([e],[[`${e} tower failure-reasons policy show`,"Consulta policy de insucesso efetiva da pr\xF3pria conta."],[`${e} tower failure-reasons policy set`,"Altera policy de insucesso da pr\xF3pria conta.","JSON: reason_codes (lista de c\xF3digos)",!0]]);a(["carrier"],[["carrier tower chat thread THREAD_ID authorize","Gera c\xF3digo de uso \xFAnico para insucesso autorizado.",null,!0]]),a(["admin"],[["admin tower chat threads","Lista threads operacionais vis\xEDveis \xE0 ACL."],["admin tower chat thread THREAD_ID messages","Consulta mensagens da thread."],["admin tower chat thread THREAD_ID send","Envia mensagem \xE0 thread.","JSON: body obrigat\xF3rio; message_type e metadata opcionais",!0],["admin tower chat thread THREAD_ID authorize","Gera c\xF3digo de autoriza\xE7\xE3o de insucesso.",null,!0],["admin tower failure-reasons shippers SHIPPER_ID show","Consulta policy de insucesso do embarcador."],["admin tower failure-reasons shippers SHIPPER_ID set","Altera policy de insucesso do embarcador.","JSON: reason_codes (lista de c\xF3digos)",!0],["admin tower failure-reasons carriers CARRIER_ID show","Consulta policy de insucesso da transportadora."],["admin tower failure-reasons carriers CARRIER_ID set","Altera policy de insucesso da transportadora.","JSON: reason_codes (lista de c\xF3digos)",!0]]);for(const e of["driver","admin","carrier","shipper"])a([e],[[`${e} tower failure-reasons catalog-global [search=X]`,"Consulta s\xEDncrona do cat\xE1logo global de motivos; sem confirma\xE7\xE3o, gera\xE7\xE3o ou consumo de autoriza\xE7\xE3o."]]);function b(e,r){const o=e.startsWith("[")?e.slice(1,-1):e;return o.split("|").includes(r)?0:/^[A-Z][A-Z0-9_]*$/.test(o)||o.includes("=")&&o.split("=")[0]===r.split("=")[0]&&/^[A-Z][A-Z0-9_]*$/.test(o.split("=")[1])?1:1/0}n(b,"matchToken");function f(e=[]){const r=e.filter(Boolean),o=u.map(i=>{const{usage:p}=i,d=p.slice(6).split(" "),l=r.reduce((m,_,c)=>m+(d[c]?b(d[c],_):1/0),0);return{command:i,score:l}}),t=Math.min(...o.map(({score:i})=>i));if(!Number.isFinite(t))return null;const s=o.filter(({score:i})=>i===t).map(({command:i})=>i);return s.length?{data:{query:r.join(" "),authorization:"Papel ativo da sess\xE3o; o Core aplica grants internos, membership, m\xF3dulos, bases e ACL a cada chamada.",input:"Objetos JSON de muta\xE7\xE3o s\xE3o enviados por stdin. Confirma\xE7\xF5es exigem terminal interativo; n\xE3o passe secrets em argumentos.",commands:s}}:null}n(f,"commandHelp");export{f as commandHelp};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var m=Object.defineProperty;var f=(t,o)=>m(t,"name",{value:o,configurable:!0});import{readFile as p,stat as u}from"node:fs/promises";import{basename as v,extname as N}from"node:path";async function P(t,o,a,l,r,e){(typeof a!="string"||!a.trim())&&e.fail("INPUT",`Arquivo inv\xE1lido para ${o}`,422);const s=l[N(a).toLowerCase()];s||e.fail("INPUT",`Formato n\xE3o aceito para ${o}`,422);let n;try{const i=await u(a);(!i.isFile()||i.size===0||i.size>r)&&e.fail("INPUT",`Arquivo inv\xE1lido ou maior que ${r/1048576} MB para ${o}`,422),n=await p(a)}catch(i){if(i.code==="INPUT")throw i;e.fail("INPUT",`N\xE3o foi poss\xEDvel ler o arquivo de ${o}`,422)}(n.length===0||n.length>r)&&e.fail("INPUT",`Arquivo inv\xE1lido ou maior que ${r/1048576} MB para ${o}`,422),t.append(o,new Blob([n],{type:s}),v(a))}f(P,"appendLocalFile");export{P as appendLocalFile};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var r=Object.defineProperty;var m=(n,e)=>r(n,"name",{value:e,configurable:!0});import{z as a}from"zod";const i=m(()=>a.uuid(),"UUID"),t={limit:a.number().int().min(1).max(100).optional(),cursor:a.string().min(1).optional()};function s(n){return Object.entries(n).filter(([,e])=>e!==void 0).map(([e,d])=>`${e}=${d}`)}m(s,"queryArgs");const o=m(n=>`Papel eleg\xEDvel: admin. Consulta ${n}; o Core revalida ACL, escopo e dados da conta. Sem confirma\xE7\xE3o e sem muta\xE7\xE3o.`,"adminDescription");function p(n){n("genne_admin_support_threads",o("atendimentos de suporte"),{status:a.enum(["open","closed"]).optional(),...t},e=>["admin","support","threads","list",...s(e)]),n("genne_admin_support_thread_messages",o("mensagens de um atendimento"),{thread_id:i(),...t},({thread_id:e,...d})=>["admin","support","threads",e,"messages",...s(d)]),n("genne_admin_feedbacks",o("feedbacks"),{status:a.enum(["pending","in_progress","prioritized","resolved","canceled","duplicate"]).optional(),user_id:i().optional(),order:a.enum(["votes","recent","oldest"]).optional(),terminal_intents:a.literal("pending").optional(),...t},e=>["admin","feedbacks","list",...s(e)]),n("genne_admin_feedback_show",o("um feedback"),{feedback_id:i()},({feedback_id:e})=>["admin","feedbacks","show",e]),n("genne_admin_feedback_comments",o("coment\xE1rios de um feedback"),{feedback_id:i(),...t},({feedback_id:e,...d})=>["admin","feedbacks","comments",e,...s(d)]),n("genne_admin_feedback_receipt",o("o receipt terminal de um feedback"),{feedback_id:i(),receipt_id:i()},({feedback_id:e,receipt_id:d})=>["admin","feedbacks","receipt",e,d]),n("genne_admin_crm_assignees",o("respons\xE1veis eleg\xEDveis do CRM"),{},()=>["admin","crm","assignees"]),n("genne_admin_crm_leads",o("leads do CRM"),{status:a.enum(["novo","em_contato","qualificado","perdido","convertido"]).optional(),search:a.string().min(1).optional(),...t},e=>["admin","crm","leads","list",...s(e)]),n("genne_admin_crm_lead_show",o("um lead do CRM"),{lead_id:i()},({lead_id:e})=>["admin","crm","leads","show",e]),n("genne_admin_notifications",o("notifica\xE7\xF5es administrativas"),t,e=>["admin","notifications","list",...s(e)]),n("genne_admin_notification_show",o("o processamento de uma notifica\xE7\xE3o"),{message_group_id:i()},({message_group_id:e})=>["admin","notifications","show",e]),n("genne_admin_blog_posts",o("posts de blog, inclusive rascunhos"),{locale:a.enum(["pt-BR","en","es"]).optional(),translation_group_id:i().optional()},e=>["admin","blog","posts","list",...s(e)]),n("genne_admin_faqs",o("FAQs, inclusive rascunhos"),{path:a.string().min(1).optional(),route_key:a.string().min(1).optional(),locale:a.enum(["pt-BR","en","es"]).optional(),category:a.string().min(1).optional(),featured:a.boolean().optional(),q:a.string().min(1).optional()},e=>["admin","faqs","list",...s(e)]),n("genne_admin_privacy_requests",o("solicita\xE7\xF5es de privacidade"),{},()=>["admin","privacy","requests"]),n("genne_driver_payout_requirements","Papel eleg\xEDvel: driver. Consulta os requisitos de repasse do mercado informado; o Core aplica a sess\xE3o e o contrato vigente. Sem confirma\xE7\xE3o e sem muta\xE7\xE3o.",{market_code:a.enum(["BR","US"])},({market_code:e})=>["driver","payout","requirements",e]),n("genne_driver_payout_accounts","Papel eleg\xEDvel: driver. Consulta contas de repasse pr\xF3prias no mercado informado; a CLI retorna somente o resumo mascarado e o Core revalida a sess\xE3o. Sem confirma\xE7\xE3o e sem muta\xE7\xE3o.",{market_code:a.enum(["BR","US"])},({market_code:e})=>["driver","payout","accounts",e]),n("genne_admin_onboarding_users",o("identidades eleg\xEDveis para onboarding"),{search:a.string().min(1).optional(),...t},e=>["admin","companies","onboarding-users","list",...s(e)])}m(p,"registerAdministrationReads");export{p as registerAdministrationReads};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var h=Object.defineProperty;var c=(a,d)=>h(a,"name",{value:d,configurable:!0});import{z as e}from"zod";import{bindCoreFetch as k}from"./core-fetch.js";const n=c(()=>e.record(e.string(),e.unknown()),"object"),u=e.array(n()).min(1).max(5),C=e.object({flow_id:e.uuid(),connection_id:e.uuid().optional(),base_id:e.uuid().nullable().optional(),trigger:e.string().min(1).optional(),trigger_key:e.string().max(100).nullable().optional(),schedule:n().optional(),timezone:e.string().min(1).optional(),enabled:e.boolean().optional(),policies:u.optional()}).strict(),w=e.object({enabled:e.boolean().optional(),schedule:n().optional(),timezone:e.string().min(1).optional(),policies:u.optional(),flow_version_id:e.uuid().optional(),expected_current_version_id:e.uuid().optional()}).strict().refine(a=>Object.keys(a).length>0,"Informe uma altera\xE7\xE3o"),m=e.object({integration_type:e.enum(["upload","proceda"]).optional(),order_entry_mode:e.enum(["upload","proceda"]).optional(),status_query_mode:e.literal("disabled").optional(),receiving_enabled:e.boolean().optional(),dispatch_enabled:e.boolean().optional(),routing_enabled:e.boolean().optional(),quotation_enabled:e.boolean().optional(),status:e.enum(["active","inactive"]).optional(),metadata:n().optional()}).strict().refine(a=>Object.keys(a).length>0,"Informe uma altera\xE7\xE3o"),o=c(()=>e.string().min(1).max(255).optional(),"optionalRecordString"),O=e.object({external_id:e.string().min(1).max(255),order_requested_at:e.string().min(1).max(100),destination_address:e.string().min(1).max(2e3),packages_count:e.number().int().min(1).max(1e5),external_base_code:o(),order_id:o(),external_shipper_label:o(),provider_status:e.union([e.string().min(1).max(255),e.number().int()]).optional(),provider_status_label:o(),provider_failure_reason:e.union([e.string().min(1).max(255),e.number().int()]).optional(),provider_failure_reason_label:o(),postal_code:e.string().min(1).max(30).optional(),destination_complement:o(),nfe_key:o(),recipient_doc:o(),recipient_name:o(),recipient_phone:o(),recipient_email:o(),metadata:n().optional()}).strict(),j=[{name:"genne_carrier_desktop_provider_activate",operation:"desktop.provider.activate",role:"carrier",fields:{provider_id:e.uuid()},destructive:!1,description:"Ativa um provider Desktop da transportadora ativa ap\xF3s aprova\xE7\xE3o Core. Revise provider, grant e conex\xE3o; ativar n\xE3o habilita automaticamente a entrada de pedidos."},{name:"genne_carrier_desktop_flow_installation_create",operation:"desktop.flow_installation.create",role:"carrier",fields:{grant_id:e.uuid(),installation:C},destructive:!1,description:"Instala um fluxo Desktop no grant autorizado ap\xF3s aprova\xE7\xE3o Core. Revise fluxo, vers\xE3o, base e pol\xEDticas de execu\xE7\xE3o; o Core valida a conta e carrier_integrations.manage."},{name:"genne_carrier_desktop_flow_installation_update",operation:"desktop.flow_installation.update",role:"carrier",fields:{installation_id:e.uuid(),changes:w},destructive:!0,description:"Altera uma instala\xE7\xE3o Desktop ap\xF3s aprova\xE7\xE3o Core. Envie somente changes; troca de vers\xE3o preserva expected_current_version_id. O Core rejeita snapshot alterado desde a aprova\xE7\xE3o."},{name:"genne_carrier_desktop_flow_installation_run",operation:"desktop.flow_installation.run",role:"carrier",fields:{installation_id:e.uuid(),input:e.record(e.string().min(1).max(255),e.string().max(500))},destructive:!1,description:"Solicita execu\xE7\xE3o de um fluxo Desktop ap\xF3s aprova\xE7\xE3o Core. O resultado queued, inclusive com HTTP 201, exige acompanhamento por genne_carrier_desktop_execution; n\xE3o comprova conclus\xE3o do fluxo."},{name:"genne_carrier_desktop_order_import_batch_create",operation:"desktop.order_import_batch.create",role:"carrier",fields:{grant_id:e.uuid(),batch:e.object({execution_id:e.uuid(),device_id:e.string().min(8).max(128).regex(/^[A-Za-z0-9._:-]+$/),records:e.array(O).max(100),next_cursor:e.string().min(1).optional(),checkpoint:n().optional()}).strict()},destructive:!0,description:"Importa um lote Desktop ap\xF3s aprova\xE7\xE3o Core. Revise grant, execu\xE7\xE3o, dispositivo e resumo do lote. O Core valida claim, conta e conte\xFAdo e grava importa\xE7\xE3o e receipt atomicamente; replay n\xE3o repete a importa\xE7\xE3o."},{name:"genne_carrier_desktop_extraction_preview",operation:"desktop.extraction.preview",role:"carrier",fields:{grant_id:e.uuid(),extraction:e.object({run_id:e.uuid(),base_id:e.uuid(),flow_version:e.literal(1),page_url:e.url().max(2e3),instruction:e.string().min(1).max(500),fields:e.array(e.string().regex(/^[A-Za-z][A-Za-z0-9_]{0,63}$/)).min(1).max(20),snapshot:e.string().min(1).max(8e3)}).strict()},destructive:!1,description:"Obt\xE9m pr\xE9via de extra\xE7\xE3o Desktop ap\xF3s aprova\xE7\xE3o Core. O Core valida a origem da p\xE1gina e devolve o receipt da pr\xE9via; n\xE3o persiste pedidos. N\xE3o inclui o snapshot bruto no efeito de aprova\xE7\xE3o."},{name:"genne_carrier_operations_config_update",operation:"operations.carrier_config.update",role:"carrier",fields:{changes:m},destructive:!0,description:"Atualiza parcialmente a configura\xE7\xE3o operacional da transportadora ativa ap\xF3s aprova\xE7\xE3o Core. Revise antes e depois; o Core deriva os modos e decide a ACL. Campos omitidos permanecem preservados."},{name:"genne_admin_operations_config_update",operation:"operations.admin_config.update",role:"admin",fields:{carrier_account_id:e.uuid(),changes:m},destructive:!0,description:"Atualiza parcialmente a configura\xE7\xE3o operacional com Admin standalone e UUID operacional da carrier. Revise conta, antes e depois na aprova\xE7\xE3o Core; membership B2B e pap\xE9is globais n\xE3o concedem acesso Admin."}];function $(a,{coreOrigin:d,coreAccessToken:_,adapterKey:g,adminOrigin:v,fetchImpl:l=fetch}){l=k(l);for(const i of j)a.registerTool(i.name,{description:`${i.description} Repita os mesmos campos e idempotency_key com intent_id ap\xF3s aprovar em outra sess\xE3o de senha com o mesmo papel e conta. Em 412, releia e crie nova inten\xE7\xE3o com outra chave.`,inputSchema:e.object({...i.fields,idempotency_key:e.string().min(16).max(128).regex(/^[A-Za-z0-9._:-]+$/),intent_id:e.uuid().optional()}).strict(),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:i.destructive,idempotentHint:!0}},async({idempotency_key:f,intent_id:p,...x})=>{try{const b=p?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(p)}/execute`:"/api/v1/auth/mcp/write-intents",s=await l(new URL(b,d),{method:"POST",headers:{authorization:`Bearer ${_}`,"x-genne-mcp-adapter-key":g,"idempotency-key":f,"content-type":"application/json"},body:JSON.stringify({operation:i.operation,...x})});let r;try{r=await s.json()}catch{r={}}if(!s.ok){const y=typeof r?.error=="string"&&/^[A-Za-z0-9_.:-]{1,80}$/.test(r.error)?r.error:`http_${s.status}`;return{isError:!0,content:[{type:"text",text:JSON.stringify({status:s.status,error:y})}]}}const t=r?.data;return!t||typeof t!="object"||Array.isArray(t)||!p&&(!e.uuid().safeParse(t.public_id).success||t.active_role!==i.role)?{isError:!0,content:[{type:"text",text:JSON.stringify({status:s.status,error:"invalid_core_response"})}]}:p?{content:[{type:"text",text:JSON.stringify(t)}]}:{content:[{type:"text",text:JSON.stringify({...t,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(t.public_id)}?role=${i.role}`,v).href,next_step:"Revise e aprove em outra sess\xE3o de senha com o mesmo papel e conta; depois repita os mesmos campos e idempotency_key com intent_id."})}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}c($,"registerDesktopOperationsWrites");export{$ as registerDesktopOperationsWrites};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var d=Object.defineProperty;var o=(i,e)=>d(i,"name",{value:e,configurable:!0});import{z as r}from"zod";function s(i){i("genne_admin_gr_driver_profile","Consulta s\xEDncrona do detalhe GR de um perfil p\xFAblico de motorista, sem confirma\xE7\xE3o. Exige Admin e gr.view/gr.manage; o Core aplica conta, v\xEDnculo e ACL.",{driver_profile_id:r.uuid()},({driver_profile_id:e})=>["admin","gr","driver-profiles",e,"show"]),i("genne_import_source_preview","Consulta s\xEDncrona da pr\xE9via sanitizada do arquivo de origem de um lote p\xFAblico de pedidos, sem confirma\xE7\xE3o. Exige admin, carrier ou shipper e order_intake.view, revalidados pelo Core. N\xE3o cria lote ou pedido.",{role:r.enum(["admin","carrier","shipper"]),batch_id:r.uuid()},({role:e,batch_id:a})=>[e,"orders","imports",a,"source-preview"])}o(s,"registerLogisticsReads");export{s as registerLogisticsReads};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var n=Object.defineProperty;var r=(a,o)=>n(a,"name",{value:o,configurable:!0});import{z as e}from"zod";function t(a){a("genne_carrier_desktop_providers","Lista providers Desktop dispon\xEDveis para ativa\xE7\xE3o pela transportadora da sess\xE3o. Exige carrier_integrations.view ou manage no Core. Consulta s\xEDncrona, sem confirma\xE7\xE3o; n\xE3o ativa uma integra\xE7\xE3o.",{},()=>["carrier","desktop","providers","list"]),a("genne_carrier_desktop_flow_installations","Consulta fluxos dispon\xEDveis e instala\xE7\xF5es de um grant Desktop da transportadora ativa. O Core valida conta e permiss\xE3o efetiva de integra\xE7\xF5es ou importa\xE7\xE3o. Consulta s\xEDncrona, sem confirma\xE7\xE3o; n\xE3o executa fluxos.",{grant_id:e.uuid()},({grant_id:o})=>["carrier","desktop","grants",o,"flow-installations","list"]),a("genne_carrier_operations_config","Consulta a configura\xE7\xE3o operacional da transportadora ativa. O Core exige permiss\xE3o operacional eleg\xEDvel. Consulta s\xEDncrona, sem confirma\xE7\xE3o; configura\xE7\xE3o ausente retorna erro e n\xE3o \xE9 criada.",{},()=>["carrier","operations","config","show"]),a("genne_admin_operations_config","Consulta a configura\xE7\xE3o operacional de uma transportadora por UUID, com sess\xE3o Admin e ACL efetiva do Core. Consulta s\xEDncrona, sem confirma\xE7\xE3o; n\xE3o altera a conta selecionada nem cria configura\xE7\xE3o.",{carrier_account_id:e.uuid()},({carrier_account_id:o})=>["admin","operations",o,"config","show"])}r(t,"registerOperationalReads");export{t as registerOperationalReads};
|