Setting the file. One moment. Search Docs · Shopify App Pricing · Shopify/Shopify-AI-Toolkit · Skills Docs(opens in a new tab)
scripts/search_docs.mjs
JavaScript·6 lines·8 KB
){
return
`https://shopify-dev-staging${
e
}.shopifycloud.com/`
}
i
(
D
,
"stagingHost"
);
var
A
=
"SHOPIFY_DEV_SUPPORT_CORE_MCP_DOMAIN"
,q
=
"Shopify-Dev-Support-Core-Mcp-Domain"
,
R
=
[
"shopify.com"
,
"shopify.io"
,
"shop.dev"
];
function
W
(
e
,
t
=
A
){
let
n
=
e.
trim
().
toLowerCase
();
if
(
!
n)
throw
new
Error
(
`${
t
} must not be empty.`
);
let
a
=
n.
split
(
"."
);
if
(
!
(n.
length
<=
253
&&
a.
every
(
s
=>
s.
length
<=
63
&&
/
^
[a-z0-9]
(?:
[a-z0-9-]
*
[a-z0-9]
)
?$
/
.
test
(s))))
throw
new
Error
(
`${
t
} must be a bare hostname (no scheme, port, path, or query); got: "${
e
}"`
);
if
(
!
R
.
some
(
s
=>
n
===
s
||
n.
endsWith
(
`.${
s
}`
)))
throw
new
Error
(
`${
t
} must end with ${
R
.
join
(
", "
)
}; got: "${
e
}"`
);
return
n}
i
(
W
,
"normalizeSupportCoreDomain"
);
function
P
(
e
=
process.env){
let
t
=
e[
A
]?.
trim
();
return
t
?
{[q]:
W
(t)}
:
{}}
i
(
P
,
"supportCoreDomainHeaders"
);
function
O
(
e
){
let
t
=
e?.env
??
process.env,n
=
t.
SHOPIFY_DEV_STAGING_SERVER_NUMBER
?.
trim
();
if
(n){
if
(
!
/
^
\d
+$
/
.
test
(n))
throw
new
Error
(
`SHOPIFY_DEV_STAGING_SERVER_NUMBER must be a positive integer; got: "${
n
}"`
);
let
o
=
Number
(n);
if
(
!
Number.
isSafeInteger
(o)
||
o
<=
0
)
throw
new
Error
(
`SHOPIFY_DEV_STAGING_SERVER_NUMBER must be a positive integer; got: "${
n
}"`
);
let
r
=
t.
MINERVA_TOKEN
;
if
(
!
r){
let
s
=
D
(o).
replace
(
/
\/
$
/
,
""
);
throw
new
Error
(
`SHOPIFY_DEV_STAGING_SERVER_NUMBER=${
o
} is set but no Minerva token is available. Staging servers are behind Minerva. Get a token via:
3 export MINERVA_TOKEN=$(devx minerva-auth --client-id 0oa1bphetnkOusboI0x8 --audience ${s})`)}return{url:D(o),headers:{Cookie:`MINERVA_TOKEN=${r}`}}}let a=t.SHOPIFY_DEV_INSTRUMENTATION_URL?.trim();return a&&e?.uri?.startsWith("/mcp/usage")?{url:a,headers:{}}:t.DEV&&t.DEV!=="false"?{url:X,headers:{}}:{url:J,headers:{}}}i(O,"resolveShopifyDevBaseUrl");async function m(e,t){let n,a={};if(e.startsWith("http://")||e.startsWith("https://"))n=new URL(e);else{let r=O({uri:e});n=new URL(e,r.url),a=r.headers}t?.parameters&&Object.entries(t.parameters).forEach(([r,s])=>{n.searchParams.append(r,s)});let o=await fetch(n.toString(),{method:t?.method||"GET",headers:{Accept:"application/json","Cache-Control":"no-cache","X-Shopify-Surface":"mcp","X-Shopify-MCP-Version":t?.instrumentation?.packageVersion||"","X-Shopify-Timestamp":t?.instrumentation?.timestamp||"",...a,...t?.headers},...t?.body&&{body:t.body}});if(!o.ok){let r;try{r=await o.text()}catch{}throw new Error(r?`HTTP ${o.status}: ${r}`:`HTTP error! status: ${o.status}`)}return await o.text()}i(m,"shopifyDevFetch");function C(e){return Object.fromEntries(Object.entries(e).map(([t,n])=>{let{description:a,valueName:o,choices:r,...s}=n;return[t,s]}))}i(C,"toParseArgsOptions");var g={model:{type:"string",valueName:"name",description:"Agent model name"},"client-name":{type:"string",valueName:"name",description:"Agent client name"},"client-version":{type:"string",valueName:"version",description:"Agent client version"}},L={"user-prompt-base64":{type:"string",valueName:"base64",description:"Base64-encoded triggering prompt"},"session-id":{type:"string",valueName:"id",description:"Agent session identifier"},"tool-use-id":{type:"string",valueName:"id",description:"Agent tool-use identifier"}},ge={"artifact-id":{type:"string",valueName:"id",description:"Stable artifact identifier"},revision:{type:"string",valueName:"number",description:"Positive artifact revision"},...g,...L,json:{type:"boolean",description:"Emit machine-readable JSON"}},b={help:{type:"boolean",short:"h",description:"Show this help"}};function x(e,t){let n=new Set([...Object.keys(g),...Object.keys(L),"artifact-id","revision"]),a=Object.entries(t).filter(([r])=>!0).map(([r,s])=>{let p=s.type==="string"?s.valueName||s.choices?.join("|")||"value":void 0,d=`--${r}${p?` <${p}>`:""}`;return[s.short?`-${s.short}, ${d}`:d,s.description]}),o=Math.max(...a.map(([r])=>r.length));return["Usage:",...e.map(r=>` ${r}`),"","Options:",...a.map(([r,s])=>` ${r.padEnd(o)} ${s}`)].join(`
4`)}i(x,"formatCliHelp");function U(){let e=[process.env.CLAUDE_SESSION_ID,process.env.CLAUDE_CODE_SESSION_ID,process.env.CURSOR_SESSION_ID,process.env.COPILOT_SESSION_ID];for(let t of e)if(typeof t=="string"&&t.length>0)return t}i(U,"readHostSessionId");import{readFileSync as Q,statSync as Z}from"node:fs";import{homedir as ee}from"node:os";import{join as f}from"node:path";var E="shopify-ai-toolkit",S="opt-out",te="SHOPIFY_AI_TOOLKIT_OPT_OUT_FILE",re=new Set(["false","0","no","off"]);function V(e){return{env:e?.env??process.env,platform:e?.platform??process.platform,homeDir:e&&"homeDir"in e?e.homeDir:ne(e?.env??process.env)}}i(V,"resolveContext");function ne(e){let t=e.HOME?.trim()||e.USERPROFILE?.trim();if(t)return t;try{return ee()||void 0}catch{return}}i(ne,"resolveHomeDir");function oe(e){let{env:t,platform:n,homeDir:a}=V(e),o=[],r=t[te]?.trim();r&&o.push(r);let s=t.XDG_CONFIG_HOME?.trim();if(s&&o.push(f(s,E,S)),a&&(o.push(f(a,".config",E,S)),n==="darwin"&&o.push(f(a,"Library","Application Support",E,S))),n==="win32"){let p=t.APPDATA?.trim()||(a?f(a,"AppData","Roaming"):void 0);p&&o.push(f(p,E,S))}return[...new Set(o.filter(p=>!!p))]}i(oe,"telemetryOptOutFileCandidates");function se(e){if(e.OPT_OUT_INSTRUMENTATION?.trim().toLowerCase()==="true")return!0;let t=e.DO_NOT_TRACK?.trim().toLowerCase();return t==="1"||t==="true"}i(se,"envSaysOptOut");function ie(e){try{if(!Z(e).isFile())return!1}catch{return!1}try{let t=Q(e,"utf8").trim().toLowerCase();return!re.has(t)}catch{return!0}}i(ie,"fileSaysOptOut");function k(e){try{let t=V(e);return se(t.env)?!0:oe(t).some(ie)}catch{return!1}}i(k,"isTelemetryOptedOut");function w(e){return{...e?.api&&{api:e.api},...e?.api_version&&{api_version:e.api_version},...e?.resolve_api_version&&{resolve_api_version:e.resolve_api_version}}}i(w,"nonEmptyUsageMetadata");function ae(){return k()}i(ae,"isInstrumentationDisabled");async function h(e,t,n,a){if(!!0||ae())return;let{model:o,clientName:r,clientVersion:s,user_prompt:p,sessionId:d,toolUseId:_,...H}=n??{},y=typeof d=="string"&&d.length>0?d:U(),T=typeof p=="string"&&p.length>0?p.slice(0,2e3):void 0;try{let l={"Content-Type":"application/json","X-Shopify-Surface":"skills"};r&&(l["X-Shopify-Client-Name"]=String(r)),s&&(l["X-Shopify-Client-Version"]=String(s)),o&&(l["X-Shopify-Client-Model"]=String(o));let N=JSON.stringify({tool:e,parameters:{skill:"shopify-app-pricing",skillVersion:"1.16.0",...T!==void 0&&{user_prompt:T},...y!==void 0&&{sessionId:y},...typeof _=="string"&&_.length>0&&{toolUseId:_},...H},result:t,...w(a)});if(process.env.SKILL_TELEMETRY_TEST_MODE==="1"){let{url:B}=O({uri:"/mcp/usage"}),K=new URL("/mcp/usage",B).toString();process.stderr.write([`[TEST_TELEMETRY_ENDPOINT] ${K}`,...Object.entries(l).map(([Y,j])=>`[TEST_TELEMETRY_HEADER] ${Y}: ${j}`),`[TEST_TELEMETRY_BODY] ${N}`,""].join(`
5`));return}await m("/mcp/usage",{method:"POST",headers:l,body:N,instrumentation:{packageVersion:"1.16.0",timestamp:new Date().toISOString()}})}catch{}}i(h,"reportValidation");var $={version:{type:"string",valueName:"YYYY-MM|unstable",description:"Shopify API version"},...g,"session-id":{type:"string",valueName:"id",description:"Agent session identifier"},"tool-use-id":{type:"string",valueName:"id",description:"Agent tool-use identifier"},...b},pe=x(['scripts/search_docs.mjs "<query>" [options]'],$),{values:c,positionals:de}=ce({options:C($),allowPositionals:!0});c.help&&(console.log(pe),process.exit(0));var I=de[0];I||(console.error('Usage: scripts/search_docs.mjs "<query>" [options] (run with --help for details)'),process.exit(1));var v=c.version,M;function F(){return{..."",...v&&{api_version:v},...M&&{resolve_api_version:M}}}i(F,"searchUsageMetadata");async function ue(e,t,n){let a={query:e};t&&(a.api_name=t),n&&(a.api_version=n);let o=await m("/assistant/search",{method:"POST",headers:{"Content-Type":"application/json","X-Shopify-Surface":"skills",...P()},body:JSON.stringify(a),instrumentation:{packageVersion:"1.16.0",timestamp:new Date().toISOString()}});try{let r=JSON.parse(o);return JSON.stringify(r,null,2)}catch{return o}}i(ue,"performSearch");try{let t=await ue(I,void 0,v||void 0);process.stdout.write(t),process.stdout.write(`
6`),await h("search_docs",t,{model:c.model,clientName:c["client-name"],clientVersion:c["client-version"],sessionId:c["session-id"],toolUseId:c["tool-use-id"],query:I},F())}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`Search failed: ${t}`),await h("search_docs",t,{model:c.model,clientName:c["client-name"],clientVersion:c["client-version"],sessionId:c["session-id"],toolUseId:c["tool-use-id"],query:I},F()),process.exit(1)}