@alva-ai/toolkit 0.1.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Alva AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,161 @@
1
+ # @alva-ai/toolkit
2
+
3
+ Alva REST API SDK and CLI for Node.js and the browser.
4
+
5
+ - **CLI** — manage config, call any Alva API from your terminal
6
+ - **SDK** — typed TypeScript/JavaScript client for Node.js
7
+ - **Browser** — drop a `<script>` tag into plain HTML, no build step needed
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ npm install @alva-ai/toolkit
13
+ ```
14
+
15
+ Or install globally for the CLI:
16
+
17
+ ```bash
18
+ npm install -g @alva-ai/toolkit
19
+ ```
20
+
21
+ ## CLI Quick Start
22
+
23
+ Configure your API key (get one at [alva.ai](https://alva.ai)):
24
+
25
+ ```bash
26
+ alva configure --api-key alva_your_key_here
27
+ ```
28
+
29
+ This writes your credentials to `~/.config/alva/config.json`.
30
+
31
+ Now use any command:
32
+
33
+ ```bash
34
+ # List your files
35
+ alva fs readdir --path /
36
+
37
+ # Run code
38
+ alva run --code 'return 1 + 1'
39
+
40
+ # Manage cronjobs
41
+ alva deploy list
42
+
43
+ # Manage secrets
44
+ alva secrets list
45
+ ```
46
+
47
+ All output is JSON for easy piping:
48
+
49
+ ```bash
50
+ alva fs readdir --path / | jq '.entries[].name'
51
+ ```
52
+
53
+ ### Config Resolution
54
+
55
+ The CLI resolves config in this order:
56
+
57
+ 1. `--api-key` / `--base-url` flags
58
+ 2. `ALVA_API_KEY` / `ALVA_ENDPOINT` environment variables
59
+ 3. `~/.config/alva/config.json` (or `$XDG_CONFIG_HOME/alva/config.json`)
60
+
61
+ ## SDK Usage (Node.js)
62
+
63
+ ```typescript
64
+ import { AlvaClient } from '@alva-ai/toolkit';
65
+
66
+ const client = new AlvaClient({ apiKey: 'alva_your_key_here' });
67
+
68
+ // List files
69
+ const entries = await client.fs.readdir({ path: '/' });
70
+
71
+ // Run code
72
+ const result = await client.run.execute({ code: 'return 1 + 1' });
73
+
74
+ // Manage cronjobs
75
+ const jobs = await client.deploy.list();
76
+
77
+ // Manage secrets
78
+ const secrets = await client.secrets.list();
79
+ ```
80
+
81
+ ## Browser Usage
82
+
83
+ Add the browser bundle via a CDN:
84
+
85
+ ```html
86
+ <script src="https://unpkg.com/@alva-ai/toolkit/dist/browser.global.js"></script>
87
+ <script>
88
+ const client = new AlvaToolkit.AlvaClient({
89
+ apiKey: 'alva_your_key_here',
90
+ });
91
+
92
+ client.fs.readdir({ path: '/' }).then((entries) => {
93
+ console.log(entries);
94
+ });
95
+ </script>
96
+ ```
97
+
98
+ > **Note:** The Alva API must have CORS headers configured for browser requests to work from your origin.
99
+
100
+ ## API Reference
101
+
102
+ ### Resources
103
+
104
+ | Resource | Methods |
105
+ | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
106
+ | `client.user` | `me()` |
107
+ | `client.fs` | `read()`, `write()`, `rawWrite()`, `stat()`, `readdir()`, `mkdir()`, `remove()`, `rename()`, `copy()`, `symlink()`, `readlink()`, `chmod()`, `grant()`, `revoke()` |
108
+ | `client.run` | `execute()` |
109
+ | `client.deploy` | `create()`, `list()`, `get()`, `update()`, `delete()`, `pause()`, `resume()` |
110
+ | `client.release` | `feed()`, `playbookDraft()`, `playbook()` |
111
+ | `client.secrets` | `create()`, `list()`, `get()`, `update()`, `delete()` |
112
+ | `client.sdk` | `doc()`, `partitions()`, `partitionSummary()` |
113
+ | `client.comments` | `create()`, `pin()`, `unpin()` |
114
+ | `client.remix` | `save()` |
115
+ | `client.screenshot` | `capture()` |
116
+
117
+ ### Error Handling
118
+
119
+ ```typescript
120
+ import { AlvaClient, AlvaError } from '@alva-ai/toolkit';
121
+
122
+ try {
123
+ await client.fs.read({ path: '/nonexistent' });
124
+ } catch (err) {
125
+ if (err instanceof AlvaError) {
126
+ console.error(err.code); // 'NOT_FOUND'
127
+ console.error(err.status); // 404
128
+ console.error(err.message); // 'File not found'
129
+ }
130
+ }
131
+ ```
132
+
133
+ ## CLI Commands
134
+
135
+ ```
136
+ alva configure --api-key <key> [--base-url <url>]
137
+ alva user me
138
+ alva fs <read|write|stat|readdir|mkdir|remove|rename|copy|symlink|readlink|chmod|grant|revoke>
139
+ alva run --code <code> [--entry-path <path>] [--working-dir <dir>] [--args <json>]
140
+ alva deploy <create|list|get|update|delete|pause|resume>
141
+ alva release <feed|playbook-draft|playbook>
142
+ alva secrets <create|list|get|update|delete>
143
+ alva sdk <doc|partitions|partition-summary>
144
+ alva comments <create|pin|unpin>
145
+ alva remix --child-username <u> --child-name <n> --parents <json>
146
+ alva screenshot --url <url> [--selector <s>] [--xpath <x>] --out <file>
147
+ ```
148
+
149
+ ## Contributing
150
+
151
+ ```bash
152
+ git clone https://github.com/alva-ai/toolkit-ts.git
153
+ cd toolkit-ts
154
+ npm install
155
+ npm test
156
+ npm run build
157
+ ```
158
+
159
+ ## License
160
+
161
+ [MIT](LICENSE)
@@ -0,0 +1,2 @@
1
+ "use strict";var AlvaToolkit=(()=>{var A=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var j=Object.prototype.hasOwnProperty;var w=(t,e)=>{for(var s in e)A(t,s,{get:e[s],enumerable:!0})},S=(t,e,s,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of g(e))!j.call(t,a)&&a!==s&&A(t,a,{get:()=>e[a],enumerable:!(r=F(e,a))||r.enumerable});return t};var T=t=>S(A({},"__esModule",{value:!0}),t);var E={};w(E,{AlvaClient:()=>q,AlvaError:()=>o});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}})}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 x="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??x,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 k=i.headers.get("content-type")??"";return k.includes("application/octet-stream")||k.includes("image/")?i.arrayBuffer():i.json()}};return T(E);})();
2
+ //# sourceMappingURL=browser.global.js.map
@@ -0,0 +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"],"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 },\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"],"mappings":"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","names":["browser_exports","__export","AlvaClient","AlvaError","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"]}