@psnext/slingcli 2.4.20260522-4 → 2.4.20260523-2
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/bin/sling.js +1 -1
- package/package.json +2 -2
- package/sling-default-packages.json +1 -0
- package/slingshot/index.js +12 -2
package/bin/sling.js
CHANGED
|
@@ -179,7 +179,7 @@ async function checkAndInstallPackages() {
|
|
|
179
179
|
for (const pkg of updatePackages) {
|
|
180
180
|
console.log(`Updating ${pkg}...`);
|
|
181
181
|
try {
|
|
182
|
-
await runCommand(process.execPath, [__filename, "update",
|
|
182
|
+
await runCommand(process.execPath, [__filename, "update", pkg]);
|
|
183
183
|
console.log(`✓ Updated ${pkg}`);
|
|
184
184
|
} catch (err) {
|
|
185
185
|
console.error(`✗ Failed to update ${pkg}:`, err.message);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@psnext/slingcli",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.20260523-2",
|
|
4
4
|
"description": "Connects Sling CLI to Publicis Sapient Slingshot enterprise LLM gateway. Bundles the pi coding-agent runtime.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"type": "git",
|
|
30
30
|
"url": "git+https://pscode.lioncloud.net/psaiproducts/slingcli.git"
|
|
31
31
|
},
|
|
32
|
-
"slingVersion": "2.4.
|
|
32
|
+
"slingVersion": "2.4.20260523-2",
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@earendil-works/pi-tui": "file:../.sling-pack/earendil-works-pi-tui-0.75.4.tgz",
|
|
35
35
|
"@earendil-works/pi-ai": "file:../.sling-pack/earendil-works-pi-ai-0.75.4.tgz",
|
package/slingshot/index.js
CHANGED
|
@@ -441,7 +441,7 @@ Log file: ${Ki}
|
|
|
441
441
|
`;Ls.appendFileSync(Ki,n)}catch{}}function Je(t,e){if(!(!Ki||!Ls||!jl))try{let i=`[${new Date().toISOString()}] ${t}:
|
|
442
442
|
${JSON.stringify(e,null,2)}
|
|
443
443
|
|
|
444
|
-
`;Ls.appendFileSync(Ki,i)}catch{}}var Ws=null;function $1(t){if(!t)return;let e=t.trim();if(e)return e.replace(/\/+$/,"")}var we=class t{static{this.BASE_URL="base_url"}static{this.ANALYTICS_DOMAIN="analytics_domain"}static{this.CLIENT_ID="client_id"}static{this.PROJECT_ID="project_id"}static{this.WORKSPACE_ID="workspace_id"}static{this.defaultValues={[t.BASE_URL]:"https://sapientaiproducts.com",[t.ANALYTICS_DOMAIN]:"https://slingshot.sapientaiproducts.com",[t.CLIENT_ID]:"b97fbef7-cad9-4e56-9850-39e86c8fdf61",[t.PROJECT_ID]:"fa8121c4-e2fc-48f1-9478-8949c04e13cc",[t.WORKSPACE_ID]:"6e5756eb-d7e2-4d80-ad07-9d7a51600d85"}}static{this.LOGIN_PATH="/web/v1/studio-auth/login"}static{this.EXCHANGE_PATH="/api/v1/studio-auth/auth/desktop/exchange"}static{this.REFRESH_PATH="/api/v3/auth/refreshtoken"}static{this.REFRESH_CLIENT_NAME="machine"}static{this.API_BASE_PATH="/api/v1/llm"}static{this.SAGE_EVENTS_PATH="/api/v1/ai-portal/sage_events"}static{this.APP_TOKEN_PATH="/api/v3/auth/app-token"}static{this.CONFIG_SERVICE_PATH="/api/v2/configservice/client"}static{this.APP_TOKEN_REFRESH_BUFFER_MS=60*1e3}static{this.SLINGSHOT_APP_TOKEN_ENV="SLINGSHOT_APP_TOKEN_HEADER"}static{this.TOKEN_EXPIRY_BUFFER_MS=300*1e3}static{this.SAPI="/save/api/v1"}static{this.CLIENT_NAME="desktop"}static defaults(e){return this.defaultValues[e]}static getSettingsPath(){let e=Gl.resolve(process.cwd(),".sling","sling.settings.json");if(Hi.existsSync(e))return e;let n=Pe();return Gl.resolve(n,"sling.settings.json")}static getSettings(){if(!Ws){let i=this.getSettingsPath();try{if(Hi.existsSync(i)){let s=Hi.readFileSync(i,"utf-8"),r=JSON.parse(s)||{};Ws={...this.defaultValues,...r}}else{let s=Gl.dirname(i);Hi.existsSync(s)||Hi.mkdirSync(s,{recursive:!0}),Hi.writeFileSync(i,JSON.stringify(this.defaultValues,null,2),"utf-8"),Ws={...this.defaultValues}}}catch(s){Je("Error reading/writing sling.settings.json: ",s),Ws={...this.defaultValues}}}let e=$1(process.env.SLINGSHOT_API_DOMAIN),n=$1(process.env.SLINGSHOT_ANALYTICS_DOMAIN);return{...Ws,[t.BASE_URL]:e||Ws[t.BASE_URL],[t.ANALYTICS_DOMAIN]:n||Ws[t.ANALYTICS_DOMAIN]}}static updateSettings(e){let n=Pe(),i=Gl.resolve(n,"sling.settings.json");try{let r={...this.getSettings()||{},...e},o=Gl.dirname(i);Hi.existsSync(o)||Hi.mkdirSync(o,{recursive:!0}),Hi.writeFileSync(i,JSON.stringify(r,null,2),"utf-8"),Ws=r}catch(s){Je("Error updating sling.settings.json: ",s)}}static getLoginUrl(e){let n=this.getSettings(),i=new URLSearchParams({client:this.CLIENT_NAME,port:String(e.port),localState:e.localState});return e.clientId&&i.set("clientId",e.clientId),`${n[t.BASE_URL]}${this.LOGIN_PATH}?${i.toString()}`}static getExchangeUrl(){return`${this.getSettings()[t.BASE_URL]}${this.EXCHANGE_PATH}`}static getRefreshUrl(){let e=this.getSettings(),n=new URLSearchParams({client:this.REFRESH_CLIENT_NAME});return`${e[t.BASE_URL]}${this.REFRESH_PATH}?${n.toString()}`}static getApiBaseUrl(){return`${this.getSettings()[t.BASE_URL]}${this.API_BASE_PATH}`}static getSageEventsUrl(){return`${this.getSettings()[t.ANALYTICS_DOMAIN]}${this.SAGE_EVENTS_PATH}`}static getTokenExpiryBuffer(){return this.TOKEN_EXPIRY_BUFFER_MS}static getDefaultProjectId(){let e=this.getSettings();return process.env.SLINGSHOT_PROJECT_ID||e[t.PROJECT_ID]}static getDefaultWorkspaceId(){let e=this.getSettings();return process.env.SLINGSHOT_WORKSPACE_ID||e[t.WORKSPACE_ID]}static getDefaultClientId(){let e=this.getSettings();return process.env.CLIENT_ID||e[t.CLIENT_ID]}static getUserActivityUrl(){return`${this.getSettings()[t.BASE_URL]}${this.SAPI}/users/activity`}static getUserUrl(){return`${this.getSettings()[t.BASE_URL]}${this.SAPI}/users`}static getAppTokenUrl(){return`${this.getSettings()[t.BASE_URL]}${this.APP_TOKEN_PATH}`}static getConfigServiceUrl(e){let n=this.getSettings(),i=this.getDefaultClientId(),s=new URLSearchParams({keys:e});return`${n[t.BASE_URL]}${this.CONFIG_SERVICE_PATH}/${i}?${s.toString()}`}static getAppTokenRefreshBuffer(){return this.APP_TOKEN_REFRESH_BUFFER_MS}};function Kl(t){try{let e=t.split(".");if(e.length!==3)return 0;let n=JSON.parse(atob(e[1]));return n.exp?n.exp*1e3:0}catch{return 0}}function jp(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{let e=Math.random()*16|0;return(t==="x"?e:e&3|8).toString(16)})}function B1(){return`user_${jp()}`}var q0="Xq7Wm2zR9pLkVbN4cD8fH3jT6yG1sA5",kB=BigInt(q0.length);function MB(t){if(t.length===0)return"";let e=0n;for(let i of t){let s=q0.indexOf(i);if(s===-1)throw new Error(`Cannot decode app_key: character "${i}" is not in the expected alphabet`);e=e*kB+BigInt(s)}let n=[];for(;e>0n;)n.unshift(Number(e&0xffn)),e>>=8n;for(let i of t)if(i===q0[0])n.unshift(0);else break;return new TextDecoder().decode(new Uint8Array(n))}var G0=new Map,qp=new Map;async function IB(t,e){let n=we.getConfigServiceUrl(t);We(`sling-config: fetching ${n}`);let i;try{i=await fetch(n,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${e}`}})}catch(o){let a=o instanceof Error?o.message:String(o);throw new Error(`Cannot reach config service: ${a}`)}if(!i.ok){let o=`${i.status} ${i.statusText}`;try{let a=await i.json();a.message?o=String(a.message):a.error&&(o=String(a.error))}catch{}throw new Error(`Config service request failed: ${o}`)}let r=(await i.json())?.data?.config;if(!r||typeof r!="object")throw new Error("Config service response missing data.config");return r}async function N1(t,e){let n=G0.get(t);if(n)return n;let i=qp.get(t);if(i)return i;if(!e)throw new Error("Cannot reach config service: no Slingshot user token provided");let s=IB(t,e).then(r=>(G0.set(t,r),r)).finally(()=>{qp.delete(t)});return qp.set(t,s),s}var tc=class{static async getSlingcliConfig(e){let n=await N1("slingcli",e),i=n.slingcli;if(!i||typeof i.app_id!="string"||typeof i.app_key!="string"||!i.app_id||!i.app_key)throw Je("sling-config: missing slingcli block",n),new Error("Config service did not return slingcli.app_id / slingcli.app_key for this client");return{app_id:i.app_id,app_key:MB(i.app_key)}}static async getRemoteConfig(e,n){return N1(e,n)}static clearCache(){G0.clear(),qp=new Map}};import j1 from"node:path";import Us from"node:fs";var RB="sling.app-creds.json";function K0(){return j1.resolve(Pe(),RB)}function q1(){let t=K0();if(!Us.existsSync(t))return null;try{let e=Us.readFileSync(t,"utf-8"),n=JSON.parse(e);return typeof n.app_id!="string"||typeof n.app_key!="string"||!n.app_id||!n.app_key?(Je("app-creds-store: invalid creds file, ignoring",n),null):{app_id:n.app_id,app_key:n.app_key}}catch(e){return Je("app-creds-store: failed to read creds file",e),null}}function H0(t){let e=K0(),n=j1.dirname(e);try{Us.existsSync(n)||Us.mkdirSync(n,{recursive:!0});let i={...t,savedAt:Date.now()};Us.writeFileSync(e,JSON.stringify(i,null,2),{encoding:"utf-8",mode:384});try{Us.chmodSync(e,384)}catch{}We(`app-creds-store: persisted to ${e}`)}catch(i){Je("app-creds-store: failed to persist creds",i)}}function G1(){let t=K0();try{Us.existsSync(t)&&(Us.unlinkSync(t),We(`app-creds-store: cleared ${t}`))}catch(e){Je("app-creds-store: failed to clear creds file",e)}}var Kp=class extends Error{constructor(n,i){super(i);this.status=n;this.name="AppTokenHttpError"}},Hl=null,zl=null,Gp=null,nc=null;function K1(t){process.env[we.SLINGSHOT_APP_TOKEN_ENV]=`Bearer ${t}`}function PB(t){nc&&(clearTimeout(nc),nc=null);let e=t.expiresAt-Date.now();e<=0||(nc=setTimeout(()=>{nc=null,zi().catch(n=>{Je("app-token: scheduled refresh failed",n)})},e),nc.unref?.())}async function H1(t){let e=Buffer.from(`${t.app_id}:${t.app_key}`).toString("base64"),n=we.getAppTokenUrl();We(`app-token: minting from ${n}`);let i;try{i=await fetch(n,{method:"GET",headers:{Accept:"application/json",Authorization:`Basic ${e}`}})}catch(a){let c=a instanceof Error?a.message:String(a);throw new Error(`Cannot reach app-token service: ${c}`)}if(!i.ok){let a=`${i.status} ${i.statusText}`;try{let c=await i.text()||"";c&&(a=c)}catch{}throw new Kp(i.status,`App token request failed: ${a}`)}let s=await i.json();if(!s.app_token||typeof s.expires_in!="number")throw new Error("App token response missing app_token or expires_in");let r=we.getAppTokenRefreshBuffer(),o=Date.now()+s.expires_in*1e3-r;return We(`app-token: minted, expires at ${new Date(o).toISOString()}`),{token:s.app_token,expiresAt:o}}async function _B(){let t=q1();if(t)return{creds:t,fromDisk:!0};if(!zl)throw new Error("Cannot mint app token: no on-disk app credentials and no Slingshot user token available (please /login slingshot first)");let e=await tc.getSlingcliConfig(zl);return H0(e),{creds:e,fromDisk:!1}}async function EB(){let{creds:t,fromDisk:e}=await _B();try{return await H1(t)}catch(n){let i=n instanceof Kp&&(n.status===401||n.status===403);if(!e||!i)throw n;if(Je("app-token: disk creds rejected (likely rotated), refetching from config service",{status:n.status}),G1(),!zl)throw new Error("Cannot rotate app credentials: on-disk creds rejected and no Slingshot user token available (please /login slingshot)");let s=await tc.getSlingcliConfig(zl);return H0(s),await H1(s)}}async function zi(t){if(t&&(zl=t),Hl&&Hl.expiresAt>Date.now())return K1(Hl.token),Hl.token;if(Gp)return(await Gp).token;let e=EB().then(i=>(Hl=i,K1(i.token),PB(i),i)).finally(()=>{Gp=null});return Gp=e,(await e).token}var Vl=null,z0=null;typeof process<"u"&&process.versions?.node&&(z0=import("node:http").then(t=>{Vl=t.createServer}));async function AB(){if(Vl||(z0&&await z0,Vl))return Vl;throw new Error("Slingshot OAuth requires Node.js")}async function V0(t){let e=await AB(),n,i,s,r=!1,o=new Promise((d,u)=>{i=d,s=u}),a=d=>{if(!r){r=!0;try{n.close()}catch{}d()}};n=e((d,u)=>{let p=new URL(d.url||"","http://127.0.0.1"),m=p.searchParams.get("code"),g=p.searchParams.get("state"),h=p.searchParams.get("clientId"),f=p.searchParams.get("error"),x=p.searchParams.get("error_description");if(f){u.writeHead(400,{"Content-Type":"text/html"}),u.end(`<html><body><h1>Login Failed</h1><p>${x||f}</p><p>You can close this window.</p></body></html>`),a(()=>s(new Error(`Login failed: ${x||f}`)));return}if(!m||!g){u.writeHead(400,{"Content-Type":"text/html"}),u.end("<html><body><h1>Login Failed</h1><p>Missing code or state in callback.</p><p>You can close this window.</p></body></html>"),a(()=>s(new Error("Missing code or state in callback")));return}u.writeHead(200,{"Content-Type":"text/html"}),u.end("<html><body><h1>Login Successful</h1><p>You can close this window and return to your terminal.</p><script>setTimeout(()=>window.close(),3000)</script></body></html>"),a(()=>i({code:m,state:g,clientId:h||""}))}),n.on("error",d=>{a(()=>s(d))});let c=setTimeout(()=>{a(()=>s(new Error("Login timeout - no callback received within 5 minutes")))},300*1e3);return n.on("close",()=>clearTimeout(c)),t&&t.addEventListener("abort",()=>{a(()=>s(new Error("Login cancelled")))}),{port:await new Promise((d,u)=>{n.once("error",u),n.listen(0,"127.0.0.1",()=>{let p=n.address();p&&typeof p=="object"?d(p.port):u(new Error("Failed to obtain loopback server port"))})}),result:o}}async function J0(t,e){if(!t)throw new Error("Missing exchange code");if(!e)throw new Error("Missing clientId for exchange");let n=we.getExchangeUrl(),i;try{i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",accept:"application/json"},body:JSON.stringify({code:t,clientId:e})})}catch(r){let o=r instanceof Error?r.message:String(r);throw new Error(`Cannot reach Studio Auth: ${o}`)}if(!i.ok){let r,o=`${i.status} ${i.statusText}`;try{let a=await i.json();r=a.error?.code,a.error?.message?o=a.error.message:a.message?o=a.message:r&&(o=r)}catch{}throw r==="INVALID_CALLBACK"?new Error("Login failed: exchange code is expired, already used, or bound to a different tenant. Please log in again."):new Error(`Code exchange failed: ${o}`)}let s=await i.json();if(!s.accessToken||!s.refreshToken)throw new Error("Exchange response missing accessToken or refreshToken");return s}function LB(){return OB(16).toString("hex")}function WB(t){let e=new URL(t),n=e.searchParams.get("code"),i=e.searchParams.get("state"),s=e.searchParams.get("clientId");if(!n||!i)throw new Error("Pasted URL is missing code or state");return{code:n,state:i,clientId:s||""}}async function Q0(t){let e=process.env.SLINGSHOT_TOKEN;if(e){let d=Kl(e);return console.log("Using Slingshot token from SLINGSHOT_TOKEN environment variable"),await zi(e),{refresh:"",access:e,expires:d>0?d-we.getTokenExpiryBuffer():Date.now()+10800*1e3,projectId:process.env.SLINGSHOT_PROJECT_ID,workspaceId:process.env.SLINGSHOT_WORKSPACE_ID}}let{port:n,result:i}=await V0(t.signal),s=LB(),r=we.getDefaultClientId(),o=we.getLoginUrl({port:n,localState:s,clientId:r||void 0});t.onAuth({url:o});let a;if(t.onManualCodeInput){let d=t.onManualCodeInput().then(WB);a=await Promise.race([i,d])}else a=await i;if(a.state!==s)throw new Error("CSRF check failed - state does not match localState");if(!a.clientId)throw new Error("Login callback did not include clientId");let c=await J0(a.code,a.clientId),l=Kl(c.accessToken);return await zi(c.accessToken),{refresh:c.refreshToken,access:c.accessToken,expires:l>0?l-we.getTokenExpiryBuffer():Date.now()+10800*1e3,projectId:void 0,workspaceId:void 0}}import{randomUUID as UB}from"node:crypto";async function Hp(t){if(!t.refresh)throw new Error("No refresh token available. Please login again.");let e;try{e=await zi()}catch(a){throw Je("auth/refresh: app token unavailable for refresh call",a),new Error(`Cannot refresh Slingshot token: app token unavailable (${a instanceof Error?a.message:String(a)}). Please /login slingshot.`)}let n=UB(),i={accept:"application/json",rt:t.refresh,"trace-id":n,Authorization:`Bearer ${e}`},s;try{let a=we.getRefreshUrl();s=await fetch(a,{headers:i})}catch(a){let c=a instanceof Error?a.message:String(a);throw new Error(`Cannot reach Slingshot server: ${c}`)}if(!s.ok){let a=`${s.status} ${s.statusText}`;try{let c=await s.json();c.message?a=String(c.message):c.error&&(a=String(c.error))}catch{}throw new Error(`Token refresh failed: ${a}`)}let r=await s.json();if(!r.accessToken)throw new Error("No access token in refresh response");let o=Kl(r.accessToken);try{await zi(r.accessToken)}catch(a){throw Je("auth/refresh: app token refresh failed",a),a}return{refresh:r.refreshToken||t.refresh,access:r.accessToken,expires:o>0?o-we.getTokenExpiryBuffer():Date.now()+10800*1e3,projectId:t.projectId,workspaceId:t.workspaceId}}var z1=[{id:"gpt-5.4-nano",name:"GPT-5.4 nano",reasoning:!0,thinkingLevelMap:{off:null,minimal:null,low:null,medium:null,high:null,xhigh:"xhigh"},input:["text","image"],cost:{input:.2,output:1.25,cacheRead:.02,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,api:"openai-completions",provider:"slingshot"},{id:"gpt-4.1",name:"GPT-4.1",reasoning:!1,input:["text","image"],cost:{input:2,output:8,cacheRead:.5,cacheWrite:0},contextWindow:1047576,maxTokens:32768,provider:"slingshot",api:"openai-completions"},{id:"gpt-5",name:"GPT-5",reasoning:!0,input:["text","image"],cost:{input:1.25,output:10,cacheRead:.125,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,provider:"slingshot",api:"openai-completions"},{id:"gpt-5-mini",name:"GPT-5 Mini",reasoning:!0,input:["text","image"],cost:{input:.25,output:2,cacheRead:.025,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,provider:"slingshot",api:"openai-completions"},{id:"gpt-5-nano",name:"GPT-5 Nano",reasoning:!0,input:["text","image"],cost:{input:.05,output:.4,cacheRead:.005,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,provider:"slingshot",api:"openai-completions"},{id:"gpt-5.1",name:"GPT-5.1",reasoning:!0,input:["text","image"],cost:{input:1.25,output:10,cacheRead:.13,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,provider:"slingshot",api:"openai-completions"},{id:"gpt-5.2",name:"GPT-5.2",reasoning:!0,input:["text","image"],cost:{input:1.75,output:14,cacheRead:.175,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,provider:"slingshot",api:"openai-completions"},{id:"gpt-5.4-mini",name:"GPT-5.4 mini",reasoning:!0,thinkingLevelMap:{off:null,minimal:null,low:null,medium:null,high:null,xhigh:"xhigh"},input:["text","image"],cost:{input:.75,output:4.5,cacheRead:.075,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,api:"openai-completions",provider:"slingshot"},{id:"gpt-5.4",name:"GPT-5.4",reasoning:!0,thinkingLevelMap:{off:null,minimal:null,low:null,medium:null,high:null,xhigh:"xhigh"},input:["text","image"],cost:{input:2.5,output:15,cacheRead:.25,cacheWrite:0},contextWindow:272e3,maxTokens:128e3,api:"openai-completions",provider:"slingshot"},{id:"gpt-5.5",name:"GPT-5.5",reasoning:!0,thinkingLevelMap:{off:null,minimal:null,low:null,medium:null,high:null,xhigh:"xhigh"},input:["text","image"],cost:{input:5,output:30,cacheRead:.5,cacheWrite:0},contextWindow:272e3,maxTokens:128e3,api:"openai-completions",provider:"slingshot"},{id:"gpt-5.2-codex",name:"GPT-5.2 Codex",reasoning:!0,input:["text","image"],cost:{input:1.75,output:14,cacheRead:.175,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,provider:"slingshot",api:"openai-codex-responses"},{id:"gpt-5.3-codex",name:"GPT-5.3 Codex",reasoning:!0,input:["text","image"],cost:{input:1.75,output:14,cacheRead:.175,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,provider:"slingshot",api:"openai-codex-responses"},{id:"claude-opus-4@20250514",name:"Claude Opus 4",reasoning:!0,input:["text","image"],cost:{input:15,output:75,cacheRead:1.5,cacheWrite:18.75},contextWindow:2e5,maxTokens:32e3,provider:"slingshot",api:"openai-completions"},{id:"claude-sonnet-4@20250514",name:"Claude Sonnet 4",reasoning:!0,input:["text","image"],cost:{input:3,output:15,cacheRead:.3,cacheWrite:3.75},contextWindow:2e5,maxTokens:64e3,provider:"slingshot",api:"openai-completions"},{id:"claude-sonnet-4-5@20250929",name:"Claude Sonnet 4.5",reasoning:!0,input:["text","image"],cost:{input:3,output:15,cacheRead:.3,cacheWrite:3.75},contextWindow:2e5,maxTokens:64e3,provider:"slingshot",api:"openai-completions"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",reasoning:!0,input:["text","image"],cost:{input:3,output:15,cacheRead:.3,cacheWrite:3.75},contextWindow:1e6,maxTokens:64e3,provider:"slingshot",api:"openai-completions"},{id:"claude-opus-4-6",name:"Claude Opus 4.6",reasoning:!0,input:["text","image"],cost:{input:5,output:25,cacheRead:.5,cacheWrite:6.25},contextWindow:1e6,maxTokens:128e3,provider:"slingshot",api:"openai-completions"},{id:"o3",name:"O3",reasoning:!0,input:["text","image"],cost:{input:2,output:8,cacheRead:.5,cacheWrite:0},contextWindow:2e5,maxTokens:1e5,provider:"slingshot",api:"openai-completions"},{id:"o3-mini",name:"o3-mini",reasoning:!0,input:["text"],cost:{input:1.1,output:4.4,cacheRead:.55,cacheWrite:0},contextWindow:2e5,maxTokens:1e5,provider:"slingshot",api:"openai-completions"},{id:"o4-mini",name:"o4-mini",reasoning:!0,input:["text"],cost:{input:1.1,output:4.4,cacheRead:.28,cacheWrite:0},contextWindow:2e5,maxTokens:1e5,provider:"slingshot",api:"openai-completions"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash",reasoning:!0,input:["text","image"],cost:{input:.3,output:2.5,cacheRead:.075,cacheWrite:0},contextWindow:1048576,maxTokens:65536,provider:"slingshot",api:"openai-completions"}];var _r={name:"slingshot.cli",private:!0,type:"module",workspaces:["packages/*","packages/web-ui/example","packages/coding-agent/examples/extensions/with-deps","packages/coding-agent/examples/extensions/custom-provider-anthropic","packages/coding-agent/examples/extensions/custom-provider-gitlab-duo"],scripts:{clean:"npm run clean --workspaces",build:"cd packages/tui && npm run build && cd ../ai && npm run build && cd ../agent && npm run build && cd ../coding-agent && npm run build && cd ../web-ui && npm run build",dev:'concurrently --names "ai,agent,coding-agent,web-ui,tui" --prefix-colors "cyan,yellow,red,white,green,magenta" "cd packages/ai && npm run dev" "cd packages/agent && npm run dev" "cd packages/coding-agent && npm run dev" "cd packages/web-ui && npm run dev" "cd packages/tui && npm run dev"',"dev:tsc":'concurrently --names "ai,web-ui" --prefix-colors "cyan,green" "cd packages/ai && npm run dev:tsc" "cd packages/web-ui && npm run dev:tsc"',check:"","check:browser-smoke":"","profile:tui":"node scripts/profile-coding-agent-node.mjs --mode tui","profile:rpc":"node scripts/profile-coding-agent-node.mjs --mode rpc",test:"npm run test --workspaces --if-present","version:patch":"npm version patch -ws --no-git-tag-version && node scripts/sync-versions.js && shx rm -rf node_modules packages/*/node_modules package-lock.json && npm install","version:minor":"npm version minor -ws --no-git-tag-version && node scripts/sync-versions.js && shx rm -rf node_modules packages/*/node_modules package-lock.json && npm install","version:major":"npm version major -ws --no-git-tag-version && node scripts/sync-versions.js && shx rm -rf node_modules packages/*/node_modules package-lock.json && npm install","version:set":"npm version -ws",prepublishOnly:"npm run clean && npm run build && npm run check",publish:"npm run prepublishOnly && npm publish -ws --access public","publish:dry":"npm run prepublishOnly && npm publish -ws --access public --dry-run","release:patch":"node scripts/release.mjs patch","release:minor":"node scripts/release.mjs minor","release:major":"node scripts/release.mjs major",prepare:"husky"},devDependencies:{"@anthropic-ai/sandbox-runtime":"0.0.26","@biomejs/biome":"2.3.5","@types/node":"22.19.19","@typescript/native-preview":"7.0.0-dev.20260120.1",concurrently:"^9.2.1",esbuild:"0.28.0",husky:"9.1.7",jiti:"2.7.0",shx:"0.4.0",tsx:"4.22.1",typescript:"5.9.3"},engines:{node:">=20.0.0"},slingVersion:"2.4.20260522-4",overrides:{rimraf:"6.1.3","fast-xml-parser":"5.7.2",gaxios:{rimraf:"6.1.3"}},dependencies:{"@modelcontextprotocol/sdk":"^1.29.0","@mozilla/readability":"^0.6.0","compound-engineering-pi":"^0.2.4","get-east-asian-width":"^1.4.0",linkedom:"^0.18.12",turndown:"^7.2.4",unpdf:"^1.6.2"}};var j1e=we.getRefreshUrl(),q1e=we.getApiBaseUrl(),G1e=we.getSageEventsUrl(),K1e=we.getTokenExpiryBuffer(),V1=we.getDefaultProjectId(),J1=we.getDefaultWorkspaceId(),Q1=we.getDefaultClientId();async function zp(t,e,n){let i=B1(),s=await e.modelRegistry.getApiKeyForProvider(e.model?.provider||"slingshot");if(!s){We("ERROR: No API key found");return}let r=s.startsWith("Bearer ")?s:`Bearer ${s}`,o=process.env.SLINGSHOT_PROJECT_ID||V1,a=process.env.SLINGSHOT_WORKSPACE_ID||J1,c=process.env.CLIENT_ID||Q1,l={"Content-Type":"application/json",accept:"application/json","access-token":r,"x-project-id":o,"x-workspace-id":a,"x-client-id":c,"sage-trace-id":i,"User-Agent":"pi-slingshot/1.0.0"},d=parseFloat(process.env.SLINGSHOT_TEMPERATURE||"0.2"),u=parseFloat(process.env.SLINGSHOT_TOP_P||"0.8"),p={source:_r.name||"sling",ai_model_info:{ai_provider_name:e.model?.provider||"slingshot",sage_modl_name:e.model?.id||"unknown",sage_modl_option:{temperature:String(d),max_token_size:String(e.model?.maxTokens||16834),top_p:String(u)}},rag_info:{type:null,account_name:"dummy",project_names:[],repository_names:[],programming_language:null},tab_data:{tab_count:"1"},tags:null,slingshot_version:_r.slingVersion||"2.3.2",chat_type:"agent",...n||{}};return{headers:l,sageCommonData:p}}async function Vp(t,e,n,i){let s={eventName:t,sageCommonData:n,eventData:i};We(`Sending analytics event: ${t} : `+we.getSageEventsUrl());try{let r=await fetch(we.getSageEventsUrl(),{method:"POST",headers:e,body:JSON.stringify(s)});if(r.ok){let o=await r.json().catch(()=>{});if(o.error_code)throw new Error(`Analytics API error: ${o.error_code} - ${o.error_message||"No message"}`);We(`'SUCCESS: Event sent: ${t}`),We(`Response: ${JSON.stringify(o)}`),We("\u2500".repeat(66))}else{let o=await r.text().catch(()=>""),a={status:r.status,statusText:r.statusText,responseBody:o,requestHeaders:e};throw We(`ERROR: ${r.status} ${r.statusText}`),Je("Error Details",a),Je("Failed Request Body",s),new Error(`Analytics API error: ${r.status} ${r.statusText}`)}}catch(r){let o=r instanceof Error?r.message:String(r);console.warn("[Slingshot Analytics] Request that caused error:",o),We(`EXCEPTION: ${o}`),r instanceof Error&&r.stack&&We(`Stack trace: ${r.stack}`),Je("Request that caused exception",s)}}import Jl from"chalk";function Y1(t,e){return{render(n){let i=` \u26AC _______. __ __ .__ __. _______
|
|
444
|
+
`;Ls.appendFileSync(Ki,i)}catch{}}var Ws=null;function $1(t){if(!t)return;let e=t.trim();if(e)return e.replace(/\/+$/,"")}var we=class t{static{this.BASE_URL="base_url"}static{this.ANALYTICS_DOMAIN="analytics_domain"}static{this.CLIENT_ID="client_id"}static{this.PROJECT_ID="project_id"}static{this.WORKSPACE_ID="workspace_id"}static{this.defaultValues={[t.BASE_URL]:"https://sapientaiproducts.com",[t.ANALYTICS_DOMAIN]:"https://slingshot.sapientaiproducts.com",[t.CLIENT_ID]:"b97fbef7-cad9-4e56-9850-39e86c8fdf61",[t.PROJECT_ID]:"fa8121c4-e2fc-48f1-9478-8949c04e13cc",[t.WORKSPACE_ID]:"6e5756eb-d7e2-4d80-ad07-9d7a51600d85"}}static{this.LOGIN_PATH="/web/v1/studio-auth/login"}static{this.EXCHANGE_PATH="/api/v1/studio-auth/auth/desktop/exchange"}static{this.REFRESH_PATH="/api/v3/auth/refreshtoken"}static{this.REFRESH_CLIENT_NAME="machine"}static{this.API_BASE_PATH="/api/v1/llm"}static{this.SAGE_EVENTS_PATH="/api/v1/ai-portal/sage_events"}static{this.APP_TOKEN_PATH="/api/v3/auth/app-token"}static{this.CONFIG_SERVICE_PATH="/api/v2/configservice/client"}static{this.APP_TOKEN_REFRESH_BUFFER_MS=60*1e3}static{this.SLINGSHOT_APP_TOKEN_ENV="SLINGSHOT_APP_TOKEN_HEADER"}static{this.TOKEN_EXPIRY_BUFFER_MS=300*1e3}static{this.SAPI="/save/api/v1"}static{this.CLIENT_NAME="desktop"}static defaults(e){return this.defaultValues[e]}static getSettingsPath(){let e=Gl.resolve(process.cwd(),".sling","sling.settings.json");if(Hi.existsSync(e))return e;let n=Pe();return Gl.resolve(n,"sling.settings.json")}static getSettings(){if(!Ws){let i=this.getSettingsPath();try{if(Hi.existsSync(i)){let s=Hi.readFileSync(i,"utf-8"),r=JSON.parse(s)||{};Ws={...this.defaultValues,...r}}else{let s=Gl.dirname(i);Hi.existsSync(s)||Hi.mkdirSync(s,{recursive:!0}),Hi.writeFileSync(i,JSON.stringify(this.defaultValues,null,2),"utf-8"),Ws={...this.defaultValues}}}catch(s){Je("Error reading/writing sling.settings.json: ",s),Ws={...this.defaultValues}}}let e=$1(process.env.SLINGSHOT_API_DOMAIN),n=$1(process.env.SLINGSHOT_ANALYTICS_DOMAIN);return{...Ws,[t.BASE_URL]:e||Ws[t.BASE_URL],[t.ANALYTICS_DOMAIN]:n||Ws[t.ANALYTICS_DOMAIN]}}static updateSettings(e){let n=Pe(),i=Gl.resolve(n,"sling.settings.json");try{let r={...this.getSettings()||{},...e},o=Gl.dirname(i);Hi.existsSync(o)||Hi.mkdirSync(o,{recursive:!0}),Hi.writeFileSync(i,JSON.stringify(r,null,2),"utf-8"),Ws=r}catch(s){Je("Error updating sling.settings.json: ",s)}}static getLoginUrl(e){let n=this.getSettings(),i=new URLSearchParams({client:this.CLIENT_NAME,port:String(e.port),localState:e.localState});return e.clientId&&i.set("clientId",e.clientId),`${n[t.BASE_URL]}${this.LOGIN_PATH}?${i.toString()}`}static getExchangeUrl(){return`${this.getSettings()[t.BASE_URL]}${this.EXCHANGE_PATH}`}static getRefreshUrl(){let e=this.getSettings(),n=new URLSearchParams({client:this.REFRESH_CLIENT_NAME});return`${e[t.BASE_URL]}${this.REFRESH_PATH}?${n.toString()}`}static getApiBaseUrl(){return`${this.getSettings()[t.BASE_URL]}${this.API_BASE_PATH}`}static getSageEventsUrl(){return`${this.getSettings()[t.ANALYTICS_DOMAIN]}${this.SAGE_EVENTS_PATH}`}static getTokenExpiryBuffer(){return this.TOKEN_EXPIRY_BUFFER_MS}static getDefaultProjectId(){let e=this.getSettings();return process.env.SLINGSHOT_PROJECT_ID||e[t.PROJECT_ID]}static getDefaultWorkspaceId(){let e=this.getSettings();return process.env.SLINGSHOT_WORKSPACE_ID||e[t.WORKSPACE_ID]}static getDefaultClientId(){let e=this.getSettings();return process.env.CLIENT_ID||e[t.CLIENT_ID]}static getUserActivityUrl(){return`${this.getSettings()[t.BASE_URL]}${this.SAPI}/users/activity`}static getUserUrl(){return`${this.getSettings()[t.BASE_URL]}${this.SAPI}/users`}static getAppTokenUrl(){return`${this.getSettings()[t.BASE_URL]}${this.APP_TOKEN_PATH}`}static getConfigServiceUrl(e){let n=this.getSettings(),i=this.getDefaultClientId(),s=new URLSearchParams({keys:e});return`${n[t.BASE_URL]}${this.CONFIG_SERVICE_PATH}/${i}?${s.toString()}`}static getAppTokenRefreshBuffer(){return this.APP_TOKEN_REFRESH_BUFFER_MS}};function Kl(t){try{let e=t.split(".");if(e.length!==3)return 0;let n=JSON.parse(atob(e[1]));return n.exp?n.exp*1e3:0}catch{return 0}}function jp(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{let e=Math.random()*16|0;return(t==="x"?e:e&3|8).toString(16)})}function B1(){return`user_${jp()}`}var q0="Xq7Wm2zR9pLkVbN4cD8fH3jT6yG1sA5",kB=BigInt(q0.length);function MB(t){if(t.length===0)return"";let e=0n;for(let i of t){let s=q0.indexOf(i);if(s===-1)throw new Error(`Cannot decode app_key: character "${i}" is not in the expected alphabet`);e=e*kB+BigInt(s)}let n=[];for(;e>0n;)n.unshift(Number(e&0xffn)),e>>=8n;for(let i of t)if(i===q0[0])n.unshift(0);else break;return new TextDecoder().decode(new Uint8Array(n))}var G0=new Map,qp=new Map;async function IB(t,e){let n=we.getConfigServiceUrl(t);We(`sling-config: fetching ${n}`);let i;try{i=await fetch(n,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${e}`}})}catch(o){let a=o instanceof Error?o.message:String(o);throw new Error(`Cannot reach config service: ${a}`)}if(!i.ok){let o=`${i.status} ${i.statusText}`;try{let a=await i.json();a.message?o=String(a.message):a.error&&(o=String(a.error))}catch{}throw new Error(`Config service request failed: ${o}`)}let r=(await i.json())?.data?.config;if(!r||typeof r!="object")throw new Error("Config service response missing data.config");return r}async function N1(t,e){let n=G0.get(t);if(n)return n;let i=qp.get(t);if(i)return i;if(!e)throw new Error("Cannot reach config service: no Slingshot user token provided");let s=IB(t,e).then(r=>(G0.set(t,r),r)).finally(()=>{qp.delete(t)});return qp.set(t,s),s}var tc=class{static async getSlingcliConfig(e){let n=await N1("slingcli",e),i=n.slingcli;if(!i||typeof i.app_id!="string"||typeof i.app_key!="string"||!i.app_id||!i.app_key)throw Je("sling-config: missing slingcli block",n),new Error("Config service did not return slingcli.app_id / slingcli.app_key for this client");return{app_id:i.app_id,app_key:MB(i.app_key)}}static async getRemoteConfig(e,n){return N1(e,n)}static clearCache(){G0.clear(),qp=new Map}};import j1 from"node:path";import Us from"node:fs";var RB="sling.app-creds.json";function K0(){return j1.resolve(Pe(),RB)}function q1(){let t=K0();if(!Us.existsSync(t))return null;try{let e=Us.readFileSync(t,"utf-8"),n=JSON.parse(e);return typeof n.app_id!="string"||typeof n.app_key!="string"||!n.app_id||!n.app_key?(Je("app-creds-store: invalid creds file, ignoring",n),null):{app_id:n.app_id,app_key:n.app_key}}catch(e){return Je("app-creds-store: failed to read creds file",e),null}}function H0(t){let e=K0(),n=j1.dirname(e);try{Us.existsSync(n)||Us.mkdirSync(n,{recursive:!0});let i={...t,savedAt:Date.now()};Us.writeFileSync(e,JSON.stringify(i,null,2),{encoding:"utf-8",mode:384});try{Us.chmodSync(e,384)}catch{}We(`app-creds-store: persisted to ${e}`)}catch(i){Je("app-creds-store: failed to persist creds",i)}}function G1(){let t=K0();try{Us.existsSync(t)&&(Us.unlinkSync(t),We(`app-creds-store: cleared ${t}`))}catch(e){Je("app-creds-store: failed to clear creds file",e)}}var Kp=class extends Error{constructor(n,i){super(i);this.status=n;this.name="AppTokenHttpError"}},Hl=null,zl=null,Gp=null,nc=null;function K1(t){process.env[we.SLINGSHOT_APP_TOKEN_ENV]=`Bearer ${t}`}function PB(t){nc&&(clearTimeout(nc),nc=null);let e=t.expiresAt-Date.now();e<=0||(nc=setTimeout(()=>{nc=null,zi().catch(n=>{Je("app-token: scheduled refresh failed",n)})},e),nc.unref?.())}async function H1(t){let e=Buffer.from(`${t.app_id}:${t.app_key}`).toString("base64"),n=we.getAppTokenUrl();We(`app-token: minting from ${n}`);let i;try{i=await fetch(n,{method:"GET",headers:{Accept:"application/json",Authorization:`Basic ${e}`}})}catch(a){let c=a instanceof Error?a.message:String(a);throw new Error(`Cannot reach app-token service: ${c}`)}if(!i.ok){let a=`${i.status} ${i.statusText}`;try{let c=await i.text()||"";c&&(a=c)}catch{}throw new Kp(i.status,`App token request failed: ${a}`)}let s=await i.json();if(!s.app_token||typeof s.expires_in!="number")throw new Error("App token response missing app_token or expires_in");let r=we.getAppTokenRefreshBuffer(),o=Date.now()+s.expires_in*1e3-r;return We(`app-token: minted, expires at ${new Date(o).toISOString()}`),{token:s.app_token,expiresAt:o}}async function _B(){let t=q1();if(t)return{creds:t,fromDisk:!0};if(!zl)throw new Error("Cannot mint app token: no on-disk app credentials and no Slingshot user token available (please /login slingshot first)");let e=await tc.getSlingcliConfig(zl);return H0(e),{creds:e,fromDisk:!1}}async function EB(){let{creds:t,fromDisk:e}=await _B();try{return await H1(t)}catch(n){let i=n instanceof Kp&&(n.status===401||n.status===403);if(!e||!i)throw n;if(Je("app-token: disk creds rejected (likely rotated), refetching from config service",{status:n.status}),G1(),!zl)throw new Error("Cannot rotate app credentials: on-disk creds rejected and no Slingshot user token available (please /login slingshot)");let s=await tc.getSlingcliConfig(zl);return H0(s),await H1(s)}}async function zi(t){if(t&&(zl=t),Hl&&Hl.expiresAt>Date.now())return K1(Hl.token),Hl.token;if(Gp)return(await Gp).token;let e=EB().then(i=>(Hl=i,K1(i.token),PB(i),i)).finally(()=>{Gp=null});return Gp=e,(await e).token}var Vl=null,z0=null;typeof process<"u"&&process.versions?.node&&(z0=import("node:http").then(t=>{Vl=t.createServer}));async function AB(){if(Vl||(z0&&await z0,Vl))return Vl;throw new Error("Slingshot OAuth requires Node.js")}async function V0(t){let e=await AB(),n,i,s,r=!1,o=new Promise((d,u)=>{i=d,s=u}),a=d=>{if(!r){r=!0;try{n.close()}catch{}d()}};n=e((d,u)=>{let p=new URL(d.url||"","http://127.0.0.1"),m=p.searchParams.get("code"),g=p.searchParams.get("state"),h=p.searchParams.get("clientId"),f=p.searchParams.get("error"),x=p.searchParams.get("error_description");if(f){u.writeHead(400,{"Content-Type":"text/html"}),u.end(`<html><body><h1>Login Failed</h1><p>${x||f}</p><p>You can close this window.</p></body></html>`),a(()=>s(new Error(`Login failed: ${x||f}`)));return}if(!m||!g){u.writeHead(400,{"Content-Type":"text/html"}),u.end("<html><body><h1>Login Failed</h1><p>Missing code or state in callback.</p><p>You can close this window.</p></body></html>"),a(()=>s(new Error("Missing code or state in callback")));return}u.writeHead(200,{"Content-Type":"text/html"}),u.end("<html><body><h1>Login Successful</h1><p>You can close this window and return to your terminal.</p><script>setTimeout(()=>window.close(),3000)</script></body></html>"),a(()=>i({code:m,state:g,clientId:h||""}))}),n.on("error",d=>{a(()=>s(d))});let c=setTimeout(()=>{a(()=>s(new Error("Login timeout - no callback received within 5 minutes")))},300*1e3);return n.on("close",()=>clearTimeout(c)),t&&t.addEventListener("abort",()=>{a(()=>s(new Error("Login cancelled")))}),{port:await new Promise((d,u)=>{n.once("error",u),n.listen(0,"127.0.0.1",()=>{let p=n.address();p&&typeof p=="object"?d(p.port):u(new Error("Failed to obtain loopback server port"))})}),result:o}}async function J0(t,e){if(!t)throw new Error("Missing exchange code");if(!e)throw new Error("Missing clientId for exchange");let n=we.getExchangeUrl(),i;try{i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",accept:"application/json"},body:JSON.stringify({code:t,clientId:e})})}catch(r){let o=r instanceof Error?r.message:String(r);throw new Error(`Cannot reach Studio Auth: ${o}`)}if(!i.ok){let r,o=`${i.status} ${i.statusText}`;try{let a=await i.json();r=a.error?.code,a.error?.message?o=a.error.message:a.message?o=a.message:r&&(o=r)}catch{}throw r==="INVALID_CALLBACK"?new Error("Login failed: exchange code is expired, already used, or bound to a different tenant. Please log in again."):new Error(`Code exchange failed: ${o}`)}let s=await i.json();if(!s.accessToken||!s.refreshToken)throw new Error("Exchange response missing accessToken or refreshToken");return s}function LB(){return OB(16).toString("hex")}function WB(t){let e=new URL(t),n=e.searchParams.get("code"),i=e.searchParams.get("state"),s=e.searchParams.get("clientId");if(!n||!i)throw new Error("Pasted URL is missing code or state");return{code:n,state:i,clientId:s||""}}async function Q0(t){let e=process.env.SLINGSHOT_TOKEN;if(e){let d=Kl(e);return console.log("Using Slingshot token from SLINGSHOT_TOKEN environment variable"),await zi(e),{refresh:"",access:e,expires:d>0?d-we.getTokenExpiryBuffer():Date.now()+10800*1e3,projectId:process.env.SLINGSHOT_PROJECT_ID,workspaceId:process.env.SLINGSHOT_WORKSPACE_ID}}let{port:n,result:i}=await V0(t.signal),s=LB(),r=we.getDefaultClientId(),o=we.getLoginUrl({port:n,localState:s,clientId:r||void 0});t.onAuth({url:o});let a;if(t.onManualCodeInput){let d=t.onManualCodeInput().then(WB);a=await Promise.race([i,d])}else a=await i;if(a.state!==s)throw new Error("CSRF check failed - state does not match localState");if(!a.clientId)throw new Error("Login callback did not include clientId");let c=await J0(a.code,a.clientId),l=Kl(c.accessToken);return await zi(c.accessToken),{refresh:c.refreshToken,access:c.accessToken,expires:l>0?l-we.getTokenExpiryBuffer():Date.now()+10800*1e3,projectId:void 0,workspaceId:void 0}}import{randomUUID as UB}from"node:crypto";async function Hp(t){if(!t.refresh)throw new Error("No refresh token available. Please login again.");let e;try{e=await zi()}catch(a){throw Je("auth/refresh: app token unavailable for refresh call",a),new Error(`Cannot refresh Slingshot token: app token unavailable (${a instanceof Error?a.message:String(a)}). Please /login slingshot.`)}let n=UB(),i={accept:"application/json",rt:t.refresh,"trace-id":n,Authorization:`Bearer ${e}`},s;try{let a=we.getRefreshUrl();s=await fetch(a,{headers:i})}catch(a){let c=a instanceof Error?a.message:String(a);throw new Error(`Cannot reach Slingshot server: ${c}`)}if(!s.ok){let a=`${s.status} ${s.statusText}`;try{let c=await s.json();c.message?a=String(c.message):c.error&&(a=String(c.error))}catch{}throw new Error(`Token refresh failed: ${a}`)}let r=await s.json();if(!r.accessToken)throw new Error("No access token in refresh response");let o=Kl(r.accessToken);try{await zi(r.accessToken)}catch(a){throw Je("auth/refresh: app token refresh failed",a),a}return{refresh:r.refreshToken||t.refresh,access:r.accessToken,expires:o>0?o-we.getTokenExpiryBuffer():Date.now()+10800*1e3,projectId:t.projectId,workspaceId:t.workspaceId}}var z1=[{id:"gpt-5.4-nano",name:"GPT-5.4 nano",reasoning:!0,thinkingLevelMap:{off:null,minimal:null,low:null,medium:null,high:null,xhigh:"xhigh"},input:["text","image"],cost:{input:.2,output:1.25,cacheRead:.02,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,api:"openai-completions",provider:"slingshot"},{id:"gpt-4.1",name:"GPT-4.1",reasoning:!1,input:["text","image"],cost:{input:2,output:8,cacheRead:.5,cacheWrite:0},contextWindow:1047576,maxTokens:32768,provider:"slingshot",api:"openai-completions"},{id:"gpt-5",name:"GPT-5",reasoning:!0,input:["text","image"],cost:{input:1.25,output:10,cacheRead:.125,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,provider:"slingshot",api:"openai-completions"},{id:"gpt-5-mini",name:"GPT-5 Mini",reasoning:!0,input:["text","image"],cost:{input:.25,output:2,cacheRead:.025,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,provider:"slingshot",api:"openai-completions"},{id:"gpt-5-nano",name:"GPT-5 Nano",reasoning:!0,input:["text","image"],cost:{input:.05,output:.4,cacheRead:.005,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,provider:"slingshot",api:"openai-completions"},{id:"gpt-5.1",name:"GPT-5.1",reasoning:!0,input:["text","image"],cost:{input:1.25,output:10,cacheRead:.13,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,provider:"slingshot",api:"openai-completions"},{id:"gpt-5.2",name:"GPT-5.2",reasoning:!0,input:["text","image"],cost:{input:1.75,output:14,cacheRead:.175,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,provider:"slingshot",api:"openai-completions"},{id:"gpt-5.4-mini",name:"GPT-5.4 mini",reasoning:!0,thinkingLevelMap:{off:null,minimal:null,low:null,medium:null,high:null,xhigh:"xhigh"},input:["text","image"],cost:{input:.75,output:4.5,cacheRead:.075,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,api:"openai-completions",provider:"slingshot"},{id:"gpt-5.4",name:"GPT-5.4",reasoning:!0,thinkingLevelMap:{off:null,minimal:null,low:null,medium:null,high:null,xhigh:"xhigh"},input:["text","image"],cost:{input:2.5,output:15,cacheRead:.25,cacheWrite:0},contextWindow:272e3,maxTokens:128e3,api:"openai-completions",provider:"slingshot"},{id:"gpt-5.5",name:"GPT-5.5",reasoning:!0,thinkingLevelMap:{off:null,minimal:null,low:null,medium:null,high:null,xhigh:"xhigh"},input:["text","image"],cost:{input:5,output:30,cacheRead:.5,cacheWrite:0},contextWindow:272e3,maxTokens:128e3,api:"openai-completions",provider:"slingshot"},{id:"gpt-5.2-codex",name:"GPT-5.2 Codex",reasoning:!0,input:["text","image"],cost:{input:1.75,output:14,cacheRead:.175,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,provider:"slingshot",api:"openai-codex-responses"},{id:"gpt-5.3-codex",name:"GPT-5.3 Codex",reasoning:!0,input:["text","image"],cost:{input:1.75,output:14,cacheRead:.175,cacheWrite:0},contextWindow:4e5,maxTokens:128e3,provider:"slingshot",api:"openai-codex-responses"},{id:"claude-opus-4@20250514",name:"Claude Opus 4",reasoning:!0,input:["text","image"],cost:{input:15,output:75,cacheRead:1.5,cacheWrite:18.75},contextWindow:2e5,maxTokens:32e3,provider:"slingshot",api:"openai-completions"},{id:"claude-sonnet-4@20250514",name:"Claude Sonnet 4",reasoning:!0,input:["text","image"],cost:{input:3,output:15,cacheRead:.3,cacheWrite:3.75},contextWindow:2e5,maxTokens:64e3,provider:"slingshot",api:"openai-completions"},{id:"claude-sonnet-4-5@20250929",name:"Claude Sonnet 4.5",reasoning:!0,input:["text","image"],cost:{input:3,output:15,cacheRead:.3,cacheWrite:3.75},contextWindow:2e5,maxTokens:64e3,provider:"slingshot",api:"openai-completions"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",reasoning:!0,input:["text","image"],cost:{input:3,output:15,cacheRead:.3,cacheWrite:3.75},contextWindow:1e6,maxTokens:64e3,provider:"slingshot",api:"openai-completions"},{id:"claude-opus-4-6",name:"Claude Opus 4.6",reasoning:!0,input:["text","image"],cost:{input:5,output:25,cacheRead:.5,cacheWrite:6.25},contextWindow:1e6,maxTokens:128e3,provider:"slingshot",api:"openai-completions"},{id:"o3",name:"O3",reasoning:!0,input:["text","image"],cost:{input:2,output:8,cacheRead:.5,cacheWrite:0},contextWindow:2e5,maxTokens:1e5,provider:"slingshot",api:"openai-completions"},{id:"o3-mini",name:"o3-mini",reasoning:!0,input:["text"],cost:{input:1.1,output:4.4,cacheRead:.55,cacheWrite:0},contextWindow:2e5,maxTokens:1e5,provider:"slingshot",api:"openai-completions"},{id:"o4-mini",name:"o4-mini",reasoning:!0,input:["text"],cost:{input:1.1,output:4.4,cacheRead:.28,cacheWrite:0},contextWindow:2e5,maxTokens:1e5,provider:"slingshot",api:"openai-completions"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash",reasoning:!0,input:["text","image"],cost:{input:.3,output:2.5,cacheRead:.075,cacheWrite:0},contextWindow:1048576,maxTokens:65536,provider:"slingshot",api:"openai-completions"}];var _r={name:"slingshot.cli",private:!0,type:"module",workspaces:["packages/*","packages/web-ui/example","packages/coding-agent/examples/extensions/with-deps","packages/coding-agent/examples/extensions/custom-provider-anthropic","packages/coding-agent/examples/extensions/custom-provider-gitlab-duo"],scripts:{clean:"npm run clean --workspaces",build:"cd packages/tui && npm run build && cd ../ai && npm run build && cd ../agent && npm run build && cd ../coding-agent && npm run build && cd ../web-ui && npm run build",dev:'concurrently --names "ai,agent,coding-agent,web-ui,tui" --prefix-colors "cyan,yellow,red,white,green,magenta" "cd packages/ai && npm run dev" "cd packages/agent && npm run dev" "cd packages/coding-agent && npm run dev" "cd packages/web-ui && npm run dev" "cd packages/tui && npm run dev"',"dev:tsc":'concurrently --names "ai,web-ui" --prefix-colors "cyan,green" "cd packages/ai && npm run dev:tsc" "cd packages/web-ui && npm run dev:tsc"',check:"","check:browser-smoke":"","profile:tui":"node scripts/profile-coding-agent-node.mjs --mode tui","profile:rpc":"node scripts/profile-coding-agent-node.mjs --mode rpc",test:"npm run test --workspaces --if-present","version:patch":"npm version patch -ws --no-git-tag-version && node scripts/sync-versions.js && shx rm -rf node_modules packages/*/node_modules package-lock.json && npm install","version:minor":"npm version minor -ws --no-git-tag-version && node scripts/sync-versions.js && shx rm -rf node_modules packages/*/node_modules package-lock.json && npm install","version:major":"npm version major -ws --no-git-tag-version && node scripts/sync-versions.js && shx rm -rf node_modules packages/*/node_modules package-lock.json && npm install","version:set":"npm version -ws",prepublishOnly:"npm run clean && npm run build && npm run check",publish:"npm run prepublishOnly && npm publish -ws --access public","publish:dry":"npm run prepublishOnly && npm publish -ws --access public --dry-run","release:patch":"node scripts/release.mjs patch","release:minor":"node scripts/release.mjs minor","release:major":"node scripts/release.mjs major",prepare:"husky"},devDependencies:{"@anthropic-ai/sandbox-runtime":"0.0.26","@biomejs/biome":"2.3.5","@types/node":"22.19.19","@typescript/native-preview":"7.0.0-dev.20260120.1",concurrently:"^9.2.1",esbuild:"0.28.0",husky:"9.1.7",jiti:"2.7.0",shx:"0.4.0",tsx:"4.22.1",typescript:"5.9.3"},engines:{node:">=20.0.0"},slingVersion:"2.4.20260523-2",overrides:{rimraf:"6.1.3","fast-xml-parser":"5.7.2",gaxios:{rimraf:"6.1.3"}},dependencies:{"@modelcontextprotocol/sdk":"^1.29.0","@mozilla/readability":"^0.6.0","compound-engineering-pi":"^0.2.4","get-east-asian-width":"^1.4.0",linkedom:"^0.18.12",turndown:"^7.2.4",unpdf:"^1.6.2"}};var j1e=we.getRefreshUrl(),q1e=we.getApiBaseUrl(),G1e=we.getSageEventsUrl(),K1e=we.getTokenExpiryBuffer(),V1=we.getDefaultProjectId(),J1=we.getDefaultWorkspaceId(),Q1=we.getDefaultClientId();async function zp(t,e,n){let i=B1(),s=await e.modelRegistry.getApiKeyForProvider(e.model?.provider||"slingshot");if(!s){We("ERROR: No API key found");return}let r=s.startsWith("Bearer ")?s:`Bearer ${s}`,o=process.env.SLINGSHOT_PROJECT_ID||V1,a=process.env.SLINGSHOT_WORKSPACE_ID||J1,c=process.env.CLIENT_ID||Q1,l={"Content-Type":"application/json",accept:"application/json","access-token":r,"x-project-id":o,"x-workspace-id":a,"x-client-id":c,"sage-trace-id":i,"User-Agent":"pi-slingshot/1.0.0"},d=parseFloat(process.env.SLINGSHOT_TEMPERATURE||"0.2"),u=parseFloat(process.env.SLINGSHOT_TOP_P||"0.8"),p={source:_r.name||"sling",ai_model_info:{ai_provider_name:e.model?.provider||"slingshot",sage_modl_name:e.model?.id||"unknown",sage_modl_option:{temperature:String(d),max_token_size:String(e.model?.maxTokens||16834),top_p:String(u)}},rag_info:{type:null,account_name:"dummy",project_names:[],repository_names:[],programming_language:null},tab_data:{tab_count:"1"},tags:null,slingshot_version:_r.slingVersion||"2.3.2",chat_type:"agent",...n||{}};return{headers:l,sageCommonData:p}}async function Vp(t,e,n,i){let s={eventName:t,sageCommonData:n,eventData:i};We(`Sending analytics event: ${t} : `+we.getSageEventsUrl());try{let r=await fetch(we.getSageEventsUrl(),{method:"POST",headers:e,body:JSON.stringify(s)});if(r.ok){let o=await r.json().catch(()=>{});if(o.error_code)throw new Error(`Analytics API error: ${o.error_code} - ${o.error_message||"No message"}`);We(`'SUCCESS: Event sent: ${t}`),We(`Response: ${JSON.stringify(o)}`),We("\u2500".repeat(66))}else{let o=await r.text().catch(()=>""),a={status:r.status,statusText:r.statusText,responseBody:o,requestHeaders:e};throw We(`ERROR: ${r.status} ${r.statusText}`),Je("Error Details",a),Je("Failed Request Body",s),new Error(`Analytics API error: ${r.status} ${r.statusText}`)}}catch(r){let o=r instanceof Error?r.message:String(r);console.warn("[Slingshot Analytics] Request that caused error:",o),We(`EXCEPTION: ${o}`),r instanceof Error&&r.stack&&We(`Stack trace: ${r.stack}`),Je("Request that caused exception",s)}}import Jl from"chalk";function Y1(t,e){return{render(n){let i=` \u26AC _______. __ __ .__ __. _______
|
|
445
445
|
\u274D \xB7 \u274D / || | | | | \\ | | / _____|
|
|
446
446
|
\u2726 \u26AC \u2726 | (----\`| | | | | \\| | | | __
|
|
447
447
|
\u26AC \xB7 \u26AC \u26AC \xB7 \u26AC \\ \\ | | | | | . \` | | | |_ |
|
|
@@ -529,7 +529,17 @@ message: ${mn.enrichedMessage}`,"info"),mn=null,t.sendMessage({customType:"ss-co
|
|
|
529
529
|
`),"info");return}let u=0;if(await n.ui.custom((p,m,g,h)=>{let f="by-source",x=zA(l,f),y=[...x],w=y.findIndex(F=>F.type==="item");w<0&&(w=0);let P=new Qe;function _(F,N){let H=F+N;for(;H>=0&&H<y.length;){if(y[H]?.type==="item")return H;H+=N}return F}function R(F){let N=uoe(F);if(!N){y=[...x],E();return}let H=new Set,G=new Set;for(let Z of x)Z.type==="item"&&N(Z.item)&&H.add(Z.item);for(let Z of l)for(let de of Z.items)H.has(de)&&G.add(Z);y=[];for(let Z of x)(Z.type==="group"&&G.has(Z.group)||Z.type==="item"&&H.has(Z.item))&&y.push(Z);E()}function L(){x=zA(l,f),R(P.getValue())}function E(){let F=y.findIndex(N=>N.type==="item");w=F>=0?F:0}let W={invalidate(){},render(F){let N=m.bold("Skill Configuration"),H=m.fg("muted"," \xB7 "),G=pt("space","toggle")+H+pt("tab","view")+H+pt("esc","close"),Z=j(G),de=j(N),Te=Math.max(1,F-de-Z);return[X(`${N}${" ".repeat(Te)}${G}`,F,""),m.fg("muted","Filter: name \xB7 /path \xB7 @source")]}},M=15,I={invalidate(){},render(F){let N=[];if(N.push(...P.render(F)),N.push(""),y.length===0)return N.push(m.fg("muted"," No skills found")),N;let H=Math.max(0,Math.min(w-Math.floor(M/2),y.length-M)),G=Math.min(H+M,y.length);for(let pe=H;pe<G;pe++){let Ie=y[pe];if(!Ie)continue;let tt=pe===w;if(Ie.type==="group"){let De=m.fg("accent",m.bold(Ie.group.label));N.push(X(` ${De}`,F,""))}else{let De=tt?"> ":" ",ri=Ie.item.enabled?m.fg("success","[x]"):m.fg("dim","[ ]"),jt=tt?m.bold(Ie.item.displayName):Ie.item.displayName;N.push(X(`${De} ${ri} ${jt}`,F,"..."))}}let Z=y.filter(pe=>pe.type==="item").length,de=y[w]?.type==="item"?y.slice(0,w+1).filter(pe=>pe.type==="item").length:0,Te=ioe[f];return H>0||G<y.length?N.push(m.fg("dim",` ${de}/${Z} ${Te}`)):N.push(m.fg("dim",` ${Te}`)),N}},O=new K;return O.addChild(new U(1)),O.addChild(new V),O.addChild(new U(1)),O.addChild(W),O.addChild(new U(1)),O.addChild(I),O.addChild(new U(1)),O.addChild(new V),{render(F){return O.render(F)},invalidate(){O.invalidate()},handleInput(F){let N=ve();if(N.matches(F,"tui.select.up")){w=_(w,-1),p.requestRender();return}if(N.matches(F,"tui.select.down")){w=_(w,1),p.requestRender();return}if(N.matches(F,"tui.select.pageUp")){let H=Math.max(0,w-M);for(;H<y.length&&y[H]?.type!=="item";)H++;H<y.length&&(w=H),p.requestRender();return}if(N.matches(F,"tui.select.pageDown")){let H=Math.min(y.length-1,w+M);for(;H>=0&&y[H]?.type!=="item";)H--;H>=0&&(w=H),p.requestRender();return}if(N.matches(F,"tui.select.cancel")){h(void 0);return}if(_e(F,"ctrl+c")){h(void 0);return}if(_e(F,"tab")){f=soe(f),L(),p.requestRender();return}if(F===" "||N.matches(F,"tui.select.confirm")){let H=y[w];if(H?.type==="item"){let G=!H.item.enabled;goe(H.item,G,r,i),H.item.enabled=G;for(let Z of l){let de=Z.items.find(Te=>Te.path===H.item.path);de&&(de.enabled=G)}u++,f==="active-first"&&L()}p.requestRender();return}P.handleInput(F),R(P.getValue()),p.requestRender()}}}),u>0){if(await n.ui.confirm("Reload Required",`${u} skill change(s) saved. Reload pi now?`)){await n.reload();return}n.ui.notify("Changes saved to settings. Use /reload to apply.","info")}}})}async function ew(t,e){let n=await e.modelRegistry.getApiKeyForProvider(e.model?.provider||"slingshot"),i=new Date;return fetch(`${we.getUserActivityUrl()}`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n||""}`,Accept:"application/json"},body:JSON.stringify({...t,activity_entity_type:"slingcli",activity_entity_id:_r.slingVersion||"dev",activity_startdate:t.activity_startdate?.toISOString()||i.toISOString(),activity_enddate:t.activity_enddate?.toISOString()||i.toISOString(),metadata:t.metadata||{}})}).then(s=>s.json()).then(s=>{We("User activity posted successfully, credits used: "+s.credits_used+"/"+s.remainingCredits)}).catch(s=>{Je("Error posting user activity:",s)}),{}}import XA from"node:path";var Gh=null,tw=0,YA=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function nw(t){let e=XA.basename(process.cwd());return t?`\u2B55\uFE0F - ${t} - ${e}`:`\u2B55\uFE0F - ${e}`}function iw(t){Gh&&(clearInterval(Gh),Gh=null),tw=0;let e=t.sessionManager.getSessionName();t.ui.setTitle(nw(e))}function ZA(t){iw(t),Gh=setInterval(()=>{let e=YA[tw%YA.length],n=XA.basename(process.cwd()),i=t.sessionManager.getSessionName(),s=i?`${e} ${nw(i)}`:`${e} ${nw()}`;t.ui.setTitle(s),tw++},80)}var Kh=null;function Go(t){t.hasUI&&t.ui.setWorkingMessage(foe.magenta(Y0[Math.floor(Math.random()*Y0.length)]+"..."))}function boe(t){j0(),nM(t),JI(t,()=>Kh),Zv(t),$b(t),GA(t),KA(t),t.on("resources_discover",async r=>{let o=Oc.join(eO(),".pi","agent"),a=Oc.join(eO(),".agents"),l=[Oc.join(r.cwd,".sling","agent"),a,o],d=[],u=[],p=[];for(let m of l){let g=Oc.join(m,"skills");sw(g)&&d.push(g);let h=Oc.join(m,"prompts");sw(h)&&u.push(h);let f=Oc.join(m,"themes");sw(f)&&p.push(f)}return{skillPaths:d,promptPaths:u,themePaths:p}});let e=new WeakSet;t.on("session_start",async(r,o)=>{o.hasUI&&o.ui.setStatus("ss-credit","0");let a=o.modelRegistry.authStorage;if(!e.has(a)){let l=a.getOAuthProviders.bind(a);a.getOAuthProviders=()=>l().filter(d=>d.id==="slingshot"),e.add(a)}o.hasUI&&o.ui.setHeader(Y1);let c=o.modelRegistry.authStorage.get("slingshot");if(c?.type==="oauth"&&typeof c.access=="string"&&c.access)try{await zi(c.access)}catch(l){We(`session_start: app-token fetch failed: ${l instanceof Error?l.message:String(l)}`)}});let n=!1;t.registerProvider("slingshot",{baseUrl:we.getApiBaseUrl(),api:"openai-completions",apiKey:"SLINGSHOT_API_KEY",models:z1,headers:{"X-App-Authorization":we.SLINGSHOT_APP_TOKEN_ENV},oauth:{name:"Slingshot",login:Q0,refreshToken:Hp,getApiKey:r=>(Kh=r,t.appendEntry("slingshot_credentials",r),r.access)}}),t.registerCommand("s:settings",{description:"slingshot specific settings",handler:async(r,o)=>{let a=we.getSettings();t.sendMessage({customType:"slingshot-settings",content:JSON.stringify(a,null,2),display:!0})}}),t.registerCommand("s:debug",{description:"Toggle Slingshot debug logging",handler:async(r,o)=>{let a=!ql();if(F1(a),a){let c="Slingshot Debug: ENABLED \u2705",l=D1();l&&(c+=`
|
|
530
530
|
|
|
531
531
|
Log file:
|
|
532
|
-
${l}`),t.sendMessage({customType:"slingshot-debug-status",content:c,display:!0})}else t.sendMessage({customType:"slingshot-debug-status",content:"Slingshot Debug: DISABLED \u274C",display:!0})}}),t.registerCommand("refresh-token",{description:"Manually refresh Slingshot OAuth token",handler:async(r,o)=>{try{let a=o.modelRegistry.authStorage,c=a.get("slingshot");if(!c||c.type!=="oauth"){o.hasUI&&o.ui.notify("No Slingshot OAuth credentials found. Please use /login slingshot first.","error");return}o.hasUI&&o.ui.setStatus("refresh","Refreshing Slingshot token...");let l=await Hp(c);a.set("slingshot",{type:"oauth",...l}),Kh=l,o.hasUI&&(o.ui.setStatus("refresh",void 0),o.ui.notify("Slingshot token refreshed successfully!","info"))}catch(a){if(o.hasUI){o.ui.setStatus("refresh",void 0);let c=a instanceof Error?a.message:String(a);o.ui.notify(`Failed to refresh token: ${c}`,"error")}}}});let i=jp(),s=new Date;t.on("before_agent_start",async(r,o)=>{try{s=new Date,ZA(o),Go(o),Z0(o,"random");let a=await zp(r,o);if(!a?.headers||!a.sageCommonData)return;i=jp(),Vp("agentExecutionStatus",a.headers,a.sageCommonData,{agent_id:i,agent_name:"Sling_Coding_Assistant",agent_execution_status:"Started",agent_correlation_id:i,agent_type:"Temp"})
|
|
532
|
+
${l}`),t.sendMessage({customType:"slingshot-debug-status",content:c,display:!0})}else t.sendMessage({customType:"slingshot-debug-status",content:"Slingshot Debug: DISABLED \u274C",display:!0})}}),t.registerCommand("refresh-token",{description:"Manually refresh Slingshot OAuth token",handler:async(r,o)=>{try{let a=o.modelRegistry.authStorage,c=a.get("slingshot");if(!c||c.type!=="oauth"){o.hasUI&&o.ui.notify("No Slingshot OAuth credentials found. Please use /login slingshot first.","error");return}o.hasUI&&o.ui.setStatus("refresh","Refreshing Slingshot token...");let l=await Hp(c);a.set("slingshot",{type:"oauth",...l}),Kh=l,o.hasUI&&(o.ui.setStatus("refresh",void 0),o.ui.notify("Slingshot token refreshed successfully!","info"))}catch(a){if(o.hasUI){o.ui.setStatus("refresh",void 0);let c=a instanceof Error?a.message:String(a);o.ui.notify(`Failed to refresh token: ${c}`,"error")}}}});let i=jp(),s=new Date;t.on("before_agent_start",async(r,o)=>{try{s=new Date,ZA(o),Go(o),Z0(o,"random");let a=await zp(r,o);if(!a?.headers||!a.sageCommonData)return;i=jp(),Vp("agentExecutionStatus",a.headers,a.sageCommonData,{agent_id:i,agent_name:"Sling_Coding_Assistant",agent_execution_status:"Started",agent_correlation_id:i,agent_type:"Temp"});let c=r.systemPrompt;return c.includes("<pi-intercom>")||(c=r.systemPrompt+`
|
|
533
|
+
|
|
534
|
+
<pi-intercom>
|
|
535
|
+
Coordinate with other local sling sessions on related codebases. Use \`/skill:pi-intercom\` for patterns.
|
|
536
|
+
|
|
537
|
+
**When:** Same codebase (parallel work), reference codebase (consulting patterns), related repos (shared libraries).
|
|
538
|
+
|
|
539
|
+
**Not when:** Unrelated codebases, trivial questions, or when you can proceed independently.
|
|
540
|
+
|
|
541
|
+
**Principle:** Prefer \`send\` for notifications; \`ask\` only when blocked waiting for input.
|
|
542
|
+
</pi-intercom>`),{systemPrompt:c}}catch(a){ql()&&(We(`CRITICAL ERROR in event handler: ${a?.message||a}`),a?.stack&&We(a.stack))}}),t.on("agent_end",async(r,o)=>{try{iw(o);let a=0,c=0,l=0,d=0,u=0;for(let m of o.sessionManager.getEntries())m.type==="message"&&m.message.role==="assistant"&&(a+=m.message.usage.input,c+=m.message.usage.output,l+=m.message.usage.cacheRead,d+=m.message.usage.cacheWrite,u+=m.message.usage.cost.total);ew({activity_type:"slingcli:agent:execute",activity_entity_id:i,activity_entity_type:"coding_agent",total_tokens:a+c,activity_startdate:s,activity_enddate:new Date,credits_used:0,metadata:{correlation_id:i,cost:u}},o).then(m=>{o.hasUI&&(m.credits_used&&o.ui.notify(`Credits used: ${m.credits_used.toFixed(4)}`,"info"),m.remainingCredits&&o.ui.setStatus("ss-credit",`${m.remainingCredits.toFixed(2)}`))});let p=await zp(r,o);if(!p?.headers||!p.sageCommonData)return;Vp("agentExecutionStatus",p.headers,p.sageCommonData,{agent_id:i,agent_name:"Sling_Coding_Assistant",agent_execution_status:"Success",agent_correlation_id:i,agent_type:"Temp",tools_list:[]})}catch(a){t.sendMessage({customType:"slingshot-analytics-error",content:"[Slingshot] Analytics error. Run /slingshot-debug for details.",display:!0}),ql()&&(We(`CRITICAL ERROR in event handler: ${a?.message||a}`),a?.stack&&We(a.stack))}}),t.on("tool_execution_start",async(r,o)=>{Go(o)}),t.on("tool_result",async(r,o)=>{if(Go(o),r.toolName==="write"||r.toolName==="edit")try{let a=await zp(r,o,Kh);if(!a?.headers||!a.sageCommonData||r.isError)return;let c=r.input.path+"",d=c.split(".").pop()||"",u="";r.toolName==="write"?u=r.input.content+"":r.toolName==="edit"&&(u=(r.details?.diff+"").split(`
|
|
533
543
|
`).filter(p=>p.startsWith("+")||p.startsWith("-")).join(`
|
|
534
544
|
`)),Vp(`${r.toolName==="edit"?"insertCode":"createNewFile"}`,a.headers,a.sageCommonData,{programming_language:d,number_of_lines:u.split(`
|
|
535
545
|
`).length+"",message_id:o.sessionManager.getSessionId()+"-"+i,code_block_id:o.sessionManager.getSessionId()+"-"+c})}catch(a){t.sendMessage({customType:"slingshot-analytics-error",content:"[Slingshot] Analytics error. Run /slingshot-debug for details.",display:!0}),ql()&&(We(`CRITICAL ERROR in event handler: ${a?.message||a}`),a?.stack&&We(a.stack))}}),t.on("tool_execution_end",async(r,o)=>{Go(o)}),t.on("message_start",async(r,o)=>{Go(o)}),t.on("message_update",async(r,o)=>{Go(o)}),t.on("message_end",async(r,o)=>{Go(o)})}export{boe as default};
|