@genne/genne-cli 0.0.0-stage → 0.1.34
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/README.md +27 -2
- package/package.json +28 -4
- package/skills/genne-cli/SKILL.md +67 -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 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 com a transportadora. 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.",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; 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.","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 autoriza\xE7\xE3o de suporte; 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 dados cadastrais de uma empresa pelo CNPJ. Retorna CNPJ, nomes e endere\xE7o, sem confirma\xE7\xE3o.","JSON em stdin: cnpj (string) e user_id opcional (UUID)"],["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; depende das permiss\xF5es da sess\xE3o. 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; depende das permiss\xF5es da sess\xE3o. 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, conforme as permiss\xF5es da sess\xE3o; 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; depende das permiss\xF5es da sess\xE3o."],["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 autoriza\xE7\xE3o 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 autoriza\xE7\xE3o 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; depende das permiss\xF5es da sess\xE3o."],["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 autoriza\xE7\xE3o da conta.",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 autoriza\xE7\xE3o 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. 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. 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 autoriza\xE7\xE3o da sess\xE3o. 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 autoriza\xE7\xE3o, 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. Os par\xE2metros base_id/status n\xE3o filtram os resultados nesta vers\xE3o; n\xE3o h\xE1 pagina\xE7\xE3o por 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 D(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(D,"commandHelp");export{D 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"),j=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(),A=[{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; exige autoriza\xE7\xE3o da conta."},{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(j).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. Consulte o receipt retornado; repetir a mesma inten\xE7\xE3o 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 A)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 a=Object.defineProperty;var o=(e,i)=>a(e,"name",{value:i,configurable:!0});import{z as r}from"zod";function p(e){e("genne_admin_gr_driver_profile","Consulta s\xEDncrona do detalhe GR de um perfil p\xFAblico de motorista, sem confirma\xE7\xE3o. Exige sess\xE3o Admin autorizada.",{driver_profile_id:r.uuid()},({driver_profile_id:i})=>["admin","gr","driver-profiles",i,"show"]),e("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 sess\xE3o admin, carrier ou shipper autorizada. N\xE3o cria lote ou pedido.",{role:r.enum(["admin","carrier","shipper"]),batch_id:r.uuid()},({role:i,batch_id:d})=>[i,"orders","imports",d,"source-preview"])}o(p,"registerLogisticsReads");export{p as registerLogisticsReads};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var n=Object.defineProperty;var e=(a,o)=>n(a,"name",{value:o,configurable:!0});import{z as r}from"zod";function t(a){a("genne_carrier_desktop_providers","Lista providers Desktop dispon\xEDveis para ativa\xE7\xE3o pela transportadora da sess\xE3o. Depende das permiss\xF5es da conta. 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:r.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:r.uuid()},({carrier_account_id:o})=>["admin","operations",o,"config","show"])}e(t,"registerOperationalReads");export{t as registerOperationalReads};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var d=Object.defineProperty;var t=(a,e)=>d(a,"name",{value:e,configurable:!0});import{z as o}from"zod";const r=o.enum(["admin","carrier","shipper"]),u=o.enum(["driver","carrier","admin"]);function s(a){return Object.entries(a).filter(([,e])=>e!==void 0).map(([e,i])=>`${e}=${i}`)}t(s,"queryArgs");function p(a){a("genne_driver_routes","Lista SavedRoutes do motorista da sess\xE3o. Filtros s\xE3o aplicados pelo endpoint Core; 202 nunca \xE9 tratado como rota conclu\xEDda.",{limit:o.number().int().positive().max(100).optional(),cursor:o.string().min(1).optional(),status:o.enum(["open","completed","closed"]).optional(),is_favorite:o.enum(["true","false"]).optional(),date_from:o.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),date_to:o.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),search:o.string().min(1).optional()},e=>["driver","routes","list",...s(e)]),a("genne_driver_route_show","Consulta SavedRoute, waypoints, manifesto e estado de execu\xE7\xE3o do motorista autenticado; a posse \xE9 revalidada pelo Core.",{route_id:o.uuid()},({route_id:e})=>["driver","routes",e,"show"]),a("genne_driver_place_search","Busca endere\xE7os no mercado do motorista; somente consulta, sem criar waypoint ou rota.",{query:o.string().min(1)},({query:e})=>["driver","places","search",e]),a("genne_driver_place_details","Resolve um place_id em endere\xE7o e coordenadas para o motorista; n\xE3o grava a rota.",{place_id:o.string().min(1)},({place_id:e})=>["driver","places","details",e]),a("genne_driver_optimization","Consulta status e resultado de um job de otimiza\xE7\xE3o pr\xF3prio; processing ou 202 n\xE3o significa geometria aplic\xE1vel.",{job_id:o.uuid()},({job_id:e})=>["driver","optimization",e,"show"]),a("genne_driver_calculation","Consulta status e resultado de um job de c\xE1lculo pr\xF3prio; processing ou 202 n\xE3o significa geometria aplic\xE1vel.",{job_id:o.uuid()},({job_id:e})=>["driver","calculation",e,"show"]),a("genne_driver_plan","Consulta o job de planejamento pr\xF3prio; 202 \xE9 aceita\xE7\xE3o e n\xE3o cria uma SavedRoute.",{job_id:o.uuid()},({job_id:e})=>["driver","routes","plan",e,"show"]),a("genne_driver_failure_policy","Consulta os motivos de insucesso e a exig\xEAncia de autoriza\xE7\xE3o da parada pr\xF3pria; n\xE3o consome c\xF3digo de autoriza\xE7\xE3o.",{route_id:o.uuid(),waypoint_id:o.uuid()},({route_id:e,waypoint_id:i})=>["driver","routes",e,"waypoints",i,"failure-policy"]),a("genne_routes","Lista rotas operacionais vis\xEDveis no papel ativo. O Core revalida membership, conta, base e ACL; filtros incompat\xEDveis com o papel s\xE3o recusados pelo comando.",{role:r,limit:o.number().int().positive().max(100).optional(),cursor:o.string().min(1).optional(),status:o.string().min(1).optional(),search:o.string().min(1).optional(),source_type:o.string().min(1).optional(),operation_mode:o.string().min(1).optional(),shipper_id:o.uuid().optional(),base_id:o.uuid().optional()},({role:e,...i})=>[e,"routes","list",...s(i)]),a("genne_shipper_route_candidates","Papel eleg\xEDvel: shipper. Lista candidatos de rota na hierarquia da sess\xE3o. Os par\xE2metros base_id/status n\xE3o filtram os resultados nesta vers\xE3o; n\xE3o h\xE1 pagina\xE7\xE3o por cursor. Consulta s\xEDncrona, sem confirma\xE7\xE3o; estes registros ainda pertencem ao planejamento e n\xE3o s\xE3o SavedRoutes nem rotas operacionais publicadas.",{base_id:o.uuid().optional(),status:o.string().min(1).optional()},e=>["shipper","route-candidates","list",...s(e)]),a("genne_carrier_route_candidates","Papel eleg\xEDvel: carrier. Lista candidatos de rota atribu\xEDdos \xE0 transportadora da sess\xE3o. Consulta s\xEDncrona, sem confirma\xE7\xE3o; estes registros ainda pertencem ao planejamento e n\xE3o s\xE3o SavedRoutes nem rotas operacionais publicadas.",{},()=>["carrier","route-candidates","list"]),a("genne_route_show","Consulta o detalhe de uma rota operacional vis\xEDvel ao papel ativo; o Core decide a ACL efetiva.",{role:r,route_id:o.uuid()},({role:e,route_id:i})=>[e,"routes",i,"show"]),a("genne_workbench_scopes","Lista escopos do workbench com backlog pendente para o papel ativo.",{role:r},({role:e})=>[e,"workbench","scopes"]),a("genne_workbench_batch","Get the route planning overview for an authorized import batch. Provide batch_id and set role to the active admin, carrier, or shipper role. Returns batch status, route candidates, order processing counts, and planning issues. Processing may still be pending. This read does not run planning or publish routes.",{role:r,batch_id:o.uuid()},({role:e,batch_id:i})=>[e,"workbench","show",`batch_id=${i}`]),a("genne_workbench_base","Get the route planning overview for an authorized shipper base. Provide shipper_account_id and base_id, and set role to the active admin, carrier, or shipper role. Returns the latest batch status, route candidates, order processing counts, and planning issues. This read does not run planning or publish routes.",{role:r,shipper_account_id:o.uuid(),base_id:o.uuid()},({role:e,shipper_account_id:i,base_id:n})=>[e,"workbench","show",`shipper_account_id=${i}`,`base_id=${n}`]),a("genne_tower_batch_cockpit","Consulta o cockpit da torre por lote autorizado; a leitura n\xE3o executa triagem nem gera assist\xEAncia.",{role:r,batch_id:o.uuid()},({role:e,batch_id:i})=>[e,"tower","cockpit",`batch_id=${i}`]),a("genne_tower_base_cockpit","Consulta o cockpit da torre por embarcador e base autorizados; a leitura n\xE3o executa triagem nem atualiza cota\xE7\xE3o.",{role:r,shipper_account_id:o.uuid(),base_id:o.uuid()},({role:e,shipper_account_id:i,base_id:n})=>[e,"tower","cockpit",`shipper_account_id=${i}`,`base_id=${n}`]),a("genne_tower_chat_messages","Consulta mensagens de uma thread da torre autorizada pelo Core. N\xE3o abre thread, envia mensagem nem gera c\xF3digo.",{role:u,thread_id:o.uuid()},({role:e,thread_id:i})=>[e,"tower","chat","thread",i,"messages"]),a("genne_admin_tower_threads","Lista threads de atendimento operacional vis\xEDveis ao Admin conforme ACL do Core.",{},()=>["admin","tower","chat","threads"]),a("genne_admin_tower_overview","Consulta a vis\xE3o geral da torre autorizada ao Admin; n\xE3o executa a\xE7\xF5es operacionais.",{},()=>["admin","tower","overview"]),a("genne_admin_tower_failure_catalog","Consulta o cat\xE1logo de motivos de insucesso dispon\xEDvel ao Admin; n\xE3o consome autoriza\xE7\xE3o.",{},()=>["admin","tower","failure-reasons","catalog"]),a("genne_tower_failure_catalog","Pap\xE9is eleg\xEDveis: driver, admin, carrier e shipper. Consulta o cat\xE1logo global de motivos de insucesso; \xE9 s\xEDncrona, sem confirma\xE7\xE3o, e n\xE3o altera policy, consome autoriza\xE7\xE3o ou gera assist\xEAncia.",{role:o.enum(["driver","admin","carrier","shipper"]),search:o.string().min(1).optional()},({role:e,search:i})=>[e,"tower","failure-reasons","catalog-global",...i===void 0?[]:[`search=${i}`]]),a("genne_admin_tower_failure_policy","Consulta a policy de insucesso de uma conta autorizada ao Admin; n\xE3o altera policy nem consome c\xF3digo.",{account_type:o.enum(["shippers","carriers"]),account_id:o.uuid()},({account_type:e,account_id:i})=>["admin","tower","failure-reasons",e,i,"show"]),a("genne_tower_failure_policy","Consulta a policy de insucesso efetiva da conta carrier ou shipper ativa; n\xE3o altera policy.",{role:o.enum(["carrier","shipper"])},({role:e})=>[e,"tower","failure-reasons","policy","show"]),a("genne_driver_tower_query","Get the saved document lookup result for the authenticated driver using a previously returned query_id. Returns that query_id and its stored lookup data. This read does not start a new lookup, refresh enrichment, or use credits.",{query_id:o.uuid()},({query_id:e})=>["driver","tower","queries",e,"show"])}t(p,"registerRoutesTowerReads");export{p as registerRoutesTowerReads};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var y=Object.defineProperty;var a=(e,o)=>y(e,"name",{value:o,configurable:!0});import{z as t}from"zod";import{bindCoreFetch as l}from"./core-fetch.js";const k=a(e=>e?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(e)}/execute`:"/api/v1/auth/mcp/write-intents","writeIntentPath"),b=a((e,o)=>typeof e=="string"&&/^[A-Za-z0-9_.:-]{1,80}$/.test(e)?e:`http_${o}`,"safeErrorCode");async function h(e){try{return await e.json()}catch{return{}}}a(h,"responseJson");const v=[{name:"genne_admin_support_thread_set_status",operation:"admin.support_thread.set_status",description:"Solicita aprova\xE7\xE3o Admin para fechar ou reabrir um atendimento. Repita thread_id, status e idempotency_key com intent_id ap\xF3s a aprova\xE7\xE3o.",fields:{thread_id:t.uuid(),status:t.enum(["open","closed"])},destructiveHint:!0},{name:"genne_admin_feedback_delete",operation:"admin.feedback.delete",description:"Solicita aprova\xE7\xE3o Admin para excluir um feedback. Repita feedback_id e idempotency_key com intent_id ap\xF3s a aprova\xE7\xE3o.",fields:{feedback_id:t.uuid()},destructiveHint:!0},{name:"genne_admin_feedback_comment_delete",operation:"admin.feedback_comment.hide",description:"Solicita aprova\xE7\xE3o Admin para ocultar um coment\xE1rio de feedback. Repita os IDs e idempotency_key com intent_id ap\xF3s a aprova\xE7\xE3o.",fields:{feedback_id:t.uuid(),comment_id:t.uuid()},destructiveHint:!0},{name:"genne_admin_feedback_comment_restore",operation:"admin.feedback_comment.restore",description:"Solicita aprova\xE7\xE3o Admin para restaurar um coment\xE1rio de feedback. Repita os IDs e idempotency_key com intent_id ap\xF3s a aprova\xE7\xE3o.",fields:{feedback_id:t.uuid(),comment_id:t.uuid()},destructiveHint:!1}];function w(e,{coreOrigin:o,coreAccessToken:p,adapterKey:m,adminOrigin:u,fetchImpl:s=fetch}){s=l(s);for(const r of v)e.registerTool(r.name,{description:r.description,inputSchema:t.object({...r.fields,idempotency_key:t.string().min(16).max(128),intent_id:t.uuid().optional()}).strict(),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:r.destructiveHint,idempotentHint:!0}},async({idempotency_key:_,intent_id:d,...f})=>{try{const n=await s(new URL(k(d),o),{method:"POST",headers:{authorization:`Bearer ${p}`,"x-genne-mcp-adapter-key":m,"idempotency-key":_,"content-type":"application/json"},body:JSON.stringify({operation:r.operation,...f})}),c=await h(n);if(!n.ok)return{isError:!0,content:[{type:"text",text:JSON.stringify({status:n.status,error:b(c?.error,n.status)})}]};const i=c?.data;return!i||typeof i!="object"||Array.isArray(i)?{isError:!0,content:[{type:"text",text:JSON.stringify({status:n.status,error:"invalid_core_response"})}]}:d?{content:[{type:"text",text:JSON.stringify(i)}]}:typeof i.public_id!="string"?{isError:!0,content:[{type:"text",text:JSON.stringify({status:n.status,error:"invalid_core_response"})}]}:{content:[{type:"text",text:JSON.stringify({...i,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(i.public_id)}?role=admin`,u).href,next_step:"Revise e aprove esta inten\xE7\xE3o em outra sess\xE3o Core de login por senha; depois repita com intent_id, os mesmos campos e idempotency_key."})}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}a(w,"registerSupportFeedbackWrites");export{w as registerSupportFeedbackWrites};
|
package/src/mcp.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var $=Object.defineProperty;var h=(y,c)=>$(y,"name",{value:c,configurable:!0});import{McpServer as S}from"@modelcontextprotocol/server";import{serveStdio as U}from"@modelcontextprotocol/server/stdio";import{z as e}from"zod";import{pathToFileURL as j}from"node:url";import{CliError as I}from"./api.js";import{runOperation as H}from"./operations.js";import{registerLogisticsReads as L}from"./mcp-logistics.js";import{registerOperationalReads as O}from"./mcp-operational.js";import{registerAdministrationReads as z}from"./mcp-administration.js";import{registerRoutesTowerReads as E}from"./mcp-routes-tower.js";import{createRemoteMcpHandler as N}from"./remote-mcp.js";import{registerSupportFeedbackWrites as B}from"./mcp-support-feedback.js";import{registerDesktopOperationsWrites as J}from"./mcp-desktop-operations.js";import{bindCoreFetch as F}from"./core-fetch.js";function k(y=process.env){const c=new S({name:"genne-product",version:"0.1.0"}),a=h((t,o,r,n)=>{c.registerTool(t,{description:o,inputSchema:e.object(r),annotations:{readOnlyHint:!0,openWorldHint:t==="genne_driver_place_search"||t==="genne_driver_place_details",destructiveHint:!1}},async m=>{try{const i=await H(n(m),{env:y});return{content:[{type:"text",text:JSON.stringify(i)}]}}catch(i){return{isError:!0,content:[{type:"text",text:i instanceof I?i.message:"Falha interna do Genne MCP"}]}}})},"register");a("genne_help","Lista todos os comandos da CLI ou detalha um caminho; n\xE3o exige sess\xE3o Core.",{path:e.string().max(200).optional()},({path:t})=>["help",...t?.trim()?t.trim().split(/\s+/):[]]),a("genne_environment","Mostra o ambiente e a origem API efetivos sem expor credenciais.",{},()=>["env","show"]),a("genne_whoami","Consulta a identidade e o papel ativo da sess\xE3o Genne.",{},()=>["whoami"]),a("genne_shipper_route_show","Consulta uma rota operacional vis\xEDvel ao shipper da sess\xE3o.",{public_id:e.uuid()},({public_id:t})=>["shipper","route","show",t]),a("genne_user_me","Consulta os dados b\xE1sicos do usu\xE1rio da sess\xE3o.",{},()=>["users","me"]),a("genne_driver_profile","Consulta o perfil do motorista da sess\xE3o.",{},()=>["users","driver","profile"]),a("genne_driver_profile_details","Consulta o perfil operacional detalhado do motorista da sess\xE3o.",{},()=>["driver","profile","show"]),a("genne_driver_carriers","Lista transportadoras vinculadas ao motorista da sess\xE3o.",{},()=>["users","driver","carriers","list"]);for(const[t,o,r]of[["carrier","drivers","driver"],["driver","carriers","carrier"]])a(`genne_${t}_${r}_invitations`,`Lista convites da sess\xE3o ${t}; o Core decide ACL e escopo.`,{status:e.enum(["pending","accepted","declined","cancelled","expired"]).optional(),limit:e.number().int().min(1).max(100).optional(),cursor:e.string().optional()},n=>["users",t,o,"invitations","list",...Object.entries(n).filter(([,m])=>m!==void 0).map(([m,i])=>`${m}=${i}`)]),a(`genne_${t}_${r}_invitation_show`,`Consulta o estado can\xF4nico de um convite da sess\xE3o ${t}.`,{invitation_id:e.uuid()},({invitation_id:n})=>["users",t,o,"invitations","show",n]);a("genne_carrier_drivers","Lista motoristas vis\xEDveis \xE0 transportadora da sess\xE3o.",{},()=>["users","carrier","drivers","list"]),a("genne_carrier_driver_link","Consulta o v\xEDnculo de um motorista com a transportadora da sess\xE3o.",{driver_id:e.uuid()},({driver_id:t})=>["users","carrier","drivers","link",t]),a("genne_my_account_members","Lista os membros da conta shipper ou carrier da sess\xE3o.",{},()=>["access","my-account","members"]),a("genne_my_account_permission_catalog","Consulta permiss\xF5es B2B dispon\xEDveis na conta ativa.",{},()=>["access","my-account","catalog"]),a("genne_my_account_entitlements","Consulta m\xF3dulos habilitados na conta ativa.",{},()=>["access","my-account","entitlements"]),a("genne_my_account_member_access","Consulta permiss\xF5es de um membro da conta ativa.",{membership_id:e.uuid()},({membership_id:t})=>["access","my-account","member-access",t]),a("genne_admin_users","Lista usu\xE1rios vis\xEDveis ao admin da sess\xE3o.",{limit:e.number().int().positive().max(100).optional(),cursor:e.string().optional(),role:e.string().optional(),search:e.string().optional()},({limit:t,cursor:o,role:r,search:n})=>["users","admin","list",...Object.entries({limit:t,cursor:o,role:r,search:n}).filter(([,m])=>m!==void 0).map(([m,i])=>`${m}=${i}`)]),a("genne_admin_user_show","Consulta um usu\xE1rio vis\xEDvel ao admin da sess\xE3o.",{user_id:e.uuid()},({user_id:t})=>["users","admin","show",t]),a("genne_admin_drivers","Lista motoristas vis\xEDveis ao admin da sess\xE3o.",{},()=>["users","drivers","list"]),a("genne_admin_driver_profile","Consulta os campos operacionais do motorista autorizados ao admin.",{user_id:e.uuid()},({user_id:t})=>["users","admin","driver-profile",t,"show"]),a("genne_admin_permission_catalog","Consulta o cat\xE1logo de permiss\xF5es internas.",{},()=>["access","catalog"]),a("genne_admin_access_accounts","Lista contas dispon\xEDveis para gest\xE3o de acesso pelo admin autorizado.",{account_type:e.enum(["shipper","carrier"]).optional(),search:e.string().optional(),limit:e.number().int().positive().max(100).optional(),cursor:e.string().optional()},t=>["access","accounts","list",...Object.entries(t).map(([o,r])=>`${o}=${r}`)]),a("genne_admin_access_members","Lista v\xEDnculos B2B vis\xEDveis ao admin autorizado.",{limit:e.number().int().positive().max(100).optional(),cursor:e.string().optional(),search:e.string().optional(),status:e.string().optional(),membership_role:e.string().optional(),carrier_account_id:e.uuid().optional(),shipper_account_id:e.uuid().optional()},t=>["access","members","list",...Object.entries(t).map(([o,r])=>`${o}=${r}`)]),a("genne_admin_internal_users","Lista usu\xE1rios internos para gest\xE3o de ACL pelo admin autorizado.",{},()=>["access","internal","list"]),a("genne_admin_internal_access","Consulta o acesso interno de um usu\xE1rio admin.",{user_id:e.uuid()},({user_id:t})=>["access","internal","show",t]),a("genne_admin_account_members","Lista membros de uma conta B2B autorizada ao admin.",{business_account_id:e.uuid()},({business_account_id:t})=>["access","account",t,"members"]),a("genne_admin_account_entitlements","Consulta m\xF3dulos de uma conta B2B autorizada ao admin.",{business_account_id:e.uuid()},({business_account_id:t})=>["access","account",t,"entitlements"]),a("genne_admin_account_member_access","Consulta permiss\xF5es de um membro B2B autorizado ao admin.",{business_account_id:e.uuid(),membership_id:e.uuid()},({business_account_id:t,membership_id:o})=>["access","account",t,"member-access",o]),a("genne_admin_account_member_bases","Consulta bases autorizadas para um membro B2B.",{business_account_id:e.uuid(),membership_id:e.uuid()},({business_account_id:t,membership_id:o})=>["access","account",t,"member-bases",o]),a("genne_admin_companies","Lista empresas B2B vis\xEDveis ao admin.",{account_type:e.enum(["shipper","carrier"]).optional(),search:e.string().optional(),limit:e.number().int().positive().max(100).optional(),cursor:e.string().optional()},t=>["admin","companies","list",...Object.entries(t).map(([o,r])=>`${o}=${r}`)]),a("genne_admin_company_show","Consulta uma empresa B2B pelo ID p\xFAblico.",{business_account_id:e.uuid()},({business_account_id:t})=>["admin","companies","show",t]),a("genne_admin_shipper_bases","Lista bases de um embarcador pelo ID operacional p\xFAblico.",{shipper_account_id:e.uuid()},({shipper_account_id:t})=>["admin","shippers",t,"bases","list"]),a("genne_admin_carrier_bases","Lista bases de uma transportadora pelo ID operacional p\xFAblico.",{carrier_account_id:e.uuid()},({carrier_account_id:t})=>["admin","carriers",t,"bases","list"]);for(const t of["shipper","carrier"])a(`genne_admin_${t}_base_zones`,"Consulta zonas efetivas salvas da base com sess\xE3o Admin autorizada. Informe account_id operacional do propriet\xE1rio e base_id p\xFAblicos; valida a refer\xEAncia \xE0 conta antes da leitura. Consulta s\xEDncrona, sem confirma\xE7\xE3o; n\xE3o altera cobertura.",{account_id:e.uuid().describe("UUID p\xFAblico operacional da conta propriet\xE1ria; n\xE3o \xE9 o ID da empresa B2B."),base_id:e.uuid().describe("UUID p\xFAblico da base pertencente \xE0 conta informada.")},({account_id:o,base_id:r})=>["admin",`${t}s`,o,"bases",r,"zone-overrides","list"]);return a("genne_admin_shipper_base_carrier_shares","Consulta distribui\xE7\xE3o configurada de carriers da base shipper com sess\xE3o Admin autorizada. Informe account_id operacional do embarcador e base_id p\xFAblicos. Consulta s\xEDncrona, sem confirma\xE7\xE3o; n\xE3o altera shares.",{account_id:e.uuid().describe("UUID p\xFAblico operacional do embarcador propriet\xE1rio."),base_id:e.uuid()},({account_id:t,base_id:o})=>["admin","shippers",t,"bases",o,"carrier-shares","list"]),a("genne_carrier_base_reference_zones","Consulta cat\xE1logo de refer\xEAncia OSM para uma base pr\xF3pria da conta carrier ativa, conforme as permiss\xF5es da sess\xE3o. N\xE3o representa cobertura operacional salva. Consulta s\xEDncrona, sem confirma\xE7\xE3o; use meta para pagina\xE7\xE3o e include_geometry para geometrias.",{base_id:e.uuid().describe("UUID p\xFAblico da base carrier da conta ativa."),limit:e.number().int().positive().max(100).optional(),cursor:e.string().min(1).optional(),search:e.string().min(1).optional(),min_lng:e.number().min(-180).max(180).optional(),min_lat:e.number().min(-90).max(90).optional(),max_lng:e.number().min(-180).max(180).optional(),max_lat:e.number().min(-90).max(90).optional(),include_geometry:e.boolean().optional()},({base_id:t,...o})=>["carrier","bases",t,"reference-zone-features","list",...Object.entries(o).map(([r,n])=>`${r}=${n}`)]),a("genne_shipper_bases","Lista bases da conta shipper ativa.",{},()=>["shipper","bases","list"]),a("genne_shipper_base_carrier_shares","Lista shares de transportadoras em uma base da conta shipper.",{base_id:e.uuid()},({base_id:t})=>["shipper","bases",t,"carrier-shares","list"]),a("genne_shipper_base_reference_zones","Lista zonas de refer\xEAncia de uma base da conta shipper.",{base_id:e.uuid(),limit:e.number().int().positive().max(100).optional(),cursor:e.string().min(1).optional(),search:e.string().min(1).optional(),min_lng:e.number().optional(),min_lat:e.number().optional(),max_lng:e.number().optional(),max_lat:e.number().optional(),include_geometry:e.boolean().optional()},({base_id:t,...o})=>["shipper","bases",t,"reference-zone-features","list",...Object.entries(o).map(([r,n])=>`${r}=${n}`)]),a("genne_my_company","Consulta a empresa ativa do embarcador ou transportadora da sess\xE3o.",{},()=>["company","my-account","show"]),a("genne_gr_requests","Lista solicita\xE7\xF5es de GR vis\xEDveis ao admin ou \xE0 transportadora da sess\xE3o.",{role:e.enum(["admin","carrier"]),carrier_account_id:e.uuid().optional(),provider_key:e.string().min(1).optional(),phase:e.string().min(1).optional(),operation_key:e.string().min(1).optional(),search:e.string().min(1).optional(),status:e.string().optional(),limit:e.number().int().positive().max(100).optional(),cursor:e.string().optional()},({role:t,...o})=>[t,"gr","requests","list",...Object.entries(o).filter(([,r])=>r!==void 0).map(([r,n])=>`${r}=${n}`)]),a("genne_gr_request_show","Consulta uma solicita\xE7\xE3o de GR pelo ID p\xFAblico, com ACL do Core.",{role:e.enum(["admin","carrier"]),request_id:e.uuid()},({role:t,request_id:o})=>[t,"gr","requests",o,"show"]),a("genne_gr_request_trail","Consulta tentativas, evid\xEAncias ou eventos de uma solicita\xE7\xE3o de GR autorizada.",{role:e.enum(["admin","carrier"]),request_id:e.uuid(),kind:e.enum(["attempts","evidence","orchestration-events"]),limit:e.number().int().positive().max(100).optional(),cursor:e.string().min(1).optional()},({role:t,request_id:o,kind:r,...n})=>[t,"gr","requests",o,r,...Object.entries(n).map(([m,i])=>`${m}=${i}`)]),a("genne_gr_provider_definitions","Lista defini\xE7\xF5es de providers GR vis\xEDveis \xE0 sess\xE3o.",{role:e.enum(["admin","carrier"])},({role:t})=>[t,"gr","provider-definitions","list"]),a("genne_gr_provider_accounts","Lista contas de providers GR vis\xEDveis ao papel ativo. carrier_account_id \xE9 filtro exclusivo Admin; search \xE9 exclusivo carrier; filtros incompat\xEDveis s\xE3o recusados.",{role:e.enum(["admin","carrier"]),carrier_account_id:e.uuid().optional(),search:e.string().min(1).optional(),provider_key:e.string().min(1).optional(),status:e.string().min(1).optional(),limit:e.number().int().positive().max(100).optional(),cursor:e.string().min(1).optional()},({role:t,...o})=>[t,"gr","providers","list",...Object.entries(o).map(([r,n])=>`${r}=${n}`)]),a("genne_gr_provider_mappings","Lista mapeamentos de opera\xE7\xF5es de uma conta GR autorizada.",{role:e.enum(["admin","carrier"]),provider_account_id:e.uuid(),active:e.boolean().optional()},({role:t,provider_account_id:o,...r})=>[t,"gr","providers",o,"mappings","list",...Object.entries(r).map(([n,m])=>`${n}=${m}`)]),a("genne_gr_provider_operations","Consulta opera\xE7\xF5es dispon\xEDveis na conta de provider GR autorizada.",{role:e.enum(["admin","carrier"]),provider_account_id:e.uuid()},({role:t,provider_account_id:o})=>[t,"gr","providers",o,"operations"]),a("genne_carrier_gr_blacklist","Lista v\xEDnculos bloqueados na transportadora da sess\xE3o.",{limit:e.number().int().positive().max(100).optional(),cursor:e.string().optional(),search:e.string().optional()},t=>["carrier","gr","blacklist","list",...Object.entries(t).map(([o,r])=>`${o}=${r}`)]),a("genne_admin_gr_blacklist","Lista v\xEDnculos bloqueados de uma transportadora vis\xEDvel ao admin.",{carrier_id:e.uuid(),limit:e.number().int().positive().max(100).optional(),cursor:e.string().optional(),search:e.string().optional()},({carrier_id:t,...o})=>["admin","gr","carriers",t,"blacklist","list",...Object.entries(o).map(([r,n])=>`${r}=${n}`)]),a("genne_carrier_gr_driver_export","Consulta perfil completo e prontid\xE3o GR de motorista vinculado \xE0 transportadora da sess\xE3o.",{driver_profile_id:e.uuid()},({driver_profile_id:t})=>["carrier","gr","drivers",t,"export"]),a("genne_admin_gr_driver_export","Consulta perfil completo e prontid\xE3o GR de motorista vinculado \xE0 transportadora autorizada.",{carrier_id:e.uuid(),driver_profile_id:e.uuid()},({carrier_id:t,driver_profile_id:o})=>["admin","gr","carriers",t,"drivers",o,"export"]),a("genne_carrier_gr_dashboard","Consulta o painel GR da transportadora ativa.",{},()=>["carrier","gr","dashboard"]),a("genne_admin_gr_dashboard","Consulta o painel GR de uma transportadora vis\xEDvel ao admin.",{carrier_id:e.uuid()},({carrier_id:t})=>["admin","gr","carriers",t,"dashboard"]),a("genne_carrier_gr_drivers","Lista motoristas GR da transportadora ativa.",{provider_account_id:e.uuid().optional(),document:e.string().min(1).optional(),training_pending:e.boolean().optional(),limit:e.number().int().positive().max(100).optional(),cursor:e.string().optional(),search:e.string().optional(),status:e.string().optional()},t=>["carrier","gr","drivers",...Object.entries(t).map(([o,r])=>`${o}=${r}`)]),a("genne_admin_gr_drivers","Lista motoristas GR de uma transportadora vis\xEDvel ao admin.",{carrier_id:e.uuid(),provider_account_id:e.uuid().optional(),document:e.string().min(1).optional(),training_pending:e.boolean().optional(),limit:e.number().int().positive().max(100).optional(),cursor:e.string().optional(),search:e.string().optional(),status:e.string().optional()},({carrier_id:t,...o})=>["admin","gr","carriers",t,"drivers",...Object.entries(o).map(([r,n])=>`${r}=${n}`)]),a("genne_admin_gr_driver_directory","Lista o diret\xF3rio GR global Admin, incluindo motoristas sem v\xEDnculo. carrier_account_id restringe \xE0 transportadora indicada; depende das permiss\xF5es da sess\xE3o.",{carrier_account_id:e.uuid().optional(),provider_account_id:e.uuid().optional(),document:e.string().min(1).optional(),training_pending:e.boolean().optional(),limit:e.number().int().positive().max(100).optional(),cursor:e.string().optional(),search:e.string().optional(),status:e.string().optional()},t=>["admin","gr","drivers",...Object.entries(t).map(([o,r])=>`${o}=${r}`)]),a("genne_order_lookup","Consulta um pedido por c\xF3digo de barras na transportadora da sess\xE3o.",{barcode:e.string().min(1)},({barcode:t})=>["carrier","orders","lookup",t]),a("genne_carrier_shippers","Lista embarcadores geridos pela transportadora da sess\xE3o.",{},()=>["carrier","shippers","list"]),a("genne_carrier_shipper_bases","Lista bases de um embarcador vinculado \xE0 transportadora da sess\xE3o.",{shipper_id:e.uuid()},({shipper_id:t})=>["carrier","shippers",t,"bases","list"]),a("genne_admin_carrier_shippers","Lista embarcadores geridos por uma transportadora vis\xEDvel ao admin.",{carrier_id:e.uuid()},({carrier_id:t})=>["admin","operations",t,"shippers","list"]),a("genne_admin_carrier_shipper_bases","Lista bases de um embarcador gerido por uma transportadora vis\xEDvel ao admin.",{carrier_id:e.uuid(),shipper_id:e.uuid()},({carrier_id:t,shipper_id:o})=>["admin","operations",t,"shippers",o,"bases","list"]),a("genne_carrier_receiving_rules","Lista regras de recebimento da transportadora da sess\xE3o.",{},()=>["carrier","receiving","rules","list"]),a("genne_admin_receiving_rules","Lista regras de recebimento de uma transportadora vis\xEDvel ao admin.",{carrier_id:e.uuid()},({carrier_id:t})=>["admin","operations",t,"receiving","rules","list"]),a("genne_admin_order_lookup","Consulta pedido por c\xF3digo de barras em uma transportadora vis\xEDvel ao admin.",{carrier_id:e.uuid(),barcode:e.string().min(1)},({carrier_id:t,barcode:o})=>["admin","operations",t,"orders","lookup",o]),a("genne_admin_triage_batch","Consulta lote de triagem vis\xEDvel ao admin da sess\xE3o.",{batch_id:e.uuid()},({batch_id:t})=>["admin","triage","batches",t,"show"]),a("genne_admin_triage_batches","Lista lotes de triagem vis\xEDveis ao admin da sess\xE3o.",{limit:e.number().int().positive().max(100).optional(),cursor:e.string().min(1).optional(),search:e.string().min(1).optional()},t=>["admin","triage","batches","list",...Object.entries(t).map(([o,r])=>`${o}=${r}`)]),a("genne_carrier_desktop_grants","Lista concess\xF5es de providers Desktop da transportadora ativa.",{},()=>["carrier","desktop","grants","list"]),a("genne_carrier_desktop_sync_runs","Lista execu\xE7\xF5es de sincroniza\xE7\xE3o Desktop na transportadora da sess\xE3o.",{shipper_id:e.uuid().optional(),base_id:e.uuid().optional(),connection_id:e.uuid().optional(),device_id:e.string().min(8).max(128).regex(/^[A-Za-z0-9._:-]+$/).optional(),order_id:e.uuid().optional(),status:e.enum(["queued","claimed","running","succeeded","failed","blocked_no_runner","blocked_auth","outcome_unknown","cancelled"]).optional(),cursor:e.string().min(1).optional()},t=>["carrier","desktop","sync-runs","list",...Object.entries(t).map(([o,r])=>`${o}=${r}`)]),a("genne_carrier_desktop_execution","Consulta estado e receipt de uma execu\xE7\xE3o Desktop autorizada.",{execution_id:e.uuid()},({execution_id:t})=>["carrier","desktop","executions",t,"show"]),a("genne_carrier_desktop_candidates","Lista candidatos de pedido de uma execu\xE7\xE3o Desktop e dispositivo autorizados.",{execution_id:e.uuid(),device_id:e.string().min(8).max(128).regex(/^[A-Za-z0-9._:-]+$/),cursor:e.string().min(1).optional()},({execution_id:t,...o})=>["carrier","desktop","executions",t,"candidates","list",...Object.entries(o).map(([r,n])=>`${r}=${n}`)]),a("genne_carrier_desktop_receipt","Consulta receipt de importa\xE7\xE3o por execu\xE7\xE3o, dispositivo e chave de lote.",{execution_id:e.uuid(),device_id:e.string().min(8).max(128).regex(/^[A-Za-z0-9._:-]+$/),batch_key:e.string().min(16).max(128).regex(/^[A-Za-z0-9._:-]+$/)},({execution_id:t,device_id:o,batch_key:r})=>["carrier","desktop","executions",t,"receipt",`device_id=${o}`,`batch_key=${r}`]),a("genne_carrier_desktop_operation_routes","Lista revis\xF5es de rotas operacionais Desktop da transportadora.",{},()=>["carrier","desktop","operation-routes","list"]),a("genne_carrier_desktop_orders","Lista pedidos can\xF4nicos vis\xEDveis \xE0 transportadora ativa no Desktop.",{shipper_id:e.uuid().optional(),base_id:e.uuid().optional(),query:e.string().optional(),cursor:e.string().optional(),status_sync:e.literal(!0).optional()},t=>["carrier","desktop","orders","list",...Object.entries(t).map(([o,r])=>`${o}=${r}`)]),a("genne_carrier_desktop_order_show","Consulta pedido can\xF4nico por ID na transportadora ativa no Desktop.",{order_id:e.uuid()},({order_id:t})=>["carrier","desktop","orders",t,"show"]),a("genne_carrier_desktop_device_runs","Lista resultados de recebimento de um dispositivo da transportadora.",{base_id:e.uuid().optional(),shipper_id:e.uuid().optional(),operation_kind:e.enum(["sack_receipt","package_receipt","route_creation","dispatch","transfer","return"]).optional(),device_id:e.string().min(8).max(128),cursor:e.string().optional(),limit:e.number().int().positive().max(100).optional()},t=>["carrier","desktop","operation-runs","list",...Object.entries(t).map(([o,r])=>`${o}=${r}`)]),a("genne_carrier_desktop_monitor_runs","Lista resultados de recebimento no monitor da transportadora.",{base_id:e.uuid().optional(),shipper_id:e.uuid().optional(),operation_kind:e.enum(["sack_receipt","package_receipt","route_creation","dispatch","transfer","return"]).optional(),monitor:e.literal(!0),cursor:e.string().optional(),limit:e.number().int().positive().max(100).optional()},t=>["carrier","desktop","operation-runs","list",...Object.entries(t).map(([o,r])=>`${o}=${r}`)]),a("genne_import_batch","Consulta o estado de um lote de importa\xE7\xE3o vis\xEDvel ao papel ativo.",{role:e.enum(["admin","carrier","shipper"]),batch_id:e.uuid(),include_orders:e.boolean().optional()},({role:t,batch_id:o,include_orders:r})=>[t,"orders","imports",o,"show",...r===void 0?[]:[`include_orders=${r}`]]),a("genne_import_orders","Lista pedidos de um lote de importa\xE7\xE3o vis\xEDvel ao papel ativo.",{role:e.enum(["admin","carrier","shipper"]),batch_id:e.uuid(),search:e.string().min(1).optional(),geocode_status:e.string().min(1).optional(),only_errors:e.boolean().optional(),limit:e.number().int().positive().max(100).optional(),cursor:e.string().optional()},({role:t,batch_id:o,...r})=>[t,"orders","imports",o,"orders","list",...Object.entries(r).filter(([,n])=>n!==void 0).map(([n,m])=>`${n}=${m}`)]),a("genne_carrier_status_outbox","Consulta eventos de status da transportadora da sess\xE3o.",{shipper_id:e.uuid().optional(),sink_type:e.enum(["webhook","ocoren","adapter"]).optional(),adapter_type:e.string().min(1).optional()},t=>["carrier","status-outbox",...Object.entries(t).map(([o,r])=>`${o}=${r}`)]),a("genne_admin_status_outbox","Consulta eventos de status de uma transportadora vis\xEDvel ao admin.",{carrier_account_id:e.uuid(),shipper_id:e.uuid().optional(),sink_type:e.enum(["webhook","ocoren","adapter"]).optional(),adapter_type:e.string().min(1).optional()},({carrier_account_id:t,...o})=>["admin","operations",t,"status-outbox",...Object.entries(o).map(([r,n])=>`${r}=${n}`)]),L(a),O(a),z(a),E(a),c}h(k,"createProductServer");function A(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_faq_save_draft",{description:"Solicita aprova\xE7\xE3o humana para salvar uma FAQ publicada como rascunho; ap\xF3s a aprova\xE7\xE3o, executa a mesma inten\xE7\xE3o e devolve o receipt.",inputSchema:e.object({target:e.uuid(),expected_version:e.number().int().positive(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({target:n,expected_version:m,idempotency_key:i,intent_id:s})=>{const l=s?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(s)}/execute`:"/api/v1/auth/mcp/write-intents";try{const u=await r(new URL(l,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":i,"content-type":"application/json"},body:JSON.stringify({target:n,expected_version:m})}),d=await u.json();if(!u.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${d.error??u.status}`}]};const p=d.data,_=s?p:{...p,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(p.public_id)}?role=${encodeURIComponent(p.active_role)}`,o).href,next_step:"A pessoa deve revisar e aprovar esta inten\xE7\xE3o em outra sess\xE3o Core de login por senha; depois repita a chamada com intent_id e os mesmos target, expected_version e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(_)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(A,"registerRemoteFaqDraft");function T(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_user_me_update",{description:"Solicita aprova\xE7\xE3o humana para alterar somente campos do pr\xF3prio perfil. Ap\xF3s aprova\xE7\xE3o, repita com intent_id, changes e idempotency_key id\xEAnticos para executar.",inputSchema:e.object({changes:e.object({name:e.string().optional(),phone:e.string().optional(),vehicle_type:e.string().optional(),navigation_app_preference:e.string().optional()}).strict(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({changes:n,idempotency_key:m,intent_id:i})=>{const s=i?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(i)}/execute`:"/api/v1/auth/mcp/write-intents";try{const l=await r(new URL(s,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":m,"content-type":"application/json"},body:JSON.stringify({operation:"user.me.update",changes:n})}),u=await l.json();if(!l.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${u.error??l.status}`}]};const d=u.data,p=i?d:{...d,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(d.public_id)}?role=${encodeURIComponent(d.active_role)}`,o).href,next_step:"Revise e aprove o antes/depois em outra sess\xE3o Core de login por senha; depois repita com intent_id, changes e idempotency_key id\xEAnticos."};return{content:[{type:"text",text:JSON.stringify(p)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(T,"registerRemoteProfileUpdate");function P(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_admin_internal_user_access_set",{description:"Substitui todo o ACL de um usu\xE1rio interno Admin ap\xF3s aprova\xE7\xE3o em outra sess\xE3o. Informe user_id, admin_access_level (staff ou super_admin) e a lista completa permission_keys; para super_admin a lista deve ser vazia. Repita com intent_id e os mesmos campos e idempotency_key para executar. Exige autoriza\xE7\xE3o para gerenciar o acesso do usu\xE1rio.",inputSchema:e.object({user_id:e.uuid(),admin_access_level:e.enum(["staff","super_admin"]),permission_keys:e.array(e.string()).refine(n=>new Set(n).size===n.length),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}).strict(),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({user_id:n,admin_access_level:m,permission_keys:i,idempotency_key:s,intent_id:l})=>{const u=l?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(l)}/execute`:"/api/v1/auth/mcp/write-intents";try{const d=await r(new URL(u,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":s,"content-type":"application/json"},body:JSON.stringify({operation:"admin.internal_user_access.set",user_id:n,admin_access_level:m,permission_keys:i})}),p=await d.json();if(!d.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${p.error??d.status}`}]};const _=p.data,v=l?_:{..._,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(_.public_id)}?role=${encodeURIComponent(_.active_role)}`,o).href,next_step:"Revise usu\xE1rio e ACL antes/depois em outra sess\xE3o Core; depois repita com intent_id, os mesmos campos e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(v)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(P,"registerRemoteAdminInternalUserAccessSet");function D(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_business_member_access_set",{description:"Substitui papel e lista completa de permiss\xF5es de um membro B2B com aprova\xE7\xE3o em outra sess\xE3o. Admin informa account_id; carrier/shipper usam a conta ativa e omitem account_id. Exige autoriza\xE7\xE3o para gerenciar as permiss\xF5es do membro. Repita com intent_id, os mesmos campos e idempotency_key para executar.",inputSchema:e.object({account_id:e.uuid().optional(),membership_id:e.uuid(),membership_role:e.enum(["owner","operator","dispatcher","finance"]),permission_keys:e.array(e.string()).refine(n=>new Set(n).size===n.length),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}).strict(),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({account_id:n,membership_id:m,membership_role:i,permission_keys:s,idempotency_key:l,intent_id:u})=>{const d=u?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(u)}/execute`:"/api/v1/auth/mcp/write-intents";try{const p=await r(new URL(d,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":l,"content-type":"application/json"},body:JSON.stringify({operation:"business.member_access.set",account_id:n,membership_id:m,membership_role:i,permission_keys:s})}),_=await p.json();if(!p.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${_.error??p.status}`}]};const v=_.data,g=u?v:{...v,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(v.public_id)}?role=${encodeURIComponent(v.active_role)}`,o).href,next_step:"Revise empresa, membro e ACL antes/depois em outra sess\xE3o Core; depois repita com intent_id e a mesma idempotency_key."};return{content:[{type:"text",text:JSON.stringify(g)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(D,"registerRemoteBusinessMemberAccessSet");function W(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_business_member_status_set",{description:"Ativa ou desativa um membro B2B com aprova\xE7\xE3o em outra sess\xE3o. Admin informa account_id; carrier/shipper usam a conta ativa e omitem account_id. Exige autoriza\xE7\xE3o para gerenciar membros. Repita com intent_id e a mesma idempotency_key ap\xF3s a aprova\xE7\xE3o.",inputSchema:e.object({account_id:e.uuid().optional(),membership_id:e.uuid(),status:e.enum(["active","inactive"]),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}).strict(),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({account_id:n,membership_id:m,status:i,idempotency_key:s,intent_id:l})=>{const u=l?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(l)}/execute`:"/api/v1/auth/mcp/write-intents";try{const d=await r(new URL(u,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":s,"content-type":"application/json"},body:JSON.stringify({operation:"business.member_status.set",account_id:n,membership_id:m,status:i})}),p=await d.json();if(!d.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${p.error??d.status}`}]};const _=p.data,v=l?_:{..._,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(_.public_id)}?role=${encodeURIComponent(_.active_role)}`,o).href,next_step:"Revise empresa, membro e status antes/depois em outra sess\xE3o Core; depois repita com intent_id e a mesma idempotency_key."};return{content:[{type:"text",text:JSON.stringify(v)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(W,"registerRemoteBusinessMemberStatusSet");function G(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){const n={account_id:e.uuid().optional(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()},m=[{name:"genne_business_member_invite",operation:"business.member.invite",description:"Convida um membro B2B com aprova\xE7\xE3o separada. Admin informa account_id e member.workspace_role (carrier ou shipper); clientes omitem ambos e usam a conta ativa. Carrier permite operator, dispatcher e finance; shipper permite operator e finance; Admin tamb\xE9m permite owner. Requer a ACL de gest\xE3o de membros do endpoint existente. Repita os mesmos dados e idempotency_key com intent_id. Um v\xEDnculo existente conserva o acesso e n\xE3o gera outro envio. Receipt pending significa e-mail enfileirado; consulte genne_my_account_members ou genne_admin_account_members para acompanhar o envio.",inputSchema:e.object({...n,member:e.object({email:e.string().trim().toLowerCase().pipe(e.email()),membership_role:e.enum(["owner","operator","dispatcher","finance"]),workspace_role:e.enum(["carrier","shipper"]).optional()}).strict()}).strict()},{name:"genne_business_member_invitation_resend",operation:"business.member_invitation.resend",description:"Reenvia um convite B2B conforme as regras atuais, com aprova\xE7\xE3o separada. Admin informa account_id; carrier/shipper omitem e usam a conta ativa. Informe membership_id e chave est\xE1vel; repita com intent_id ap\xF3s aprova\xE7\xE3o. Receipt pending significa enfileirado. Consulte genne_my_account_members ou genne_admin_account_members para acompanhar; convite de cadastro j\xE1 enviado n\xE3o pode ser reenviado.",inputSchema:e.object({...n,membership_id:e.uuid()}).strict()}];for(const{name:i,operation:s,description:l,inputSchema:u}of m)y.registerTool(i,{description:l,inputSchema:u,annotations:{readOnlyHint:!1,openWorldHint:i==="genne_business_member_invite",destructiveHint:!0,idempotentHint:!0}},async({idempotency_key:d,intent_id:p,..._})=>{const v=p?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(p)}/execute`:"/api/v1/auth/mcp/write-intents";try{const g=await r(new URL(v,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":d,"content-type":"application/json"},body:JSON.stringify({operation:s,..._})}),b=await g.json();if(!g.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${b.error??g.status}`}]};const f=b.data,x=p?f:{...f,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(f.public_id)}?role=${encodeURIComponent(f.active_role)}`,o).href,next_step:"Revise empresa, destinat\xE1rio e papel em outra sess\xE3o Core. Repita os mesmos dados e chave com intent_id ap\xF3s aprova\xE7\xE3o. Pending indica enfileirado; acompanhe o envio na consulta de membros."};return{content:[{type:"text",text:JSON.stringify(x)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(G,"registerRemoteBusinessMemberInvitations");function q(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_company_my_account_update",{description:"Solicita aprova\xE7\xE3o para mudar legal_name ou trading_name da empresa carrier/shipper ativa. Repita com intent_id e a mesma chave ap\xF3s a aprova\xE7\xE3o.",inputSchema:e.object({changes:e.object({legal_name:e.string().min(1).max(255).optional(),trading_name:e.string().min(1).max(255).optional()}).strict().refine(n=>Object.keys(n).length>0),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({changes:n,idempotency_key:m,intent_id:i})=>{const s=i?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(i)}/execute`:"/api/v1/auth/mcp/write-intents";try{const l=await r(new URL(s,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":m,"content-type":"application/json"},body:JSON.stringify({operation:"company.my_account.update",changes:n})}),u=await l.json();if(!l.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${u.error??l.status}`}]};const d=u.data,p=i?d:{...d,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(d.public_id)}?role=${encodeURIComponent(d.active_role)}`,o).href,next_step:"Revise e aprove a altera\xE7\xE3o da empresa ativa no navegador; depois repita com intent_id, changes e idempotency_key id\xEAnticos."};return{content:[{type:"text",text:JSON.stringify(p)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(q,"registerRemoteCompanyUpdate");function M(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_admin_company_update",{description:"Solicita aprova\xE7\xE3o para alterar legal_name ou trading_name de uma empresa B2B selecionada por UUID. Exige sess\xE3o Admin com business_accounts_registry.manage. Repita com intent_id, account_id, changes e a mesma chave ap\xF3s aprova\xE7\xE3o em outra sess\xE3o Admin.",inputSchema:e.object({account_id:e.uuid(),changes:e.object({legal_name:e.string().min(1).max(255).optional(),trading_name:e.string().min(1).max(255).optional()}).strict().refine(n=>Object.keys(n).length>0),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}).strict(),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({account_id:n,changes:m,idempotency_key:i,intent_id:s})=>{const l=s?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(s)}/execute`:"/api/v1/auth/mcp/write-intents";try{const u=await r(new URL(l,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":i,"content-type":"application/json"},body:JSON.stringify({operation:"company.admin.update",account_id:n,changes:m})}),d=await u.json();if(!u.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${d.error??u.status}`}]};const p=d.data,_=s?p:{...p,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(p.public_id)}?role=admin`,o).href,next_step:"Revise empresa e valores antes/depois em outra sess\xE3o Core Admin; depois repita com intent_id, account_id, changes e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(_)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(M,"registerRemoteAdminCompanyUpdate");function Z(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){for(const n of[{tool:"genne_admin_carrier_base_create",operation:"base.carrier.create",subject:"transportadora"},{tool:"genne_admin_shipper_base_create",operation:"base.admin_shipper.create",subject:"embarcador"}])y.registerTool(n.tool,{description:`Solicita aprova\xE7\xE3o para criar uma base de ${n.subject} como Admin com a ACL do Core. Repita com intent_id e os mesmos dados ap\xF3s aprova\xE7\xE3o.`,inputSchema:e.object({account_id:e.uuid(),base:e.object({code:e.string().trim().min(1).max(255),name:e.string().trim().min(1).max(255),origin_address:e.string().trim().min(1).max(255),market_id:e.uuid(),country_code:e.string().regex(/^[A-Z]{2}$/),currency_code:e.string().regex(/^[A-Z]{3}$/),timezone:e.string().trim().min(1).max(255)}).strict(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!1,idempotentHint:!0}},async({account_id:m,base:i,idempotency_key:s,intent_id:l})=>{const u=l?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(l)}/execute`:"/api/v1/auth/mcp/write-intents";try{const d=await r(new URL(u,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":s,"content-type":"application/json"},body:JSON.stringify({operation:n.operation,account_id:m,base:i})}),p=await d.json();if(!d.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${p.error??d.status}`}]};const _=p.data,v=l?_:{..._,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(_.public_id)}?role=admin`,o).href,next_step:`Revise ${n.subject} e base em outra sess\xE3o Core Admin; depois repita com intent_id, account_id, base e idempotency_key id\xEAnticos.`};return{content:[{type:"text",text:JSON.stringify(v)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(Z,"registerRemoteAdminBaseCreate");function X(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){const m={...Object.fromEntries(["code","name","origin_address","postal_code","place_id","street","street_number","neighborhood","city","state","state_code","country","geocode_provider","timezone"].map(i=>[i,e.string().optional()])),origin_lat:e.number().min(-90).max(90).optional(),origin_lng:e.number().min(-180).max(180).optional(),triage_rules:e.record(e.string(),e.unknown()).optional()};for(const i of[{tool:"genne_admin_shipper_base_update",operation:"base.admin_shipper.update",fields:{...m,metadata:e.record(e.string(),e.unknown()).optional(),balancing_policy:e.record(e.string(),e.unknown()).optional()}},{tool:"genne_admin_carrier_base_update",operation:"base.admin_carrier.update",fields:m},{tool:"genne_admin_shipper_base_set_status",operation:"base.admin_shipper.set_status"},{tool:"genne_admin_shipper_base_cutoff_windows_set",operation:"base.admin_shipper.cutoff_windows.set",cutoff:!0},{tool:"genne_admin_carrier_base_cutoff_windows_set",operation:"base.admin_carrier.cutoff_windows.set",cutoff:!0}])y.registerTool(i.tool,{description:i.fields?"Edita uma base com sess\xE3o Admin autorizada. account_id \xE9 o UUID operacional da conta propriet\xE1ria. Revise conta, base, valores atuais e resultantes no link de aprova\xE7\xE3o; repita os mesmos dados e chave com intent_id. Campos omitidos s\xE3o preservados; mercado, country_code, moeda, ownership, status e null s\xE3o recusados. 412 exige nova leitura e inten\xE7\xE3o.":i.cutoff?"Substitui todos os hor\xE1rios de corte de uma base shipper/carrier com sess\xE3o Admin autorizada. account_id \xE9 o UUID operacional propriet\xE1rio. windows cont\xE9m weekday 0..6, cutoff_time HH:MM[:SS] no timezone da base e auto_publish opcional; [] remove todos. Base shipper com execu\xE7\xF5es de corte vinculadas \xE9 recusada com 409 cutoff_dispatches_exist para preservar hist\xF3rico e execu\xE7\xE3o; n\xE3o h\xE1 reagendamento impl\xEDcito. Revise conta, base, timezone e hor\xE1rios atuais/resultantes na aprova\xE7\xE3o Core. Repita os mesmos dados e idempotency_key com intent_id. A execu\xE7\xE3o retorna o receipt; 412 exige nova inten\xE7\xE3o, replay retorna o receipt original.":"Ativa ou desativa uma base de embarcador com sess\xE3o Admin autorizada. Informe account_id operacional da conta propriet\xE1ria, base_id e status active/inactive. Revise conta, base, status atual e resultante no link de aprova\xE7\xE3o; repita os mesmos dados e chave com intent_id. 412 exige nova leitura e inten\xE7\xE3o; replay devolve o receipt original.",inputSchema:e.object({account_id:e.uuid(),base_id:e.uuid(),...i.fields?{changes:e.object(i.fields).strict().refine(s=>Object.keys(s).length>0,"Informe uma altera\xE7\xE3o")}:i.cutoff?{windows:e.array(e.object({weekday:e.number().int().min(0).max(6),cutoff_time:e.string().regex(/^(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d)?$/),auto_publish:e.boolean().optional()}).strict())}:{status:e.enum(["active","inactive"])},idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}).strict(),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({account_id:s,base_id:l,changes:u,status:d,windows:p,idempotency_key:_,intent_id:v})=>{const g=v?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(v)}/execute`:"/api/v1/auth/mcp/write-intents";try{const b=await r(new URL(g,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":_,"content-type":"application/json"},body:JSON.stringify({operation:i.operation,account_id:s,base_id:l,...i.fields?{changes:u}:i.cutoff?{windows:p}:{status:d}})}),f=await b.json();if(!b.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${f.error??b.status}`}]};const x=v?f.data:{...f.data,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(f.data.public_id)}?role=admin`,o).href,next_step:"Revise a base em outra sess\xE3o Admin e repita com intent_id e os mesmos dados e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(x)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(X,"registerRemoteAdminBaseChange");function Q(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_admin_carrier_base_set_status",{description:"Solicita aprova\xE7\xE3o para ativar ou desativar operacionalmente uma base carrier com sess\xE3o Admin autorizada. Repita com intent_id, base_id, status e a mesma chave ap\xF3s aprova\xE7\xE3o.",inputSchema:e.object({base_id:e.uuid(),status:e.enum(["active","inactive"]),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}).strict(),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({base_id:n,status:m,idempotency_key:i,intent_id:s})=>{const l=s?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(s)}/execute`:"/api/v1/auth/mcp/write-intents";try{const u=await r(new URL(l,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":i,"content-type":"application/json"},body:JSON.stringify({operation:"base.admin_carrier.set_status",base_id:n,status:m})}),d=await u.json();if(!u.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${d.error??u.status}`}]};const p=d.data,_=s?p:{...p,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(p.public_id)}?role=admin`,o).href,next_step:"Revise base e estado antes/depois em outra sess\xE3o Core Admin; depois repita com intent_id, base_id, status e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(_)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(Q,"registerRemoteAdminCarrierBaseStatus");function V(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){const n=e.object({code:e.string().trim().min(1).max(255),name:e.string().trim().min(1).max(255),origin_address:e.string().trim().min(1).max(255).optional(),origin_lat:e.number().min(-90).max(90).optional(),origin_lng:e.number().min(-180).max(180).optional(),timezone:e.string().trim().min(1).max(255).optional(),triage_rules:e.record(e.string(),e.unknown()).optional(),metadata:e.record(e.string(),e.unknown()).optional()}).strict().refine(m=>m.origin_lat===void 0==(m.origin_lng===void 0),{message:"origin_lat e origin_lng devem ser informados juntos"});for(const m of[{tool:"genne_shipper_base_create",operation:"base.shipper.create",role:"shipper"},{tool:"genne_carrier_shipper_base_create",operation:"base.carrier_shipper.create",role:"carrier"}])y.registerTool(m.tool,{description:m.role==="carrier"?"Solicita aprova\xE7\xE3o para criar uma base nova de embarcador vinculada \xE0 transportadora ativa. Informe c\xF3digo em mai\xFAsculas; repita com intent_id e os mesmos dados ap\xF3s aprova\xE7\xE3o.":"Solicita aprova\xE7\xE3o para criar uma base da conta shipper ativa e autorizada. Repita com intent_id e os mesmos dados ap\xF3s aprova\xE7\xE3o.",inputSchema:e.object({...m.role==="carrier"?{shipper_id:e.uuid()}:{},base:m.role==="carrier"?n.refine(i=>i.code===i.code.toUpperCase(),{message:"code deve estar em mai\xFAsculas"}):n,idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}).strict(),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!1,idempotentHint:!0}},async({shipper_id:i,base:s,idempotency_key:l,intent_id:u})=>{const d=u?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(u)}/execute`:"/api/v1/auth/mcp/write-intents";try{const p=await r(new URL(d,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":l,"content-type":"application/json"},body:JSON.stringify({operation:m.operation,...i?{shipper_id:i}:{},base:s})}),_=await p.json();if(!p.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${_.error??p.status}`}]};const v=_.data,g=u?v:{...v,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(v.public_id)}?role=${m.role}`,o).href,next_step:m.role==="carrier"?"Revise a transportadora, o embarcador e a base em outra sess\xE3o Core da mesma conta carrier; depois repita com intent_id, shipper_id, base e idempotency_key id\xEAnticos.":"Revise a base em outra sess\xE3o Core da mesma conta shipper; depois repita com intent_id, base e idempotency_key id\xEAnticos."};return{content:[{type:"text",text:JSON.stringify(g)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(V,"registerRemoteShipperBaseCreate");function Y(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_gr_driver_training_update",{description:"Solicita aprova\xE7\xE3o para marcar o treinamento GR de um motorista vis\xEDvel ao admin ou carrier. Repita com intent_id e a mesma chave ap\xF3s a aprova\xE7\xE3o.",inputSchema:e.object({target:e.uuid(),training_watched:e.boolean(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({target:n,training_watched:m,idempotency_key:i,intent_id:s})=>{const l=s?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(s)}/execute`:"/api/v1/auth/mcp/write-intents";try{const u=await r(new URL(l,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":i,"content-type":"application/json"},body:JSON.stringify({operation:"gr.driver_training.update",target:n,training_watched:m})}),d=await u.json();if(!u.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${d.error??u.status}`}]};const p=d.data,_=s?p:{...p,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(p.public_id)}?role=${encodeURIComponent(p.active_role)}`,o).href,next_step:"Revise e aprove o treinamento GR em outra sess\xE3o Core; depois repita com intent_id, target, training_watched e idempotency_key id\xEAnticos."};return{content:[{type:"text",text:JSON.stringify(_)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(Y,"registerRemoteGrTrainingUpdate");function K(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_order_triage_address_update",{description:"Solicita aprova\xE7\xE3o para corrigir o endere\xE7o de um pedido em lote de triagem (admin). Coordenadas manuais exigem latitude e longitude juntas. Repita com intent_id e a mesma chave ap\xF3s a aprova\xE7\xE3o.",inputSchema:e.object({batch_id:e.uuid(),order_id:e.uuid(),destination_address:e.string().min(1),destination_lat:e.number().min(-90).max(90).optional(),destination_lng:e.number().min(-180).max(180).optional(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({batch_id:n,order_id:m,destination_address:i,destination_lat:s,destination_lng:l,idempotency_key:u,intent_id:d})=>{const p=d?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(d)}/execute`:"/api/v1/auth/mcp/write-intents",_={operation:"order.triage_address.update",batch_id:n,order_id:m,destination_address:i};s!==void 0&&l!==void 0&&(_.destination_lat=s,_.destination_lng=l);try{const v=await r(new URL(p,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":u,"content-type":"application/json"},body:JSON.stringify(_)}),g=await v.json();if(!v.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${g.error??v.status}`}]};const b=g.data,f=d?b:{...b,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(b.public_id)}?role=${encodeURIComponent(b.active_role)}`,o).href,next_step:"Revise e aprove a corre\xE7\xE3o do pedido em outra sess\xE3o Core; depois repita com intent_id e os mesmos campos e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(f)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(K,"registerRemoteTriageOrderUpdate");function ee(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_receiving_scan",{description:"Solicita aprova\xE7\xE3o para registrar um bip de recebimento na carrier ativa. Admin informa carrier_account_id; carrier usa a conta da sess\xE3o. Repita com intent_id e a mesma chave ap\xF3s aprova\xE7\xE3o.",inputSchema:e.object({barcode:e.string().min(1),carrier_account_id:e.uuid().optional(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({barcode:n,carrier_account_id:m,idempotency_key:i,intent_id:s})=>{const l=s?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(s)}/execute`:"/api/v1/auth/mcp/write-intents",u={operation:"receiving.order.scan",barcode:n};m&&(u.carrier_account_id=m);try{const d=await r(new URL(l,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":i,"content-type":"application/json"},body:JSON.stringify(u)}),p=await d.json();if(!d.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${p.error??d.status}`}]};const _=p.data,v=s?_:{..._,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(_.public_id)}?role=${encodeURIComponent(_.active_role)}`,o).href,next_step:"Revise o pedido e c\xF3digo bipado em outra sess\xE3o Core; depois repita com intent_id, o mesmo barcode, carrier_account_id quando usado e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(v)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(ee,"registerRemoteReceivingScan");function te(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){const m={...{shipper_id:e.uuid().nullable().optional(),base_id:e.uuid().nullable().optional()},code:e.string().min(1).max(255),name:e.string().min(1).max(255),postal_code_start:e.string().min(1).max(16),postal_code_end:e.string().min(1).max(16),priority_order:e.number().int().min(0).optional(),status:e.enum(["active","inactive"]).optional(),metadata:e.record(e.string(),e.unknown()).optional()},i=e.object(m).strict(),s=i.partial().refine(u=>Object.keys(u).length>0,{message:"changes deve conter ao menos um campo"}),l=h(async({operation:u,carrier_account_id:d,rule_id:p,values:_,idempotency_key:v,intent_id:g})=>{const b=g?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(g)}/execute`:"/api/v1/auth/mcp/write-intents",f={operation:u,..._};d!==void 0&&(f.carrier_account_id=d),p!==void 0&&(f.rule_id=p);try{const x=await r(new URL(b,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":v,"content-type":"application/json"},body:JSON.stringify(f)}),R=await x.json();if(!x.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${R.error??x.status}`}]};const w=R.data,C=g?w:{...w,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(w.public_id)}?role=${encodeURIComponent(w.active_role)}`,o).href,next_step:"Revise transportadora, escopo e regra antes/depois em outra sess\xE3o Core; depois repita com intent_id, os mesmos campos e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(C)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}},"send");y.registerTool("genne_receiving_rule_create",{description:"Solicita aprova\xE7\xE3o para criar regra de recebimento global, de shipper ou por base. Admin informa carrier_account_id; carrier usa a conta ativa. Repita com intent_id e o mesmo rule ap\xF3s aprova\xE7\xE3o.",inputSchema:e.object({carrier_account_id:e.uuid().optional(),rule:i,idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}).strict(),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!1,idempotentHint:!0}},async({carrier_account_id:u,rule:d,idempotency_key:p,intent_id:_})=>l({operation:"receiving.rule.create",carrier_account_id:u,values:d,idempotency_key:p,intent_id:_})),y.registerTool("genne_receiving_rule_update",{description:"Solicita aprova\xE7\xE3o para atualizar parcialmente uma regra de recebimento. Campos de escopo omitidos s\xE3o preservados e null expl\xEDcito \xE9 enviado ao Core. Admin informa carrier_account_id; carrier usa a conta ativa.",inputSchema:e.object({carrier_account_id:e.uuid().optional(),rule_id:e.uuid(),changes:s,idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}).strict(),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({carrier_account_id:u,rule_id:d,changes:p,idempotency_key:_,intent_id:v})=>l({operation:"receiving.rule.update",carrier_account_id:u,rule_id:d,values:p,idempotency_key:_,intent_id:v}))}h(te,"registerRemoteReceivingRules");function oe(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_dispatch_route_create",{description:"Solicita aprova\xE7\xE3o para criar rota de expedi\xE7\xE3o com pedidos recebidos na carrier ativa. Admin informa carrier_account_id. Repita com intent_id e os mesmos campos e chave ap\xF3s aprova\xE7\xE3o.",inputSchema:e.object({driver_user_id:e.uuid(),barcodes:e.array(e.string().min(1).max(128)).min(1).max(100),route_name:e.string().min(1).max(120).optional(),carrier_account_id:e.uuid().optional(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!1,idempotentHint:!0}},async({driver_user_id:n,barcodes:m,route_name:i,carrier_account_id:s,idempotency_key:l,intent_id:u})=>{const d=u?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(u)}/execute`:"/api/v1/auth/mcp/write-intents",p={operation:"dispatch.route.create",driver_user_id:n,barcodes:m};i&&(p.route_name=i),s&&(p.carrier_account_id=s);try{const _=await r(new URL(d,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":l,"content-type":"application/json"},body:JSON.stringify(p)}),v=await _.json();if(!_.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${v.error??_.status}`}]};const g=v.data,b=u?g:{...g,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(g.public_id)}?role=${encodeURIComponent(g.active_role)}`,o).href,next_step:"Revise motorista e pedidos em outra sess\xE3o Core; depois repita com intent_id, os mesmos campos e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(b)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(oe,"registerRemoteDispatchRouteCreate");function ae(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_dispatch_route_add_orders",{description:"Solicita aprova\xE7\xE3o para adicionar pedidos recebidos a uma rota de expedi\xE7\xE3o manual ativa da carrier. Admin informa carrier_account_id; carrier usa a conta ativa. A rota pode j\xE1 ter iniciado. Repita com intent_id e os mesmos campos e chave ap\xF3s aprova\xE7\xE3o.",inputSchema:e.object({route_id:e.uuid(),barcodes:e.array(e.string().min(1).max(128)).min(1).max(100),reason:e.string().min(1).max(500).optional(),carrier_account_id:e.uuid().optional(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({route_id:n,barcodes:m,reason:i,carrier_account_id:s,idempotency_key:l,intent_id:u})=>{const d=u?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(u)}/execute`:"/api/v1/auth/mcp/write-intents",p={operation:"dispatch.route.add_orders",route_id:n,barcodes:m};i!==void 0&&(p.reason=i),s&&(p.carrier_account_id=s);try{const _=await r(new URL(d,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":l,"content-type":"application/json"},body:JSON.stringify(p)}),v=await _.json();if(!_.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${v.error??_.status}`}]};const g=v.data,b=u?g:{...g,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(g.public_id)}?role=${encodeURIComponent(g.active_role)}`,o).href,next_step:"Revise a rota, os pedidos e o motivo em outra sess\xE3o Core; depois repita com intent_id, os mesmos campos e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(b)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(ae,"registerRemoteDispatchRouteAddOrders");function ne(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){for(const n of[{tool:"genne_driver_route_start",operation:"driver.route.start",verb:"iniciar"},{tool:"genne_driver_route_finish",operation:"driver.route.finish",verb:"concluir"}])y.registerTool(n.tool,{description:`Solicita aprova\xE7\xE3o para ${n.verb} uma SavedRoute pr\xF3pria do motorista. Repita com intent_id, o mesmo route_id e a mesma chave ap\xF3s aprova\xE7\xE3o em outra sess\xE3o driver.`,inputSchema:e.object({route_id:e.uuid(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({route_id:m,idempotency_key:i,intent_id:s})=>{const l=s?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(s)}/execute`:"/api/v1/auth/mcp/write-intents";try{const u=await r(new URL(l,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":i,"content-type":"application/json"},body:JSON.stringify({operation:n.operation,route_id:m})}),d=await u.json();if(!u.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${d.error??u.status}`}]};const p=d.data,_=s?p:{...p,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(p.public_id)}?role=driver`,o).href,next_step:"Revise a rota em outra sess\xE3o Core do mesmo motorista; depois repita com intent_id, route_id e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(_)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(ne,"registerRemoteDriverRouteTransitions");function ie(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_driver_waypoint_deliver",{description:"Solicita aprova\xE7\xE3o para entregar os itens pendentes de uma parada em SavedRoute pr\xF3pria. O Core valida check-in e atualiza manifesto e eventos quando aplic\xE1veis. Repita com intent_id, os mesmos IDs e a mesma chave ap\xF3s aprova\xE7\xE3o em outra sess\xE3o driver.",inputSchema:e.object({route_id:e.uuid(),waypoint_id:e.uuid(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({route_id:n,waypoint_id:m,idempotency_key:i,intent_id:s})=>{const l=s?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(s)}/execute`:"/api/v1/auth/mcp/write-intents";try{const u=await r(new URL(l,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":i,"content-type":"application/json"},body:JSON.stringify({operation:"driver.waypoint.deliver",route_id:n,waypoint_id:m})}),d=await u.json();if(!u.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${d.error??u.status}`}]};const p=d.data,_=s?p:{...p,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(p.public_id)}?role=driver`,o).href,next_step:"Revise rota e parada em outra sess\xE3o Core do mesmo motorista; depois repita com intent_id, route_id, waypoint_id e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(_)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(ie,"registerRemoteDriverWaypointDeliver");function re(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_driver_package_item_deliver",{description:"Solicita aprova\xE7\xE3o para entregar um item pendente do manifesto em parada de rota pr\xF3pria. O Core valida check-in, estado e eventos. Repita com intent_id, os mesmos IDs e a mesma chave ap\xF3s aprova\xE7\xE3o em outra sess\xE3o driver.",inputSchema:e.object({route_id:e.uuid(),waypoint_id:e.uuid(),item_id:e.uuid(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({route_id:n,waypoint_id:m,item_id:i,idempotency_key:s,intent_id:l})=>{const u=l?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(l)}/execute`:"/api/v1/auth/mcp/write-intents";try{const d=await r(new URL(u,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":s,"content-type":"application/json"},body:JSON.stringify({operation:"driver.package_item.deliver",route_id:n,waypoint_id:m,item_id:i})}),p=await d.json();if(!d.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${p.error??d.status}`}]};const _=p.data,v=l?_:{..._,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(_.public_id)}?role=driver`,o).href,next_step:"Revise rota, parada e item em outra sess\xE3o Core do mesmo motorista; depois repita com intent_id, route_id, waypoint_id, item_id e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(v)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(re,"registerRemoteDriverPackageItemDeliver");function se(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_driver_waypoint_navigation_start",{description:"Solicita aprova\xE7\xE3o para registrar um evento de in\xEDcio de navega\xE7\xE3o em uma parada pr\xF3pria. N\xE3o abre um aplicativo de navega\xE7\xE3o nem altera carga ou status. Telemetria \xE9 opcional; o provider padr\xE3o \xE9 navigation_sdk_in_app. O Core valida posse, janela de edi\xE7\xE3o e ACL. Repita com intent_id, os mesmos dados e a mesma chave ap\xF3s aprova\xE7\xE3o em outra sess\xE3o driver.",inputSchema:e.object({route_id:e.uuid(),waypoint_id:e.uuid(),navigation_provider:e.string().trim().min(1).optional(),nav_sdk_version:e.string().trim().min(1).optional(),boot_duration_ms:e.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER).optional(),waypoint_index:e.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER).optional(),packages_count:e.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER).optional(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!1,idempotentHint:!0}},async({idempotency_key:n,intent_id:m,...i})=>{const s=m?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(m)}/execute`:"/api/v1/auth/mcp/write-intents",l={operation:"driver.waypoint.navigation.start",...i};try{const u=await r(new URL(s,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":n,"content-type":"application/json"},body:JSON.stringify(l)}),d=await u.json();if(!u.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${d.error??u.status}`}]};const p=d.data,_=m?p:{...p,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(p.public_id)}?role=driver`,o).href,next_step:"Revise a rota, a parada e a telemetria do evento em outra sess\xE3o Core do mesmo motorista; depois repita com intent_id, os mesmos dados e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(_)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(se,"registerRemoteDriverWaypointNavigationStart");function pe(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_driver_waypoint_notes",{description:"Solicita aprova\xE7\xE3o para substituir a observa\xE7\xE3o de uma parada pr\xF3pria do motorista. Envie notes como string; uma string vazia limpa a observa\xE7\xE3o. O Core valida posse e janela de edi\xE7\xE3o. Repita com intent_id, os mesmos dados e a mesma chave ap\xF3s aprova\xE7\xE3o em outra sess\xE3o driver.",inputSchema:e.object({route_id:e.uuid(),waypoint_id:e.uuid(),notes:e.string(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({route_id:n,waypoint_id:m,notes:i,idempotency_key:s,intent_id:l})=>{const u=l?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(l)}/execute`:"/api/v1/auth/mcp/write-intents",d={operation:"driver.waypoint.notes",route_id:n,waypoint_id:m,notes:i};try{const p=await r(new URL(u,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":s,"content-type":"application/json"},body:JSON.stringify(d)}),_=await p.json();if(!p.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${_.error??p.status}`}]};const v=_.data,g=l?v:{...v,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(v.public_id)}?role=driver`,o).href,next_step:"Revise a rota, a parada e a observa\xE7\xE3o em outra sess\xE3o Core do mesmo motorista; depois repita com intent_id, os mesmos dados e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(g)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(pe,"registerRemoteDriverWaypointNotes");function ce(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_driver_waypoint_packages",{description:"Solicita aprova\xE7\xE3o para alterar a quantidade de volumes de uma parada pr\xF3pria sem manifesto importado. Zero \xE9 v\xE1lido. O Core protege os itens do manifesto, valida posse e janela de edi\xE7\xE3o. Repita com intent_id, os mesmos dados e a mesma chave ap\xF3s aprova\xE7\xE3o em outra sess\xE3o driver.",inputSchema:e.object({route_id:e.uuid(),waypoint_id:e.uuid(),packages_count:e.number().int().min(0).max(2147483647),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({route_id:n,waypoint_id:m,packages_count:i,idempotency_key:s,intent_id:l})=>{const u=l?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(l)}/execute`:"/api/v1/auth/mcp/write-intents",d={operation:"driver.waypoint.packages",route_id:n,waypoint_id:m,packages_count:i};try{const p=await r(new URL(u,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":s,"content-type":"application/json"},body:JSON.stringify(d)}),_=await p.json();if(!p.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${_.error??p.status}`}]};const v=_.data,g=l?v:{...v,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(v.public_id)}?role=driver`,o).href,next_step:"Revise a rota, a parada e a quantidade de volumes em outra sess\xE3o Core do mesmo motorista; depois repita com intent_id, os mesmos dados e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(g)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(ce,"registerRemoteDriverWaypointPackages");function de(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_driver_waypoint_check_in",{description:"Solicita aprova\xE7\xE3o para registrar a localiza\xE7\xE3o atual em uma parada pr\xF3pria do motorista. O check-in \xE9 aditivo e o Core calcula dist\xE2ncia, limite e alerta. Repita com intent_id, os mesmos dados e a mesma chave ap\xF3s aprova\xE7\xE3o em outra sess\xE3o driver.",inputSchema:e.object({route_id:e.uuid(),waypoint_id:e.uuid(),lat:e.number().min(-90).max(90),lng:e.number().min(-180).max(180),accuracy_meters:e.number().min(0).optional(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!1,idempotentHint:!0}},async({route_id:n,waypoint_id:m,lat:i,lng:s,accuracy_meters:l,idempotency_key:u,intent_id:d})=>{const p=d?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(d)}/execute`:"/api/v1/auth/mcp/write-intents",_={operation:"driver.waypoint.check_in",route_id:n,waypoint_id:m,lat:i,lng:s};l!==void 0&&(_.accuracy_meters=l);try{const v=await r(new URL(p,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":u,"content-type":"application/json"},body:JSON.stringify(_)}),g=await v.json();if(!v.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${g.error??v.status}`}]};const b=g.data,f=d?b:{...b,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(b.public_id)}?role=driver`,o).href,next_step:"Revise a rota, a parada e as coordenadas em outra sess\xE3o Core do mesmo motorista; depois repita com intent_id, os mesmos dados e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(f)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(de,"registerRemoteDriverWaypointCheckIn");function me(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_driver_carrier_link",{description:"Solicita aprova\xE7\xE3o para vincular o motorista da sess\xE3o \xE0 transportadora identificada pelo c\xF3digo. O c\xF3digo n\xE3o aparece na aprova\xE7\xE3o. Repita com intent_id, o mesmo c\xF3digo e a mesma chave ap\xF3s aprova\xE7\xE3o em outra sess\xE3o driver.",inputSchema:e.object({driver_link_code:e.string().regex(/^\s*[A-Za-z0-9]{5}\s*$/),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({driver_link_code:n,idempotency_key:m,intent_id:i})=>{const s=i?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(i)}/execute`:"/api/v1/auth/mcp/write-intents";try{const l=await r(new URL(s,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":m,"content-type":"application/json"},body:JSON.stringify({operation:"driver.carrier.link",driver_link_code:n.trim().toUpperCase()})}),u=await l.json();if(!l.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${u.error??l.status}`}]};const d=u.data,p=i?d:{...d,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(d.public_id)}?role=driver`,o).href,next_step:"Revise a transportadora e o estado do v\xEDnculo em outra sess\xE3o Core driver; depois repita com intent_id, driver_link_code e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(p)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(me,"registerRemoteDriverCarrierLink");function ue(y,{coreOrigin:c,coreAccessToken:a,adapterKey:t,adminOrigin:o,fetchImpl:r}){y.registerTool("genne_tower_failure_policy_update",{description:"Solicita aprova\xE7\xE3o para alterar os motivos de insucesso permitidos \xE0 conta carrier/shipper ativa. Admin informa account_type e account_id. Repita com intent_id e os mesmos dados ap\xF3s aprova\xE7\xE3o.",inputSchema:e.object({reason_codes:e.array(e.string().min(1).max(64)).max(100),account_type:e.enum(["carrier","shipper"]).optional(),account_id:e.uuid().optional(),idempotency_key:e.string().min(16).max(128),intent_id:e.uuid().optional()}),annotations:{readOnlyHint:!1,openWorldHint:!1,destructiveHint:!0,idempotentHint:!0}},async({reason_codes:n,account_type:m,account_id:i,idempotency_key:s,intent_id:l})=>{const u=l?`/api/v1/auth/mcp/write-intents/${encodeURIComponent(l)}/execute`:"/api/v1/auth/mcp/write-intents",d={operation:"tower.failure_policy.update",reason_codes:n};m&&(d.account_type=m),i&&(d.account_id=i);try{const p=await r(new URL(u,c),{method:"POST",headers:{authorization:`Bearer ${a}`,"x-genne-mcp-adapter-key":t,"idempotency-key":s,"content-type":"application/json"},body:JSON.stringify(d)}),_=await p.json();if(!p.ok)return{isError:!0,content:[{type:"text",text:`Core recusou a inten\xE7\xE3o: ${_.error??p.status}`}]};const v=_.data,g=l?v:{...v,approval_url:new URL(`/admin/mcp-write-intents/${encodeURIComponent(v.public_id)}?role=${encodeURIComponent(v.active_role)}`,o).href,next_step:"Revise conta e lista de motivos em outra sess\xE3o Core; depois repita com intent_id, os mesmos campos e idempotency_key."};return{content:[{type:"text",text:JSON.stringify(g)}]}}catch{return{isError:!0,content:[{type:"text",text:"Falha ao consultar a inten\xE7\xE3o no Core; repita com a mesma idempotency_key."}]}}})}h(ue,"registerRemoteTowerFailurePolicyUpdate");function Ue({auth:y,coreOrigin:c,resource:a,adapterKey:t,adminOrigin:o,fetchImpl:r=fetch}){return N({auth:y,coreOrigin:c,resource:a,createServerForContext:h(({coreAccessToken:n,context:m})=>{const i=k({GENNE_API_URL:c,GENNE_ACCESS_TOKEN:n});if(t&&o&&m.scopes?.includes("genne.write.request")){const s=F(r);B(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),J(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),A(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),T(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),P(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),D(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),W(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),G(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),q(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),M(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),Z(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),X(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),Q(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),V(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),Y(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),K(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),ee(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),te(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),oe(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),ae(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),ne(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),de(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),se(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),pe(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),ce(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),me(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),ie(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),re(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s}),ue(i,{coreOrigin:c,coreAccessToken:n,adapterKey:t,adminOrigin:o,fetchImpl:s})}return i},"createServerForContext")})}h(Ue,"createRemoteProductMcpHandler"),process.argv[1]&&import.meta.url===j(process.argv[1]).href&&U(()=>k());export{k as createProductServer,Ue as createRemoteProductMcpHandler};
|