@alva-ai/toolkit 0.1.3 → 0.1.4

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 CHANGED
@@ -86,7 +86,7 @@ Add the browser bundle via a CDN:
86
86
  <script src="https://unpkg.com/@alva-ai/toolkit/dist/browser.global.js"></script>
87
87
  <script>
88
88
  const client = new AlvaToolkit.AlvaClient({
89
- apiKey: 'alva_your_key_here',
89
+ token: 'your_token_here',
90
90
  });
91
91
 
92
92
  client.fs.readdir({ path: '/' }).then((entries) => {
@@ -1,2 +1,2 @@
1
- "use strict";var AlvaToolkit=(()=>{var A=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var j=(t,e)=>{for(var s in e)A(t,s,{get:e[s],enumerable:!0})},w=(t,e,s,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of F(e))!S.call(t,a)&&a!==s&&A(t,a,{get:()=>e[a],enumerable:!(r=k(e,a))||r.enumerable});return t};var T=t=>w(A({},"__esModule",{value:!0}),t);var O={};j(O,{AlvaClient:()=>q,AlvaError:()=>o,VERSION:()=>x});var o=class extends Error{code;status;constructor(e,s,r){super(s),this.name="AlvaError",this.code=e,this.status=r}};var m=class{constructor(e){this.client=e}client;async read(e){return this.client._request("GET","/api/v1/fs/read",{query:{path:e.path,offset:e.offset,size:e.size}})}async write(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/fs/write",{body:{path:e.path,data:e.data,mkdir_parents:e.mkdir_parents}})}async rawWrite(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/fs/write",{query:{path:e.path,mkdir_parents:e.mkdir_parents},rawBody:e.body})}async stat(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/fs/stat",{query:{path:e.path}})}async readdir(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/fs/readdir",{query:{path:e.path,recursive:e.recursive}})}async mkdir(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/fs/mkdir",{body:{path:e.path}})}async remove(e){this.client._requireAuth(),await this.client._request("DELETE","/api/v1/fs/remove",{query:{path:e.path,recursive:e.recursive}})}async rename(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/fs/rename",{body:{old_path:e.old_path,new_path:e.new_path}})}async copy(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/fs/copy",{body:{src_path:e.src_path,dst_path:e.dst_path}})}async symlink(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/fs/symlink",{body:{target_path:e.target_path,link_path:e.link_path}})}async readlink(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/fs/readlink",{query:{path:e.path}})}async chmod(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/fs/chmod",{body:{path:e.path,mode:e.mode}})}async grant(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/fs/grant",{body:{path:e.path,subject:e.subject,permission:e.permission}})}async revoke(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/fs/revoke",{body:{path:e.path,subject:e.subject,permission:e.permission}})}};var l=class{constructor(e){this.client=e}client;async execute(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/run",{body:{code:e.code,entry_path:e.entry_path,working_dir:e.working_dir,args:e.args}})}};var p=class{constructor(e){this.client=e}client;async create(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/deploy/cronjob",{body:{name:e.name,path:e.path,cron_expression:e.cron_expression,args:e.args,push_notify:e.push_notify}})}async list(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/deploy/cronjobs",{query:{limit:e?.limit,cursor:e?.cursor}})}async get(e){return this.client._requireAuth(),this.client._request("GET",`/api/v1/deploy/cronjob/${e.id}`)}async update(e){this.client._requireAuth();let{id:s,...r}=e;return this.client._request("PATCH",`/api/v1/deploy/cronjob/${s}`,{body:r})}async delete(e){this.client._requireAuth(),await this.client._request("DELETE",`/api/v1/deploy/cronjob/${e.id}`)}async pause(e){this.client._requireAuth(),await this.client._request("POST",`/api/v1/deploy/cronjob/${e.id}/pause`)}async resume(e){this.client._requireAuth(),await this.client._request("POST",`/api/v1/deploy/cronjob/${e.id}/resume`)}};var d=class{constructor(e){this.client=e}client;async feed(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/release/feed",{body:{name:e.name,version:e.version,cronjob_id:e.cronjob_id,view_json:e.view_json,description:e.description}})}async playbookDraft(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/draft/playbook",{body:{name:e.name,display_name:e.display_name,description:e.description,feeds:e.feeds,trading_symbols:e.trading_symbols,changelog:e.changelog}})}async playbook(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/release/playbook",{body:{name:e.name,version:e.version,feeds:e.feeds,changelog:e.changelog}})}};var h=class{constructor(e){this.client=e}client;async create(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/secrets",{body:{name:e.name,value:e.value}})}async list(){return this.client._requireAuth(),this.client._request("GET","/api/v1/secrets")}async get(e){this.client._requireAuth();let s=encodeURIComponent(e.name);return this.client._request("GET",`/api/v1/secrets/${s}`)}async update(e){this.client._requireAuth();let s=encodeURIComponent(e.name);await this.client._request("PUT",`/api/v1/secrets/${s}`,{body:{value:e.value}})}async delete(e){this.client._requireAuth();let s=encodeURIComponent(e.name);await this.client._request("DELETE",`/api/v1/secrets/${s}`)}};var y=class{constructor(e){this.client=e}client;async doc(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/sdk/doc",{query:{name:e.name}})}async partitions(){return this.client._requireAuth(),this.client._request("GET","/api/v1/sdk/partitions")}async partitionSummary(e){this.client._requireAuth();let s=encodeURIComponent(e.partition);return this.client._request("GET",`/api/v1/sdk/partitions/${s}/summary`)}};var P=class{constructor(e){this.client=e}client;async create(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/playbook/comment",{body:{username:e.username,name:e.name,content:e.content,parent_id:e.parent_id}})}async pin(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/playbook/comment/pin",{body:{comment_id:e.comment_id}})}async unpin(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/playbook/comment/unpin",{body:{comment_id:e.comment_id}})}};var R=class{constructor(e){this.client=e}client;async save(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/remix",{body:{child:e.child,parents:e.parents}})}};var _=class{constructor(e){this.client=e}client;async capture(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/screenshot",{query:{url:e.url,selector:e.selector,xpath:e.xpath}})}};var v=class{constructor(e){this.client=e}client;async me(){return this.client._requireAuth(),this.client._request("GET","/api/v1/me")}};var E="https://api-llm.prd.alva.ai",q=class{baseUrl;apiKey;_fs;_run;_deploy;_release;_secrets;_sdk;_comments;_remix;_screenshot;_user;constructor(e){this.baseUrl=e.baseUrl??E,this.apiKey=e.apiKey}get fs(){return this._fs??=new m(this)}get run(){return this._run??=new l(this)}get deploy(){return this._deploy??=new p(this)}get release(){return this._release??=new d(this)}get secrets(){return this._secrets??=new h(this)}get sdk(){return this._sdk??=new y(this)}get comments(){return this._comments??=new P(this)}get remix(){return this._remix??=new R(this)}get screenshot(){return this._screenshot??=new _(this)}get user(){return this._user??=new v(this)}_requireAuth(){if(!this.apiKey)throw new o("UNAUTHENTICATED","API key is required for this operation. Pass apiKey in the constructor.",401)}async _request(e,s,r){let a=`${this.baseUrl}${s}`;if(r?.query){let n=new URLSearchParams;for(let[c,C]of Object.entries(r.query))C!=null&&n.set(c,String(C));let b=n.toString();b&&(a+=`?${b}`)}let u={};this.apiKey&&(u["X-Alva-Api-Key"]=this.apiKey);let f;r?.rawBody!==void 0?(u["Content-Type"]="application/octet-stream",f=r.rawBody):r?.body!==void 0&&(u["Content-Type"]="application/json",f=JSON.stringify(r.body));let i;try{i=await fetch(a,{method:e,headers:u,body:f})}catch(n){throw new o("NETWORK_ERROR",n instanceof Error?n.message:"Network request failed",0)}if(!i.ok){let n=await i.text().catch(()=>"");if((i.headers.get("content-type")??"").includes("application/json")&&n)try{let c=JSON.parse(n);if(c.error)throw new o(c.error.code??"UNKNOWN",c.error.message??`HTTP ${i.status}`,i.status)}catch(c){if(c instanceof o)throw c}throw new o("UNKNOWN",`HTTP ${i.status}: ${n.slice(0,200)}`,i.status)}if(i.status===204)return;let g=i.headers.get("content-type")??"";return g.includes("application/octet-stream")||g.includes("image/")?i.arrayBuffer():i.json()}};var x="0.1.3";return T(O);})();
1
+ "use strict";var AlvaToolkit=(()=>{var T=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var w=(t,e)=>{for(var r in e)T(t,r,{get:e[r],enumerable:!0})},j=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of S(e))!F.call(t,a)&&a!==r&&T(t,a,{get:()=>e[a],enumerable:!(s=C(e,a))||s.enumerable});return t};var E=t=>j(T({},"__esModule",{value:!0}),t);var U={};w(U,{AlvaClient:()=>g,AlvaError:()=>n,VERSION:()=>O});var n=class extends Error{code;status;constructor(e,r,s){super(r),this.name="AlvaError",this.code=e,this.status=s}};var l=class{constructor(e){this.client=e}client;async read(e){return this.client._request("GET","/api/v1/fs/read",{query:{path:e.path,offset:e.offset,size:e.size}})}async write(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/fs/write",{body:{path:e.path,data:e.data,mkdir_parents:e.mkdir_parents}})}async rawWrite(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/fs/write",{query:{path:e.path,mkdir_parents:e.mkdir_parents},rawBody:e.body})}async stat(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/fs/stat",{query:{path:e.path}})}async readdir(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/fs/readdir",{query:{path:e.path,recursive:e.recursive}})}async mkdir(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/fs/mkdir",{body:{path:e.path}})}async remove(e){this.client._requireAuth(),await this.client._request("DELETE","/api/v1/fs/remove",{query:{path:e.path,recursive:e.recursive}})}async rename(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/fs/rename",{body:{old_path:e.old_path,new_path:e.new_path}})}async copy(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/fs/copy",{body:{src_path:e.src_path,dst_path:e.dst_path}})}async symlink(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/fs/symlink",{body:{target_path:e.target_path,link_path:e.link_path}})}async readlink(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/fs/readlink",{query:{path:e.path}})}async chmod(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/fs/chmod",{body:{path:e.path,mode:e.mode}})}async grant(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/fs/grant",{body:{path:e.path,subject:e.subject,permission:e.permission}})}async revoke(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/fs/revoke",{body:{path:e.path,subject:e.subject,permission:e.permission}})}};var m=class{constructor(e){this.client=e}client;async execute(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/run",{body:{code:e.code,entry_path:e.entry_path,working_dir:e.working_dir,args:e.args}})}};var p=class{constructor(e){this.client=e}client;async create(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/deploy/cronjob",{body:{name:e.name,path:e.path,cron_expression:e.cron_expression,args:e.args,push_notify:e.push_notify}})}async list(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/deploy/cronjobs",{query:{limit:e?.limit,cursor:e?.cursor}})}async get(e){return this.client._requireAuth(),this.client._request("GET",`/api/v1/deploy/cronjob/${e.id}`)}async update(e){this.client._requireAuth();let{id:r,...s}=e;return this.client._request("PATCH",`/api/v1/deploy/cronjob/${r}`,{body:s})}async delete(e){this.client._requireAuth(),await this.client._request("DELETE",`/api/v1/deploy/cronjob/${e.id}`)}async pause(e){this.client._requireAuth(),await this.client._request("POST",`/api/v1/deploy/cronjob/${e.id}/pause`)}async resume(e){this.client._requireAuth(),await this.client._request("POST",`/api/v1/deploy/cronjob/${e.id}/resume`)}};var d=class{constructor(e){this.client=e}client;async feed(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/release/feed",{body:{name:e.name,version:e.version,cronjob_id:e.cronjob_id,view_json:e.view_json,description:e.description}})}async playbookDraft(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/draft/playbook",{body:{name:e.name,display_name:e.display_name,description:e.description,feeds:e.feeds,trading_symbols:e.trading_symbols,changelog:e.changelog}})}async playbook(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/release/playbook",{body:{name:e.name,version:e.version,feeds:e.feeds,changelog:e.changelog}})}};var h=class{constructor(e){this.client=e}client;async create(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/secrets",{body:{name:e.name,value:e.value}})}async list(){return this.client._requireAuth(),this.client._request("GET","/api/v1/secrets")}async get(e){this.client._requireAuth();let r=encodeURIComponent(e.name);return this.client._request("GET",`/api/v1/secrets/${r}`)}async update(e){this.client._requireAuth();let r=encodeURIComponent(e.name);await this.client._request("PUT",`/api/v1/secrets/${r}`,{body:{value:e.value}})}async delete(e){this.client._requireAuth();let r=encodeURIComponent(e.name);await this.client._request("DELETE",`/api/v1/secrets/${r}`)}};var y=class{constructor(e){this.client=e}client;async doc(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/sdk/doc",{query:{name:e.name}})}async partitions(){return this.client._requireAuth(),this.client._request("GET","/api/v1/sdk/partitions")}async partitionSummary(e){this.client._requireAuth();let r=encodeURIComponent(e.partition);return this.client._request("GET",`/api/v1/sdk/partitions/${r}/summary`)}};var P=class{constructor(e){this.client=e}client;async create(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/playbook/comment",{body:{username:e.username,name:e.name,content:e.content,parent_id:e.parent_id}})}async pin(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/playbook/comment/pin",{body:{comment_id:e.comment_id}})}async unpin(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/playbook/comment/unpin",{body:{comment_id:e.comment_id}})}};var _=class{constructor(e){this.client=e}client;async save(e){this.client._requireAuth(),await this.client._request("POST","/api/v1/remix",{body:{child:e.child,parents:e.parents}})}};var R=class{constructor(e){this.client=e}client;async capture(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/screenshot",{query:{url:e.url,selector:e.selector,xpath:e.xpath}})}};var q=class{constructor(e){this.client=e}client;async me(){return this.client._requireAuth(),this.client._request("GET","/api/v1/me")}};var v=class{constructor(e){this.client=e}client;async accounts(){return this.client._requireAuth(),this.client._request("GET","/api/v1/trading/accounts")}async portfolio(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/trading/portfolio",{query:{accountId:e}})}async orders(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/trading/orders",{query:{accountId:e.accountId,source:e.source,since:e.since,limit:e.limit}})}async subscriptions(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/trading/subscriptions",{query:{accountId:e}})}async equityHistory(e){return this.client._requireAuth(),this.client._request("GET","/api/v1/trading/equity-history",{query:{accountId:e.accountId,timeframe:e.timeframe,sinceMs:e.sinceMs,untilMs:e.untilMs}})}async riskRules(){return this.client._requireAuth(),this.client._request("GET","/api/v1/trading/risk-rules")}async subscribe(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/trading/subscribe",{body:e})}async unsubscribe(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/trading/unsubscribe",{body:{subscriptionId:e}})}async execute(e){return this.client._requireAuth(),this.client._request("POST","/api/v1/trading/execute",{body:e})}async updateRiskRules(e){return this.client._requireAuth(),this.client._request("PUT","/api/v1/trading/risk-rules",{body:e})}};var x="https://api-llm.prd.alva.ai",g=class{baseUrl;token;apiKey;_fs;_run;_deploy;_release;_secrets;_sdk;_comments;_remix;_screenshot;_user;_trading;constructor(e){this.baseUrl=e.baseUrl??x,this.token=e.token,this.apiKey=e.apiKey}get fs(){return this._fs??=new l(this)}get run(){return this._run??=new m(this)}get deploy(){return this._deploy??=new p(this)}get release(){return this._release??=new d(this)}get secrets(){return this._secrets??=new h(this)}get sdk(){return this._sdk??=new y(this)}get comments(){return this._comments??=new P(this)}get remix(){return this._remix??=new _(this)}get screenshot(){return this._screenshot??=new R(this)}get user(){return this._user??=new q(this)}get trading(){return this._trading??=new v(this)}_requireAuth(){if(!this.token&&!this.apiKey)throw new n("UNAUTHENTICATED","Authentication is required. Pass token or apiKey in the constructor.",401)}async _request(e,r,s){let a=`${this.baseUrl}${r}`;if(s?.query){let o=new URLSearchParams;for(let[c,A]of Object.entries(s.query))A!=null&&o.set(c,String(A));let b=o.toString();b&&(a+=`?${b}`)}let u={};this.token?u.Authorization=`${this.token}`:this.apiKey&&(u["X-Alva-Api-Key"]=this.apiKey);let f;s?.rawBody!==void 0?(u["Content-Type"]="application/octet-stream",f=s.rawBody):s?.body!==void 0&&(u["Content-Type"]="application/json",f=JSON.stringify(s.body));let i;try{i=await fetch(a,{method:e,headers:u,body:f})}catch(o){throw new n("NETWORK_ERROR",o instanceof Error?o.message:"Network request failed",0)}if(!i.ok){let o=await i.text().catch(()=>"");if((i.headers.get("content-type")??"").includes("application/json")&&o)try{let c=JSON.parse(o);if(c.error)throw new n(c.error.code??"UNKNOWN",c.error.message??`HTTP ${i.status}`,i.status)}catch(c){if(c instanceof n)throw c}throw new n("UNKNOWN",`HTTP ${i.status}: ${o.slice(0,200)}`,i.status)}if(i.status===204)return;let k=i.headers.get("content-type")??"";return k.includes("application/octet-stream")||k.includes("image/")?i.arrayBuffer():i.json()}};var O="0.1.4";return E(U);})();
2
2
  //# sourceMappingURL=browser.global.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/browser.ts","../src/error.ts","../src/resources/fs.ts","../src/resources/run.ts","../src/resources/deploy.ts","../src/resources/release.ts","../src/resources/secrets.ts","../src/resources/sdkDocs.ts","../src/resources/comments.ts","../src/resources/remix.ts","../src/resources/screenshot.ts","../src/resources/user.ts","../src/client.ts","../src/index.ts"],"sourcesContent":["export * from './index.js';\n","export class AlvaError extends Error {\n readonly code: string;\n readonly status: number;\n\n constructor(code: string, message: string, status: number) {\n super(message);\n this.name = 'AlvaError';\n this.code = code;\n this.status = status;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type {\n FsReadParams,\n FsWriteParams,\n FsRawWriteParams,\n FsWriteResponse,\n FsStat,\n FsReaddirParams,\n FsReaddirResponse,\n FsMkdirParams,\n FsRemoveParams,\n FsRenameParams,\n FsCopyParams,\n FsSymlinkParams,\n FsReadlinkParams,\n FsChmodParams,\n FsGrantParams,\n FsRevokeParams,\n} from '../types.js';\n\nexport class FsResource {\n constructor(private client: AlvaClient) {}\n\n /** Returns `ArrayBuffer` for binary files, or parsed JSON for time-series virtual paths. */\n async read(params: FsReadParams): Promise<ArrayBuffer | unknown> {\n return this.client._request('GET', '/api/v1/fs/read', {\n query: { path: params.path, offset: params.offset, size: params.size },\n });\n }\n\n /** Write file using JSON body (Mode 2). For text content. */\n async write(params: FsWriteParams): Promise<FsWriteResponse> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/fs/write', {\n body: {\n path: params.path,\n data: params.data,\n mkdir_parents: params.mkdir_parents,\n },\n }) as Promise<FsWriteResponse>;\n }\n\n /** Write file using raw body (Mode 1). Supports binary data. Path and options are query params. */\n async rawWrite(params: FsRawWriteParams): Promise<FsWriteResponse> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/fs/write', {\n query: {\n path: params.path,\n mkdir_parents: params.mkdir_parents,\n },\n rawBody: params.body,\n }) as Promise<FsWriteResponse>;\n }\n\n async stat(params: { path: string }): Promise<FsStat> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/fs/stat', {\n query: { path: params.path },\n }) as Promise<FsStat>;\n }\n\n async readdir(params: FsReaddirParams): Promise<FsReaddirResponse> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/fs/readdir', {\n query: { path: params.path, recursive: params.recursive },\n }) as Promise<FsReaddirResponse>;\n }\n\n async mkdir(params: FsMkdirParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/fs/mkdir', {\n body: { path: params.path },\n });\n }\n\n async remove(params: FsRemoveParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('DELETE', '/api/v1/fs/remove', {\n query: { path: params.path, recursive: params.recursive },\n });\n }\n\n async rename(params: FsRenameParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/fs/rename', {\n body: { old_path: params.old_path, new_path: params.new_path },\n });\n }\n\n async copy(params: FsCopyParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/fs/copy', {\n body: { src_path: params.src_path, dst_path: params.dst_path },\n });\n }\n\n async symlink(params: FsSymlinkParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/fs/symlink', {\n body: {\n target_path: params.target_path,\n link_path: params.link_path,\n },\n });\n }\n\n async readlink(params: FsReadlinkParams): Promise<{ target: string }> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/fs/readlink', {\n query: { path: params.path },\n }) as Promise<{ target: string }>;\n }\n\n async chmod(params: FsChmodParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/fs/chmod', {\n body: { path: params.path, mode: params.mode },\n });\n }\n\n async grant(params: FsGrantParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/fs/grant', {\n body: {\n path: params.path,\n subject: params.subject,\n permission: params.permission,\n },\n });\n }\n\n async revoke(params: FsRevokeParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/fs/revoke', {\n body: {\n path: params.path,\n subject: params.subject,\n permission: params.permission,\n },\n });\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type { RunRequest, RunResponse } from '../types.js';\n\nexport class RunResource {\n constructor(private client: AlvaClient) {}\n\n async execute(params: RunRequest): Promise<RunResponse> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/run', {\n body: {\n code: params.code,\n entry_path: params.entry_path,\n working_dir: params.working_dir,\n args: params.args,\n },\n }) as Promise<RunResponse>;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type {\n CronjobCreateRequest,\n Cronjob,\n CronjobListParams,\n CronjobListResponse,\n CronjobUpdateRequest,\n} from '../types.js';\n\nexport class DeployResource {\n constructor(private client: AlvaClient) {}\n\n async create(params: CronjobCreateRequest): Promise<Cronjob> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/deploy/cronjob', {\n body: {\n name: params.name,\n path: params.path,\n cron_expression: params.cron_expression,\n args: params.args,\n push_notify: params.push_notify,\n },\n }) as Promise<Cronjob>;\n }\n\n async list(params?: CronjobListParams): Promise<CronjobListResponse> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/deploy/cronjobs', {\n query: { limit: params?.limit, cursor: params?.cursor },\n }) as Promise<CronjobListResponse>;\n }\n\n async get(params: { id: number }): Promise<Cronjob> {\n this.client._requireAuth();\n return this.client._request(\n 'GET',\n `/api/v1/deploy/cronjob/${params.id}`\n ) as Promise<Cronjob>;\n }\n\n async update(params: CronjobUpdateRequest): Promise<Cronjob> {\n this.client._requireAuth();\n const { id, ...body } = params;\n return this.client._request('PATCH', `/api/v1/deploy/cronjob/${id}`, {\n body,\n }) as Promise<Cronjob>;\n }\n\n async delete(params: { id: number }): Promise<void> {\n this.client._requireAuth();\n await this.client._request('DELETE', `/api/v1/deploy/cronjob/${params.id}`);\n }\n\n async pause(params: { id: number }): Promise<void> {\n this.client._requireAuth();\n await this.client._request(\n 'POST',\n `/api/v1/deploy/cronjob/${params.id}/pause`\n );\n }\n\n async resume(params: { id: number }): Promise<void> {\n this.client._requireAuth();\n await this.client._request(\n 'POST',\n `/api/v1/deploy/cronjob/${params.id}/resume`\n );\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type {\n FeedReleaseRequest,\n FeedReleaseResponse,\n PlaybookDraftRequest,\n PlaybookDraftResponse,\n PlaybookReleaseRequest,\n PlaybookReleaseResponse,\n} from '../types.js';\n\nexport class ReleaseResource {\n constructor(private client: AlvaClient) {}\n\n async feed(params: FeedReleaseRequest): Promise<FeedReleaseResponse> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/release/feed', {\n body: {\n name: params.name,\n version: params.version,\n cronjob_id: params.cronjob_id,\n view_json: params.view_json,\n description: params.description,\n },\n }) as Promise<FeedReleaseResponse>;\n }\n\n async playbookDraft(\n params: PlaybookDraftRequest\n ): Promise<PlaybookDraftResponse> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/draft/playbook', {\n body: {\n name: params.name,\n display_name: params.display_name,\n description: params.description,\n feeds: params.feeds,\n trading_symbols: params.trading_symbols,\n changelog: params.changelog,\n },\n }) as Promise<PlaybookDraftResponse>;\n }\n\n async playbook(\n params: PlaybookReleaseRequest\n ): Promise<PlaybookReleaseResponse> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/release/playbook', {\n body: {\n name: params.name,\n version: params.version,\n feeds: params.feeds,\n changelog: params.changelog,\n },\n }) as Promise<PlaybookReleaseResponse>;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type { CreateSecretRequest, Secret, SecretMetadata } from '../types.js';\n\nexport class SecretsResource {\n constructor(private client: AlvaClient) {}\n\n async create(params: CreateSecretRequest): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/secrets', {\n body: { name: params.name, value: params.value },\n });\n }\n\n async list(): Promise<{ secrets: SecretMetadata[] }> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/secrets') as Promise<{\n secrets: SecretMetadata[];\n }>;\n }\n\n async get(params: { name: string }): Promise<Secret> {\n this.client._requireAuth();\n const encoded = encodeURIComponent(params.name);\n return this.client._request(\n 'GET',\n `/api/v1/secrets/${encoded}`\n ) as Promise<Secret>;\n }\n\n async update(params: { name: string; value: string }): Promise<void> {\n this.client._requireAuth();\n const encoded = encodeURIComponent(params.name);\n await this.client._request('PUT', `/api/v1/secrets/${encoded}`, {\n body: { value: params.value },\n });\n }\n\n async delete(params: { name: string }): Promise<void> {\n this.client._requireAuth();\n const encoded = encodeURIComponent(params.name);\n await this.client._request('DELETE', `/api/v1/secrets/${encoded}`);\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type {\n ModuleDoc,\n PartitionsResponse,\n PartitionSummaryResponse,\n} from '../types.js';\n\nexport class SdkDocsResource {\n constructor(private client: AlvaClient) {}\n\n async doc(params: { name: string }): Promise<ModuleDoc> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/sdk/doc', {\n query: { name: params.name },\n }) as Promise<ModuleDoc>;\n }\n\n async partitions(): Promise<PartitionsResponse> {\n this.client._requireAuth();\n return this.client._request(\n 'GET',\n '/api/v1/sdk/partitions'\n ) as Promise<PartitionsResponse>;\n }\n\n async partitionSummary(params: {\n partition: string;\n }): Promise<PartitionSummaryResponse> {\n this.client._requireAuth();\n const encoded = encodeURIComponent(params.partition);\n return this.client._request(\n 'GET',\n `/api/v1/sdk/partitions/${encoded}/summary`\n ) as Promise<PartitionSummaryResponse>;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type { CreateCommentRequest, Comment } from '../types.js';\n\nexport class CommentsResource {\n constructor(private client: AlvaClient) {}\n\n async create(params: CreateCommentRequest): Promise<Comment> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/playbook/comment', {\n body: {\n username: params.username,\n name: params.name,\n content: params.content,\n parent_id: params.parent_id,\n },\n }) as Promise<Comment>;\n }\n\n async pin(params: { comment_id: number }): Promise<Comment> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/playbook/comment/pin', {\n body: { comment_id: params.comment_id },\n }) as Promise<Comment>;\n }\n\n async unpin(params: { comment_id: number }): Promise<Comment> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/playbook/comment/unpin', {\n body: { comment_id: params.comment_id },\n }) as Promise<Comment>;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type { RemixRequest } from '../types.js';\n\nexport class RemixResource {\n constructor(private client: AlvaClient) {}\n\n async save(params: RemixRequest): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/remix', {\n body: {\n child: params.child,\n parents: params.parents,\n },\n });\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type { ScreenshotParams } from '../types.js';\n\nexport class ScreenshotResource {\n constructor(private client: AlvaClient) {}\n\n async capture(params: ScreenshotParams): Promise<ArrayBuffer> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/screenshot', {\n query: {\n url: params.url,\n selector: params.selector,\n xpath: params.xpath,\n },\n }) as Promise<ArrayBuffer>;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type { UserProfile } from '../types.js';\n\nexport class UserResource {\n constructor(private client: AlvaClient) {}\n\n async me(): Promise<UserProfile> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/me') as Promise<UserProfile>;\n }\n}\n","import { AlvaError } from './error.js';\nimport type { AlvaClientConfig } from './types.js';\nimport { FsResource } from './resources/fs.js';\nimport { RunResource } from './resources/run.js';\nimport { DeployResource } from './resources/deploy.js';\nimport { ReleaseResource } from './resources/release.js';\nimport { SecretsResource } from './resources/secrets.js';\nimport { SdkDocsResource } from './resources/sdkDocs.js';\nimport { CommentsResource } from './resources/comments.js';\nimport { RemixResource } from './resources/remix.js';\nimport { ScreenshotResource } from './resources/screenshot.js';\nimport { UserResource } from './resources/user.js';\n\nconst DEFAULT_BASE_URL = 'https://api-llm.prd.alva.ai';\n\ninterface RequestOptions {\n query?: Record<string, unknown>;\n body?: unknown;\n /** Send raw body with application/octet-stream content type (for binary writes). */\n rawBody?: BodyInit;\n}\n\nexport class AlvaClient {\n readonly baseUrl: string;\n readonly apiKey?: string;\n\n private _fs?: FsResource;\n private _run?: RunResource;\n private _deploy?: DeployResource;\n private _release?: ReleaseResource;\n private _secrets?: SecretsResource;\n private _sdk?: SdkDocsResource;\n private _comments?: CommentsResource;\n private _remix?: RemixResource;\n private _screenshot?: ScreenshotResource;\n private _user?: UserResource;\n\n constructor(config: AlvaClientConfig) {\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n this.apiKey = config.apiKey;\n }\n\n get fs(): FsResource {\n return (this._fs ??= new FsResource(this));\n }\n get run(): RunResource {\n return (this._run ??= new RunResource(this));\n }\n get deploy(): DeployResource {\n return (this._deploy ??= new DeployResource(this));\n }\n get release(): ReleaseResource {\n return (this._release ??= new ReleaseResource(this));\n }\n get secrets(): SecretsResource {\n return (this._secrets ??= new SecretsResource(this));\n }\n get sdk(): SdkDocsResource {\n return (this._sdk ??= new SdkDocsResource(this));\n }\n get comments(): CommentsResource {\n return (this._comments ??= new CommentsResource(this));\n }\n get remix(): RemixResource {\n return (this._remix ??= new RemixResource(this));\n }\n get screenshot(): ScreenshotResource {\n return (this._screenshot ??= new ScreenshotResource(this));\n }\n get user(): UserResource {\n return (this._user ??= new UserResource(this));\n }\n\n _requireAuth(): void {\n if (!this.apiKey) {\n throw new AlvaError(\n 'UNAUTHENTICATED',\n 'API key is required for this operation. Pass apiKey in the constructor.',\n 401\n );\n }\n }\n\n async _request(\n method: string,\n path: string,\n options?: RequestOptions\n ): Promise<unknown> {\n let url = `${this.baseUrl}${path}`;\n\n if (options?.query) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined && value !== null) {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n url += `?${qs}`;\n }\n }\n\n const headers: Record<string, string> = {};\n if (this.apiKey) {\n headers['X-Alva-Api-Key'] = this.apiKey;\n }\n\n let fetchBody: BodyInit | undefined;\n if (options?.rawBody !== undefined) {\n headers['Content-Type'] = 'application/octet-stream';\n fetchBody = options.rawBody;\n } else if (options?.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n fetchBody = JSON.stringify(options.body);\n }\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers,\n body: fetchBody,\n });\n } catch (err) {\n throw new AlvaError(\n 'NETWORK_ERROR',\n err instanceof Error ? err.message : 'Network request failed',\n 0\n );\n }\n\n if (!response.ok) {\n // Read body as text first to avoid double consumption\n const bodyText = await response.text().catch(() => '');\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json') && bodyText) {\n try {\n const data = JSON.parse(bodyText) as {\n error?: { code?: string; message?: string };\n };\n if (data.error) {\n throw new AlvaError(\n data.error.code ?? 'UNKNOWN',\n data.error.message ?? `HTTP ${response.status}`,\n response.status\n );\n }\n } catch (e) {\n if (e instanceof AlvaError) throw e;\n // JSON parse failed or no error envelope — fall through\n }\n }\n throw new AlvaError(\n 'UNKNOWN',\n `HTTP ${response.status}: ${bodyText.slice(0, 200)}`,\n response.status\n );\n }\n\n // Handle 204 No Content and empty responses\n if (response.status === 204) {\n return undefined;\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n if (\n contentType.includes('application/octet-stream') ||\n contentType.includes('image/')\n ) {\n return response.arrayBuffer();\n }\n\n return response.json();\n }\n}\n","declare const __VERSION__: string;\n\n/** SDK version, injected at build time from package.json. */\nexport const VERSION: string =\n typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'dev';\n\nexport { AlvaClient } from './client.js';\nexport { AlvaError } from './error.js';\nexport type {\n AlvaClientConfig,\n UserProfile,\n FsReadParams,\n FsWriteParams,\n FsRawWriteParams,\n FsWriteResponse,\n FsStat,\n FsReaddirParams,\n FsEntry,\n FsReaddirResponse,\n FsMkdirParams,\n FsRemoveParams,\n FsRenameParams,\n FsCopyParams,\n FsSymlinkParams,\n FsReadlinkParams,\n FsChmodParams,\n FsGrantParams,\n FsRevokeParams,\n RunRequest,\n RunResponse,\n CronjobCreateRequest,\n Cronjob,\n CronjobListParams,\n CronjobListResponse,\n CronjobUpdateRequest,\n FeedReleaseRequest,\n FeedReleaseResponse,\n PlaybookDraftRequest,\n PlaybookDraftResponse,\n PlaybookReleaseRequest,\n PlaybookReleaseResponse,\n CreateSecretRequest,\n SecretMetadata,\n Secret,\n ModuleDoc,\n PartitionsResponse,\n PartitionSummaryResponse,\n CreateCommentRequest,\n Comment,\n RemixRequest,\n ScreenshotParams,\n} from './types.js';\n"],"mappings":"+bAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gBAAAE,EAAA,cAAAC,EAAA,YAAAC,ICAO,IAAMC,EAAN,cAAwB,KAAM,CAC1B,KACA,OAET,YAAYC,EAAcC,EAAiBC,EAAgB,CACzD,MAAMD,CAAO,EACb,KAAK,KAAO,YACZ,KAAK,KAAOD,EACZ,KAAK,OAASE,CAChB,CACF,ECUO,IAAMC,EAAN,KAAiB,CACtB,YAAoBC,EAAoB,CAApB,YAAAA,CAAqB,CAArB,OAGpB,MAAM,KAAKC,EAAsD,CAC/D,OAAO,KAAK,OAAO,SAAS,MAAO,kBAAmB,CACpD,MAAO,CAAE,KAAMA,EAAO,KAAM,OAAQA,EAAO,OAAQ,KAAMA,EAAO,IAAK,CACvE,CAAC,CACH,CAGA,MAAM,MAAMA,EAAiD,CAC3D,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,OAAQ,mBAAoB,CACtD,KAAM,CACJ,KAAMA,EAAO,KACb,KAAMA,EAAO,KACb,cAAeA,EAAO,aACxB,CACF,CAAC,CACH,CAGA,MAAM,SAASA,EAAoD,CACjE,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,OAAQ,mBAAoB,CACtD,MAAO,CACL,KAAMA,EAAO,KACb,cAAeA,EAAO,aACxB,EACA,QAASA,EAAO,IAClB,CAAC,CACH,CAEA,MAAM,KAAKA,EAA2C,CACpD,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,MAAO,kBAAmB,CACpD,MAAO,CAAE,KAAMA,EAAO,IAAK,CAC7B,CAAC,CACH,CAEA,MAAM,QAAQA,EAAqD,CACjE,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,MAAO,qBAAsB,CACvD,MAAO,CAAE,KAAMA,EAAO,KAAM,UAAWA,EAAO,SAAU,CAC1D,CAAC,CACH,CAEA,MAAM,MAAMA,EAAsC,CAChD,KAAK,OAAO,aAAa,EACzB,MAAM,KAAK,OAAO,SAAS,OAAQ,mBAAoB,CACrD,KAAM,CAAE,KAAMA,EAAO,IAAK,CAC5B,CAAC,CACH,CAEA,MAAM,OAAOA,EAAuC,CAClD,KAAK,OAAO,aAAa,EACzB,MAAM,KAAK,OAAO,SAAS,SAAU,oBAAqB,CACxD,MAAO,CAAE,KAAMA,EAAO,KAAM,UAAWA,EAAO,SAAU,CAC1D,CAAC,CACH,CAEA,MAAM,OAAOA,EAAuC,CAClD,KAAK,OAAO,aAAa,EACzB,MAAM,KAAK,OAAO,SAAS,OAAQ,oBAAqB,CACtD,KAAM,CAAE,SAAUA,EAAO,SAAU,SAAUA,EAAO,QAAS,CAC/D,CAAC,CACH,CAEA,MAAM,KAAKA,EAAqC,CAC9C,KAAK,OAAO,aAAa,EACzB,MAAM,KAAK,OAAO,SAAS,OAAQ,kBAAmB,CACpD,KAAM,CAAE,SAAUA,EAAO,SAAU,SAAUA,EAAO,QAAS,CAC/D,CAAC,CACH,CAEA,MAAM,QAAQA,EAAwC,CACpD,KAAK,OAAO,aAAa,EACzB,MAAM,KAAK,OAAO,SAAS,OAAQ,qBAAsB,CACvD,KAAM,CACJ,YAAaA,EAAO,YACpB,UAAWA,EAAO,SACpB,CACF,CAAC,CACH,CAEA,MAAM,SAASA,EAAuD,CACpE,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,MAAO,sBAAuB,CACxD,MAAO,CAAE,KAAMA,EAAO,IAAK,CAC7B,CAAC,CACH,CAEA,MAAM,MAAMA,EAAsC,CAChD,KAAK,OAAO,aAAa,EACzB,MAAM,KAAK,OAAO,SAAS,OAAQ,mBAAoB,CACrD,KAAM,CAAE,KAAMA,EAAO,KAAM,KAAMA,EAAO,IAAK,CAC/C,CAAC,CACH,CAEA,MAAM,MAAMA,EAAsC,CAChD,KAAK,OAAO,aAAa,EACzB,MAAM,KAAK,OAAO,SAAS,OAAQ,mBAAoB,CACrD,KAAM,CACJ,KAAMA,EAAO,KACb,QAASA,EAAO,QAChB,WAAYA,EAAO,UACrB,CACF,CAAC,CACH,CAEA,MAAM,OAAOA,EAAuC,CAClD,KAAK,OAAO,aAAa,EACzB,MAAM,KAAK,OAAO,SAAS,OAAQ,oBAAqB,CACtD,KAAM,CACJ,KAAMA,EAAO,KACb,QAASA,EAAO,QAChB,WAAYA,EAAO,UACrB,CACF,CAAC,CACH,CACF,EC1IO,IAAMC,EAAN,KAAkB,CACvB,YAAoBC,EAAoB,CAApB,YAAAA,CAAqB,CAArB,OAEpB,MAAM,QAAQC,EAA0C,CACtD,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,OAAQ,cAAe,CACjD,KAAM,CACJ,KAAMA,EAAO,KACb,WAAYA,EAAO,WACnB,YAAaA,EAAO,YACpB,KAAMA,EAAO,IACf,CACF,CAAC,CACH,CACF,ECRO,IAAMC,EAAN,KAAqB,CAC1B,YAAoBC,EAAoB,CAApB,YAAAA,CAAqB,CAArB,OAEpB,MAAM,OAAOC,EAAgD,CAC3D,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,OAAQ,yBAA0B,CAC5D,KAAM,CACJ,KAAMA,EAAO,KACb,KAAMA,EAAO,KACb,gBAAiBA,EAAO,gBACxB,KAAMA,EAAO,KACb,YAAaA,EAAO,WACtB,CACF,CAAC,CACH,CAEA,MAAM,KAAKA,EAA0D,CACnE,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,MAAO,0BAA2B,CAC5D,MAAO,CAAE,MAAOA,GAAQ,MAAO,OAAQA,GAAQ,MAAO,CACxD,CAAC,CACH,CAEA,MAAM,IAAIA,EAA0C,CAClD,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SACjB,MACA,0BAA0BA,EAAO,EAAE,EACrC,CACF,CAEA,MAAM,OAAOA,EAAgD,CAC3D,KAAK,OAAO,aAAa,EACzB,GAAM,CAAE,GAAAC,EAAI,GAAGC,CAAK,EAAIF,EACxB,OAAO,KAAK,OAAO,SAAS,QAAS,0BAA0BC,CAAE,GAAI,CACnE,KAAAC,CACF,CAAC,CACH,CAEA,MAAM,OAAOF,EAAuC,CAClD,KAAK,OAAO,aAAa,EACzB,MAAM,KAAK,OAAO,SAAS,SAAU,0BAA0BA,EAAO,EAAE,EAAE,CAC5E,CAEA,MAAM,MAAMA,EAAuC,CACjD,KAAK,OAAO,aAAa,EACzB,MAAM,KAAK,OAAO,SAChB,OACA,0BAA0BA,EAAO,EAAE,QACrC,CACF,CAEA,MAAM,OAAOA,EAAuC,CAClD,KAAK,OAAO,aAAa,EACzB,MAAM,KAAK,OAAO,SAChB,OACA,0BAA0BA,EAAO,EAAE,SACrC,CACF,CACF,EC1DO,IAAMG,EAAN,KAAsB,CAC3B,YAAoBC,EAAoB,CAApB,YAAAA,CAAqB,CAArB,OAEpB,MAAM,KAAKC,EAA0D,CACnE,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,OAAQ,uBAAwB,CAC1D,KAAM,CACJ,KAAMA,EAAO,KACb,QAASA,EAAO,QAChB,WAAYA,EAAO,WACnB,UAAWA,EAAO,UAClB,YAAaA,EAAO,WACtB,CACF,CAAC,CACH,CAEA,MAAM,cACJA,EACgC,CAChC,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,OAAQ,yBAA0B,CAC5D,KAAM,CACJ,KAAMA,EAAO,KACb,aAAcA,EAAO,aACrB,YAAaA,EAAO,YACpB,MAAOA,EAAO,MACd,gBAAiBA,EAAO,gBACxB,UAAWA,EAAO,SACpB,CACF,CAAC,CACH,CAEA,MAAM,SACJA,EACkC,CAClC,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,OAAQ,2BAA4B,CAC9D,KAAM,CACJ,KAAMA,EAAO,KACb,QAASA,EAAO,QAChB,MAAOA,EAAO,MACd,UAAWA,EAAO,SACpB,CACF,CAAC,CACH,CACF,ECpDO,IAAMC,EAAN,KAAsB,CAC3B,YAAoBC,EAAoB,CAApB,YAAAA,CAAqB,CAArB,OAEpB,MAAM,OAAOC,EAA4C,CACvD,KAAK,OAAO,aAAa,EACzB,MAAM,KAAK,OAAO,SAAS,OAAQ,kBAAmB,CACpD,KAAM,CAAE,KAAMA,EAAO,KAAM,MAAOA,EAAO,KAAM,CACjD,CAAC,CACH,CAEA,MAAM,MAA+C,CACnD,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,MAAO,iBAAiB,CAGtD,CAEA,MAAM,IAAIA,EAA2C,CACnD,KAAK,OAAO,aAAa,EACzB,IAAMC,EAAU,mBAAmBD,EAAO,IAAI,EAC9C,OAAO,KAAK,OAAO,SACjB,MACA,mBAAmBC,CAAO,EAC5B,CACF,CAEA,MAAM,OAAOD,EAAwD,CACnE,KAAK,OAAO,aAAa,EACzB,IAAMC,EAAU,mBAAmBD,EAAO,IAAI,EAC9C,MAAM,KAAK,OAAO,SAAS,MAAO,mBAAmBC,CAAO,GAAI,CAC9D,KAAM,CAAE,MAAOD,EAAO,KAAM,CAC9B,CAAC,CACH,CAEA,MAAM,OAAOA,EAAyC,CACpD,KAAK,OAAO,aAAa,EACzB,IAAMC,EAAU,mBAAmBD,EAAO,IAAI,EAC9C,MAAM,KAAK,OAAO,SAAS,SAAU,mBAAmBC,CAAO,EAAE,CACnE,CACF,ECnCO,IAAMC,EAAN,KAAsB,CAC3B,YAAoBC,EAAoB,CAApB,YAAAA,CAAqB,CAArB,OAEpB,MAAM,IAAIC,EAA8C,CACtD,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,MAAO,kBAAmB,CACpD,MAAO,CAAE,KAAMA,EAAO,IAAK,CAC7B,CAAC,CACH,CAEA,MAAM,YAA0C,CAC9C,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SACjB,MACA,wBACF,CACF,CAEA,MAAM,iBAAiBA,EAEe,CACpC,KAAK,OAAO,aAAa,EACzB,IAAMC,EAAU,mBAAmBD,EAAO,SAAS,EACnD,OAAO,KAAK,OAAO,SACjB,MACA,0BAA0BC,CAAO,UACnC,CACF,CACF,EChCO,IAAMC,EAAN,KAAuB,CAC5B,YAAoBC,EAAoB,CAApB,YAAAA,CAAqB,CAArB,OAEpB,MAAM,OAAOC,EAAgD,CAC3D,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,OAAQ,2BAA4B,CAC9D,KAAM,CACJ,SAAUA,EAAO,SACjB,KAAMA,EAAO,KACb,QAASA,EAAO,QAChB,UAAWA,EAAO,SACpB,CACF,CAAC,CACH,CAEA,MAAM,IAAIA,EAAkD,CAC1D,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,OAAQ,+BAAgC,CAClE,KAAM,CAAE,WAAYA,EAAO,UAAW,CACxC,CAAC,CACH,CAEA,MAAM,MAAMA,EAAkD,CAC5D,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,OAAQ,iCAAkC,CACpE,KAAM,CAAE,WAAYA,EAAO,UAAW,CACxC,CAAC,CACH,CACF,EC5BO,IAAMC,EAAN,KAAoB,CACzB,YAAoBC,EAAoB,CAApB,YAAAA,CAAqB,CAArB,OAEpB,MAAM,KAAKC,EAAqC,CAC9C,KAAK,OAAO,aAAa,EACzB,MAAM,KAAK,OAAO,SAAS,OAAQ,gBAAiB,CAClD,KAAM,CACJ,MAAOA,EAAO,MACd,QAASA,EAAO,OAClB,CACF,CAAC,CACH,CACF,ECZO,IAAMC,EAAN,KAAyB,CAC9B,YAAoBC,EAAoB,CAApB,YAAAA,CAAqB,CAArB,OAEpB,MAAM,QAAQC,EAAgD,CAC5D,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,MAAO,qBAAsB,CACvD,MAAO,CACL,IAAKA,EAAO,IACZ,SAAUA,EAAO,SACjB,MAAOA,EAAO,KAChB,CACF,CAAC,CACH,CACF,ECbO,IAAMC,EAAN,KAAmB,CACxB,YAAoBC,EAAoB,CAApB,YAAAA,CAAqB,CAArB,OAEpB,MAAM,IAA2B,CAC/B,YAAK,OAAO,aAAa,EAClB,KAAK,OAAO,SAAS,MAAO,YAAY,CACjD,CACF,ECGA,IAAMC,EAAmB,8BASZC,EAAN,KAAiB,CACb,QACA,OAED,IACA,KACA,QACA,SACA,SACA,KACA,UACA,OACA,YACA,MAER,YAAYC,EAA0B,CACpC,KAAK,QAAUA,EAAO,SAAWF,EACjC,KAAK,OAASE,EAAO,MACvB,CAEA,IAAI,IAAiB,CACnB,OAAQ,KAAK,MAAQ,IAAIC,EAAW,IAAI,CAC1C,CACA,IAAI,KAAmB,CACrB,OAAQ,KAAK,OAAS,IAAIC,EAAY,IAAI,CAC5C,CACA,IAAI,QAAyB,CAC3B,OAAQ,KAAK,UAAY,IAAIC,EAAe,IAAI,CAClD,CACA,IAAI,SAA2B,CAC7B,OAAQ,KAAK,WAAa,IAAIC,EAAgB,IAAI,CACpD,CACA,IAAI,SAA2B,CAC7B,OAAQ,KAAK,WAAa,IAAIC,EAAgB,IAAI,CACpD,CACA,IAAI,KAAuB,CACzB,OAAQ,KAAK,OAAS,IAAIC,EAAgB,IAAI,CAChD,CACA,IAAI,UAA6B,CAC/B,OAAQ,KAAK,YAAc,IAAIC,EAAiB,IAAI,CACtD,CACA,IAAI,OAAuB,CACzB,OAAQ,KAAK,SAAW,IAAIC,EAAc,IAAI,CAChD,CACA,IAAI,YAAiC,CACnC,OAAQ,KAAK,cAAgB,IAAIC,EAAmB,IAAI,CAC1D,CACA,IAAI,MAAqB,CACvB,OAAQ,KAAK,QAAU,IAAIC,EAAa,IAAI,CAC9C,CAEA,cAAqB,CACnB,GAAI,CAAC,KAAK,OACR,MAAM,IAAIC,EACR,kBACA,0EACA,GACF,CAEJ,CAEA,MAAM,SACJC,EACAC,EACAC,EACkB,CAClB,IAAIC,EAAM,GAAG,KAAK,OAAO,GAAGF,CAAI,GAEhC,GAAIC,GAAS,MAAO,CAClB,IAAME,EAAS,IAAI,gBACnB,OAAW,CAACC,EAAKC,CAAK,IAAK,OAAO,QAAQJ,EAAQ,KAAK,EAC1BI,GAAU,MACnCF,EAAO,IAAIC,EAAK,OAAOC,CAAK,CAAC,EAGjC,IAAMC,EAAKH,EAAO,SAAS,EACvBG,IACFJ,GAAO,IAAII,CAAE,GAEjB,CAEA,IAAMC,EAAkC,CAAC,EACrC,KAAK,SACPA,EAAQ,gBAAgB,EAAI,KAAK,QAGnC,IAAIC,EACAP,GAAS,UAAY,QACvBM,EAAQ,cAAc,EAAI,2BAC1BC,EAAYP,EAAQ,SACXA,GAAS,OAAS,SAC3BM,EAAQ,cAAc,EAAI,mBAC1BC,EAAY,KAAK,UAAUP,EAAQ,IAAI,GAGzC,IAAIQ,EACJ,GAAI,CACFA,EAAW,MAAM,MAAMP,EAAK,CAC1B,OAAAH,EACA,QAAAQ,EACA,KAAMC,CACR,CAAC,CACH,OAASE,EAAK,CACZ,MAAM,IAAIZ,EACR,gBACAY,aAAe,MAAQA,EAAI,QAAU,yBACrC,CACF,CACF,CAEA,GAAI,CAACD,EAAS,GAAI,CAEhB,IAAME,EAAW,MAAMF,EAAS,KAAK,EAAE,MAAM,IAAM,EAAE,EAErD,IADoBA,EAAS,QAAQ,IAAI,cAAc,GAAK,IAC5C,SAAS,kBAAkB,GAAKE,EAC9C,GAAI,CACF,IAAMC,EAAO,KAAK,MAAMD,CAAQ,EAGhC,GAAIC,EAAK,MACP,MAAM,IAAId,EACRc,EAAK,MAAM,MAAQ,UACnBA,EAAK,MAAM,SAAW,QAAQH,EAAS,MAAM,GAC7CA,EAAS,MACX,CAEJ,OAASI,EAAG,CACV,GAAIA,aAAaf,EAAW,MAAMe,CAEpC,CAEF,MAAM,IAAIf,EACR,UACA,QAAQW,EAAS,MAAM,KAAKE,EAAS,MAAM,EAAG,GAAG,CAAC,GAClDF,EAAS,MACX,CACF,CAGA,GAAIA,EAAS,SAAW,IACtB,OAGF,IAAMK,EAAcL,EAAS,QAAQ,IAAI,cAAc,GAAK,GAC5D,OACEK,EAAY,SAAS,0BAA0B,GAC/CA,EAAY,SAAS,QAAQ,EAEtBL,EAAS,YAAY,EAGvBA,EAAS,KAAK,CACvB,CACF,EC5KO,IAAMM,EAC0B","names":["browser_exports","__export","AlvaClient","AlvaError","VERSION","AlvaError","code","message","status","FsResource","client","params","RunResource","client","params","DeployResource","client","params","id","body","ReleaseResource","client","params","SecretsResource","client","params","encoded","SdkDocsResource","client","params","encoded","CommentsResource","client","params","RemixResource","client","params","ScreenshotResource","client","params","UserResource","client","DEFAULT_BASE_URL","AlvaClient","config","FsResource","RunResource","DeployResource","ReleaseResource","SecretsResource","SdkDocsResource","CommentsResource","RemixResource","ScreenshotResource","UserResource","AlvaError","method","path","options","url","params","key","value","qs","headers","fetchBody","response","err","bodyText","data","e","contentType","VERSION"]}
1
+ {"version":3,"sources":["../src/browser.ts","../src/error.ts","../src/resources/fs.ts","../src/resources/run.ts","../src/resources/deploy.ts","../src/resources/release.ts","../src/resources/secrets.ts","../src/resources/sdkDocs.ts","../src/resources/comments.ts","../src/resources/remix.ts","../src/resources/screenshot.ts","../src/resources/user.ts","../src/resources/trading.ts","../src/client.ts","../src/index.ts"],"sourcesContent":["export * from './index.js';\n","export class AlvaError extends Error {\n readonly code: string;\n readonly status: number;\n\n constructor(code: string, message: string, status: number) {\n super(message);\n this.name = 'AlvaError';\n this.code = code;\n this.status = status;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type {\n FsReadParams,\n FsWriteParams,\n FsRawWriteParams,\n FsWriteResponse,\n FsStat,\n FsReaddirParams,\n FsReaddirResponse,\n FsMkdirParams,\n FsRemoveParams,\n FsRenameParams,\n FsCopyParams,\n FsSymlinkParams,\n FsReadlinkParams,\n FsChmodParams,\n FsGrantParams,\n FsRevokeParams,\n} from '../types.js';\n\nexport class FsResource {\n constructor(private client: AlvaClient) {}\n\n /** Returns `ArrayBuffer` for binary files, or parsed JSON for time-series virtual paths. */\n async read(params: FsReadParams): Promise<ArrayBuffer | unknown> {\n return this.client._request('GET', '/api/v1/fs/read', {\n query: { path: params.path, offset: params.offset, size: params.size },\n });\n }\n\n /** Write file using JSON body (Mode 2). For text content. */\n async write(params: FsWriteParams): Promise<FsWriteResponse> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/fs/write', {\n body: {\n path: params.path,\n data: params.data,\n mkdir_parents: params.mkdir_parents,\n },\n }) as Promise<FsWriteResponse>;\n }\n\n /** Write file using raw body (Mode 1). Supports binary data. Path and options are query params. */\n async rawWrite(params: FsRawWriteParams): Promise<FsWriteResponse> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/fs/write', {\n query: {\n path: params.path,\n mkdir_parents: params.mkdir_parents,\n },\n rawBody: params.body,\n }) as Promise<FsWriteResponse>;\n }\n\n async stat(params: { path: string }): Promise<FsStat> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/fs/stat', {\n query: { path: params.path },\n }) as Promise<FsStat>;\n }\n\n async readdir(params: FsReaddirParams): Promise<FsReaddirResponse> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/fs/readdir', {\n query: { path: params.path, recursive: params.recursive },\n }) as Promise<FsReaddirResponse>;\n }\n\n async mkdir(params: FsMkdirParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/fs/mkdir', {\n body: { path: params.path },\n });\n }\n\n async remove(params: FsRemoveParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('DELETE', '/api/v1/fs/remove', {\n query: { path: params.path, recursive: params.recursive },\n });\n }\n\n async rename(params: FsRenameParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/fs/rename', {\n body: { old_path: params.old_path, new_path: params.new_path },\n });\n }\n\n async copy(params: FsCopyParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/fs/copy', {\n body: { src_path: params.src_path, dst_path: params.dst_path },\n });\n }\n\n async symlink(params: FsSymlinkParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/fs/symlink', {\n body: {\n target_path: params.target_path,\n link_path: params.link_path,\n },\n });\n }\n\n async readlink(params: FsReadlinkParams): Promise<{ target: string }> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/fs/readlink', {\n query: { path: params.path },\n }) as Promise<{ target: string }>;\n }\n\n async chmod(params: FsChmodParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/fs/chmod', {\n body: { path: params.path, mode: params.mode },\n });\n }\n\n async grant(params: FsGrantParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/fs/grant', {\n body: {\n path: params.path,\n subject: params.subject,\n permission: params.permission,\n },\n });\n }\n\n async revoke(params: FsRevokeParams): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/fs/revoke', {\n body: {\n path: params.path,\n subject: params.subject,\n permission: params.permission,\n },\n });\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type { RunRequest, RunResponse } from '../types.js';\n\nexport class RunResource {\n constructor(private client: AlvaClient) {}\n\n async execute(params: RunRequest): Promise<RunResponse> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/run', {\n body: {\n code: params.code,\n entry_path: params.entry_path,\n working_dir: params.working_dir,\n args: params.args,\n },\n }) as Promise<RunResponse>;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type {\n CronjobCreateRequest,\n Cronjob,\n CronjobListParams,\n CronjobListResponse,\n CronjobUpdateRequest,\n} from '../types.js';\n\nexport class DeployResource {\n constructor(private client: AlvaClient) {}\n\n async create(params: CronjobCreateRequest): Promise<Cronjob> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/deploy/cronjob', {\n body: {\n name: params.name,\n path: params.path,\n cron_expression: params.cron_expression,\n args: params.args,\n push_notify: params.push_notify,\n },\n }) as Promise<Cronjob>;\n }\n\n async list(params?: CronjobListParams): Promise<CronjobListResponse> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/deploy/cronjobs', {\n query: { limit: params?.limit, cursor: params?.cursor },\n }) as Promise<CronjobListResponse>;\n }\n\n async get(params: { id: number }): Promise<Cronjob> {\n this.client._requireAuth();\n return this.client._request(\n 'GET',\n `/api/v1/deploy/cronjob/${params.id}`\n ) as Promise<Cronjob>;\n }\n\n async update(params: CronjobUpdateRequest): Promise<Cronjob> {\n this.client._requireAuth();\n const { id, ...body } = params;\n return this.client._request('PATCH', `/api/v1/deploy/cronjob/${id}`, {\n body,\n }) as Promise<Cronjob>;\n }\n\n async delete(params: { id: number }): Promise<void> {\n this.client._requireAuth();\n await this.client._request('DELETE', `/api/v1/deploy/cronjob/${params.id}`);\n }\n\n async pause(params: { id: number }): Promise<void> {\n this.client._requireAuth();\n await this.client._request(\n 'POST',\n `/api/v1/deploy/cronjob/${params.id}/pause`\n );\n }\n\n async resume(params: { id: number }): Promise<void> {\n this.client._requireAuth();\n await this.client._request(\n 'POST',\n `/api/v1/deploy/cronjob/${params.id}/resume`\n );\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type {\n FeedReleaseRequest,\n FeedReleaseResponse,\n PlaybookDraftRequest,\n PlaybookDraftResponse,\n PlaybookReleaseRequest,\n PlaybookReleaseResponse,\n} from '../types.js';\n\nexport class ReleaseResource {\n constructor(private client: AlvaClient) {}\n\n async feed(params: FeedReleaseRequest): Promise<FeedReleaseResponse> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/release/feed', {\n body: {\n name: params.name,\n version: params.version,\n cronjob_id: params.cronjob_id,\n view_json: params.view_json,\n description: params.description,\n },\n }) as Promise<FeedReleaseResponse>;\n }\n\n async playbookDraft(\n params: PlaybookDraftRequest\n ): Promise<PlaybookDraftResponse> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/draft/playbook', {\n body: {\n name: params.name,\n display_name: params.display_name,\n description: params.description,\n feeds: params.feeds,\n trading_symbols: params.trading_symbols,\n changelog: params.changelog,\n },\n }) as Promise<PlaybookDraftResponse>;\n }\n\n async playbook(\n params: PlaybookReleaseRequest\n ): Promise<PlaybookReleaseResponse> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/release/playbook', {\n body: {\n name: params.name,\n version: params.version,\n feeds: params.feeds,\n changelog: params.changelog,\n },\n }) as Promise<PlaybookReleaseResponse>;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type { CreateSecretRequest, Secret, SecretMetadata } from '../types.js';\n\nexport class SecretsResource {\n constructor(private client: AlvaClient) {}\n\n async create(params: CreateSecretRequest): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/secrets', {\n body: { name: params.name, value: params.value },\n });\n }\n\n async list(): Promise<{ secrets: SecretMetadata[] }> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/secrets') as Promise<{\n secrets: SecretMetadata[];\n }>;\n }\n\n async get(params: { name: string }): Promise<Secret> {\n this.client._requireAuth();\n const encoded = encodeURIComponent(params.name);\n return this.client._request(\n 'GET',\n `/api/v1/secrets/${encoded}`\n ) as Promise<Secret>;\n }\n\n async update(params: { name: string; value: string }): Promise<void> {\n this.client._requireAuth();\n const encoded = encodeURIComponent(params.name);\n await this.client._request('PUT', `/api/v1/secrets/${encoded}`, {\n body: { value: params.value },\n });\n }\n\n async delete(params: { name: string }): Promise<void> {\n this.client._requireAuth();\n const encoded = encodeURIComponent(params.name);\n await this.client._request('DELETE', `/api/v1/secrets/${encoded}`);\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type {\n ModuleDoc,\n PartitionsResponse,\n PartitionSummaryResponse,\n} from '../types.js';\n\nexport class SdkDocsResource {\n constructor(private client: AlvaClient) {}\n\n async doc(params: { name: string }): Promise<ModuleDoc> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/sdk/doc', {\n query: { name: params.name },\n }) as Promise<ModuleDoc>;\n }\n\n async partitions(): Promise<PartitionsResponse> {\n this.client._requireAuth();\n return this.client._request(\n 'GET',\n '/api/v1/sdk/partitions'\n ) as Promise<PartitionsResponse>;\n }\n\n async partitionSummary(params: {\n partition: string;\n }): Promise<PartitionSummaryResponse> {\n this.client._requireAuth();\n const encoded = encodeURIComponent(params.partition);\n return this.client._request(\n 'GET',\n `/api/v1/sdk/partitions/${encoded}/summary`\n ) as Promise<PartitionSummaryResponse>;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type { CreateCommentRequest, Comment } from '../types.js';\n\nexport class CommentsResource {\n constructor(private client: AlvaClient) {}\n\n async create(params: CreateCommentRequest): Promise<Comment> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/playbook/comment', {\n body: {\n username: params.username,\n name: params.name,\n content: params.content,\n parent_id: params.parent_id,\n },\n }) as Promise<Comment>;\n }\n\n async pin(params: { comment_id: number }): Promise<Comment> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/playbook/comment/pin', {\n body: { comment_id: params.comment_id },\n }) as Promise<Comment>;\n }\n\n async unpin(params: { comment_id: number }): Promise<Comment> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/playbook/comment/unpin', {\n body: { comment_id: params.comment_id },\n }) as Promise<Comment>;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type { RemixRequest } from '../types.js';\n\nexport class RemixResource {\n constructor(private client: AlvaClient) {}\n\n async save(params: RemixRequest): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/remix', {\n body: {\n child: params.child,\n parents: params.parents,\n },\n });\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type { ScreenshotParams } from '../types.js';\n\nexport class ScreenshotResource {\n constructor(private client: AlvaClient) {}\n\n async capture(params: ScreenshotParams): Promise<ArrayBuffer> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/screenshot', {\n query: {\n url: params.url,\n selector: params.selector,\n xpath: params.xpath,\n },\n }) as Promise<ArrayBuffer>;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type { UserProfile } from '../types.js';\n\nexport class UserResource {\n constructor(private client: AlvaClient) {}\n\n async me(): Promise<UserProfile> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/me') as Promise<UserProfile>;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type {\n TradingAccount,\n TradingPortfolio,\n TradingOrder,\n TradingSubscription,\n EquityPoint,\n TradingRiskRule,\n TradingRiskRuleInput,\n ExecuteSignalResult,\n} from '../types.js';\n\nexport class TradingResource {\n constructor(private client: AlvaClient) {}\n\n async accounts(): Promise<TradingAccount[]> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/trading/accounts') as Promise<\n TradingAccount[]\n >;\n }\n\n async portfolio(accountId: string): Promise<TradingPortfolio> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/trading/portfolio', {\n query: { accountId },\n }) as Promise<TradingPortfolio>;\n }\n\n async orders(params: {\n accountId: string;\n source?: string;\n since?: number;\n limit?: number;\n }): Promise<TradingOrder[]> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/trading/orders', {\n query: {\n accountId: params.accountId,\n source: params.source,\n since: params.since,\n limit: params.limit,\n },\n }) as Promise<TradingOrder[]>;\n }\n\n async subscriptions(accountId: string): Promise<TradingSubscription[]> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/trading/subscriptions', {\n query: { accountId },\n }) as Promise<TradingSubscription[]>;\n }\n\n async equityHistory(params: {\n accountId: string;\n timeframe?: string;\n sinceMs?: number;\n untilMs?: number;\n }): Promise<EquityPoint[]> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/trading/equity-history', {\n query: {\n accountId: params.accountId,\n timeframe: params.timeframe,\n sinceMs: params.sinceMs,\n untilMs: params.untilMs,\n },\n }) as Promise<EquityPoint[]>;\n }\n\n async riskRules(): Promise<TradingRiskRule> {\n this.client._requireAuth();\n return this.client._request(\n 'GET',\n '/api/v1/trading/risk-rules'\n ) as Promise<TradingRiskRule>;\n }\n\n async subscribe(params: {\n accountId: string;\n sourceUsername: string;\n sourceFeed: string;\n playbookId: string;\n playbookVersion: string;\n executeLatest?: boolean;\n }): Promise<TradingSubscription> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/trading/subscribe', {\n body: params,\n }) as Promise<TradingSubscription>;\n }\n\n async unsubscribe(\n subscriptionId: string\n ): Promise<{ unsubscribedId: string }> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/trading/unsubscribe', {\n body: { subscriptionId },\n }) as Promise<{ unsubscribedId: string }>;\n }\n\n async execute(params: {\n accountId: string;\n signalJson: string;\n dryRun: boolean;\n sourceUsername?: string;\n sourceFeed?: string;\n }): Promise<ExecuteSignalResult> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/trading/execute', {\n body: params,\n }) as Promise<ExecuteSignalResult>;\n }\n\n async updateRiskRules(rules: TradingRiskRuleInput): Promise<TradingRiskRule> {\n this.client._requireAuth();\n return this.client._request('PUT', '/api/v1/trading/risk-rules', {\n body: rules,\n }) as Promise<TradingRiskRule>;\n }\n}\n","import { AlvaError } from './error.js';\nimport type { AlvaClientConfig } from './types.js';\nimport { FsResource } from './resources/fs.js';\nimport { RunResource } from './resources/run.js';\nimport { DeployResource } from './resources/deploy.js';\nimport { ReleaseResource } from './resources/release.js';\nimport { SecretsResource } from './resources/secrets.js';\nimport { SdkDocsResource } from './resources/sdkDocs.js';\nimport { CommentsResource } from './resources/comments.js';\nimport { RemixResource } from './resources/remix.js';\nimport { ScreenshotResource } from './resources/screenshot.js';\nimport { UserResource } from './resources/user.js';\nimport { TradingResource } from './resources/trading.js';\n\nconst DEFAULT_BASE_URL = 'https://api-llm.prd.alva.ai';\n\ninterface RequestOptions {\n query?: Record<string, unknown>;\n body?: unknown;\n /** Send raw body with application/octet-stream content type (for binary writes). */\n rawBody?: BodyInit;\n}\n\nexport class AlvaClient {\n readonly baseUrl: string;\n readonly token?: string;\n readonly apiKey?: string;\n\n private _fs?: FsResource;\n private _run?: RunResource;\n private _deploy?: DeployResource;\n private _release?: ReleaseResource;\n private _secrets?: SecretsResource;\n private _sdk?: SdkDocsResource;\n private _comments?: CommentsResource;\n private _remix?: RemixResource;\n private _screenshot?: ScreenshotResource;\n private _user?: UserResource;\n private _trading?: TradingResource;\n\n constructor(config: AlvaClientConfig) {\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n this.token = config.token;\n this.apiKey = config.apiKey;\n }\n\n get fs(): FsResource {\n return (this._fs ??= new FsResource(this));\n }\n get run(): RunResource {\n return (this._run ??= new RunResource(this));\n }\n get deploy(): DeployResource {\n return (this._deploy ??= new DeployResource(this));\n }\n get release(): ReleaseResource {\n return (this._release ??= new ReleaseResource(this));\n }\n get secrets(): SecretsResource {\n return (this._secrets ??= new SecretsResource(this));\n }\n get sdk(): SdkDocsResource {\n return (this._sdk ??= new SdkDocsResource(this));\n }\n get comments(): CommentsResource {\n return (this._comments ??= new CommentsResource(this));\n }\n get remix(): RemixResource {\n return (this._remix ??= new RemixResource(this));\n }\n get screenshot(): ScreenshotResource {\n return (this._screenshot ??= new ScreenshotResource(this));\n }\n get user(): UserResource {\n return (this._user ??= new UserResource(this));\n }\n get trading(): TradingResource {\n return (this._trading ??= new TradingResource(this));\n }\n\n _requireAuth(): void {\n if (!this.token && !this.apiKey) {\n throw new AlvaError(\n 'UNAUTHENTICATED',\n 'Authentication is required. Pass token or apiKey in the constructor.',\n 401\n );\n }\n }\n\n async _request(\n method: string,\n path: string,\n options?: RequestOptions\n ): Promise<unknown> {\n let url = `${this.baseUrl}${path}`;\n\n if (options?.query) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined && value !== null) {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n url += `?${qs}`;\n }\n }\n\n const headers: Record<string, string> = {};\n if (this.token) {\n headers.Authorization = `${this.token}`;\n } else if (this.apiKey) {\n headers['X-Alva-Api-Key'] = this.apiKey;\n }\n\n let fetchBody: BodyInit | undefined;\n if (options?.rawBody !== undefined) {\n headers['Content-Type'] = 'application/octet-stream';\n fetchBody = options.rawBody;\n } else if (options?.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n fetchBody = JSON.stringify(options.body);\n }\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers,\n body: fetchBody,\n });\n } catch (err) {\n throw new AlvaError(\n 'NETWORK_ERROR',\n err instanceof Error ? err.message : 'Network request failed',\n 0\n );\n }\n\n if (!response.ok) {\n // Read body as text first to avoid double consumption\n const bodyText = await response.text().catch(() => '');\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json') && bodyText) {\n try {\n const data = JSON.parse(bodyText) as {\n error?: { code?: string; message?: string };\n };\n if (data.error) {\n throw new AlvaError(\n data.error.code ?? 'UNKNOWN',\n data.error.message ?? `HTTP ${response.status}`,\n response.status\n );\n }\n } catch (e) {\n if (e instanceof AlvaError) throw e;\n // JSON parse failed or no error envelope — fall through\n }\n }\n throw new AlvaError(\n 'UNKNOWN',\n `HTTP ${response.status}: ${bodyText.slice(0, 200)}`,\n response.status\n );\n }\n\n // Handle 204 No Content and empty responses\n if (response.status === 204) {\n return undefined;\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n if (\n contentType.includes('application/octet-stream') ||\n contentType.includes('image/')\n ) {\n return response.arrayBuffer();\n }\n\n return response.json();\n }\n}\n","declare const __VERSION__: string;\n\n/** SDK version, injected at build time from package.json. */\nexport const VERSION: string =\n typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'dev';\n\nexport { AlvaClient } from './client.js';\nexport { AlvaError } from './error.js';\nexport type {\n AlvaClientConfig,\n FsReadParams,\n FsWriteParams,\n FsRawWriteParams,\n FsWriteResponse,\n FsStat,\n FsReaddirParams,\n FsEntry,\n FsReaddirResponse,\n FsMkdirParams,\n FsRemoveParams,\n FsRenameParams,\n FsCopyParams,\n FsSymlinkParams,\n FsReadlinkParams,\n FsChmodParams,\n FsGrantParams,\n FsRevokeParams,\n TradingAccount,\n AccountSubscription,\n TradingSubscription,\n TradingOrder,\n PortfolioAsset,\n TradingPortfolio,\n EquityPoint,\n RiskRuleEntry,\n TradingRiskRule,\n TradingRiskRuleInput,\n ExecuteSignalOrder,\n ExecuteSignalResult,\n} from './types.js';\n"],"mappings":"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","names":["browser_exports","__export","AlvaClient","AlvaError","VERSION","AlvaError","code","message","status","FsResource","client","params","RunResource","client","params","DeployResource","client","params","id","body","ReleaseResource","client","params","SecretsResource","client","params","encoded","SdkDocsResource","client","params","encoded","CommentsResource","client","params","RemixResource","client","params","ScreenshotResource","client","params","UserResource","client","TradingResource","client","accountId","params","subscriptionId","rules","DEFAULT_BASE_URL","AlvaClient","config","FsResource","RunResource","DeployResource","ReleaseResource","SecretsResource","SdkDocsResource","CommentsResource","RemixResource","ScreenshotResource","UserResource","TradingResource","AlvaError","method","path","options","url","params","key","value","qs","headers","fetchBody","response","err","bodyText","data","e","contentType","VERSION"]}
package/dist/cli.js CHANGED
@@ -391,10 +391,88 @@ var UserResource = class {
391
391
  }
392
392
  };
