@alva-ai/toolkit 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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/resources/trading.ts","../src/client.ts","../src/cli/config.ts","../src/cli/auth.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\nexport class CliUsageError extends Error {\n readonly command?: string;\n\n constructor(message: string, command?: string) {\n super(message);\n this.name = 'CliUsageError';\n this.command = command;\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 CronjobRunsListParams,\n CronjobRunsListResponse,\n CronjobRunLogsResponse,\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 async listRuns(\n params: CronjobRunsListParams\n ): Promise<CronjobRunsListResponse> {\n this.client._requireAuth();\n return this.client._request(\n 'GET',\n `/api/v1/deploy/cronjob/${params.cronjob_id}/runs`,\n {\n query: { first: params.first, cursor: params.cursor },\n }\n ) as Promise<CronjobRunsListResponse>;\n }\n\n async getRunLogs(params: {\n cronjob_id: number;\n run_id: number;\n }): Promise<CronjobRunLogsResponse> {\n this.client._requireAuth();\n return this.client._request(\n 'GET',\n `/api/v1/deploy/cronjob/${params.cronjob_id}/runs/${params.run_id}/logs`\n ) as Promise<CronjobRunLogsResponse>;\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 viewer_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.viewer_token = config.viewer_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.viewer_token && !this.apiKey) {\n throw new AlvaError(\n 'UNAUTHENTICATED',\n 'Authentication is required. Pass viewer_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.viewer_token) {\n headers['x-Playbook-Viewer'] = this.viewer_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 * as crypto from 'node:crypto';\nimport * as http from 'node:http';\nimport { exec } from 'node:child_process';\nimport * as os from 'node:os';\nimport * as fsPromises from 'node:fs/promises';\nimport { writeConfig } from './config.js';\n\nexport function generateState(): string {\n return crypto.randomBytes(32).toString('hex');\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 interface AuthLoginDeps {\n generateState: () => string;\n openBrowser: (url: string) => Promise<void>;\n writeConfigDeps: WriteConfigDeps;\n createServer: (handler: http.RequestListener) => http.Server;\n timeout?: number;\n log: (msg: string) => void;\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('--')) {\n const eqIdx = arg.indexOf('=');\n if (eqIdx !== -1) {\n flags[arg.slice(2, eqIdx)] = arg.slice(eqIdx + 1);\n } else if (i + 1 < argv.length && !argv[i + 1].startsWith('--')) {\n flags[arg.slice(2)] = argv[i + 1];\n i++;\n }\n }\n }\n return flags;\n}\n\nfunction defaultOpenBrowser(url: string): Promise<void> {\n return new Promise<void>((resolve) => {\n const platform = process.platform;\n let cmd: string;\n if (platform === 'darwin') {\n cmd = `open \"${url}\"`;\n } else if (platform === 'win32') {\n cmd = `start \"${url}\"`;\n } else {\n cmd = `xdg-open \"${url}\"`;\n }\n exec(cmd, () => {\n resolve();\n });\n });\n}\n\nfunction defaultDeps(): AuthLoginDeps {\n return {\n generateState,\n openBrowser: defaultOpenBrowser,\n writeConfigDeps: {\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 createServer: (handler: http.RequestListener) => http.createServer(handler),\n timeout: 120_000,\n log: (msg: string) => process.stderr.write(msg),\n };\n}\n\nexport interface AuthLoginResult {\n status: string;\n apiKey: string;\n profile: string;\n}\n\nexport async function handleAuthLogin(\n args: string[],\n deps?: Partial<AuthLoginDeps>\n): Promise<AuthLoginResult> {\n const d = { ...defaultDeps(), ...deps };\n const flags = parseFlags(args.slice(1));\n const profileName = flags.profile || 'default';\n const authUrl = flags['auth-url'] || 'https://alva.ai';\n const timeout = d.timeout ?? 120_000;\n\n const state = d.generateState();\n\n return new Promise<AuthLoginResult>((resolve, reject) => {\n const server = d.createServer((req, res) => {\n const reqUrl = new URL(req.url ?? '/', 'http://127.0.0.1');\n if (reqUrl.pathname !== '/callback') {\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n\n const callbackState = reqUrl.searchParams.get('state');\n const apiKey = reqUrl.searchParams.get('api_key');\n\n if (callbackState !== state) {\n res.writeHead(400);\n res.end(\n '<html><body><h1>Error</h1><p>State mismatch. Please try again.</p></body></html>'\n );\n return;\n }\n\n if (!apiKey) {\n res.writeHead(400);\n res.end(\n '<html><body><h1>Error</h1><p>Missing API key. Please try again.</p></body></html>'\n );\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(\n '<html><body style=\"display:flex;align-items:center;justify-content:center;height:100vh;margin:0;background:rgba(246,246,246,1);font-family:system-ui,sans-serif\"><div style=\"text-align:center;display:flex;flex-direction:column;align-items:center;gap:40px\"><h1 style=\"font-size:45px;font-weight:400;line-height:120%;margin:0\">Turn Ideas into Live<br>Investing Playbooks in Minutes</h1><p style=\"font-size:24px;font-weight:400;margin:0\">You\\'re all set for Alva.</p></div></body></html>'\n );\n\n server.close();\n clearTimeout(timer);\n\n writeConfig({ apiKey }, d.writeConfigDeps, profileName).then(() => {\n resolve({ status: 'logged_in', apiKey, profile: profileName });\n }, reject);\n });\n\n server.on('error', (err) => {\n clearTimeout(timer);\n reject(err);\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address() as { port: number };\n const callbackUrl = `http://127.0.0.1:${addr.port}/callback`;\n const loginUrl = `${authUrl}/authorize?callback_url=${encodeURIComponent(callbackUrl)}&state=${state}`;\n d.log(\n `Opening browser...\\nIf it doesn't open, visit:\\n${loginUrl}\\n\\nWaiting for login callback...\\n`\n );\n d.openBrowser(loginUrl).catch(() => {\n // Swallow browser open errors\n });\n });\n\n const timer = setTimeout(() => {\n server.close();\n reject(new Error('Login timed out waiting for callback'));\n }, timeout);\n });\n}\n","import { AlvaClient } from '../client.js';\nimport { AlvaError, CliUsageError } from '../error.js';\nimport { loadConfig, writeConfig } from './config.js';\nimport { handleAuthLogin } from './auth.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 identity\n user User profile operations (me)\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, runs, run-logs)\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 auth Authentication (login)\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 auth: `Usage: alva auth <subcommand>\n\nSubcommands:\n login Open browser to authenticate and save credentials\n\nExamples:\n alva auth login\n alva auth login --profile staging`,\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\nSubcommand flags:\n read --path (required), [--offset <n>], [--size <n>]\n write --path (required), --data <text> OR --file <local-path> (one required),\n [--mkdir-parents | --no-mkdir-parents]\n stat --path (required)\n readdir --path (required), [--recursive | --no-recursive]\n mkdir --path (required)\n remove --path (required), [--recursive | --no-recursive]\n rename --old-path (required), --new-path (required)\n copy --src-path (required), --dst-path (required)\n symlink --target-path (required), --link-path (required)\n readlink --path (required)\n chmod --path (required), --mode <octal> (required)\n grant --path (required), --subject <s> (required), --permission <p> (required)\n revoke --path (required), --subject <s> (required), --permission <p> (required)\n\nPath conventions:\n ~/... Home-relative path (expands to /alva/home/<username>/...)\n /alva/home/alice/... Absolute path (required for public/unauthenticated reads)\n Quote tilde paths to prevent shell expansion: --path \"~/data\" (not --path ~/data).\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 alva fs symlink --target-path \"~/real-file.txt\" --link-path \"~/my-link.txt\"\n alva fs readlink --path \"~/my-link.txt\"`,\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 --local-file <path> Path to a local file whose contents are sent as code\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, --local-file, or --entry-path is required.\nThese three options are mutually exclusive.\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 alva run --local-file ./my-script.js --args '{\"symbol\":\"BTC\"}'`,\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 runs List runs for a cronjob (cursor-paginated)\n run-logs Get stdout/stderr logs for a single cronjob run\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\nRuns flags:\n --id <id> Cronjob ID (required)\n --first <n> Max results per page\n --cursor <cursor> Pagination cursor from previous response\n\nRun-logs flags:\n --id <id> Cronjob ID (required)\n --run-id <id> Run 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 alva deploy runs --id 42\n alva deploy runs --id 42 --first 10\n alva deploy run-logs --id 42 --run-id 123`,\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 CliUsageError('--api-key is required', 'configure');\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 const group = command.split(' ')[0];\n throw new CliUsageError(`--${name} is required for '${command}'`, group);\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 const group = command.split(' ')[0];\n throw new CliUsageError(\n `--${name} must be a number for '${command}', got '${val}'`,\n group\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)\n throw new CliUsageError('Missing subcommand for user', 'user');\n if (subcommand === 'me') return client.user.me();\n throw new CliUsageError(`Unknown subcommand: user ${subcommand}`, 'user');\n\n case 'fs': {\n if (!subcommand)\n throw new CliUsageError('Missing subcommand for fs', '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 CliUsageError(`Unknown subcommand: fs ${subcommand}`, 'fs');\n }\n }\n\n case 'run': {\n const sourceFlags = ['code', 'local-file', 'entry-path'].filter(\n (f) => flags[f] !== undefined\n );\n if (sourceFlags.length > 1) {\n throw new CliUsageError(\n `--${sourceFlags.join(' and --')} are mutually exclusive`,\n 'run'\n );\n }\n let code = flags['code'];\n if (flags['local-file']) {\n code = fs.readFileSync(flags['local-file'], 'utf-8') as string;\n }\n return client.run.execute({\n 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\n case 'deploy': {\n if (!subcommand)\n throw new CliUsageError('Missing subcommand for deploy', '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 case 'runs':\n return client.deploy.listRuns({\n cronjob_id: requireNumericFlag(flags, 'id', 'deploy runs'),\n first: num(flags['first']),\n cursor: num(flags['cursor']),\n });\n case 'run-logs':\n return client.deploy.getRunLogs({\n cronjob_id: requireNumericFlag(flags, 'id', 'deploy run-logs'),\n run_id: requireNumericFlag(flags, 'run-id', 'deploy run-logs'),\n });\n default:\n throw new CliUsageError(\n `Unknown subcommand: deploy ${subcommand}`,\n 'deploy'\n );\n }\n }\n\n case 'release': {\n if (!subcommand)\n throw new CliUsageError('Missing subcommand for release', '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 CliUsageError(\n `Unknown subcommand: release ${subcommand}`,\n 'release'\n );\n }\n }\n\n case 'secrets': {\n if (!subcommand)\n throw new CliUsageError('Missing subcommand for secrets', '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 CliUsageError(\n `Unknown subcommand: secrets ${subcommand}`,\n 'secrets'\n );\n }\n }\n\n case 'sdk': {\n if (!subcommand)\n throw new CliUsageError('Missing subcommand for sdk', '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 CliUsageError(\n `Unknown subcommand: sdk ${subcommand}`,\n 'sdk'\n );\n }\n }\n\n case 'comments': {\n if (!subcommand)\n throw new CliUsageError('Missing subcommand for comments', '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 CliUsageError(\n `Unknown subcommand: comments ${subcommand}`,\n 'comments'\n );\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)\n throw new CliUsageError('Missing subcommand for trading', '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 CliUsageError(\n `Unknown subcommand: trading ${subcommand}`,\n 'trading'\n );\n }\n }\n\n case 'auth': {\n // bare `auth`, `auth --help`, `auth login --help` all show help\n const authSub = args[1];\n if (\n !authSub ||\n authSub === '--help' ||\n authSub === '-h' ||\n args[2] === '--help' ||\n args[2] === '-h'\n ) {\n return { _help: true, text: COMMAND_HELP.auth };\n }\n // auth login is handled in main() before loadConfig; if we reach here\n // it means dispatch was called directly (shouldn't happen in production)\n throw new CliUsageError(`Unknown auth subcommand: '${authSub}'`, 'auth');\n }\n\n default:\n throw new CliUsageError(`Unknown command: '${group}'`);\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 // Handle auth before loading config (user doesn't have config yet when logging in)\n if (rawArgs[0] === 'auth') {\n const authSub = rawArgs[1];\n if (\n !authSub ||\n authSub === '--help' ||\n authSub === '-h' ||\n rawArgs[2] === '--help' ||\n rawArgs[2] === '-h'\n ) {\n process.stdout.write(`${COMMAND_HELP.auth}\\n`);\n return;\n }\n if (authSub === 'login') {\n const result = await handleAuthLogin(rawArgs);\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n process.stdout.write(`${COMMAND_HELP.auth}\\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 if (err instanceof CliUsageError) {\n const help = err.command ? COMMAND_HELP[err.command] : HELP_TEXT;\n process.stderr.write(`Error: ${err.message}\\n`);\n if (help) process.stderr.write(`\\n${help}\\n`);\n process.exit(1);\n } else if (err instanceof AlvaError) {\n const error = {\n code: err.code,\n message: err.message,\n status: err.status,\n };\n process.stderr.write(`${JSON.stringify({ error }, null, 2)}\\n`);\n process.exit(1);\n } else {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`Error: ${message}\\n`);\n process.exit(1);\n }\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","os","fsPromises","parseFlags","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/skills.ts","../src/resources/comments.ts","../src/resources/remix.ts","../src/resources/screenshot.ts","../src/resources/user.ts","../src/resources/trading.ts","../src/resources/arraysJwt.ts","../src/resources/notifications.ts","../src/resources/pushSubscriptions.ts","../src/client.ts","../src/cli/config.ts","../src/cli/auth.ts","../src/cli/postConfigureHooks.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\nexport class CliUsageError extends Error {\n readonly command?: string;\n\n constructor(message: string, command?: string) {\n super(message);\n this.name = 'CliUsageError';\n this.command = command;\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 const result = await this.client._request('GET', '/api/v1/fs/read', {\n query: { path: params.path, offset: params.offset, size: params.size },\n });\n if (!(result instanceof ArrayBuffer)) return result;\n try {\n const text = new TextDecoder('utf-8', { fatal: true }).decode(result);\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n } catch {\n return result;\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 CronjobRunsListParams,\n CronjobRunsListResponse,\n CronjobRunLogsResponse,\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 async listRuns(\n params: CronjobRunsListParams\n ): Promise<CronjobRunsListResponse> {\n this.client._requireAuth();\n return this.client._request(\n 'GET',\n `/api/v1/deploy/cronjob/${params.cronjob_id}/runs`,\n {\n query: { first: params.first, cursor: params.cursor },\n }\n ) as Promise<CronjobRunsListResponse>;\n }\n\n async getRunLogs(params: {\n cronjob_id: number;\n run_id: number;\n }): Promise<CronjobRunLogsResponse> {\n this.client._requireAuth();\n return this.client._request(\n 'GET',\n `/api/v1/deploy/cronjob/${params.cronjob_id}/runs/${params.run_id}/logs`\n ) as Promise<CronjobRunLogsResponse>;\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 changelog: params.changelog,\n },\n }) as Promise<FeedReleaseResponse>;\n }\n\n async playbookDraft(\n params: PlaybookDraftRequest\n ): Promise<PlaybookDraftResponse> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/draft/playbook', {\n body: {\n name: params.name,\n display_name: params.display_name,\n description: params.description,\n feeds: params.feeds,\n trading_symbols: params.trading_symbols,\n },\n }) as Promise<PlaybookDraftResponse>;\n }\n\n async playbook(\n params: PlaybookReleaseRequest\n ): Promise<PlaybookReleaseResponse> {\n this.client._requireAuth();\n return this.client._request('POST', '/api/v1/release/playbook', {\n body: {\n name: params.name,\n version: params.version,\n feeds: params.feeds,\n changelog: params.changelog,\n },\n }) as Promise<PlaybookReleaseResponse>;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type { CreateSecretRequest, Secret, SecretMetadata } from '../types.js';\n\nexport class SecretsResource {\n constructor(private client: AlvaClient) {}\n\n async create(params: CreateSecretRequest): Promise<void> {\n this.client._requireAuth();\n await this.client._request('POST', '/api/v1/secrets', {\n body: { name: params.name, value: params.value },\n });\n }\n\n async list(): Promise<{ secrets: SecretMetadata[] }> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/secrets') as Promise<{\n secrets: SecretMetadata[];\n }>;\n }\n\n async get(params: { name: string }): Promise<Secret> {\n this.client._requireAuth();\n const encoded = encodeURIComponent(params.name);\n return this.client._request(\n 'GET',\n `/api/v1/secrets/${encoded}`\n ) as Promise<Secret>;\n }\n\n async update(params: { name: string; value: string }): Promise<void> {\n this.client._requireAuth();\n const encoded = encodeURIComponent(params.name);\n await this.client._request('PUT', `/api/v1/secrets/${encoded}`, {\n body: { value: params.value },\n });\n }\n\n async delete(params: { name: string }): Promise<void> {\n this.client._requireAuth();\n const encoded = encodeURIComponent(params.name);\n await this.client._request('DELETE', `/api/v1/secrets/${encoded}`);\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type {\n ModuleDoc,\n PartitionsResponse,\n PartitionSummaryResponse,\n} from '../types.js';\n\nexport class SdkDocsResource {\n constructor(private client: AlvaClient) {}\n\n async doc(params: { name: string }): Promise<ModuleDoc> {\n this.client._requireAuth();\n return this.client._request('GET', '/api/v1/sdk/doc', {\n query: { name: params.name },\n }) as Promise<ModuleDoc>;\n }\n\n async partitions(): Promise<PartitionsResponse> {\n this.client._requireAuth();\n return this.client._request(\n 'GET',\n '/api/v1/sdk/partitions'\n ) as Promise<PartitionsResponse>;\n }\n\n async partitionSummary(params: {\n partition: string;\n }): Promise<PartitionSummaryResponse> {\n this.client._requireAuth();\n const encoded = encodeURIComponent(params.partition);\n return this.client._request(\n 'GET',\n `/api/v1/sdk/partitions/${encoded}/summary`\n ) as Promise<PartitionSummaryResponse>;\n }\n}\n","import type { AlvaClient } from '../client.js';\n\ntype Envelope<T> = { success: boolean; data: T; request_id?: string };\n\nexport interface SkillSummary {\n name: string;\n description: string;\n}\n\nexport interface SkillDoc {\n name: string;\n description: string;\n content: string;\n}\n\nexport class SkillsResource {\n constructor(private client: AlvaClient) {}\n\n async list(): Promise<{ skills: SkillSummary[] }> {\n const res = (await this.client._request('GET', '/api/v1/skills', {\n baseUrl: this.client.arraysBaseUrl,\n noAuth: true,\n })) as Envelope<SkillSummary[]>;\n return { skills: res.data ?? [] };\n }\n\n async summary(params: { name: string }): Promise<SkillDoc> {\n const encoded = encodeURIComponent(params.name);\n const res = (await this.client._request(\n 'GET',\n `/api/v1/skills/${encoded}`,\n {\n baseUrl: this.client.arraysBaseUrl,\n noAuth: true,\n }\n )) as Envelope<SkillDoc[]>;\n const doc = res.data?.[0];\n if (!doc)\n throw new Error(`empty skills summary response for \"${params.name}\"`);\n return doc;\n }\n\n async endpoint(params: { name: string; file: string }): Promise<SkillDoc> {\n const encoded = encodeURIComponent(params.name);\n const res = (await this.client._request(\n 'GET',\n `/api/v1/skills/${encoded}`,\n {\n baseUrl: this.client.arraysBaseUrl,\n noAuth: true,\n query: { endpoint: params.file },\n }\n )) as Envelope<SkillDoc[]>;\n const doc = res.data?.[0];\n if (!doc) {\n throw new Error(\n `empty skills endpoint response for \"${params.name}\" file \"${params.file}\"`\n );\n }\n return doc;\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 type { AlvaClient } from '../client.js';\nimport type {\n EnsureArraysJwtResponse,\n ArraysJwtStatusResponse,\n} from '../types.js';\n\nexport class ArraysJwtResource {\n constructor(private client: AlvaClient) {}\n\n /** Idempotently sign-or-renew the Arrays JWT server-side. */\n async ensure(): Promise<EnsureArraysJwtResponse> {\n this.client._requireAuth();\n return this.client._request(\n 'POST',\n '/api/v1/arrays-jwt/ensure'\n ) as Promise<EnsureArraysJwtResponse>;\n }\n\n /** Report the current Arrays JWT state for the authenticated user. */\n async status(): Promise<ArraysJwtStatusResponse> {\n this.client._requireAuth();\n return this.client._request(\n 'GET',\n '/api/v1/arrays-jwt/status'\n ) as Promise<ArraysJwtStatusResponse>;\n }\n}\n","import type { AlvaClient } from '../client.js';\nimport type {\n FeedNotificationListResponse,\n NotificationListParams,\n PlaybookNotificationListResponse,\n} from '../types.js';\n\nexport class NotificationsResource {\n constructor(private client: AlvaClient) {}\n\n /**\n * List the caller's notification history for one playbook\n * `(username, name)`. Returns `NOT_FOUND` when the playbook is\n * private or does not exist (the two cases are deliberately\n * indistinguishable to prevent namespace enumeration).\n */\n async listPlaybook(\n params: NotificationListParams\n ): Promise<PlaybookNotificationListResponse> {\n this.client._requireAuth();\n const path = `/api/v1/playbook/${encodeURIComponent(params.username)}/${encodeURIComponent(params.name)}/notifications`;\n return this.client._request('GET', path, {\n query: buildQuery(params),\n }) as Promise<PlaybookNotificationListResponse>;\n }\n\n /**\n * List the caller's notification history for one feed\n * `(username, name)`. Authorization is alfs read on\n * `/alva/home/<username>/feeds/<name>`.\n */\n async listFeed(\n params: NotificationListParams\n ): Promise<FeedNotificationListResponse> {\n this.client._requireAuth();\n const path = `/api/v1/feed/${encodeURIComponent(params.username)}/${encodeURIComponent(params.name)}/notifications`;\n return this.client._request('GET', path, {\n query: buildQuery(params),\n }) as Promise<FeedNotificationListResponse>;\n }\n}\n\nfunction buildQuery(params: NotificationListParams): Record<string, string> {\n const q: Record<string, string> = {};\n if (params.channel) q.channel = params.channel;\n if (params.status) q.status = params.status;\n if (params.since_time !== undefined && params.since_time > 0) {\n q.since_time = String(params.since_time);\n }\n if (params.first !== undefined && params.first > 0) {\n q.first = String(params.first);\n }\n if (params.cursor) q.cursor = params.cursor;\n return q;\n}\n","import type { AlvaClient } from '../client.js';\nimport type {\n PushSubscriptionListParams,\n PushSubscriptionListResponse,\n PushSubscriptionPlaybookParams,\n SubscribePushTargetResponse,\n UnsubscribePushTargetResponse,\n} from '../types.js';\n\n/**\n * Personal push subscriptions — opt the caller in or out of personal\n * DM/web push for a target. Independent of social follow:\n *\n * - `subscribePlaybook` does not start following.\n * - `unsubscribePlaybook` does not unfollow.\n * - Following a playbook elsewhere will compound-subscribe automatically.\n *\n * Backed by alva-gateway REST (mirrors the GraphQL surface in\n * `pkg/schema/push_subscription.graphql`).\n */\nexport class PushSubscriptionsResource {\n constructor(private client: AlvaClient) {}\n\n /**\n * Opt into personal push for one playbook `(username, name)`.\n * Idempotent. Auth: callers must be able to read the playbook\n * (public/paid pass; private requires explicit alfs grant).\n */\n async subscribePlaybook(\n params: PushSubscriptionPlaybookParams\n ): Promise<SubscribePushTargetResponse> {\n this.client._requireAuth();\n const path = `/api/v1/playbook/${encodeURIComponent(params.username)}/${encodeURIComponent(params.name)}/push-subscription`;\n return this.client._request(\n 'POST',\n path\n ) as Promise<SubscribePushTargetResponse>;\n }\n\n /**\n * Soft-disable personal push for one playbook `(username, name)`.\n * Does NOT remove any social follow. Idempotent.\n */\n async unsubscribePlaybook(\n params: PushSubscriptionPlaybookParams\n ): Promise<UnsubscribePushTargetResponse> {\n this.client._requireAuth();\n const path = `/api/v1/playbook/${encodeURIComponent(params.username)}/${encodeURIComponent(params.name)}/push-subscription`;\n return this.client._request(\n 'DELETE',\n path\n ) as Promise<UnsubscribePushTargetResponse>;\n }\n\n /**\n * List the caller's personal push subscriptions across all targets.\n * Defaults to currently-active rows only; pass `include_history=true`\n * to also return previously-unsubscribed rows.\n */\n async list(\n params: PushSubscriptionListParams = {}\n ): Promise<PushSubscriptionListResponse> {\n this.client._requireAuth();\n const query: Record<string, string> = {};\n if (params.include_history !== undefined) {\n query.include_history = String(params.include_history);\n }\n return this.client._request('GET', '/api/v1/me/push-subscriptions', {\n query,\n }) as Promise<PushSubscriptionListResponse>;\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 { SkillsResource } from './resources/skills.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';\nimport { ArraysJwtResource } from './resources/arraysJwt.js';\nimport { NotificationsResource } from './resources/notifications.js';\nimport { PushSubscriptionsResource } from './resources/pushSubscriptions.js';\n\nconst DEFAULT_BASE_URL = 'https://api-llm.prd.alva.ai';\nexport const DEFAULT_ARRAYS_BASE_URL = 'https://data-tools.prd.space.id';\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 /** Override the base URL for this request (e.g. the Arrays data-tools endpoint). */\n baseUrl?: string;\n /** If true, skip attaching any Alva auth header (X-Alva-Api-Key / x-Playbook-Viewer). */\n noAuth?: boolean;\n}\n\nexport class AlvaClient {\n readonly baseUrl: string;\n readonly arraysBaseUrl: string;\n readonly viewer_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 _skills?: SkillsResource;\n private _comments?: CommentsResource;\n private _remix?: RemixResource;\n private _screenshot?: ScreenshotResource;\n private _user?: UserResource;\n private _trading?: TradingResource;\n private _arraysJwt?: ArraysJwtResource;\n private _notifications?: NotificationsResource;\n private _pushSubscriptions?: PushSubscriptionsResource;\n\n constructor(config: AlvaClientConfig) {\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n this.arraysBaseUrl = config.arraysBaseUrl ?? DEFAULT_ARRAYS_BASE_URL;\n this.viewer_token = config.viewer_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 skills(): SkillsResource {\n return (this._skills ??= new SkillsResource(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 get arraysJwt(): ArraysJwtResource {\n return (this._arraysJwt ??= new ArraysJwtResource(this));\n }\n get notifications(): NotificationsResource {\n return (this._notifications ??= new NotificationsResource(this));\n }\n get pushSubscriptions(): PushSubscriptionsResource {\n return (this._pushSubscriptions ??= new PushSubscriptionsResource(this));\n }\n\n _requireAuth(): void {\n if (!this.viewer_token && !this.apiKey) {\n throw new AlvaError(\n 'UNAUTHENTICATED',\n 'Authentication is required. Pass viewer_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 const baseUrl = options?.baseUrl ?? this.baseUrl;\n let url = `${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 (!options?.noAuth) {\n if (this.viewer_token) {\n headers['x-Playbook-Viewer'] = this.viewer_token;\n } else if (this.apiKey) {\n headers['X-Alva-Api-Key'] = this.apiKey;\n }\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","import { DEFAULT_ARRAYS_BASE_URL } from '../client.js';\n\nexport interface CliConfig {\n apiKey?: string;\n baseUrl?: string;\n arraysBaseUrl: 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 arraysBaseUrl: DEFAULT_ARRAYS_BASE_URL,\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 arrays base URL: flag > env > default (no file layer)\n const arraysBaseUrlFlag = parseFlag(argv, '--arrays-endpoint');\n const arraysBaseUrlEnv = env.ARRAYS_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 arraysBaseUrl:\n arraysBaseUrlFlag ?? arraysBaseUrlEnv ?? DEFAULT_ARRAYS_BASE_URL,\n profile: profileName,\n };\n}\n","import * as crypto from 'node:crypto';\nimport * as http from 'node:http';\nimport { exec } from 'node:child_process';\nimport * as os from 'node:os';\nimport * as fsPromises from 'node:fs/promises';\nimport { writeConfig } from './config.js';\n\nexport function generateState(): string {\n return crypto.randomBytes(32).toString('hex');\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 interface AuthLoginDeps {\n generateState: () => string;\n openBrowser: (url: string) => Promise<void>;\n writeConfigDeps: WriteConfigDeps;\n createServer: (handler: http.RequestListener) => http.Server;\n timeout?: number;\n log: (msg: string) => void;\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('--')) {\n const eqIdx = arg.indexOf('=');\n if (eqIdx !== -1) {\n flags[arg.slice(2, eqIdx)] = arg.slice(eqIdx + 1);\n } else if (i + 1 < argv.length && !argv[i + 1].startsWith('--')) {\n flags[arg.slice(2)] = argv[i + 1];\n i++;\n }\n }\n }\n return flags;\n}\n\nfunction defaultOpenBrowser(url: string): Promise<void> {\n return new Promise<void>((resolve) => {\n const platform = process.platform;\n let cmd: string;\n if (platform === 'darwin') {\n cmd = `open \"${url}\"`;\n } else if (platform === 'win32') {\n cmd = `start \"${url}\"`;\n } else {\n cmd = `xdg-open \"${url}\"`;\n }\n exec(cmd, () => {\n resolve();\n });\n });\n}\n\nfunction defaultDeps(): AuthLoginDeps {\n return {\n generateState,\n openBrowser: defaultOpenBrowser,\n writeConfigDeps: {\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 createServer: (handler: http.RequestListener) => http.createServer(handler),\n timeout: 120_000,\n log: (msg: string) => process.stderr.write(msg),\n };\n}\n\nexport interface AuthLoginResult {\n status: string;\n apiKey: string;\n profile: string;\n}\n\nexport async function handleAuthLogin(\n args: string[],\n deps?: Partial<AuthLoginDeps>\n): Promise<AuthLoginResult> {\n const d = { ...defaultDeps(), ...deps };\n const flags = parseFlags(args.slice(1));\n const profileName = flags.profile || 'default';\n const authUrl = flags['auth-url'] || 'https://alva.ai';\n const timeout = d.timeout ?? 120_000;\n\n const state = d.generateState();\n\n return new Promise<AuthLoginResult>((resolve, reject) => {\n const server = d.createServer((req, res) => {\n const reqUrl = new URL(req.url ?? '/', 'http://127.0.0.1');\n if (reqUrl.pathname !== '/callback') {\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n\n const callbackState = reqUrl.searchParams.get('state');\n const apiKey = reqUrl.searchParams.get('api_key');\n\n if (callbackState !== state) {\n res.writeHead(400);\n res.end(\n '<html><body><h1>Error</h1><p>State mismatch. Please try again.</p></body></html>'\n );\n return;\n }\n\n if (!apiKey) {\n res.writeHead(400);\n res.end(\n '<html><body><h1>Error</h1><p>Missing API key. Please try again.</p></body></html>'\n );\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(\n '<html><body style=\"display:flex;align-items:center;justify-content:center;height:100vh;margin:0;background:rgba(246,246,246,1);font-family:system-ui,sans-serif\"><div style=\"text-align:center;display:flex;flex-direction:column;align-items:center;gap:40px\"><h1 style=\"font-size:45px;font-weight:400;line-height:120%;margin:0\">Turn Ideas into Live<br>Investing Playbooks in Minutes</h1><p style=\"font-size:24px;font-weight:400;margin:0\">You\\'re all set for Alva.</p></div></body></html>'\n );\n\n server.close();\n clearTimeout(timer);\n\n writeConfig({ apiKey }, d.writeConfigDeps, profileName).then(() => {\n resolve({ status: 'logged_in', apiKey, profile: profileName });\n }, reject);\n });\n\n server.on('error', (err) => {\n clearTimeout(timer);\n reject(err);\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address() as { port: number };\n const callbackUrl = `http://127.0.0.1:${addr.port}/callback`;\n const loginUrl = `${authUrl}/authorize?callback_url=${encodeURIComponent(callbackUrl)}&state=${state}`;\n d.log(\n `Opening browser...\\nIf it doesn't open, visit:\\n${loginUrl}\\n\\nWaiting for login callback...\\n`\n );\n d.openBrowser(loginUrl).catch(() => {\n // Swallow browser open errors\n });\n });\n\n const timer = setTimeout(() => {\n server.close();\n reject(new Error('Login timed out waiting for callback'));\n }, timeout);\n });\n}\n","import type { AlvaClient } from '../client.js';\nimport type { SubscriptionTier } from '../types.js';\n\nexport interface PostConfigureHook {\n name: string;\n run(client: AlvaClient): Promise<void>;\n}\n\nexport interface RunHooksDeps {\n hooks?: PostConfigureHook[];\n stderr?: (s: string) => void;\n}\n\nfunction defaultStderr(s: string): void {\n process.stderr.write(s);\n}\n\nfunction formatTier(t: SubscriptionTier | string): string {\n const stripped =\n typeof t === 'string' && t.startsWith('SUBSCRIPTION_TIER_')\n ? t.slice('SUBSCRIPTION_TIER_'.length)\n : String(t);\n return stripped.toLowerCase();\n}\n\nfunction formatExpiry(expiresAt: number): string {\n return new Date(expiresAt * 1000).toISOString().slice(0, 10);\n}\n\nexport const ensureArraysJwtHook: PostConfigureHook = {\n name: 'ensureArraysJwt',\n async run(client: AlvaClient): Promise<void> {\n const res = await client.arraysJwt.ensure();\n const date = formatExpiry(res.expires_at);\n const tier = formatTier(res.tier);\n const verb = res.renewed\n ? 'Arrays JWT provisioned'\n : 'Arrays JWT already current';\n process.stderr.write(`${verb} (expires ${date}, tier: ${tier})\\n`);\n },\n};\n\nexport const POST_CONFIGURE_HOOKS: PostConfigureHook[] = [ensureArraysJwtHook];\n\nexport async function runPostConfigureHooks(\n client: AlvaClient,\n deps?: RunHooksDeps\n): Promise<void> {\n const hooks = deps?.hooks ?? POST_CONFIGURE_HOOKS;\n const stderr = deps?.stderr ?? defaultStderr;\n for (const hook of hooks) {\n try {\n await hook.run(client);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n stderr(`warning: post-configure hook \"${hook.name}\" failed: ${msg}\\n`);\n }\n }\n}\n","import { AlvaClient } from '../client.js';\nimport { AlvaError, CliUsageError } from '../error.js';\nimport { loadConfig, writeConfig } from './config.js';\nimport { handleAuthLogin } from './auth.js';\nimport { runPostConfigureHooks } from './postConfigureHooks.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 identity\n user User profile operations (me)\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, runs, run-logs)\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 skills Data-skill documentation from the Arrays backend (list, summary, endpoint)\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 auth Authentication (login)\n screenshot Capture a web screenshot as PNG\n arrays Arrays backend operations (token ensure, token status)\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 --arrays-endpoint <url> Arrays backend URL (or ARRAYS_ENDPOINT env; default: https://data-tools.prd.space.id)\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.).\nAlso auto-runs 'alva arrays token ensure' to provision the server-side Arrays JWT\n(soft-fail: a network/auth failure prints a stderr warning but exit stays 0).\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 auth: `Usage: alva auth <subcommand>\n\nSubcommands:\n login Open browser to authenticate and save credentials\n\nExamples:\n alva auth login\n alva auth login --profile staging`,\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\nOutput also includes _meta.arrays_jwt (exists, expires_at, renewal_needed,\ntier) when the backend is reachable; the field is omitted on RPC failure.\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\nSubcommand flags:\n read --path (required), [--offset <n>], [--size <n>]\n write --path (required), --data <text> OR --file <local-path> (one required),\n [--mkdir-parents | --no-mkdir-parents]\n stat --path (required)\n readdir --path (required), [--recursive | --no-recursive]\n mkdir --path (required)\n remove --path (required), [--recursive | --no-recursive]\n rename --old-path (required), --new-path (required)\n copy --src-path (required), --dst-path (required)\n symlink --target-path (required), --link-path (required)\n readlink --path (required)\n chmod --path (required), --mode <octal> (required)\n grant --path (required), --subject <s> (required), --permission <p> (required)\n revoke --path (required), --subject <s> (required), --permission <p> (required)\n\nPath conventions:\n ~/... Home-relative path (expands to /alva/home/<username>/...)\n /alva/home/alice/... Absolute path (required for public/unauthenticated reads)\n Quote tilde paths to prevent shell expansion: --path \"~/data\" (not --path ~/data).\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 alva fs symlink --target-path \"~/real-file.txt\" --link-path \"~/my-link.txt\"\n alva fs readlink --path \"~/my-link.txt\"`,\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 --local-file <path> Path to a local file whose contents are sent as code\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, --local-file, or --entry-path is required.\nThese three options are mutually exclusive.\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 alva run --local-file ./my-script.js --args '{\"symbol\":\"BTC\"}'`,\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 runs List runs for a cronjob (cursor-paginated)\n run-logs Get stdout/stderr logs for a single cronjob run\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\nRuns flags:\n --id <id> Cronjob ID (required)\n --first <n> Max results per page\n --cursor <cursor> Pagination cursor from previous response\n\nRun-logs flags:\n --id <id> Cronjob ID (required)\n --run-id <id> Run 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 alva deploy runs --id 42\n alva deploy runs --id 42 --first 10\n alva deploy run-logs --id 42 --run-id 123`,\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 --changelog <text> Per-major changelog summary\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 --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}]' --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 feed_widgets Per-handle/channel rolling subscriptions\n unified_search Web search and URL scraping tools (X/Grok, Google, Brave, serper, decodo)\n technical_indicator_calculation_helpers 50+ pure calculators (RSI, MACD, Bollinger)\n\nExamples:\n alva sdk partitions\n alva sdk partition-summary --partition feed_widgets\n alva sdk doc --name \"@arrays/data/widget-scrap/twitter:v1.0.0\"\n alva sdk doc --name \"@arrays/data/search/search-grok-x:v1.0.0\"`,\n\n skills: `Usage: alva skills <subcommand> [options]\n\nBrowse the Arrays backend's data-skill documentation. These endpoints are\npublic — no Alva credentials required.\n\nSubcommands:\n list List all available data skills\n summary Get the endpoints table for a skill (requires --name)\n endpoint Get full documentation for a specific endpoint (requires --name and --file)\n\nFlags:\n --name <name> Skill name (required for summary and endpoint)\n --file <file> Endpoint file name from the \"File\" column of 'skills summary' (required for endpoint)\n\nGlobal override:\n --arrays-endpoint <url> Arrays backend URL (or ARRAYS_ENDPOINT env)\n Default: https://data-tools.prd.space.id\n\nExamples:\n alva skills list\n alva skills summary --name <skill>\n alva skills endpoint --name <skill> --file <endpoint-file>`,\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 arrays: `Usage: alva arrays token <subcommand>\n\nManage the Arrays JWT used by sandbox scripts (secret.loadPlaintext('ARRAYS_JWT')).\nThe JWT is stored server-side as a jagent secret; the CLI never receives the\ntoken itself. 'alva configure' auto-runs 'token ensure' after saving credentials.\n\nSubcommands:\n token ensure Provision or refresh the Arrays JWT (idempotent)\n token status Show Arrays JWT presence, expiry, tier, and renewal hint\n\nExamples:\n alva arrays token ensure\n alva arrays token status`,\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 runHooks?: (client: AlvaClient) => Promise<void>;\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 CliUsageError('--api-key is required', 'configure');\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\n const client = new AlvaClient(baseUrl ? { apiKey, baseUrl } : { apiKey });\n const runHooks =\n writeDeps.runHooks ?? ((c: AlvaClient) => runPostConfigureHooks(c));\n try {\n await runHooks(client);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr?.write?.(`warning: post-configure hooks crashed: ${msg}\\n`);\n }\n\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 const group = command.split(' ')[0];\n throw new CliUsageError(`--${name} is required for '${command}'`, group);\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 const group = command.split(' ')[0];\n throw new CliUsageError(\n `--${name} must be a number for '${command}', got '${val}'`,\n group\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 let arraysJwtStatus: unknown;\n try {\n arraysJwtStatus = await client.arraysJwt.status();\n } catch {\n // soft-fail: omit arrays_jwt from _meta on failure\n }\n const metaBlock: Record<string, unknown> = {\n profile: meta?.profile ?? 'default',\n endpoint: meta?.baseUrl ?? client.baseUrl,\n };\n if (arraysJwtStatus !== undefined) {\n metaBlock.arrays_jwt = arraysJwtStatus;\n }\n const result: Record<string, unknown> = {\n ...record,\n _meta: metaBlock,\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)\n throw new CliUsageError('Missing subcommand for user', 'user');\n if (subcommand === 'me') return client.user.me();\n throw new CliUsageError(`Unknown subcommand: user ${subcommand}`, 'user');\n\n case 'fs': {\n if (!subcommand)\n throw new CliUsageError('Missing subcommand for fs', '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 CliUsageError(`Unknown subcommand: fs ${subcommand}`, 'fs');\n }\n }\n\n case 'run': {\n const sourceFlags = ['code', 'local-file', 'entry-path'].filter(\n (f) => flags[f] !== undefined\n );\n if (sourceFlags.length > 1) {\n throw new CliUsageError(\n `--${sourceFlags.join(' and --')} are mutually exclusive`,\n 'run'\n );\n }\n let code = flags['code'];\n if (flags['local-file']) {\n code = fs.readFileSync(flags['local-file'], 'utf-8') as string;\n }\n return client.run.execute({\n 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\n case 'deploy': {\n if (!subcommand)\n throw new CliUsageError('Missing subcommand for deploy', '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 case 'runs':\n return client.deploy.listRuns({\n cronjob_id: requireNumericFlag(flags, 'id', 'deploy runs'),\n first: num(flags['first']),\n cursor: num(flags['cursor']),\n });\n case 'run-logs':\n return client.deploy.getRunLogs({\n cronjob_id: requireNumericFlag(flags, 'id', 'deploy run-logs'),\n run_id: requireNumericFlag(flags, 'run-id', 'deploy run-logs'),\n });\n default:\n throw new CliUsageError(\n `Unknown subcommand: deploy ${subcommand}`,\n 'deploy'\n );\n }\n }\n\n case 'release': {\n if (!subcommand)\n throw new CliUsageError('Missing subcommand for release', '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 changelog: flags['changelog'],\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 });\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 CliUsageError(\n `Unknown subcommand: release ${subcommand}`,\n 'release'\n );\n }\n }\n\n case 'secrets': {\n if (!subcommand)\n throw new CliUsageError('Missing subcommand for secrets', '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 CliUsageError(\n `Unknown subcommand: secrets ${subcommand}`,\n 'secrets'\n );\n }\n }\n\n case 'sdk': {\n if (!subcommand)\n throw new CliUsageError('Missing subcommand for sdk', '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 CliUsageError(\n `Unknown subcommand: sdk ${subcommand}`,\n 'sdk'\n );\n }\n }\n\n case 'skills': {\n if (!subcommand)\n throw new CliUsageError('Missing subcommand for skills', 'skills');\n switch (subcommand) {\n case 'list':\n return client.skills.list();\n case 'summary':\n return client.skills.summary({\n name: requireFlag(flags, 'name', 'skills summary'),\n });\n case 'endpoint':\n return client.skills.endpoint({\n name: requireFlag(flags, 'name', 'skills endpoint'),\n file: requireFlag(flags, 'file', 'skills endpoint'),\n });\n default:\n throw new CliUsageError(\n `Unknown subcommand: skills ${subcommand}`,\n 'skills'\n );\n }\n }\n\n case 'comments': {\n if (!subcommand)\n throw new CliUsageError('Missing subcommand for comments', '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 CliUsageError(\n `Unknown subcommand: comments ${subcommand}`,\n 'comments'\n );\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 'arrays': {\n if (!subcommand || subcommand === '--help' || subcommand === '-h') {\n return { _help: true, text: COMMAND_HELP.arrays };\n }\n if (subcommand === 'token') {\n const leaf = args[2];\n if (!leaf || leaf === '--help' || leaf === '-h') {\n return { _help: true, text: COMMAND_HELP.arrays };\n }\n switch (leaf) {\n case 'ensure':\n return client.arraysJwt.ensure();\n case 'status':\n return client.arraysJwt.status();\n default:\n throw new Error(\n `Unknown subcommand 'arrays token ${leaf}'. Use 'alva arrays --help' for usage.`\n );\n }\n }\n throw new Error(\n `Unknown subcommand 'arrays ${subcommand}'. Use 'alva arrays --help' for usage.`\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 if (buf.length === 0) {\n throw new CliUsageError(\n 'Screenshot service returned empty response (0 bytes). The service may be overloaded — retry in a few seconds.',\n 'screenshot'\n );\n }\n fs.writeFileSync(outFile, buf);\n return { written: outFile, bytes: buf.length };\n }\n\n case 'trading': {\n if (!subcommand)\n throw new CliUsageError('Missing subcommand for trading', '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 CliUsageError(\n `Unknown subcommand: trading ${subcommand}`,\n 'trading'\n );\n }\n }\n\n case 'auth': {\n // bare `auth`, `auth --help`, `auth login --help` all show help\n const authSub = args[1];\n if (\n !authSub ||\n authSub === '--help' ||\n authSub === '-h' ||\n args[2] === '--help' ||\n args[2] === '-h'\n ) {\n return { _help: true, text: COMMAND_HELP.auth };\n }\n // auth login is handled in main() before loadConfig; if we reach here\n // it means dispatch was called directly (shouldn't happen in production)\n throw new CliUsageError(`Unknown auth subcommand: '${authSub}'`, 'auth');\n }\n\n default:\n throw new CliUsageError(`Unknown command: '${group}'`);\n }\n}\n\n/**\n * Strips global flags (--api-key, --base-url, --profile, --arrays-endpoint)\n * and their associated values from an argv list. Supports both\n * `--flag value` and `--flag=value` forms.\n */\nexport function stripGlobalFlags(argv: string[]): string[] {\n const GLOBAL_FLAGS = [\n '--api-key',\n '--base-url',\n '--profile',\n '--arrays-endpoint',\n ];\n const result: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (GLOBAL_FLAGS.includes(a)) {\n i++; // skip the value\n continue;\n }\n if (GLOBAL_FLAGS.some((f) => a.startsWith(`${f}=`))) {\n continue;\n }\n result.push(a);\n }\n return result;\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 // Handle auth before loading config (user doesn't have config yet when logging in)\n if (rawArgs[0] === 'auth') {\n const authSub = rawArgs[1];\n if (\n !authSub ||\n authSub === '--help' ||\n authSub === '-h' ||\n rawArgs[2] === '--help' ||\n rawArgs[2] === '-h'\n ) {\n process.stdout.write(`${COMMAND_HELP.auth}\\n`);\n return;\n }\n if (authSub === 'login') {\n const result = await handleAuthLogin(rawArgs);\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n process.stdout.write(`${COMMAND_HELP.auth}\\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 arraysBaseUrl: config.arraysBaseUrl,\n });\n\n const cleanArgs = stripGlobalFlags(rawArgs);\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 (typeof result === 'string') {\n // Print raw string (e.g. `fs read` of a plain-text file). JSON-stringifying\n // would wrap it in quotes and emit an escaped form, which is wrong for\n // scripting/pipe use and breaks downstream consumers that expect the\n // exact file bytes.\n process.stdout.write(result);\n return;\n }\n if (result !== undefined) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n');\n }\n } catch (err) {\n if (err instanceof CliUsageError) {\n const help = err.command ? COMMAND_HELP[err.command] : HELP_TEXT;\n process.stderr.write(`Error: ${err.message}\\n`);\n if (help) process.stderr.write(`\\n${help}\\n`);\n process.exit(1);\n } else if (err instanceof AlvaError) {\n const error = {\n code: err.code,\n message: err.message,\n status: err.status,\n };\n process.stderr.write(`${JSON.stringify({ error }, null, 2)}\\n`);\n process.exit(1);\n } else {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`Error: ${message}\\n`);\n process.exit(1);\n }\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","os","fsPromises","parseFlags","result"]}