@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 +1 -1
- package/dist/browser.global.js +1 -1
- package/dist/browser.global.js.map +1 -1
- package/dist/cli.js +265 -6
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +89 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +136 -1
- package/dist/index.d.ts +136 -1
- package/dist/index.js +89 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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/cli/config.ts","../src/cli/index.ts"],"sourcesContent":["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","export interface CliConfig {\n apiKey?: string;\n baseUrl?: string;\n profile?: string;\n}\n\ninterface ProfileData {\n apiKey?: string;\n baseUrl?: string;\n}\n\ninterface ConfigFile {\n profiles?: Record<string, ProfileData>;\n // Legacy flat fields (pre-profile format)\n apiKey?: string;\n baseUrl?: string;\n}\n\ninterface WriteConfigDeps {\n env: Record<string, string | undefined>;\n homedir: () => string;\n mkdir: (path: string, options: { recursive: boolean }) => Promise<void>;\n writeFile: (\n path: string,\n data: string,\n options: { mode: number }\n ) => Promise<void>;\n readFile: (path: string) => Promise<string>;\n}\n\nfunction configPath(deps: {\n env: Record<string, string | undefined>;\n homedir: () => string;\n}): string {\n const configDir = deps.env.XDG_CONFIG_HOME || `${deps.homedir()}/.config`;\n return `${configDir}/alva/config.json`;\n}\n\nfunction configDir(deps: {\n env: Record<string, string | undefined>;\n homedir: () => string;\n}): string {\n const configRoot = deps.env.XDG_CONFIG_HOME || `${deps.homedir()}/.config`;\n return `${configRoot}/alva`;\n}\n\n/**\n * Read and normalize config file. Handles both legacy flat format\n * and new profile-based format.\n */\nfunction readConfigFile(raw: string): ConfigFile {\n const parsed = JSON.parse(raw);\n return parsed as ConfigFile;\n}\n\n/**\n * Extract profile data from a config file. Handles migration from\n * legacy flat format (apiKey at root) to profile-based format.\n */\nfunction getProfile(config: ConfigFile, profileName: string): ProfileData {\n // New format: profiles map\n if (config.profiles && config.profiles[profileName]) {\n return config.profiles[profileName];\n }\n // Legacy flat format: treat root-level apiKey/baseUrl as \"default\" profile\n if (profileName === 'default' && config.apiKey) {\n return { apiKey: config.apiKey, baseUrl: config.baseUrl };\n }\n return {};\n}\n\nexport async function writeConfig(\n config: { apiKey: string; baseUrl?: string },\n deps: WriteConfigDeps,\n profileName: string = 'default'\n): Promise<CliConfig> {\n const path = configPath(deps);\n const dir = configDir(deps);\n\n // Read existing config\n let existing: ConfigFile = {};\n try {\n const raw = await deps.readFile(path);\n existing = readConfigFile(raw);\n } catch {\n // File doesn't exist or can't be parsed — start fresh\n }\n\n // Migrate legacy flat format to profiles\n if (!existing.profiles) {\n existing.profiles = {};\n if (existing.apiKey) {\n existing.profiles['default'] = {\n apiKey: existing.apiKey,\n baseUrl: existing.baseUrl,\n };\n }\n }\n\n // Update the target profile\n const profileData: ProfileData = {\n ...(existing.profiles[profileName] || {}),\n apiKey: config.apiKey,\n };\n if (config.baseUrl) {\n profileData.baseUrl = config.baseUrl;\n } else if (!existing.profiles[profileName]?.baseUrl) {\n delete profileData.baseUrl;\n }\n existing.profiles[profileName] = profileData;\n\n // Write clean format (profiles only, no legacy root fields)\n const output: ConfigFile = { profiles: existing.profiles };\n await deps.mkdir(dir, { recursive: true });\n await deps.writeFile(path, JSON.stringify(output, null, 2) + '\\n', {\n mode: 0o600,\n });\n\n return {\n apiKey: profileData.apiKey,\n baseUrl: profileData.baseUrl,\n profile: profileName,\n };\n}\n\ninterface ConfigDeps {\n argv: string[];\n env: Record<string, string | undefined>;\n readFile: (path: string) => string;\n homedir: () => string;\n}\n\nfunction parseFlag(argv: string[], flag: string): string | undefined {\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === flag && i + 1 < argv.length) {\n return argv[i + 1];\n }\n if (argv[i].startsWith(`${flag}=`)) {\n return argv[i].slice(flag.length + 1);\n }\n }\n return undefined;\n}\n\nexport function loadConfig(deps: ConfigDeps): CliConfig {\n const { argv, env, readFile, homedir } = deps;\n\n // Resolve profile name: flag > env > default\n const profileName =\n parseFlag(argv, '--profile') || env.ALVA_PROFILE || 'default';\n\n // Resolve base URL: flag > env > file > default\n const baseUrlFlag = parseFlag(argv, '--base-url');\n const baseUrlEnv = env.ALVA_ENDPOINT;\n\n // Resolve API key: flag > env > file\n const apiKeyFlag = parseFlag(argv, '--api-key');\n const apiKeyEnv = env.ALVA_API_KEY;\n\n // Read config file\n let fileProfile: ProfileData = {};\n const path = configPath({ env, homedir });\n try {\n const raw = readFile(path);\n let config: ConfigFile;\n try {\n config = readConfigFile(raw);\n } catch {\n throw new Error(`Failed to parse ${path}: invalid JSON`);\n }\n fileProfile = getProfile(config, profileName);\n } catch (e) {\n if (e instanceof Error && e.message.startsWith('Failed to parse')) {\n throw e;\n }\n // File not found — that's fine\n }\n\n return {\n apiKey: apiKeyFlag ?? apiKeyEnv ?? fileProfile.apiKey,\n baseUrl: baseUrlFlag ?? baseUrlEnv ?? fileProfile.baseUrl,\n profile: profileName,\n };\n}\n","import { AlvaClient } from '../client.js';\nimport { AlvaError } from '../error.js';\nimport { loadConfig, writeConfig } from './config.js';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as fsPromises from 'fs/promises';\n\ndeclare const __VERSION__: string;\nexport const CLI_VERSION: string =\n typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'dev';\n\n/**\n * Returns true if version `a` is strictly older than version `b`.\n * Compares major.minor.patch as integers. Returns false on malformed input.\n */\nexport function isVersionOlderThan(a: string, b: string): boolean {\n const parse = (v: string): number[] | null => {\n if (!v) return null;\n const parts = v.split('.').map(Number);\n if (parts.some(isNaN)) return null;\n while (parts.length < 3) parts.push(0);\n return parts;\n };\n const pa = parse(a);\n const pb = parse(b);\n if (!pa || !pb) return false;\n for (let i = 0; i < 3; i++) {\n if (pa[i] < pb[i]) return true;\n if (pa[i] > pb[i]) return false;\n }\n return false;\n}\n\nconst HELP_TEXT = `Usage: alva <command> [options]\n\nCommands:\n configure Save API key and endpoint to a named profile\n whoami Verify credentials and show current user info\n user User profile operations\n fs Filesystem operations (read, write, stat, readdir, mkdir, remove, rename, copy, symlink, readlink, chmod, grant, revoke)\n run Execute code in the Alva runtime\n deploy Cronjob management (create, list, get, update, delete, pause, resume)\n release Feed and playbook releases (feed, playbook-draft, playbook)\n secrets Secret management (create, list, get, update, delete)\n sdk SDK documentation (doc, partitions, partition-summary)\n comments Playbook comments (create, pin, unpin)\n remix Save playbook remix lineage\n screenshot Capture a web screenshot as PNG\n\nGlobal options:\n --api-key <key> API key (overrides env and config file)\n --base-url <url> API base URL (overrides env and config file)\n --profile <name> Named profile to use (default: \"default\")\n -v, --version Show CLI version\n --help Show help (use 'alva <command> --help' for command details)\n\nConfig resolution: --api-key flag > ALVA_API_KEY env > profile in ~/.config/alva/config.json\nProfile resolution: --profile flag > ALVA_PROFILE env > \"default\"\n\nQuick start:\n npm install -g @alva-ai/toolkit\n alva configure --api-key alva_your_key_here\n alva whoami`;\n\nconst COMMAND_HELP: Record<string, string> = {\n configure: `Usage: alva configure --api-key <key> [--base-url <url>] [--profile <name>]\n\nSave API credentials to ~/.config/alva/config.json (mode 0600).\nAfter configuring, subsequent commands use the saved key automatically.\nMultiple profiles allow switching between environments (production, staging, etc.).\n\nRequired:\n --api-key <key> Your Alva API key (starts with \"alva_\")\n\nOptional:\n --base-url <url> API base URL (default: https://api-llm.prd.alva.ai)\n --profile <name> Profile name to save under (default: \"default\")\n\nConfig file format:\n {\n \"profiles\": {\n \"default\": { \"apiKey\": \"alva_...\", \"baseUrl\": \"https://api-llm.prd.alva.ai\" },\n \"staging\": { \"apiKey\": \"alva_...\", \"baseUrl\": \"https://api-llm.stg.alva.ai\" }\n }\n }\n\nExamples:\n alva configure --api-key alva_abc123\n alva configure --api-key alva_abc123 --base-url http://localhost:8080\n alva configure --profile staging --api-key alva_stg_key --base-url https://api-llm.stg.alva.ai\n alva --profile staging whoami`,\n\n whoami: `Usage: alva whoami [--profile <name>]\n\nVerify that your credentials are valid by calling the Alva API. Shows your\nusername, subscription tier, and which profile/endpoint is being used.\nUse this after 'alva configure' to confirm everything works.\n\nExamples:\n alva whoami\n alva --profile staging whoami`,\n\n user: `Usage: alva user <subcommand>\n\nSubcommands:\n me Get the authenticated user's profile\n\nResponse fields:\n id User ID\n username Username (used in ALFS paths and playbook URLs)\n subscription_tier \"free\" or \"pro\" — determines release flow and feature gates\n telegram_username Telegram username if connected, null otherwise\n\nExamples:\n alva user me`,\n\n fs: `Usage: alva fs <subcommand> [options]\n\nSubcommands:\n read Read a file or time series data\n write Write content to a file (use --data for inline, --file for upload)\n stat Get file metadata (name, size, mode, mod_time, is_dir)\n readdir List directory contents\n mkdir Create a directory (recursive by default)\n remove Delete a file or directory\n rename Move/rename a file\n copy Copy a file\n symlink Create a symbolic link\n readlink Read a symlink target\n chmod Change file permissions (mode is octal, e.g. 755)\n grant Grant access permission to a user or group\n revoke Revoke access permission\n\nCommon flags:\n --path <path> File or directory path (required for most subcommands)\n --recursive Enable recursive operation (readdir, remove)\n --no-recursive Disable recursive operation\n --mkdir-parents Create parent directories on write (default for write)\n --no-mkdir-parents Disable automatic parent directory creation on write\n\nPath conventions:\n ~/... Home-relative path (expands to /alva/home/<username>/...)\n /alva/home/alice/... Absolute path (required for public/unauthenticated reads)\n\nTime series reads:\n Paths under feed data directories support virtual suffixes:\n @last/{n} Last N data points (chronological order)\n @range/{start}..{end} Between timestamps (RFC 3339 or Unix ms)\n @range/{duration} Recent data within duration (e.g. 7d, 1h)\n @count Data point count\n @now Latest single data point\n\nGrant/revoke subjects:\n special:user:* Public (anyone, including unauthenticated)\n special:user:+ Any authenticated user\n user:<id> Specific user by ID\n\nExamples:\n alva fs readdir --path ~/\n alva fs readdir --path ~/data --recursive\n alva fs read --path ~/data/prices.json\n alva fs read --path ~/feeds/btc-ema/v1/data/metrics/prices/@last/100\n alva fs read --path /alva/home/alice/feeds/btc-ema/v1/data/metrics/prices/@last/10\n alva fs write --path ~/hello.txt --data \"Hello, world!\"\n alva fs write --path ~/feeds/my-feed/v1/src/index.js --file ./local-script.js --mkdir-parents\n alva fs stat --path ~/hello.txt\n alva fs mkdir --path ~/feeds/my-feed/v1/src\n alva fs remove --path ~/old-folder --recursive\n alva fs rename --old-path ~/a.txt --new-path ~/b.txt\n alva fs copy --src-path ~/a.txt --dst-path ~/b.txt\n alva fs chmod --path ~/script.js --mode 755\n alva fs grant --path ~/feeds/btc-ema --subject \"special:user:*\" --permission read\n alva fs revoke --path ~/feeds/btc-ema --subject \"special:user:*\" --permission read`,\n\n run: `Usage: alva run [options]\n\nExecute JavaScript code in the Alva V8 runtime. Provide either inline code\nor a path to a script file on ALFS. Scripts have access to 250+ financial\ndata SDKs, ALFS, HTTP networking, and the Feed SDK.\n\nOptions:\n --code <code> Inline JavaScript code to execute\n --entry-path <path> Path to a script file on ALFS (home-relative)\n --working-dir <dir> Working directory for require() (inline code only)\n --args <json> JSON object passed to require(\"env\").args\n\nAt least one of --code or --entry-path is required.\n\nResponse fields:\n result JSON-encoded return value of the script\n logs Captured stderr output\n status \"completed\" or \"failed\"\n error Error message (when status is \"failed\")\n\nAvailable runtime modules:\n require(\"alfs\") Cloud filesystem (absolute paths only)\n require(\"env\") userId, username, args from request\n require(\"net/http\") fetch(url, init) for HTTP requests\n require(\"secret-manager\") Read user-scoped third-party secrets\n require(\"@alva/feed\") Feed SDK for data pipelines\n require(\"@alva/algorithm\") 50+ technical indicators\n require(\"@alva/adk\") Agent SDK for LLM tool calling\n require(\"@arrays/...\") 250+ financial data SDKs\n\nConstraints:\n No top-level await — wrap in (async () => { ... })();\n No Node.js builtins (fs, path, http) — use alfs, net/http instead\n 2 GB heap limit per execution\n\nExamples:\n alva run --code \"1 + 2 + 3;\"\n alva run --code \"JSON.stringify(require('env').args);\" --args '{\"symbol\":\"BTC\"}'\n alva run --entry-path ~/feeds/my-feed/v1/src/index.js\n alva run --entry-path ~/tasks/analyze/src/index.js --args '{\"symbol\":\"NVDA\",\"limit\":50}'`,\n\n deploy: `Usage: alva deploy <subcommand> [options]\n\nManage scheduled cronjobs that run your scripts on a cron schedule.\nMax 20 cronjobs per user. Min interval: 1 minute.\n\nSubcommands:\n create Create a new cronjob\n list List all cronjobs (supports cursor-based pagination)\n get Get a single cronjob by ID\n update Update a cronjob (partial update — only include changed fields)\n delete Delete a cronjob\n pause Pause a running cronjob\n resume Resume a paused cronjob\n\nCreate flags:\n --name <name> Cronjob name (required, 1-63 lowercase alphanumeric/hyphens)\n --path <path> Path to script on ALFS (required, must exist)\n --cron <expression> Cron expression (required, e.g. \"0 */4 * * *\")\n --args <json> JSON object passed to require(\"env\").args\n --push-notify Enable Telegram push notifications on completion\n --no-push-notify Disable push notifications\n\nList flags:\n --limit <n> Max results per page (default: 20)\n --cursor <cursor> Pagination cursor from previous response\n\nGet/Update/Delete/Pause/Resume flags:\n --id <id> Cronjob ID (required)\n\nName format: 1-63 lowercase alphanumeric or hyphens, no leading/trailing hyphens.\n Valid: btc-ema-update, my-strategy-1\n Invalid: BTC EMA, -my-job-, my_job\n\nRecommended cron schedules:\n \"0 */4 * * *\" Every 4 hours (stock OHLCV, crypto technicals)\n \"0 8 * * *\" Daily at 8am (fundamentals, insider trades, earnings)\n \"*/5 * * * *\" Every 5 minutes (high-frequency alerts)\n \"0 0 * * *\" Daily at midnight (end-of-day summaries)\n\nExamples:\n alva deploy create --name btc-ema --path ~/feeds/btc-ema/v1/src/index.js --cron \"0 */4 * * *\"\n alva deploy create --name alert --path ~/feeds/alert/v1/src/index.js --cron \"*/5 * * * *\" --push-notify --args '{\"threshold\":100}'\n alva deploy list\n alva deploy list --limit 10\n alva deploy get --id 42\n alva deploy update --id 42 --cron \"0 */2 * * *\" --no-push-notify\n alva deploy pause --id 42\n alva deploy resume --id 42\n alva deploy delete --id 42`,\n\n release: `Usage: alva release <subcommand> [options]\n\nPublish feeds and playbooks to the Alva platform. The typical workflow:\n 1. Deploy cronjob (alva deploy create)\n 2. Register feed (alva release feed)\n 3. Create playbook draft (alva release playbook-draft)\n 4. Write HTML to ALFS (alva fs write --path ~/playbooks/{name}/index.html)\n 5. Release playbook (alva release playbook)\n\nSubcommands:\n feed Register a feed after deploying its cronjob\n playbook-draft Create a playbook draft (preview before publishing)\n playbook Publish a playbook (public for free users, choice for pro)\n\nFeed flags:\n --name <name> Feed name, unique per user (required)\n --version <version> Semantic version, e.g. \"1.0.0\" (required)\n --cronjob-id <id> ID of the backing cronjob (required)\n --view-json <json> View configuration JSON\n --description <text> Feed description\n\nPlaybook-draft flags:\n --name <name> URL-safe playbook name, unique per user (required)\n --display-name <name> Human-readable title, max 40 chars (required)\n --feeds <json> JSON array of {feed_id, feed_major?} (required)\n --changelog <text> Release changelog (required)\n --description <text> Playbook description\n --trading-symbols <json> JSON array of tickers, e.g. '[\"BTC\",\"ETH\"]' (max 50)\n\nPlaybook flags:\n --name <name> Playbook name, must already exist as draft (required)\n --version <version> Semantic version, e.g. \"v1.0.0\" (required)\n --feeds <json> JSON array of {feed_id, feed_major?} (required)\n --changelog <text> Release changelog (required)\n\nDisplay name conventions:\n Format: [subject/theme] [analysis angle/strategy logic]\n Max 40 characters. Avoid \"My\", \"Test\", or generic-only titles.\n Good: \"BTC Trend Dashboard\", \"NVDA Insider Activity Tracker\"\n Bad: \"My Dashboard\", \"Test V2\", \"Stock Dashboard\"\n\nExamples:\n alva release feed --name btc-ema --version 1.0.0 --cronjob-id 42\n alva release feed --name nvda-insiders --version 1.0.0 --cronjob-id 43 --description \"NVDA insider trading activity\"\n alva release playbook-draft --name btc-dashboard --display-name \"BTC Trend Dashboard\" --feeds '[{\"feed_id\":100}]' --changelog \"Initial release\" --trading-symbols '[\"BTC\"]'\n alva release playbook --name btc-dashboard --version v1.0.0 --feeds '[{\"feed_id\":100}]' --changelog \"Initial release\"`,\n\n secrets: `Usage: alva secrets <subcommand> [options]\n\nManage encrypted secrets for use in Alva scripts. Secrets are stored\nencrypted at rest and accessible via require(\"secret-manager\") in the runtime.\n\nFor sensitive secrets (API keys, tokens), prefer the web UI at https://alva.ai/apikey.\nUse the CLI for agent-managed CRUD operations.\n\nSubcommands:\n create Create a new secret (fails if name already exists)\n list List all secrets (metadata only: name, keyPrefix, timestamps)\n get Get a secret's plaintext value\n update Update a secret's value (fails if name doesn't exist)\n delete Delete a secret (fails if name doesn't exist)\n\nFlags:\n --name <name> Secret name (required for create, get, update, delete)\n --value <value> Secret value (required for create, update)\n\nRuntime usage in scripts:\n const secret = require(\"secret-manager\");\n const key = secret.loadPlaintext(\"OPENAI_API_KEY\");\n // Returns string if found, null if missing\n\nExamples:\n alva secrets create --name OPENAI_KEY --value sk-abc123\n alva secrets list\n alva secrets get --name OPENAI_KEY\n alva secrets update --name OPENAI_KEY --value sk-new456\n alva secrets delete --name OPENAI_KEY`,\n\n sdk: `Usage: alva sdk <subcommand> [options]\n\nBrowse Alva's 250+ financial data SDKs. Use the two-step discovery flow:\n 1. List partitions to find the right category\n 2. Get partition summary to see available modules\n 3. Get full documentation for a specific module\n\nSubcommands:\n doc Get documentation for a specific SDK module\n partitions List all available data partitions\n partition-summary Get a summary of modules in a partition\n\nFlags:\n --name <module> Module name for 'doc' (required)\n --partition <name> Partition name for 'partition-summary' (required)\n\nKey partitions:\n spot_market_price_and_volume Spot OHLCV for crypto and equities\n crypto_futures_data Perpetual futures, funding rates, OI\n crypto_technical_metrics MA, RSI, MACD, MVRV, SOPR, NUPL (20 modules)\n equity_fundamentals Income, balance sheet, PE, ROE (31 modules)\n equity_estimates_and_targets Analyst targets, consensus estimates\n equity_ownership_and_flow Insider trades, senator trading, institutions\n macro_and_economics_data CPI, GDP, Treasury rates, VIX (20 modules)\n technical_indicator_calculation_helpers 50+ pure calculators (RSI, MACD, Bollinger)\n\nExamples:\n alva sdk partitions\n alva sdk partition-summary --partition spot_market_price_and_volume\n alva sdk doc --name \"@arrays/crypto/ohlcv:v1.0.0\"\n alva sdk doc --name \"@arrays/data/stock/ohlcv:v1.0.0\"`,\n\n comments: `Usage: alva comments <subcommand> [options]\n\nManage comments on Alva playbooks. Supports top-level comments and threaded\nreplies. One comment per playbook can be pinned (pinning a new one unpins\nthe previous).\n\nSubcommands:\n create Post a comment on a playbook (or reply to an existing comment)\n pin Pin a top-level comment (owner/admin only)\n unpin Unpin a comment (owner/admin only)\n\nCreate flags:\n --username <user> Playbook owner's username (required)\n --name <name> Playbook name (required)\n --content <text> Comment content (required)\n --parent-id <id> Parent comment ID (for threaded replies, omit for top-level)\n\nPin/Unpin flags:\n --comment-id <id> Comment ID (required)\n\nExamples:\n alva comments create --username alice --name btc-dashboard --content \"Great analysis!\"\n alva comments create --username alice --name btc-dashboard --content \"Thanks!\" --parent-id 5\n alva comments pin --comment-id 12\n alva comments unpin --comment-id 12`,\n\n remix: `Usage: alva remix --child-username <u> --child-name <n> --parents <json>\n\nRecord remix lineage when creating a playbook based on existing playbooks.\nCall this after releasing a remixed playbook to establish the parent-child\nrelationship in the database.\n\nRequired:\n --child-username <username> Your username (the remixer)\n --child-name <name> Your new playbook name\n --parents <json> JSON array of source playbooks: [{\"username\":\"...\", \"name\":\"...\"}]\n\nExamples:\n alva remix --child-username bob --child-name my-btc --parents '[{\"username\":\"alice\",\"name\":\"btc-signals\"}]'`,\n\n screenshot: `Usage: alva screenshot --url <url> --out <file> [--selector <css>] [--xpath <xpath>]\n\nCapture a screenshot of an Alva page and save it as PNG. Useful for verifying\nplaybook rendering before release.\n\nRequired:\n --url <url> URL or path to capture (e.g. /playbook/alice/dashboard)\n --out <file> Local file path to write the PNG output\n\nOptional:\n --selector <css> CSS selector to capture a specific element\n --xpath <xpath> XPath selector to capture a specific element\n\nExamples:\n alva screenshot --url /playbook/alice/btc-dashboard --out dashboard.png\n alva screenshot --url /playbook/alice/btc-dashboard --out chart.png --selector \".chart-container\"`,\n};\n\ninterface WriteConfigDeps {\n env: Record<string, string | undefined>;\n homedir: () => string;\n mkdir: (path: string, options: { recursive: boolean }) => Promise<void>;\n writeFile: (\n path: string,\n data: string,\n options: { mode: number }\n ) => Promise<void>;\n readFile: (path: string) => Promise<string>;\n}\n\nexport async function handleConfigure(\n args: string[],\n deps?: WriteConfigDeps\n): Promise<{\n status: string;\n apiKey: string;\n baseUrl?: string;\n profile: string;\n}> {\n const flags = parseFlags(args.slice(1));\n const apiKey = flags['api-key'];\n if (!apiKey) {\n throw new Error(\n '--api-key is required. Usage: alva configure --api-key <key> [--base-url <url>] [--profile <name>]'\n );\n }\n if (!apiKey.startsWith('alva_')) {\n process.stderr?.write?.(\n 'Warning: API key does not start with \"alva_\". This may not be a valid Alva API key.\\n'\n );\n }\n\n const baseUrl = flags['base-url'];\n const profileName = flags['profile'] || 'default';\n const configInput: { apiKey: string; baseUrl?: string } = { apiKey };\n if (baseUrl) configInput.baseUrl = baseUrl;\n\n const writeDeps = deps ?? {\n env: process.env as Record<string, string | undefined>,\n homedir: () => os.homedir(),\n mkdir: (path: string, options: { recursive: boolean }) =>\n fsPromises.mkdir(path, options).then(() => undefined),\n writeFile: (path: string, data: string, options: { mode: number }) =>\n fsPromises.writeFile(path, data, options).then(() => undefined),\n readFile: (path: string) => fsPromises.readFile(path, 'utf-8'),\n };\n\n const result = await writeConfig(configInput, writeDeps, profileName);\n return {\n status: 'configured',\n apiKey: result.apiKey!,\n baseUrl: result.baseUrl,\n profile: profileName,\n };\n}\n\nconst BOOLEAN_FLAGS = new Set([\n 'recursive',\n 'mkdir-parents',\n 'push-notify',\n 'help',\n]);\n\nfunction parseFlags(argv: string[]): Record<string, string> {\n const flags: Record<string, string> = {};\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg.startsWith('--no-') && BOOLEAN_FLAGS.has(arg.slice(5))) {\n flags[arg.slice(5)] = 'false';\n } else if (arg.startsWith('--')) {\n const eqIdx = arg.indexOf('=');\n if (eqIdx !== -1) {\n flags[arg.slice(2, eqIdx)] = arg.slice(eqIdx + 1);\n } else if (BOOLEAN_FLAGS.has(arg.slice(2))) {\n flags[arg.slice(2)] = 'true';\n } else if (i + 1 < argv.length) {\n flags[arg.slice(2)] = argv[i + 1];\n i++;\n }\n }\n }\n return flags;\n}\n\nfunction boolFlag(val: string | undefined): boolean | undefined {\n if (val === 'true') return true;\n if (val === 'false') return false;\n return undefined;\n}\n\nfunction requireFlag(\n flags: Record<string, string>,\n name: string,\n command: string\n): string {\n const val = flags[name];\n if (val === undefined) {\n throw new Error(`--${name} is required for '${command}'`);\n }\n return val;\n}\n\nfunction requireNumericFlag(\n flags: Record<string, string>,\n name: string,\n command: string\n): number {\n const val = requireFlag(flags, name, command);\n const n = Number(val);\n if (Number.isNaN(n)) {\n throw new Error(\n `--${name} must be a number for '${command}', got '${val}'`\n );\n }\n return n;\n}\n\nfunction num(val: string | undefined): number | undefined {\n if (val === undefined) return undefined;\n const n = Number(val);\n return Number.isNaN(n) ? undefined : n;\n}\n\nfunction jsonParse(val: string | undefined): unknown {\n if (val === undefined) return undefined;\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n}\n\nexport async function dispatch(\n client: AlvaClient,\n args: string[],\n meta?: { profile?: string; baseUrl?: string; cliVersion?: string }\n): Promise<unknown> {\n const group = args[0];\n\n if (!group || group === '--help' || group === '-h') {\n return { _help: true, text: HELP_TEXT };\n }\n\n // Per-command help: alva <command> --help\n if (COMMAND_HELP[group] && (args[1] === '--help' || args[1] === '-h')) {\n return { _help: true, text: COMMAND_HELP[group] };\n }\n\n // whoami: verify credentials and show user info\n if (group === 'whoami') {\n const user = await client.user.me();\n const record = user as unknown as Record<string, unknown>;\n const version = meta?.cliVersion ?? CLI_VERSION;\n const result: Record<string, unknown> = {\n ...record,\n _meta: {\n profile: meta?.profile ?? 'default',\n endpoint: meta?.baseUrl ?? client.baseUrl,\n },\n };\n const minVersion = record.toolkit_min_version;\n if (\n typeof minVersion === 'string' &&\n version &&\n version !== 'dev' &&\n isVersionOlderThan(version, minVersion)\n ) {\n result._warning =\n `Warning: your toolkit version (${version}) is older than the minimum recommended version (${minVersion}). ` +\n `Please upgrade: npm install -g @alva-ai/toolkit`;\n }\n return result;\n }\n\n const subcommand = args[1];\n const flags = parseFlags(\n args.slice(\n group === 'run' || group === 'remix' || group === 'screenshot' ? 1 : 2\n )\n );\n\n // Also check for --help in flags (e.g. alva fs read --help)\n if (flags['help'] !== undefined) {\n const helpText = COMMAND_HELP[group];\n if (helpText) return { _help: true, text: helpText };\n }\n\n switch (group) {\n case 'user':\n if (!subcommand) throw new Error('Missing subcommand for user');\n if (subcommand === 'me') return client.user.me();\n throw new Error(`Unknown subcommand: user ${subcommand}`);\n\n case 'fs': {\n if (!subcommand) throw new Error('Missing subcommand for fs');\n switch (subcommand) {\n case 'read':\n return client.fs.read({\n path: requireFlag(flags, 'path', 'fs read'),\n offset: num(flags['offset']),\n size: num(flags['size']),\n });\n case 'write':\n if (flags['file']) {\n const fileData = fs.readFileSync(flags['file']);\n return client.fs.rawWrite({\n path: requireFlag(flags, 'path', 'fs write'),\n body: fileData as unknown as BodyInit,\n mkdir_parents: boolFlag(flags['mkdir-parents']) ?? true,\n });\n }\n return client.fs.write({\n path: requireFlag(flags, 'path', 'fs write'),\n data: requireFlag(flags, 'data', 'fs write'),\n mkdir_parents: boolFlag(flags['mkdir-parents']) ?? true,\n });\n case 'stat':\n return client.fs.stat({\n path: requireFlag(flags, 'path', 'fs stat'),\n });\n case 'readdir':\n return client.fs.readdir({\n path: requireFlag(flags, 'path', 'fs readdir'),\n recursive: boolFlag(flags['recursive']),\n });\n case 'mkdir':\n return client.fs.mkdir({\n path: requireFlag(flags, 'path', 'fs mkdir'),\n });\n case 'remove':\n return client.fs.remove({\n path: requireFlag(flags, 'path', 'fs remove'),\n recursive: boolFlag(flags['recursive']),\n });\n case 'rename':\n return client.fs.rename({\n old_path: requireFlag(flags, 'old-path', 'fs rename'),\n new_path: requireFlag(flags, 'new-path', 'fs rename'),\n });\n case 'copy':\n return client.fs.copy({\n src_path: requireFlag(flags, 'src-path', 'fs copy'),\n dst_path: requireFlag(flags, 'dst-path', 'fs copy'),\n });\n case 'symlink':\n return client.fs.symlink({\n target_path: requireFlag(flags, 'target-path', 'fs symlink'),\n link_path: requireFlag(flags, 'link-path', 'fs symlink'),\n });\n case 'readlink':\n return client.fs.readlink({\n path: requireFlag(flags, 'path', 'fs readlink'),\n });\n case 'chmod':\n return client.fs.chmod({\n path: requireFlag(flags, 'path', 'fs chmod'),\n mode: parseInt(requireFlag(flags, 'mode', 'fs chmod'), 8),\n });\n case 'grant':\n return client.fs.grant({\n path: requireFlag(flags, 'path', 'fs grant'),\n subject: requireFlag(flags, 'subject', 'fs grant'),\n permission: requireFlag(flags, 'permission', 'fs grant'),\n });\n case 'revoke':\n return client.fs.revoke({\n path: requireFlag(flags, 'path', 'fs revoke'),\n subject: requireFlag(flags, 'subject', 'fs revoke'),\n permission: requireFlag(flags, 'permission', 'fs revoke'),\n });\n default:\n throw new Error(`Unknown subcommand: fs ${subcommand}`);\n }\n }\n\n case 'run':\n return client.run.execute({\n code: flags['code'],\n entry_path: flags['entry-path'],\n working_dir: flags['working-dir'],\n args: jsonParse(flags['args']) as Record<string, unknown> | undefined,\n });\n\n case 'deploy': {\n if (!subcommand) throw new Error('Missing subcommand for deploy');\n switch (subcommand) {\n case 'create':\n return client.deploy.create({\n name: requireFlag(flags, 'name', 'deploy create'),\n path: requireFlag(flags, 'path', 'deploy create'),\n cron_expression: requireFlag(flags, 'cron', 'deploy create'),\n args: jsonParse(flags['args']) as\n | Record<string, unknown>\n | undefined,\n push_notify: boolFlag(flags['push-notify']),\n });\n case 'list':\n return client.deploy.list({\n limit: num(flags['limit']),\n cursor: flags['cursor'],\n });\n case 'get':\n return client.deploy.get({\n id: requireNumericFlag(flags, 'id', 'deploy get'),\n });\n case 'update':\n return client.deploy.update({\n id: requireNumericFlag(flags, 'id', 'deploy update'),\n name: flags['name'],\n cron_expression: flags['cron'],\n args: jsonParse(flags['args']) as\n | Record<string, unknown>\n | undefined,\n push_notify: boolFlag(flags['push-notify']),\n });\n case 'delete':\n return client.deploy.delete({\n id: requireNumericFlag(flags, 'id', 'deploy delete'),\n });\n case 'pause':\n return client.deploy.pause({\n id: requireNumericFlag(flags, 'id', 'deploy pause'),\n });\n case 'resume':\n return client.deploy.resume({\n id: requireNumericFlag(flags, 'id', 'deploy resume'),\n });\n default:\n throw new Error(`Unknown subcommand: deploy ${subcommand}`);\n }\n }\n\n case 'release': {\n if (!subcommand) throw new Error('Missing subcommand for release');\n switch (subcommand) {\n case 'feed':\n return client.release.feed({\n name: requireFlag(flags, 'name', 'release feed'),\n version: requireFlag(flags, 'version', 'release feed'),\n cronjob_id: requireNumericFlag(flags, 'cronjob-id', 'release feed'),\n view_json: jsonParse(flags['view-json']) as\n | Record<string, unknown>\n | undefined,\n description: flags['description'],\n });\n case 'playbook-draft':\n return client.release.playbookDraft({\n name: requireFlag(flags, 'name', 'release playbook-draft'),\n display_name: requireFlag(\n flags,\n 'display-name',\n 'release playbook-draft'\n ),\n description: flags['description'],\n feeds: jsonParse(\n requireFlag(flags, 'feeds', 'release playbook-draft')\n ) as Array<{\n feed_id: number;\n feed_major?: number;\n }>,\n trading_symbols: flags['trading-symbols']\n ? (jsonParse(flags['trading-symbols']) as string[])\n : undefined,\n changelog: requireFlag(\n flags,\n 'changelog',\n 'release playbook-draft'\n ),\n });\n case 'playbook':\n return client.release.playbook({\n name: requireFlag(flags, 'name', 'release playbook'),\n version: requireFlag(flags, 'version', 'release playbook'),\n feeds: jsonParse(\n requireFlag(flags, 'feeds', 'release playbook')\n ) as Array<{\n feed_id: number;\n feed_major?: number;\n }>,\n changelog: requireFlag(flags, 'changelog', 'release playbook'),\n });\n default:\n throw new Error(`Unknown subcommand: release ${subcommand}`);\n }\n }\n\n case 'secrets': {\n if (!subcommand) throw new Error('Missing subcommand for secrets');\n switch (subcommand) {\n case 'create':\n return client.secrets.create({\n name: requireFlag(flags, 'name', 'secrets create'),\n value: requireFlag(flags, 'value', 'secrets create'),\n });\n case 'list':\n return client.secrets.list();\n case 'get':\n return client.secrets.get({\n name: requireFlag(flags, 'name', 'secrets get'),\n });\n case 'update':\n return client.secrets.update({\n name: requireFlag(flags, 'name', 'secrets update'),\n value: requireFlag(flags, 'value', 'secrets update'),\n });\n case 'delete':\n return client.secrets.delete({\n name: requireFlag(flags, 'name', 'secrets delete'),\n });\n default:\n throw new Error(`Unknown subcommand: secrets ${subcommand}`);\n }\n }\n\n case 'sdk': {\n if (!subcommand) throw new Error('Missing subcommand for sdk');\n switch (subcommand) {\n case 'doc':\n return client.sdk.doc({\n name: requireFlag(flags, 'name', 'sdk doc'),\n });\n case 'partitions':\n return client.sdk.partitions();\n case 'partition-summary':\n return client.sdk.partitionSummary({\n partition: requireFlag(flags, 'partition', 'sdk partition-summary'),\n });\n default:\n throw new Error(`Unknown subcommand: sdk ${subcommand}`);\n }\n }\n\n case 'comments': {\n if (!subcommand) throw new Error('Missing subcommand for comments');\n switch (subcommand) {\n case 'create':\n return client.comments.create({\n username: requireFlag(flags, 'username', 'comments create'),\n name: requireFlag(flags, 'name', 'comments create'),\n content: requireFlag(flags, 'content', 'comments create'),\n parent_id: num(flags['parent-id']),\n });\n case 'pin':\n return client.comments.pin({\n comment_id: requireNumericFlag(flags, 'comment-id', 'comments pin'),\n });\n case 'unpin':\n return client.comments.unpin({\n comment_id: requireNumericFlag(\n flags,\n 'comment-id',\n 'comments unpin'\n ),\n });\n default:\n throw new Error(`Unknown subcommand: comments ${subcommand}`);\n }\n }\n\n case 'remix':\n return client.remix.save({\n child: {\n username: requireFlag(flags, 'child-username', 'remix'),\n name: requireFlag(flags, 'child-name', 'remix'),\n },\n parents: jsonParse(requireFlag(flags, 'parents', 'remix')) as Array<{\n username: string;\n name: string;\n }>,\n });\n\n case 'screenshot': {\n const outFile = requireFlag(flags, 'out', 'screenshot');\n const result = await client.screenshot.capture({\n url: requireFlag(flags, 'url', 'screenshot'),\n selector: flags['selector'],\n xpath: flags['xpath'],\n });\n const buf = Buffer.from(result as ArrayBuffer);\n fs.writeFileSync(outFile, buf);\n return { written: outFile, bytes: buf.length };\n }\n\n default:\n throw new Error(\n `Unknown command: '${group}'. Run 'alva --help' to see available commands.`\n );\n }\n}\n\nasync function main() {\n try {\n const rawArgs = process.argv.slice(2);\n\n // Handle --version before loading config (doesn't need auth)\n if (rawArgs[0] === '-v' || rawArgs[0] === '--version') {\n process.stdout.write(`alva version ${CLI_VERSION}\\n`);\n return;\n }\n\n // Handle configure before loading config (doesn't need existing auth)\n if (rawArgs[0] === 'configure') {\n if (rawArgs[1] === '--help' || rawArgs[1] === '-h') {\n process.stdout.write(COMMAND_HELP['configure'] + '\\n');\n return;\n }\n const result = await handleConfigure(rawArgs);\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n');\n return;\n }\n\n const config = loadConfig({\n argv: rawArgs,\n env: process.env as Record<string, string | undefined>,\n readFile: (path: string) => fs.readFileSync(path, 'utf-8'),\n homedir: () => os.homedir(),\n });\n\n const client = new AlvaClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n });\n\n // Remove global flags (--api-key, --base-url, --profile and their values)\n const cleanArgs: string[] = [];\n for (let i = 0; i < rawArgs.length; i++) {\n const a = rawArgs[i];\n if (a === '--api-key' || a === '--base-url' || a === '--profile') {\n i++; // skip the next arg (the value)\n continue;\n }\n if (\n a.startsWith('--api-key=') ||\n a.startsWith('--base-url=') ||\n a.startsWith('--profile=')\n ) {\n continue;\n }\n cleanArgs.push(a);\n }\n\n const result = await dispatch(client, cleanArgs, {\n profile: config.profile,\n baseUrl: config.baseUrl,\n cliVersion: CLI_VERSION,\n });\n if (result && typeof result === 'object' && '_warning' in result) {\n process.stderr.write(\n (result as unknown as { _warning: string })._warning + '\\n'\n );\n delete (result as Record<string, unknown>)._warning;\n }\n if (result && typeof result === 'object' && '_help' in result) {\n const helpResult = result as unknown as { text: string };\n process.stdout.write(helpResult.text + '\\n');\n return;\n }\n if (result instanceof ArrayBuffer) {\n process.stdout.write(Buffer.from(result));\n return;\n }\n if (result !== undefined) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n');\n }\n } catch (err) {\n const error =\n err instanceof AlvaError\n ? { code: err.code, message: err.message, status: err.status }\n : {\n code: 'CLI_ERROR',\n message: err instanceof Error ? err.message : String(err),\n };\n process.stderr.write(JSON.stringify({ error }, null, 2) + '\\n');\n process.exit(1);\n }\n}\n\n// Run main() when executed as a script (node cli.js or via symlinked `alva` binary),\n// but not when imported for testing (vitest imports dispatch directly).\nconst isDirectRun =\n typeof process !== 'undefined' &&\n process.argv[1] &&\n (process.argv[1].endsWith('cli.mjs') ||\n process.argv[1].endsWith('cli.js') ||\n process.argv[1].endsWith('/alva') ||\n process.argv[1].endsWith('\\\\alva'));\nif (isDirectRun) {\n main();\n}\n"],"mappings":"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","names":["contentType","configDir","readFile","homedir","result"]}
|
|
1
|
+
{"version":3,"sources":["../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/cli/config.ts","../src/cli/index.ts"],"sourcesContent":["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","export interface CliConfig {\n apiKey?: string;\n baseUrl?: string;\n profile?: string;\n}\n\ninterface ProfileData {\n apiKey?: string;\n baseUrl?: string;\n}\n\ninterface ConfigFile {\n profiles?: Record<string, ProfileData>;\n // Legacy flat fields (pre-profile format)\n apiKey?: string;\n baseUrl?: string;\n}\n\ninterface WriteConfigDeps {\n env: Record<string, string | undefined>;\n homedir: () => string;\n mkdir: (path: string, options: { recursive: boolean }) => Promise<void>;\n writeFile: (\n path: string,\n data: string,\n options: { mode: number }\n ) => Promise<void>;\n readFile: (path: string) => Promise<string>;\n}\n\nfunction configPath(deps: {\n env: Record<string, string | undefined>;\n homedir: () => string;\n}): string {\n const configDir = deps.env.XDG_CONFIG_HOME || `${deps.homedir()}/.config`;\n return `${configDir}/alva/config.json`;\n}\n\nfunction configDir(deps: {\n env: Record<string, string | undefined>;\n homedir: () => string;\n}): string {\n const configRoot = deps.env.XDG_CONFIG_HOME || `${deps.homedir()}/.config`;\n return `${configRoot}/alva`;\n}\n\n/**\n * Read and normalize config file. Handles both legacy flat format\n * and new profile-based format.\n */\nfunction readConfigFile(raw: string): ConfigFile {\n const parsed = JSON.parse(raw);\n return parsed as ConfigFile;\n}\n\n/**\n * Extract profile data from a config file. Handles migration from\n * legacy flat format (apiKey at root) to profile-based format.\n */\nfunction getProfile(config: ConfigFile, profileName: string): ProfileData {\n // New format: profiles map\n if (config.profiles && config.profiles[profileName]) {\n return config.profiles[profileName];\n }\n // Legacy flat format: treat root-level apiKey/baseUrl as \"default\" profile\n if (profileName === 'default' && config.apiKey) {\n return { apiKey: config.apiKey, baseUrl: config.baseUrl };\n }\n return {};\n}\n\nexport async function writeConfig(\n config: { apiKey: string; baseUrl?: string },\n deps: WriteConfigDeps,\n profileName: string = 'default'\n): Promise<CliConfig> {\n const path = configPath(deps);\n const dir = configDir(deps);\n\n // Read existing config\n let existing: ConfigFile = {};\n try {\n const raw = await deps.readFile(path);\n existing = readConfigFile(raw);\n } catch {\n // File doesn't exist or can't be parsed — start fresh\n }\n\n // Migrate legacy flat format to profiles\n if (!existing.profiles) {\n existing.profiles = {};\n if (existing.apiKey) {\n existing.profiles['default'] = {\n apiKey: existing.apiKey,\n baseUrl: existing.baseUrl,\n };\n }\n }\n\n // Update the target profile\n const profileData: ProfileData = {\n ...(existing.profiles[profileName] || {}),\n apiKey: config.apiKey,\n };\n if (config.baseUrl) {\n profileData.baseUrl = config.baseUrl;\n } else if (!existing.profiles[profileName]?.baseUrl) {\n delete profileData.baseUrl;\n }\n existing.profiles[profileName] = profileData;\n\n // Write clean format (profiles only, no legacy root fields)\n const output: ConfigFile = { profiles: existing.profiles };\n await deps.mkdir(dir, { recursive: true });\n await deps.writeFile(path, JSON.stringify(output, null, 2) + '\\n', {\n mode: 0o600,\n });\n\n return {\n apiKey: profileData.apiKey,\n baseUrl: profileData.baseUrl,\n profile: profileName,\n };\n}\n\ninterface ConfigDeps {\n argv: string[];\n env: Record<string, string | undefined>;\n readFile: (path: string) => string;\n homedir: () => string;\n}\n\nfunction parseFlag(argv: string[], flag: string): string | undefined {\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === flag && i + 1 < argv.length) {\n return argv[i + 1];\n }\n if (argv[i].startsWith(`${flag}=`)) {\n return argv[i].slice(flag.length + 1);\n }\n }\n return undefined;\n}\n\nexport function loadConfig(deps: ConfigDeps): CliConfig {\n const { argv, env, readFile, homedir } = deps;\n\n // Resolve profile name: flag > env > default\n const profileName =\n parseFlag(argv, '--profile') || env.ALVA_PROFILE || 'default';\n\n // Resolve base URL: flag > env > file > default\n const baseUrlFlag = parseFlag(argv, '--base-url');\n const baseUrlEnv = env.ALVA_ENDPOINT;\n\n // Resolve API key: flag > env > file\n const apiKeyFlag = parseFlag(argv, '--api-key');\n const apiKeyEnv = env.ALVA_API_KEY;\n\n // Read config file\n let fileProfile: ProfileData = {};\n const path = configPath({ env, homedir });\n try {\n const raw = readFile(path);\n let config: ConfigFile;\n try {\n config = readConfigFile(raw);\n } catch {\n throw new Error(`Failed to parse ${path}: invalid JSON`);\n }\n fileProfile = getProfile(config, profileName);\n } catch (e) {\n if (e instanceof Error && e.message.startsWith('Failed to parse')) {\n throw e;\n }\n // File not found — that's fine\n }\n\n return {\n apiKey: apiKeyFlag ?? apiKeyEnv ?? fileProfile.apiKey,\n baseUrl: baseUrlFlag ?? baseUrlEnv ?? fileProfile.baseUrl,\n profile: profileName,\n };\n}\n","import { AlvaClient } from '../client.js';\nimport { AlvaError } from '../error.js';\nimport { loadConfig, writeConfig } from './config.js';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as fsPromises from 'fs/promises';\n\ndeclare const __VERSION__: string;\nexport const CLI_VERSION: string =\n typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'dev';\n\n/**\n * Returns true if version `a` is strictly older than version `b`.\n * Compares major.minor.patch as integers. Returns false on malformed input.\n */\nexport function isVersionOlderThan(a: string, b: string): boolean {\n const parse = (v: string): number[] | null => {\n if (!v) return null;\n const parts = v.split('.').map(Number);\n if (parts.some(isNaN)) return null;\n while (parts.length < 3) parts.push(0);\n return parts;\n };\n const pa = parse(a);\n const pb = parse(b);\n if (!pa || !pb) return false;\n for (let i = 0; i < 3; i++) {\n if (pa[i] < pb[i]) return true;\n if (pa[i] > pb[i]) return false;\n }\n return false;\n}\n\nconst HELP_TEXT = `Usage: alva <command> [options]\n\nCommands:\n configure Save API key and endpoint to a named profile\n whoami Verify credentials and show current user info\n user User profile operations\n fs Filesystem operations (read, write, stat, readdir, mkdir, remove, rename, copy, symlink, readlink, chmod, grant, revoke)\n run Execute code in the Alva runtime\n deploy Cronjob management (create, list, get, update, delete, pause, resume)\n release Feed and playbook releases (feed, playbook-draft, playbook)\n secrets Secret management (create, list, get, update, delete)\n sdk SDK documentation (doc, partitions, partition-summary)\n comments Playbook comments (create, pin, unpin)\n remix Save playbook remix lineage\n trading Trading operations (accounts, portfolio, orders, subscriptions, equity-history, risk-rules, subscribe, unsubscribe, execute, update-risk-rules)\n screenshot Capture a web screenshot as PNG\n\nGlobal options:\n --api-key <key> API key (overrides env and config file)\n --base-url <url> API base URL (overrides env and config file)\n --profile <name> Named profile to use (default: \"default\")\n -v, --version Show CLI version\n --help Show help (use 'alva <command> --help' for command details)\n\nConfig resolution: --api-key flag > ALVA_API_KEY env > profile in ~/.config/alva/config.json\nProfile resolution: --profile flag > ALVA_PROFILE env > \"default\"\n\nQuick start:\n npm install -g @alva-ai/toolkit\n alva configure --api-key alva_your_key_here\n alva whoami`;\n\nconst COMMAND_HELP: Record<string, string> = {\n configure: `Usage: alva configure --api-key <key> [--base-url <url>] [--profile <name>]\n\nSave API credentials to ~/.config/alva/config.json (mode 0600).\nAfter configuring, subsequent commands use the saved key automatically.\nMultiple profiles allow switching between environments (production, staging, etc.).\n\nRequired:\n --api-key <key> Your Alva API key (starts with \"alva_\")\n\nOptional:\n --base-url <url> API base URL (default: https://api-llm.prd.alva.ai)\n --profile <name> Profile name to save under (default: \"default\")\n\nConfig file format:\n {\n \"profiles\": {\n \"default\": { \"apiKey\": \"alva_...\", \"baseUrl\": \"https://api-llm.prd.alva.ai\" },\n \"staging\": { \"apiKey\": \"alva_...\", \"baseUrl\": \"https://api-llm.stg.alva.ai\" }\n }\n }\n\nExamples:\n alva configure --api-key alva_abc123\n alva configure --api-key alva_abc123 --base-url http://localhost:8080\n alva configure --profile staging --api-key alva_stg_key --base-url https://api-llm.stg.alva.ai\n alva --profile staging whoami`,\n\n whoami: `Usage: alva whoami [--profile <name>]\n\nVerify that your credentials are valid by calling the Alva API. Shows your\nusername, subscription tier, and which profile/endpoint is being used.\nUse this after 'alva configure' to confirm everything works.\n\nExamples:\n alva whoami\n alva --profile staging whoami`,\n\n user: `Usage: alva user <subcommand>\n\nSubcommands:\n me Get the authenticated user's profile\n\nResponse fields:\n id User ID\n username Username (used in ALFS paths and playbook URLs)\n subscription_tier \"free\" or \"pro\" — determines release flow and feature gates\n telegram_username Telegram username if connected, null otherwise\n\nExamples:\n alva user me`,\n\n fs: `Usage: alva fs <subcommand> [options]\n\nSubcommands:\n read Read a file or time series data\n write Write content to a file (use --data for inline, --file for upload)\n stat Get file metadata (name, size, mode, mod_time, is_dir)\n readdir List directory contents\n mkdir Create a directory (recursive by default)\n remove Delete a file or directory\n rename Move/rename a file\n copy Copy a file\n symlink Create a symbolic link\n readlink Read a symlink target\n chmod Change file permissions (mode is octal, e.g. 755)\n grant Grant access permission to a user or group\n revoke Revoke access permission\n\nCommon flags:\n --path <path> File or directory path (required for most subcommands)\n --recursive Enable recursive operation (readdir, remove)\n --no-recursive Disable recursive operation\n --mkdir-parents Create parent directories on write (default for write)\n --no-mkdir-parents Disable automatic parent directory creation on write\n\nPath conventions:\n ~/... Home-relative path (expands to /alva/home/<username>/...)\n /alva/home/alice/... Absolute path (required for public/unauthenticated reads)\n\nTime series reads:\n Paths under feed data directories support virtual suffixes:\n @last/{n} Last N data points (chronological order)\n @range/{start}..{end} Between timestamps (RFC 3339 or Unix ms)\n @range/{duration} Recent data within duration (e.g. 7d, 1h)\n @count Data point count\n @now Latest single data point\n\nGrant/revoke subjects:\n special:user:* Public (anyone, including unauthenticated)\n special:user:+ Any authenticated user\n user:<id> Specific user by ID\n\nExamples:\n alva fs readdir --path ~/\n alva fs readdir --path ~/data --recursive\n alva fs read --path ~/data/prices.json\n alva fs read --path ~/feeds/btc-ema/v1/data/metrics/prices/@last/100\n alva fs read --path /alva/home/alice/feeds/btc-ema/v1/data/metrics/prices/@last/10\n alva fs write --path ~/hello.txt --data \"Hello, world!\"\n alva fs write --path ~/feeds/my-feed/v1/src/index.js --file ./local-script.js --mkdir-parents\n alva fs stat --path ~/hello.txt\n alva fs mkdir --path ~/feeds/my-feed/v1/src\n alva fs remove --path ~/old-folder --recursive\n alva fs rename --old-path ~/a.txt --new-path ~/b.txt\n alva fs copy --src-path ~/a.txt --dst-path ~/b.txt\n alva fs chmod --path ~/script.js --mode 755\n alva fs grant --path ~/feeds/btc-ema --subject \"special:user:*\" --permission read\n alva fs revoke --path ~/feeds/btc-ema --subject \"special:user:*\" --permission read`,\n\n run: `Usage: alva run [options]\n\nExecute JavaScript code in the Alva V8 runtime. Provide either inline code\nor a path to a script file on ALFS. Scripts have access to 250+ financial\ndata SDKs, ALFS, HTTP networking, and the Feed SDK.\n\nOptions:\n --code <code> Inline JavaScript code to execute\n --entry-path <path> Path to a script file on ALFS (home-relative)\n --working-dir <dir> Working directory for require() (inline code only)\n --args <json> JSON object passed to require(\"env\").args\n\nAt least one of --code or --entry-path is required.\n\nResponse fields:\n result JSON-encoded return value of the script\n logs Captured stderr output\n status \"completed\" or \"failed\"\n error Error message (when status is \"failed\")\n\nAvailable runtime modules:\n require(\"alfs\") Cloud filesystem (absolute paths only)\n require(\"env\") userId, username, args from request\n require(\"net/http\") fetch(url, init) for HTTP requests\n require(\"secret-manager\") Read user-scoped third-party secrets\n require(\"@alva/feed\") Feed SDK for data pipelines\n require(\"@alva/algorithm\") 50+ technical indicators\n require(\"@alva/adk\") Agent SDK for LLM tool calling\n require(\"@arrays/...\") 250+ financial data SDKs\n\nConstraints:\n No top-level await — wrap in (async () => { ... })();\n No Node.js builtins (fs, path, http) — use alfs, net/http instead\n 2 GB heap limit per execution\n\nExamples:\n alva run --code \"1 + 2 + 3;\"\n alva run --code \"JSON.stringify(require('env').args);\" --args '{\"symbol\":\"BTC\"}'\n alva run --entry-path ~/feeds/my-feed/v1/src/index.js\n alva run --entry-path ~/tasks/analyze/src/index.js --args '{\"symbol\":\"NVDA\",\"limit\":50}'`,\n\n deploy: `Usage: alva deploy <subcommand> [options]\n\nManage scheduled cronjobs that run your scripts on a cron schedule.\nMax 20 cronjobs per user. Min interval: 1 minute.\n\nSubcommands:\n create Create a new cronjob\n list List all cronjobs (supports cursor-based pagination)\n get Get a single cronjob by ID\n update Update a cronjob (partial update — only include changed fields)\n delete Delete a cronjob\n pause Pause a running cronjob\n resume Resume a paused cronjob\n\nCreate flags:\n --name <name> Cronjob name (required, 1-63 lowercase alphanumeric/hyphens)\n --path <path> Path to script on ALFS (required, must exist)\n --cron <expression> Cron expression (required, e.g. \"0 */4 * * *\")\n --args <json> JSON object passed to require(\"env\").args\n --push-notify Enable Telegram push notifications on completion\n --no-push-notify Disable push notifications\n\nList flags:\n --limit <n> Max results per page (default: 20)\n --cursor <cursor> Pagination cursor from previous response\n\nGet/Update/Delete/Pause/Resume flags:\n --id <id> Cronjob ID (required)\n\nName format: 1-63 lowercase alphanumeric or hyphens, no leading/trailing hyphens.\n Valid: btc-ema-update, my-strategy-1\n Invalid: BTC EMA, -my-job-, my_job\n\nRecommended cron schedules:\n \"0 */4 * * *\" Every 4 hours (stock OHLCV, crypto technicals)\n \"0 8 * * *\" Daily at 8am (fundamentals, insider trades, earnings)\n \"*/5 * * * *\" Every 5 minutes (high-frequency alerts)\n \"0 0 * * *\" Daily at midnight (end-of-day summaries)\n\nExamples:\n alva deploy create --name btc-ema --path ~/feeds/btc-ema/v1/src/index.js --cron \"0 */4 * * *\"\n alva deploy create --name alert --path ~/feeds/alert/v1/src/index.js --cron \"*/5 * * * *\" --push-notify --args '{\"threshold\":100}'\n alva deploy list\n alva deploy list --limit 10\n alva deploy get --id 42\n alva deploy update --id 42 --cron \"0 */2 * * *\" --no-push-notify\n alva deploy pause --id 42\n alva deploy resume --id 42\n alva deploy delete --id 42`,\n\n release: `Usage: alva release <subcommand> [options]\n\nPublish feeds and playbooks to the Alva platform. The typical workflow:\n 1. Deploy cronjob (alva deploy create)\n 2. Register feed (alva release feed)\n 3. Create playbook draft (alva release playbook-draft)\n 4. Write HTML to ALFS (alva fs write --path ~/playbooks/{name}/index.html)\n 5. Release playbook (alva release playbook)\n\nSubcommands:\n feed Register a feed after deploying its cronjob\n playbook-draft Create a playbook draft (preview before publishing)\n playbook Publish a playbook (public for free users, choice for pro)\n\nFeed flags:\n --name <name> Feed name, unique per user (required)\n --version <version> Semantic version, e.g. \"1.0.0\" (required)\n --cronjob-id <id> ID of the backing cronjob (required)\n --view-json <json> View configuration JSON\n --description <text> Feed description\n\nPlaybook-draft flags:\n --name <name> URL-safe playbook name, unique per user (required)\n --display-name <name> Human-readable title, max 40 chars (required)\n --feeds <json> JSON array of {feed_id, feed_major?} (required)\n --changelog <text> Release changelog (required)\n --description <text> Playbook description\n --trading-symbols <json> JSON array of tickers, e.g. '[\"BTC\",\"ETH\"]' (max 50)\n\nPlaybook flags:\n --name <name> Playbook name, must already exist as draft (required)\n --version <version> Semantic version, e.g. \"v1.0.0\" (required)\n --feeds <json> JSON array of {feed_id, feed_major?} (required)\n --changelog <text> Release changelog (required)\n\nDisplay name conventions:\n Format: [subject/theme] [analysis angle/strategy logic]\n Max 40 characters. Avoid \"My\", \"Test\", or generic-only titles.\n Good: \"BTC Trend Dashboard\", \"NVDA Insider Activity Tracker\"\n Bad: \"My Dashboard\", \"Test V2\", \"Stock Dashboard\"\n\nExamples:\n alva release feed --name btc-ema --version 1.0.0 --cronjob-id 42\n alva release feed --name nvda-insiders --version 1.0.0 --cronjob-id 43 --description \"NVDA insider trading activity\"\n alva release playbook-draft --name btc-dashboard --display-name \"BTC Trend Dashboard\" --feeds '[{\"feed_id\":100}]' --changelog \"Initial release\" --trading-symbols '[\"BTC\"]'\n alva release playbook --name btc-dashboard --version v1.0.0 --feeds '[{\"feed_id\":100}]' --changelog \"Initial release\"`,\n\n secrets: `Usage: alva secrets <subcommand> [options]\n\nManage encrypted secrets for use in Alva scripts. Secrets are stored\nencrypted at rest and accessible via require(\"secret-manager\") in the runtime.\n\nFor sensitive secrets (API keys, tokens), prefer the web UI at https://alva.ai/apikey.\nUse the CLI for agent-managed CRUD operations.\n\nSubcommands:\n create Create a new secret (fails if name already exists)\n list List all secrets (metadata only: name, keyPrefix, timestamps)\n get Get a secret's plaintext value\n update Update a secret's value (fails if name doesn't exist)\n delete Delete a secret (fails if name doesn't exist)\n\nFlags:\n --name <name> Secret name (required for create, get, update, delete)\n --value <value> Secret value (required for create, update)\n\nRuntime usage in scripts:\n const secret = require(\"secret-manager\");\n const key = secret.loadPlaintext(\"OPENAI_API_KEY\");\n // Returns string if found, null if missing\n\nExamples:\n alva secrets create --name OPENAI_KEY --value sk-abc123\n alva secrets list\n alva secrets get --name OPENAI_KEY\n alva secrets update --name OPENAI_KEY --value sk-new456\n alva secrets delete --name OPENAI_KEY`,\n\n sdk: `Usage: alva sdk <subcommand> [options]\n\nBrowse Alva's 250+ financial data SDKs. Use the two-step discovery flow:\n 1. List partitions to find the right category\n 2. Get partition summary to see available modules\n 3. Get full documentation for a specific module\n\nSubcommands:\n doc Get documentation for a specific SDK module\n partitions List all available data partitions\n partition-summary Get a summary of modules in a partition\n\nFlags:\n --name <module> Module name for 'doc' (required)\n --partition <name> Partition name for 'partition-summary' (required)\n\nKey partitions:\n spot_market_price_and_volume Spot OHLCV for crypto and equities\n crypto_futures_data Perpetual futures, funding rates, OI\n crypto_technical_metrics MA, RSI, MACD, MVRV, SOPR, NUPL (20 modules)\n equity_fundamentals Income, balance sheet, PE, ROE (31 modules)\n equity_estimates_and_targets Analyst targets, consensus estimates\n equity_ownership_and_flow Insider trades, senator trading, institutions\n macro_and_economics_data CPI, GDP, Treasury rates, VIX (20 modules)\n technical_indicator_calculation_helpers 50+ pure calculators (RSI, MACD, Bollinger)\n\nExamples:\n alva sdk partitions\n alva sdk partition-summary --partition spot_market_price_and_volume\n alva sdk doc --name \"@arrays/crypto/ohlcv:v1.0.0\"\n alva sdk doc --name \"@arrays/data/stock/ohlcv:v1.0.0\"`,\n\n comments: `Usage: alva comments <subcommand> [options]\n\nManage comments on Alva playbooks. Supports top-level comments and threaded\nreplies. One comment per playbook can be pinned (pinning a new one unpins\nthe previous).\n\nSubcommands:\n create Post a comment on a playbook (or reply to an existing comment)\n pin Pin a top-level comment (owner/admin only)\n unpin Unpin a comment (owner/admin only)\n\nCreate flags:\n --username <user> Playbook owner's username (required)\n --name <name> Playbook name (required)\n --content <text> Comment content (required)\n --parent-id <id> Parent comment ID (for threaded replies, omit for top-level)\n\nPin/Unpin flags:\n --comment-id <id> Comment ID (required)\n\nExamples:\n alva comments create --username alice --name btc-dashboard --content \"Great analysis!\"\n alva comments create --username alice --name btc-dashboard --content \"Thanks!\" --parent-id 5\n alva comments pin --comment-id 12\n alva comments unpin --comment-id 12`,\n\n remix: `Usage: alva remix --child-username <u> --child-name <n> --parents <json>\n\nRecord remix lineage when creating a playbook based on existing playbooks.\nCall this after releasing a remixed playbook to establish the parent-child\nrelationship in the database.\n\nRequired:\n --child-username <username> Your username (the remixer)\n --child-name <name> Your new playbook name\n --parents <json> JSON array of source playbooks: [{\"username\":\"...\", \"name\":\"...\"}]\n\nExamples:\n alva remix --child-username bob --child-name my-btc --parents '[{\"username\":\"alice\",\"name\":\"btc-signals\"}]'`,\n\n screenshot: `Usage: alva screenshot --url <url> --out <file> [--selector <css>] [--xpath <xpath>]\n\nCapture a screenshot of an Alva page and save it as PNG. Useful for verifying\nplaybook rendering before release.\n\nRequired:\n --url <url> URL or path to capture (e.g. /playbook/alice/dashboard)\n --out <file> Local file path to write the PNG output\n\nOptional:\n --selector <css> CSS selector to capture a specific element\n --xpath <xpath> XPath selector to capture a specific element\n\nExamples:\n alva screenshot --url /playbook/alice/btc-dashboard --out dashboard.png\n alva screenshot --url /playbook/alice/btc-dashboard --out chart.png --selector \".chart-container\"`,\n\n trading: `Usage: alva trading <subcommand> [options]\n\nManage trading accounts, portfolios, orders, subscriptions, and risk rules.\n\nSubcommands:\n accounts List all trading accounts\n portfolio Get portfolio for an account\n orders List orders for an account\n subscriptions List subscriptions for an account\n equity-history Get equity history for an account\n risk-rules Show risk rules\n subscribe Subscribe an account to a source feed\n unsubscribe Unsubscribe by subscription ID\n execute Execute a signal on an account\n update-risk-rules Update risk rules\n\nPortfolio/Orders/Subscriptions/Equity-history flags:\n --account-id <id> Trading account ID (required)\n\nOrders optional flags:\n --limit <n> Max results\n --source <source> Filter by source\n --since <timestamp> Filter orders since timestamp\n\nEquity-history optional flags:\n --timeframe <tf> Timeframe (e.g. \"1d\", \"1h\")\n --since-ms <ms> Start timestamp in ms\n --until-ms <ms> End timestamp in ms\n\nSubscribe flags:\n --account-id <id> Account ID (required)\n --source-username <user> Source username (required)\n --source-feed <feed> Source feed (required)\n --playbook-id <id> Playbook ID (required)\n --playbook-version <ver> Playbook version (required)\n --execute-latest Execute latest signal on subscribe\n\nUnsubscribe flags:\n --subscription-id <id> Subscription ID (required)\n\nExecute flags:\n --account-id <id> Account ID (required)\n --signal <json> Signal JSON (required)\n --dry-run Dry run mode\n --source-username <user> Source username (optional)\n --source-feed <feed> Source feed (optional)\n\nUpdate-risk-rules flags:\n --max-single-order-value <n> Max single order value (required)\n --max-single-order-enabled <bool> Max single order enabled (required)\n --max-daily-turnover-value <n> Max daily turnover value (required)\n --max-daily-turnover-enabled <bool> Max daily turnover enabled (required)\n --max-daily-orders-value <n> Max daily orders value (required)\n --max-daily-orders-enabled <bool> Max daily orders enabled (required)\n\nExamples:\n alva trading accounts\n alva trading portfolio --account-id acc_123\n alva trading orders --account-id acc_123 --limit 10\n alva trading subscriptions --account-id acc_123\n alva trading equity-history --account-id acc_123 --timeframe 1d\n alva trading risk-rules\n alva trading subscribe --account-id acc_123 --source-username alice --source-feed btc-signals --playbook-id pb_1 --playbook-version v1.0.0\n alva trading unsubscribe --subscription-id sub_456\n alva trading execute --account-id acc_123 --signal '{\"symbol\":\"BTC\",\"side\":\"buy\",\"qty\":0.1}' --dry-run\n 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`,\n};\n\ninterface WriteConfigDeps {\n env: Record<string, string | undefined>;\n homedir: () => string;\n mkdir: (path: string, options: { recursive: boolean }) => Promise<void>;\n writeFile: (\n path: string,\n data: string,\n options: { mode: number }\n ) => Promise<void>;\n readFile: (path: string) => Promise<string>;\n}\n\nexport async function handleConfigure(\n args: string[],\n deps?: WriteConfigDeps\n): Promise<{\n status: string;\n apiKey: string;\n baseUrl?: string;\n profile: string;\n}> {\n const flags = parseFlags(args.slice(1));\n const apiKey = flags['api-key'];\n if (!apiKey) {\n throw new Error(\n '--api-key is required. Usage: alva configure --api-key <key> [--base-url <url>] [--profile <name>]'\n );\n }\n if (!apiKey.startsWith('alva_')) {\n process.stderr?.write?.(\n 'Warning: API key does not start with \"alva_\". This may not be a valid Alva API key.\\n'\n );\n }\n\n const baseUrl = flags['base-url'];\n const profileName = flags['profile'] || 'default';\n const configInput: { apiKey: string; baseUrl?: string } = { apiKey };\n if (baseUrl) configInput.baseUrl = baseUrl;\n\n const writeDeps = deps ?? {\n env: process.env as Record<string, string | undefined>,\n homedir: () => os.homedir(),\n mkdir: (path: string, options: { recursive: boolean }) =>\n fsPromises.mkdir(path, options).then(() => undefined),\n writeFile: (path: string, data: string, options: { mode: number }) =>\n fsPromises.writeFile(path, data, options).then(() => undefined),\n readFile: (path: string) => fsPromises.readFile(path, 'utf-8'),\n };\n\n const result = await writeConfig(configInput, writeDeps, profileName);\n return {\n status: 'configured',\n apiKey: result.apiKey!,\n baseUrl: result.baseUrl,\n profile: profileName,\n };\n}\n\nconst BOOLEAN_FLAGS = new Set([\n 'recursive',\n 'mkdir-parents',\n 'push-notify',\n 'help',\n 'execute-latest',\n 'dry-run',\n]);\n\nfunction parseFlags(argv: string[]): Record<string, string> {\n const flags: Record<string, string> = {};\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg.startsWith('--no-') && BOOLEAN_FLAGS.has(arg.slice(5))) {\n flags[arg.slice(5)] = 'false';\n } else if (arg.startsWith('--')) {\n const eqIdx = arg.indexOf('=');\n if (eqIdx !== -1) {\n flags[arg.slice(2, eqIdx)] = arg.slice(eqIdx + 1);\n } else if (BOOLEAN_FLAGS.has(arg.slice(2))) {\n flags[arg.slice(2)] = 'true';\n } else if (i + 1 < argv.length) {\n flags[arg.slice(2)] = argv[i + 1];\n i++;\n }\n }\n }\n return flags;\n}\n\nfunction boolFlag(val: string | undefined): boolean | undefined {\n if (val === 'true') return true;\n if (val === 'false') return false;\n return undefined;\n}\n\nfunction requireFlag(\n flags: Record<string, string>,\n name: string,\n command: string\n): string {\n const val = flags[name];\n if (val === undefined) {\n throw new Error(`--${name} is required for '${command}'`);\n }\n return val;\n}\n\nfunction requireNumericFlag(\n flags: Record<string, string>,\n name: string,\n command: string\n): number {\n const val = requireFlag(flags, name, command);\n const n = Number(val);\n if (Number.isNaN(n)) {\n throw new Error(\n `--${name} must be a number for '${command}', got '${val}'`\n );\n }\n return n;\n}\n\nfunction num(val: string | undefined): number | undefined {\n if (val === undefined) return undefined;\n const n = Number(val);\n return Number.isNaN(n) ? undefined : n;\n}\n\nfunction jsonParse(val: string | undefined): unknown {\n if (val === undefined) return undefined;\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n}\n\nexport async function dispatch(\n client: AlvaClient,\n args: string[],\n meta?: { profile?: string; baseUrl?: string; cliVersion?: string }\n): Promise<unknown> {\n const group = args[0];\n\n if (!group || group === '--help' || group === '-h') {\n return { _help: true, text: HELP_TEXT };\n }\n\n // Per-command help: alva <command> --help\n if (COMMAND_HELP[group] && (args[1] === '--help' || args[1] === '-h')) {\n return { _help: true, text: COMMAND_HELP[group] };\n }\n\n // whoami: verify credentials and show user info\n if (group === 'whoami') {\n const user = await client.user.me();\n const record = user as unknown as Record<string, unknown>;\n const version = meta?.cliVersion ?? CLI_VERSION;\n const result: Record<string, unknown> = {\n ...record,\n _meta: {\n profile: meta?.profile ?? 'default',\n endpoint: meta?.baseUrl ?? client.baseUrl,\n },\n };\n const minVersion = record.toolkit_min_version;\n if (\n typeof minVersion === 'string' &&\n version &&\n version !== 'dev' &&\n isVersionOlderThan(version, minVersion)\n ) {\n result._warning =\n `Warning: your toolkit version (${version}) is older than the minimum recommended version (${minVersion}). ` +\n `Please upgrade: npm install -g @alva-ai/toolkit`;\n }\n return result;\n }\n\n const subcommand = args[1];\n const flags = parseFlags(\n args.slice(\n group === 'run' || group === 'remix' || group === 'screenshot' ? 1 : 2\n )\n );\n\n // Also check for --help in flags (e.g. alva fs read --help)\n if (flags['help'] !== undefined) {\n const helpText = COMMAND_HELP[group];\n if (helpText) return { _help: true, text: helpText };\n }\n\n switch (group) {\n case 'user':\n if (!subcommand) throw new Error('Missing subcommand for user');\n if (subcommand === 'me') return client.user.me();\n throw new Error(`Unknown subcommand: user ${subcommand}`);\n\n case 'fs': {\n if (!subcommand) throw new Error('Missing subcommand for fs');\n switch (subcommand) {\n case 'read':\n return client.fs.read({\n path: requireFlag(flags, 'path', 'fs read'),\n offset: num(flags['offset']),\n size: num(flags['size']),\n });\n case 'write':\n if (flags['file']) {\n const fileData = fs.readFileSync(flags['file']);\n return client.fs.rawWrite({\n path: requireFlag(flags, 'path', 'fs write'),\n body: fileData as unknown as BodyInit,\n mkdir_parents: boolFlag(flags['mkdir-parents']) ?? true,\n });\n }\n return client.fs.write({\n path: requireFlag(flags, 'path', 'fs write'),\n data: requireFlag(flags, 'data', 'fs write'),\n mkdir_parents: boolFlag(flags['mkdir-parents']) ?? true,\n });\n case 'stat':\n return client.fs.stat({\n path: requireFlag(flags, 'path', 'fs stat'),\n });\n case 'readdir':\n return client.fs.readdir({\n path: requireFlag(flags, 'path', 'fs readdir'),\n recursive: boolFlag(flags['recursive']),\n });\n case 'mkdir':\n return client.fs.mkdir({\n path: requireFlag(flags, 'path', 'fs mkdir'),\n });\n case 'remove':\n return client.fs.remove({\n path: requireFlag(flags, 'path', 'fs remove'),\n recursive: boolFlag(flags['recursive']),\n });\n case 'rename':\n return client.fs.rename({\n old_path: requireFlag(flags, 'old-path', 'fs rename'),\n new_path: requireFlag(flags, 'new-path', 'fs rename'),\n });\n case 'copy':\n return client.fs.copy({\n src_path: requireFlag(flags, 'src-path', 'fs copy'),\n dst_path: requireFlag(flags, 'dst-path', 'fs copy'),\n });\n case 'symlink':\n return client.fs.symlink({\n target_path: requireFlag(flags, 'target-path', 'fs symlink'),\n link_path: requireFlag(flags, 'link-path', 'fs symlink'),\n });\n case 'readlink':\n return client.fs.readlink({\n path: requireFlag(flags, 'path', 'fs readlink'),\n });\n case 'chmod':\n return client.fs.chmod({\n path: requireFlag(flags, 'path', 'fs chmod'),\n mode: parseInt(requireFlag(flags, 'mode', 'fs chmod'), 8),\n });\n case 'grant':\n return client.fs.grant({\n path: requireFlag(flags, 'path', 'fs grant'),\n subject: requireFlag(flags, 'subject', 'fs grant'),\n permission: requireFlag(flags, 'permission', 'fs grant'),\n });\n case 'revoke':\n return client.fs.revoke({\n path: requireFlag(flags, 'path', 'fs revoke'),\n subject: requireFlag(flags, 'subject', 'fs revoke'),\n permission: requireFlag(flags, 'permission', 'fs revoke'),\n });\n default:\n throw new Error(`Unknown subcommand: fs ${subcommand}`);\n }\n }\n\n case 'run':\n return client.run.execute({\n code: flags['code'],\n entry_path: flags['entry-path'],\n working_dir: flags['working-dir'],\n args: jsonParse(flags['args']) as Record<string, unknown> | undefined,\n });\n\n case 'deploy': {\n if (!subcommand) throw new Error('Missing subcommand for deploy');\n switch (subcommand) {\n case 'create':\n return client.deploy.create({\n name: requireFlag(flags, 'name', 'deploy create'),\n path: requireFlag(flags, 'path', 'deploy create'),\n cron_expression: requireFlag(flags, 'cron', 'deploy create'),\n args: jsonParse(flags['args']) as\n | Record<string, unknown>\n | undefined,\n push_notify: boolFlag(flags['push-notify']),\n });\n case 'list':\n return client.deploy.list({\n limit: num(flags['limit']),\n cursor: flags['cursor'],\n });\n case 'get':\n return client.deploy.get({\n id: requireNumericFlag(flags, 'id', 'deploy get'),\n });\n case 'update':\n return client.deploy.update({\n id: requireNumericFlag(flags, 'id', 'deploy update'),\n name: flags['name'],\n cron_expression: flags['cron'],\n args: jsonParse(flags['args']) as\n | Record<string, unknown>\n | undefined,\n push_notify: boolFlag(flags['push-notify']),\n });\n case 'delete':\n return client.deploy.delete({\n id: requireNumericFlag(flags, 'id', 'deploy delete'),\n });\n case 'pause':\n return client.deploy.pause({\n id: requireNumericFlag(flags, 'id', 'deploy pause'),\n });\n case 'resume':\n return client.deploy.resume({\n id: requireNumericFlag(flags, 'id', 'deploy resume'),\n });\n default:\n throw new Error(`Unknown subcommand: deploy ${subcommand}`);\n }\n }\n\n case 'release': {\n if (!subcommand) throw new Error('Missing subcommand for release');\n switch (subcommand) {\n case 'feed':\n return client.release.feed({\n name: requireFlag(flags, 'name', 'release feed'),\n version: requireFlag(flags, 'version', 'release feed'),\n cronjob_id: requireNumericFlag(flags, 'cronjob-id', 'release feed'),\n view_json: jsonParse(flags['view-json']) as\n | Record<string, unknown>\n | undefined,\n description: flags['description'],\n });\n case 'playbook-draft':\n return client.release.playbookDraft({\n name: requireFlag(flags, 'name', 'release playbook-draft'),\n display_name: requireFlag(\n flags,\n 'display-name',\n 'release playbook-draft'\n ),\n description: flags['description'],\n feeds: jsonParse(\n requireFlag(flags, 'feeds', 'release playbook-draft')\n ) as Array<{\n feed_id: number;\n feed_major?: number;\n }>,\n trading_symbols: flags['trading-symbols']\n ? (jsonParse(flags['trading-symbols']) as string[])\n : undefined,\n changelog: requireFlag(\n flags,\n 'changelog',\n 'release playbook-draft'\n ),\n });\n case 'playbook':\n return client.release.playbook({\n name: requireFlag(flags, 'name', 'release playbook'),\n version: requireFlag(flags, 'version', 'release playbook'),\n feeds: jsonParse(\n requireFlag(flags, 'feeds', 'release playbook')\n ) as Array<{\n feed_id: number;\n feed_major?: number;\n }>,\n changelog: requireFlag(flags, 'changelog', 'release playbook'),\n });\n default:\n throw new Error(`Unknown subcommand: release ${subcommand}`);\n }\n }\n\n case 'secrets': {\n if (!subcommand) throw new Error('Missing subcommand for secrets');\n switch (subcommand) {\n case 'create':\n return client.secrets.create({\n name: requireFlag(flags, 'name', 'secrets create'),\n value: requireFlag(flags, 'value', 'secrets create'),\n });\n case 'list':\n return client.secrets.list();\n case 'get':\n return client.secrets.get({\n name: requireFlag(flags, 'name', 'secrets get'),\n });\n case 'update':\n return client.secrets.update({\n name: requireFlag(flags, 'name', 'secrets update'),\n value: requireFlag(flags, 'value', 'secrets update'),\n });\n case 'delete':\n return client.secrets.delete({\n name: requireFlag(flags, 'name', 'secrets delete'),\n });\n default:\n throw new Error(`Unknown subcommand: secrets ${subcommand}`);\n }\n }\n\n case 'sdk': {\n if (!subcommand) throw new Error('Missing subcommand for sdk');\n switch (subcommand) {\n case 'doc':\n return client.sdk.doc({\n name: requireFlag(flags, 'name', 'sdk doc'),\n });\n case 'partitions':\n return client.sdk.partitions();\n case 'partition-summary':\n return client.sdk.partitionSummary({\n partition: requireFlag(flags, 'partition', 'sdk partition-summary'),\n });\n default:\n throw new Error(`Unknown subcommand: sdk ${subcommand}`);\n }\n }\n\n case 'comments': {\n if (!subcommand) throw new Error('Missing subcommand for comments');\n switch (subcommand) {\n case 'create':\n return client.comments.create({\n username: requireFlag(flags, 'username', 'comments create'),\n name: requireFlag(flags, 'name', 'comments create'),\n content: requireFlag(flags, 'content', 'comments create'),\n parent_id: num(flags['parent-id']),\n });\n case 'pin':\n return client.comments.pin({\n comment_id: requireNumericFlag(flags, 'comment-id', 'comments pin'),\n });\n case 'unpin':\n return client.comments.unpin({\n comment_id: requireNumericFlag(\n flags,\n 'comment-id',\n 'comments unpin'\n ),\n });\n default:\n throw new Error(`Unknown subcommand: comments ${subcommand}`);\n }\n }\n\n case 'remix':\n return client.remix.save({\n child: {\n username: requireFlag(flags, 'child-username', 'remix'),\n name: requireFlag(flags, 'child-name', 'remix'),\n },\n parents: jsonParse(requireFlag(flags, 'parents', 'remix')) as Array<{\n username: string;\n name: string;\n }>,\n });\n\n case 'screenshot': {\n const outFile = requireFlag(flags, 'out', 'screenshot');\n const result = await client.screenshot.capture({\n url: requireFlag(flags, 'url', 'screenshot'),\n selector: flags['selector'],\n xpath: flags['xpath'],\n });\n const buf = Buffer.from(result as ArrayBuffer);\n fs.writeFileSync(outFile, buf);\n return { written: outFile, bytes: buf.length };\n }\n\n case 'trading': {\n if (!subcommand) throw new Error('Missing subcommand for trading');\n switch (subcommand) {\n case 'accounts':\n return client.trading.accounts();\n case 'portfolio':\n return client.trading.portfolio(\n requireFlag(flags, 'account-id', 'trading portfolio')\n );\n case 'orders':\n return client.trading.orders({\n accountId: requireFlag(flags, 'account-id', 'trading orders'),\n source: flags['source'],\n since: num(flags['since']),\n limit: num(flags['limit']),\n });\n case 'subscriptions':\n return client.trading.subscriptions(\n requireFlag(flags, 'account-id', 'trading subscriptions')\n );\n case 'equity-history':\n return client.trading.equityHistory({\n accountId: requireFlag(\n flags,\n 'account-id',\n 'trading equity-history'\n ),\n timeframe: flags['timeframe'],\n sinceMs: num(flags['since-ms']),\n untilMs: num(flags['until-ms']),\n });\n case 'risk-rules':\n return client.trading.riskRules();\n case 'subscribe':\n return client.trading.subscribe({\n accountId: requireFlag(flags, 'account-id', 'trading subscribe'),\n sourceUsername: requireFlag(\n flags,\n 'source-username',\n 'trading subscribe'\n ),\n sourceFeed: requireFlag(flags, 'source-feed', 'trading subscribe'),\n playbookId: requireFlag(flags, 'playbook-id', 'trading subscribe'),\n playbookVersion: requireFlag(\n flags,\n 'playbook-version',\n 'trading subscribe'\n ),\n executeLatest: boolFlag(flags['execute-latest']),\n });\n case 'unsubscribe':\n return client.trading.unsubscribe(\n requireFlag(flags, 'subscription-id', 'trading unsubscribe')\n );\n case 'execute':\n return client.trading.execute({\n accountId: requireFlag(flags, 'account-id', 'trading execute'),\n signalJson: requireFlag(flags, 'signal', 'trading execute'),\n dryRun: boolFlag(flags['dry-run']) ?? false,\n sourceUsername: flags['source-username'],\n sourceFeed: flags['source-feed'],\n });\n case 'update-risk-rules':\n return client.trading.updateRiskRules({\n maxSingleOrder: {\n value: requireNumericFlag(\n flags,\n 'max-single-order-value',\n 'trading update-risk-rules'\n ),\n enabled:\n requireFlag(\n flags,\n 'max-single-order-enabled',\n 'trading update-risk-rules'\n ) === 'true',\n },\n maxDailyTurnover: {\n value: requireNumericFlag(\n flags,\n 'max-daily-turnover-value',\n 'trading update-risk-rules'\n ),\n enabled:\n requireFlag(\n flags,\n 'max-daily-turnover-enabled',\n 'trading update-risk-rules'\n ) === 'true',\n },\n maxDailyOrders: {\n value: requireNumericFlag(\n flags,\n 'max-daily-orders-value',\n 'trading update-risk-rules'\n ),\n enabled:\n requireFlag(\n flags,\n 'max-daily-orders-enabled',\n 'trading update-risk-rules'\n ) === 'true',\n },\n });\n default:\n throw new Error(`Unknown subcommand: trading ${subcommand}`);\n }\n }\n\n default:\n throw new Error(\n `Unknown command: '${group}'. Run 'alva --help' to see available commands.`\n );\n }\n}\n\nasync function main() {\n try {\n const rawArgs = process.argv.slice(2);\n\n // Handle --version before loading config (doesn't need auth)\n if (rawArgs[0] === '-v' || rawArgs[0] === '--version') {\n process.stdout.write(`alva version ${CLI_VERSION}\\n`);\n return;\n }\n\n // Handle configure before loading config (doesn't need existing auth)\n if (rawArgs[0] === 'configure') {\n if (rawArgs[1] === '--help' || rawArgs[1] === '-h') {\n process.stdout.write(COMMAND_HELP['configure'] + '\\n');\n return;\n }\n const result = await handleConfigure(rawArgs);\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n');\n return;\n }\n\n const config = loadConfig({\n argv: rawArgs,\n env: process.env as Record<string, string | undefined>,\n readFile: (path: string) => fs.readFileSync(path, 'utf-8'),\n homedir: () => os.homedir(),\n });\n\n const client = new AlvaClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n });\n\n // Remove global flags (--api-key, --base-url, --profile and their values)\n const cleanArgs: string[] = [];\n for (let i = 0; i < rawArgs.length; i++) {\n const a = rawArgs[i];\n if (a === '--api-key' || a === '--base-url' || a === '--profile') {\n i++; // skip the next arg (the value)\n continue;\n }\n if (\n a.startsWith('--api-key=') ||\n a.startsWith('--base-url=') ||\n a.startsWith('--profile=')\n ) {\n continue;\n }\n cleanArgs.push(a);\n }\n\n const result = await dispatch(client, cleanArgs, {\n profile: config.profile,\n baseUrl: config.baseUrl,\n cliVersion: CLI_VERSION,\n });\n if (result && typeof result === 'object' && '_warning' in result) {\n process.stderr.write(\n (result as unknown as { _warning: string })._warning + '\\n'\n );\n delete (result as Record<string, unknown>)._warning;\n }\n if (result && typeof result === 'object' && '_help' in result) {\n const helpResult = result as unknown as { text: string };\n process.stdout.write(helpResult.text + '\\n');\n return;\n }\n if (result instanceof ArrayBuffer) {\n process.stdout.write(Buffer.from(result));\n return;\n }\n if (result !== undefined) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n');\n }\n } catch (err) {\n const error =\n err instanceof AlvaError\n ? { code: err.code, message: err.message, status: err.status }\n : {\n code: 'CLI_ERROR',\n message: err instanceof Error ? err.message : String(err),\n };\n process.stderr.write(JSON.stringify({ error }, null, 2) + '\\n');\n process.exit(1);\n }\n}\n\n// Run main() when executed as a script (node cli.js or via symlinked `alva` binary),\n// but not when imported for testing (vitest imports dispatch directly).\nconst isDirectRun =\n typeof process !== 'undefined' &&\n process.argv[1] &&\n (process.argv[1].endsWith('cli.mjs') ||\n process.argv[1].endsWith('cli.js') ||\n process.argv[1].endsWith('/alva') ||\n process.argv[1].endsWith('\\\\alva'));\nif (isDirectRun) {\n main();\n}\n"],"mappings":"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","names":["contentType","configDir","readFile","homedir","result"]}
|