393
393
 
394
+ // src/resources/trading.ts
395
+ var TradingResource = class {
396
+ constructor(client) {
397
+ this.client = client;
398
+ }
399
+ client;
400
+ async accounts() {
401
+ this.client._requireAuth();
402
+ return this.client._request("GET", "/api/v1/trading/accounts");
403
+ }
404
+ async portfolio(accountId) {
405
+ this.client._requireAuth();
406
+ return this.client._request("GET", "/api/v1/trading/portfolio", {
407
+ query: { accountId }
408
+ });
409
+ }
410
+ async orders(params) {
411
+ this.client._requireAuth();
412
+ return this.client._request("GET", "/api/v1/trading/orders", {
413
+ query: {
414
+ accountId: params.accountId,
415
+ source: params.source,
416
+ since: params.since,
417
+ limit: params.limit
418
+ }
419
+ });
420
+ }
421
+ async subscriptions(accountId) {
422
+ this.client._requireAuth();
423
+ return this.client._request("GET", "/api/v1/trading/subscriptions", {
424
+ query: { accountId }
425
+ });
426
+ }
427
+ async equityHistory(params) {
428
+ this.client._requireAuth();
429
+ return this.client._request("GET", "/api/v1/trading/equity-history", {
430
+ query: {
431
+ accountId: params.accountId,
432
+ timeframe: params.timeframe,
433
+ sinceMs: params.sinceMs,
434
+ untilMs: params.untilMs
435
+ }
436
+ });
437
+ }
438
+ async riskRules() {
439
+ this.client._requireAuth();
440
+ return this.client._request(
441
+ "GET",
442
+ "/api/v1/trading/risk-rules"
443
+ );
444
+ }
445
+ async subscribe(params) {
446
+ this.client._requireAuth();
447
+ return this.client._request("POST", "/api/v1/trading/subscribe", {
448
+ body: params
449
+ });
450
+ }
451
+ async unsubscribe(subscriptionId) {
452
+ this.client._requireAuth();
453
+ return this.client._request("POST", "/api/v1/trading/unsubscribe", {
454
+ body: { subscriptionId }
455
+ });
456
+ }
457
+ async execute(params) {
458
+ this.client._requireAuth();
459
+ return this.client._request("POST", "/api/v1/trading/execute", {
460
+ body: params
461
+ });
462
+ }
463
+ async updateRiskRules(rules) {
464
+ this.client._requireAuth();
465
+ return this.client._request("PUT", "/api/v1/trading/risk-rules", {
466
+ body: rules
467
+ });
468
+ }
469
+ };
470
+
394
471
  // src/client.ts
395
472
  var DEFAULT_BASE_URL = "https://api-llm.prd.alva.ai";
396
473
  var AlvaClient = class {
397
474
  baseUrl;
475
+ token;
398
476
  apiKey;
399
477
  _fs;
400
478
  _run;
@@ -406,8 +484,10 @@ var AlvaClient = class {
406
484
  _remix;
407
485
  _screenshot;
408
486
  _user;
487
+ _trading;
409
488
  constructor(config) {
410
489
  this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
490
+ this.token = config.token;
411
491
  this.apiKey = config.apiKey;
412
492
  }
413
493
  get fs() {
@@ -440,11 +520,14 @@ var AlvaClient = class {
440
520
  get user() {
441
521
  return this._user ??= new UserResource(this);
442
522
  }
523
+ get trading() {
524
+ return this._trading ??= new TradingResource(this);
525
+ }
443
526
  _requireAuth() {
444
- if (!this.apiKey) {
527
+ if (!this.token && !this.apiKey) {
445
528
  throw new AlvaError(
446
529
  "UNAUTHENTICATED",
447
- "API key is required for this operation. Pass apiKey in the constructor.",
530
+ "Authentication is required. Pass token or apiKey in the constructor.",
448
531
  401
449
532
  );
450
533
  }
@@ -464,7 +547,9 @@ var AlvaClient = class {
464
547
  }
465
548
  }
466
549
  const headers = {};
467
- if (this.apiKey) {
550
+ if (this.token) {
551
+ headers.Authorization = `${this.token}`;
552
+ } else if (this.apiKey) {
468
553
  headers["X-Alva-Api-Key"] = this.apiKey;
469
554
  }
470
555
  let fetchBody;
@@ -629,7 +714,7 @@ function loadConfig(deps) {
629
714
  import * as fs from "fs";
630
715
  import * as os from "os";
631
716
  import * as fsPromises from "fs/promises";
632
- var CLI_VERSION = true ? "0.1.3" : "dev";
717
+ var CLI_VERSION = true ? "0.1.4" : "dev";
633
718
  function isVersionOlderThan(a, b) {
634
719
  const parse = (v) => {
635
720
  if (!v) return null;
@@ -661,6 +746,7 @@ Commands:
661
746
  sdk SDK documentation (doc, partitions, partition-summary)
662
747
  comments Playbook comments (create, pin, unpin)
663
748
  remix Save playbook remix lineage
749
+ trading Trading operations (accounts, portfolio, orders, subscriptions, equity-history, risk-rules, subscribe, unsubscribe, execute, update-risk-rules)
664
750
  screenshot Capture a web screenshot as PNG
665
751
 
666
752
  Global options:
@@ -1032,7 +1118,73 @@ Optional:
1032
1118
 
1033
1119
  Examples:
1034
1120
  alva screenshot --url /playbook/alice/btc-dashboard --out dashboard.png
1035
- alva screenshot --url /playbook/alice/btc-dashboard --out chart.png --selector ".chart-container"`
1121
+ alva screenshot --url /playbook/alice/btc-dashboard --out chart.png --selector ".chart-container"`,
1122
+ trading: `Usage: alva trading <subcommand> [options]
1123
+
1124
+ Manage trading accounts, portfolios, orders, subscriptions, and risk rules.
1125
+
1126
+ Subcommands:
1127
+ accounts List all trading accounts
1128
+ portfolio Get portfolio for an account
1129
+ orders List orders for an account
1130
+ subscriptions List subscriptions for an account
1131
+ equity-history Get equity history for an account
1132
+ risk-rules Show risk rules
1133
+ subscribe Subscribe an account to a source feed
1134
+ unsubscribe Unsubscribe by subscription ID
1135
+ execute Execute a signal on an account
1136
+ update-risk-rules Update risk rules
1137
+
1138
+ Portfolio/Orders/Subscriptions/Equity-history flags:
1139
+ --account-id <id> Trading account ID (required)
1140
+
1141
+ Orders optional flags:
1142
+ --limit <n> Max results
1143
+ --source <source> Filter by source
1144
+ --since <timestamp> Filter orders since timestamp
1145
+
1146
+ Equity-history optional flags:
1147
+ --timeframe <tf> Timeframe (e.g. "1d", "1h")
1148
+ --since-ms <ms> Start timestamp in ms
1149
+ --until-ms <ms> End timestamp in ms
1150
+
1151
+ Subscribe flags:
1152
+ --account-id <id> Account ID (required)
1153
+ --source-username <user> Source username (required)
1154
+ --source-feed <feed> Source feed (required)
1155
+ --playbook-id <id> Playbook ID (required)
1156
+ --playbook-version <ver> Playbook version (required)
1157
+ --execute-latest Execute latest signal on subscribe
1158
+
1159
+ Unsubscribe flags:
1160
+ --subscription-id <id> Subscription ID (required)
1161
+
1162
+ Execute flags:
1163
+ --account-id <id> Account ID (required)
1164
+ --signal <json> Signal JSON (required)
1165
+ --dry-run Dry run mode
1166
+ --source-username <user> Source username (optional)
1167
+ --source-feed <feed> Source feed (optional)
1168
+
1169
+ Update-risk-rules flags:
1170
+ --max-single-order-value <n> Max single order value (required)
1171
+ --max-single-order-enabled <bool> Max single order enabled (required)
1172
+ --max-daily-turnover-value <n> Max daily turnover value (required)
1173
+ --max-daily-turnover-enabled <bool> Max daily turnover enabled (required)
1174
+ --max-daily-orders-value <n> Max daily orders value (required)
1175
+ --max-daily-orders-enabled <bool> Max daily orders enabled (required)
1176
+
1177
+ Examples:
1178
+ alva trading accounts
1179
+ alva trading portfolio --account-id acc_123
1180
+ alva trading orders --account-id acc_123 --limit 10
1181
+ alva trading subscriptions --account-id acc_123
1182
+ alva trading equity-history --account-id acc_123 --timeframe 1d
1183
+ alva trading risk-rules
1184
+ alva trading subscribe --account-id acc_123 --source-username alice --source-feed btc-signals --playbook-id pb_1 --playbook-version v1.0.0
1185
+ alva trading unsubscribe --subscription-id sub_456
1186
+ alva trading execute --account-id acc_123 --signal '{"symbol":"BTC","side":"buy","qty":0.1}' --dry-run
1187
+ alva trading update-risk-rules --max-single-order-value 10000 --max-single-order-enabled true --max-daily-turnover-value 50000 --max-daily-turnover-enabled true --max-daily-orders-value 100 --max-daily-orders-enabled true`
1036
1188
  };
1037
1189
  async function handleConfigure(args, deps) {
1038
1190
  const flags = parseFlags(args.slice(1));
@@ -1070,7 +1222,9 @@ var BOOLEAN_FLAGS = /* @__PURE__ */ new Set([
1070
1222
  "recursive",
1071
1223
  "mkdir-parents",
1072
1224
  "push-notify",
1073
- "help"
1225
+ "help",
1226
+ "execute-latest",
1227
+ "dry-run"
1074
1228
  ]);
1075
1229
  function parseFlags(argv) {
1076
1230
  const flags = {};
@@ -1431,6 +1585,111 @@ async function dispatch(client, args, meta) {
1431
1585
  fs.writeFileSync(outFile, buf);
1432
1586
  return { written: outFile, bytes: buf.length };
1433
1587
  }
1588
+ case "trading": {
1589
+ if (!subcommand) throw new Error("Missing subcommand for trading");
1590
+ switch (subcommand) {
1591
+ case "accounts":
1592
+ return client.trading.accounts();
1593
+ case "portfolio":
1594
+ return client.trading.portfolio(
1595
+ requireFlag(flags, "account-id", "trading portfolio")
1596
+ );
1597
+ case "orders":
1598
+ return client.trading.orders({
1599
+ accountId: requireFlag(flags, "account-id", "trading orders"),
1600
+ source: flags["source"],
1601
+ since: num(flags["since"]),
1602
+ limit: num(flags["limit"])
1603
+ });
1604
+ case "subscriptions":
1605
+ return client.trading.subscriptions(
1606
+ requireFlag(flags, "account-id", "trading subscriptions")
1607
+ );
1608
+ case "equity-history":
1609
+ return client.trading.equityHistory({
1610
+ accountId: requireFlag(
1611
+ flags,
1612
+ "account-id",
1613
+ "trading equity-history"
1614
+ ),
1615
+ timeframe: flags["timeframe"],
1616
+ sinceMs: num(flags["since-ms"]),
1617
+ untilMs: num(flags["until-ms"])
1618
+ });
1619
+ case "risk-rules":
1620
+ return client.trading.riskRules();
1621
+ case "subscribe":
1622
+ return client.trading.subscribe({
1623
+ accountId: requireFlag(flags, "account-id", "trading subscribe"),
1624
+ sourceUsername: requireFlag(
1625
+ flags,
1626
+ "source-username",
1627
+ "trading subscribe"
1628
+ ),
1629
+ sourceFeed: requireFlag(flags, "source-feed", "trading subscribe"),
1630
+ playbookId: requireFlag(flags, "playbook-id", "trading subscribe"),
1631
+ playbookVersion: requireFlag(
1632
+ flags,
1633
+ "playbook-version",
1634
+ "trading subscribe"
1635
+ ),
1636
+ executeLatest: boolFlag(flags["execute-latest"])
1637
+ });
1638
+ case "unsubscribe":
1639
+ return client.trading.unsubscribe(
1640
+ requireFlag(flags, "subscription-id", "trading unsubscribe")
1641
+ );
1642
+ case "execute":
1643
+ return client.trading.execute({
1644
+ accountId: requireFlag(flags, "account-id", "trading execute"),
1645
+ signalJson: requireFlag(flags, "signal", "trading execute"),
1646
+ dryRun: boolFlag(flags["dry-run"]) ?? false,
1647
+ sourceUsername: flags["source-username"],
1648
+ sourceFeed: flags["source-feed"]
1649
+ });
1650
+ case "update-risk-rules":
1651
+ return client.trading.updateRiskRules({
1652
+ maxSingleOrder: {
1653
+ value: requireNumericFlag(
1654
+ flags,
1655
+ "max-single-order-value",
1656
+ "trading update-risk-rules"
1657
+ ),
1658
+ enabled: requireFlag(
1659
+ flags,
1660
+ "max-single-order-enabled",
1661
+ "trading update-risk-rules"
1662
+ ) === "true"
1663
+ },
1664
+ maxDailyTurnover: {
1665
+ value: requireNumericFlag(
1666
+ flags,
1667
+ "max-daily-turnover-value",
1668
+ "trading update-risk-rules"
1669
+ ),
1670
+ enabled: requireFlag(
1671
+ flags,
1672
+ "max-daily-turnover-enabled",
1673
+ "trading update-risk-rules"
1674
+ ) === "true"
1675
+ },
1676
+ maxDailyOrders: {
1677
+ value: requireNumericFlag(
1678
+ flags,
1679
+ "max-daily-orders-value",
1680
+ "trading update-risk-rules"
1681
+ ),
1682
+ enabled: requireFlag(
1683
+ flags,
1684
+ "max-daily-orders-enabled",
1685
+ "trading update-risk-rules"
1686
+ ) === "true"
1687
+ }
1688
+ });
1689
+ default:
1690
+ throw new Error(`Unknown subcommand: trading ${subcommand}`);
1691
+ }
1692
+ }
1434
1693
  default:
1435
1694
  throw new Error(
1436
1695
  `Unknown command: '${group}'. Run 'alva --help' to see available commands.`