@ariestools/aries-witness-cli 0.1.6
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/bin/witness.mjs +19663 -0
- package/dist/node/actions/bank/capitalOne.d.ts +19 -0
- package/dist/node/actions/bank/capitalOne.d.ts.map +1 -0
- package/dist/node/actions/bank/capitalOneProducts.d.ts +15 -0
- package/dist/node/actions/bank/capitalOneProducts.d.ts.map +1 -0
- package/dist/node/actions/bank/config.d.ts +33 -0
- package/dist/node/actions/bank/config.d.ts.map +1 -0
- package/dist/node/actions/bank/index.d.ts +7 -0
- package/dist/node/actions/bank/index.d.ts.map +1 -0
- package/dist/node/actions/pentair/circuit.d.ts +16 -0
- package/dist/node/actions/pentair/circuit.d.ts.map +1 -0
- package/dist/node/actions/pentair/config.d.ts +32 -0
- package/dist/node/actions/pentair/config.d.ts.map +1 -0
- package/dist/node/actions/pentair/index.d.ts +6 -0
- package/dist/node/actions/pentair/index.d.ts.map +1 -0
- package/dist/node/actions/pentair/screenlogic.d.ts +4 -0
- package/dist/node/actions/pentair/screenlogic.d.ts.map +1 -0
- package/dist/node/actions/witness/app/index.d.ts +4 -0
- package/dist/node/actions/witness/app/index.d.ts.map +1 -0
- package/dist/node/actions/witness/app/scanApps.d.ts +3 -0
- package/dist/node/actions/witness/app/scanApps.d.ts.map +1 -0
- package/dist/node/actions/witness/app/types.d.ts +15 -0
- package/dist/node/actions/witness/app/types.d.ts.map +1 -0
- package/dist/node/actions/witness/discoverPlugins.d.ts +3 -0
- package/dist/node/actions/witness/discoverPlugins.d.ts.map +1 -0
- package/dist/node/actions/witness/executeWitness.d.ts +16 -0
- package/dist/node/actions/witness/executeWitness.d.ts.map +1 -0
- package/dist/node/actions/witness/formatOutput.d.ts +8 -0
- package/dist/node/actions/witness/formatOutput.d.ts.map +1 -0
- package/dist/node/actions/witness/index.d.ts +6 -0
- package/dist/node/actions/witness/index.d.ts.map +1 -0
- package/dist/node/actions/witness/registerWitnessCommand.d.ts +4 -0
- package/dist/node/actions/witness/registerWitnessCommand.d.ts.map +1 -0
- package/dist/node/actions/witness/witnesses/bank.d.ts +3 -0
- package/dist/node/actions/witness/witnesses/bank.d.ts.map +1 -0
- package/dist/node/actions/witness/witnesses/index.d.ts +11 -0
- package/dist/node/actions/witness/witnesses/index.d.ts.map +1 -0
- package/dist/node/actions/witness/witnesses/netflixCatalog.d.ts +3 -0
- package/dist/node/actions/witness/witnesses/netflixCatalog.d.ts.map +1 -0
- package/dist/node/actions/witness/witnesses/netflixCatalogBrowser.d.ts +19 -0
- package/dist/node/actions/witness/witnesses/netflixCatalogBrowser.d.ts.map +1 -0
- package/dist/node/actions/witness/witnesses/netflixCatalogDetail.d.ts +26 -0
- package/dist/node/actions/witness/witnesses/netflixCatalogDetail.d.ts.map +1 -0
- package/dist/node/actions/witness/witnesses/netflixCatalogExtract.d.ts +24 -0
- package/dist/node/actions/witness/witnesses/netflixCatalogExtract.d.ts.map +1 -0
- package/dist/node/actions/witness/witnesses/pentair.d.ts +3 -0
- package/dist/node/actions/witness/witnesses/pentair.d.ts.map +1 -0
- package/dist/node/actions/witness/witnesses/pentairIntellichem.d.ts +3 -0
- package/dist/node/actions/witness/witnesses/pentairIntellichem.d.ts.map +1 -0
- package/dist/node/actions/witness/witnesses/pentairIntellichemGraph.d.ts +10 -0
- package/dist/node/actions/witness/witnesses/pentairIntellichemGraph.d.ts.map +1 -0
- package/dist/node/actions/witness/witnesses/pentairIntellichemTypes.d.ts +20 -0
- package/dist/node/actions/witness/witnesses/pentairIntellichemTypes.d.ts.map +1 -0
- package/dist/node/actions/witness/witnesses/pentairSchedules.d.ts +82 -0
- package/dist/node/actions/witness/witnesses/pentairSchedules.d.ts.map +1 -0
- package/dist/node/actions/witness/witnesses/systemInfo.d.ts +3 -0
- package/dist/node/actions/witness/witnesses/systemInfo.d.ts.map +1 -0
- package/dist/node/actions/witness/witnesses/timestamp.d.ts +3 -0
- package/dist/node/actions/witness/witnesses/timestamp.d.ts.map +1 -0
- package/dist/node/actions/witness/witnesses/url.d.ts +3 -0
- package/dist/node/actions/witness/witnesses/url.d.ts.map +1 -0
- package/dist/node/bin/witness.d.ts +3 -0
- package/dist/node/bin/witness.d.ts.map +1 -0
- package/dist/node/commands/bankCommand.d.ts +3 -0
- package/dist/node/commands/bankCommand.d.ts.map +1 -0
- package/dist/node/commands/pentairCommand.d.ts +3 -0
- package/dist/node/commands/pentairCommand.d.ts.map +1 -0
- package/dist/node/commands/witnessAppCommand.d.ts +3 -0
- package/dist/node/commands/witnessAppCommand.d.ts.map +1 -0
- package/dist/node/commands/witnessAppListCommand.d.ts +3 -0
- package/dist/node/commands/witnessAppListCommand.d.ts.map +1 -0
- package/dist/node/commands/witnessCommand.d.ts +4 -0
- package/dist/node/commands/witnessCommand.d.ts.map +1 -0
- package/dist/node/index.d.ts +10 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.mjs +3829 -0
- package/dist/node/index.mjs.map +7 -0
- package/dist/node/witness.d.ts +2 -0
- package/dist/node/witness.d.ts.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/actions/bank/capitalOne.ts", "../../src/actions/bank/config.ts", "../../src/actions/bank/capitalOneProducts.ts", "../../src/actions/pentair/circuit.ts", "../../src/actions/pentair/screenlogic.ts", "../../src/actions/pentair/config.ts", "../../src/actions/witness/discoverPlugins.ts", "../../src/actions/witness/executeWitness.ts", "../../src/actions/witness/formatOutput.ts", "../../src/actions/witness/registerWitnessCommand.ts", "../../src/commands/bankCommand.ts", "../../src/commands/pentairCommand.ts", "../../src/commands/witnessAppListCommand.ts", "../../src/actions/witness/app/scanApps.ts", "../../src/actions/witness/app/types.ts", "../../src/commands/witnessAppCommand.ts", "../../src/commands/witnessCommand.ts", "../../src/actions/witness/witnesses/bank.ts", "../../src/actions/witness/witnesses/netflixCatalog.ts", "../../src/actions/witness/witnesses/netflixCatalogBrowser.ts", "../../src/actions/witness/witnesses/netflixCatalogDetail.ts", "../../src/actions/witness/witnesses/netflixCatalogExtract.ts", "../../src/actions/witness/witnesses/pentair.ts", "../../src/actions/witness/witnesses/pentairIntellichem.ts", "../../src/actions/witness/witnesses/pentairIntellichemGraph.ts", "../../src/actions/witness/witnesses/pentairSchedules.ts", "../../src/actions/witness/witnesses/systemInfo.ts", "../../src/actions/witness/witnesses/timestamp.ts", "../../src/actions/witness/witnesses/url.ts", "../../src/actions/witness/witnesses/index.ts", "../../src/witness.ts"],
|
|
4
|
+
"sourcesContent": ["import { createHash } from 'node:crypto'\n\nimport type {\n BinaryRef, WitnessObservation, XyoPayload,\n} from '@ariestools/aries-witness-core'\nimport { hashBinary } from '@ariestools/aries-witness-core'\n\nimport {\n type CapitalOneConfig,\n type CapitalOneEnvironment,\n resolveCapitalOneConfig,\n} from './config.ts'\n\nexport const BANK_ACCOUNT_SNAPSHOT_SCHEMA = 'network.xyo.bank.account-snapshot'\n\nexport type BankRedactionMode = 'default' | 'none'\n\nexport interface BankWitnessOptions extends CapitalOneConfig {\n 'access-token'?: string\n 'account-id'?: string\n 'from'?: string\n 'include-raw'?: boolean\n 'provider'?: 'capitalone'\n 'redaction'?: BankRedactionMode\n 'to'?: string\n}\n\nexport interface BankProvider {\n name: string\n observe: (args: Record<string, unknown>) => Promise<WitnessObservation>\n}\n\ninterface TokenResponse {\n access_token?: string\n}\n\ninterface JsonFetchResult {\n bodyText: string\n json: unknown\n}\n\ninterface NormalizedAmount {\n amount?: string\n currency?: string\n}\n\ninterface RawArtifact {\n data: Buffer\n ref: BinaryRef\n}\n\nconst DEFAULT_HEADERS = { Accept: 'application/json' }\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction stringValue(value: unknown): string | undefined {\n if (typeof value === 'string' && value.length > 0) return value\n if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n return undefined\n}\n\nfunction getPath(value: unknown, path: readonly string[]): unknown {\n let current = value\n for (const part of path) {\n if (!isRecord(current)) return undefined\n current = current[part]\n }\n return current\n}\n\nfunction firstValue(source: unknown, paths: readonly (readonly string[])[]): unknown {\n for (const path of paths) {\n const value = getPath(source, path)\n if (value !== undefined && value !== null) return value\n }\n return undefined\n}\n\nfunction firstString(source: unknown, paths: readonly (readonly string[])[]): string | undefined {\n return stringValue(firstValue(source, paths))\n}\n\nfunction itemsAt(raw: unknown, paths: readonly (readonly string[])[]): unknown[] {\n for (const path of paths) {\n const value = getPath(raw, path)\n if (Array.isArray(value)) return value\n if (isRecord(value)) return [value]\n }\n return []\n}\n\nfunction hashIdentifier(provider: string, kind: string, value: string | undefined): string | undefined {\n if (!value) return undefined\n return createHash('sha256').update(`${provider}:${kind}:${value}`).digest('hex')\n}\n\nfunction maybeRedactedId(\n provider: string,\n kind: string,\n value: string | undefined,\n redaction: BankRedactionMode,\n clearKey: string,\n): Record<string, string> {\n if (!value) return {}\n if (redaction === 'none') return { [clearKey]: value }\n return { [`${clearKey}Hash`]: hashIdentifier(provider, kind, value) ?? '' }\n}\n\nfunction extractLast4(value: string | undefined): string | undefined {\n if (!value) return undefined\n const digits = value.replaceAll(/\\D/gu, '')\n if (digits.length >= 4) return digits.slice(-4)\n return value.length >= 4 ? value.slice(-4) : value\n}\n\nfunction normalizeAmount(source: unknown): NormalizedAmount | undefined {\n const amount = firstString(source, [\n ['Amount', 'Amount'],\n ['amount', 'amount'],\n ['amount'],\n ['currentBalance'],\n ['availableBalance'],\n ['balance'],\n ])\n const currency = firstString(source, [\n ['Amount', 'Currency'],\n ['amount', 'currency'],\n ['currency'],\n ['Currency'],\n ])\n if (!amount && !currency) return undefined\n return { amount, currency }\n}\n\nfunction normalizeAccount(source: unknown, provider: string, redaction: BankRedactionMode): Record<string, unknown> {\n const accountId = firstString(source, [\n ['AccountId'],\n ['accountId'],\n ['id'],\n ['account_id'],\n ])\n const identification = firstString(source, [\n ['Account', 'Identification'],\n ['account', 'identification'],\n ['identification'],\n ['mask'],\n ['last4'],\n ])\n\n return {\n ...maybeRedactedId(provider, 'account', accountId, redaction, 'accountId'),\n accountSubType: firstString(source, [['AccountSubType'], ['accountSubType'], ['subtype'], ['subType']]),\n accountType: firstString(source, [['AccountType'], ['accountType'], ['type']]),\n currency: firstString(source, [['Currency'], ['currency']]),\n description: firstString(source, [['Description'], ['description']]),\n last4: extractLast4(identification),\n name: firstString(source, [['Account', 'Name'], ['account', 'name'], ['name'], ['displayName']]),\n }\n}\n\nfunction normalizeBalance(source: unknown, provider: string, redaction: BankRedactionMode): Record<string, unknown> {\n const accountId = firstString(source, [\n ['AccountId'],\n ['accountId'],\n ['account_id'],\n ])\n return {\n ...maybeRedactedId(provider, 'account', accountId, redaction, 'accountId'),\n amount: normalizeAmount(source),\n creditDebitIndicator: firstString(source, [['CreditDebitIndicator'], ['creditDebitIndicator']]),\n dateTime: firstString(source, [['DateTime'], ['dateTime'], ['datetime'], ['asOf']]),\n type: firstString(source, [['Type'], ['type']]),\n }\n}\n\nfunction normalizeTransaction(source: unknown, provider: string, redaction: BankRedactionMode): Record<string, unknown> {\n const accountId = firstString(source, [\n ['AccountId'],\n ['accountId'],\n ['account_id'],\n ])\n const transactionId = firstString(source, [\n ['TransactionId'],\n ['TransactionReference'],\n ['transactionId'],\n ['transactionReference'],\n ['id'],\n ])\n return {\n ...maybeRedactedId(provider, 'account', accountId, redaction, 'accountId'),\n ...maybeRedactedId(provider, 'transaction', transactionId, redaction, 'transactionId'),\n amount: normalizeAmount(source),\n bookingDateTime: firstString(source, [['BookingDateTime'], ['bookingDateTime'], ['postedAt'], ['postedDate']]),\n creditDebitIndicator: firstString(source, [['CreditDebitIndicator'], ['creditDebitIndicator'], ['type']]),\n description: firstString(source, [['TransactionInformation'], ['transactionInformation'], ['description'], ['memo']]),\n merchantName: firstString(source, [['MerchantDetails', 'MerchantName'], ['merchantDetails', 'merchantName'], ['merchantName']]),\n status: firstString(source, [['Status'], ['status']]),\n valueDateTime: firstString(source, [['ValueDateTime'], ['valueDateTime'], ['authorizedAt'], ['transactionDate']]),\n }\n}\n\nfunction cleanObject<T extends Record<string, unknown>>(value: T): T {\n for (const key of Object.keys(value)) {\n const child = value[key]\n if (child === undefined) {\n delete value[key]\n } else if (isRecord(child)) {\n cleanObject(child)\n if (Object.keys(child).length === 0) delete value[key]\n }\n }\n return value\n}\n\nfunction jsonBinary(name: string, raw: unknown): RawArtifact {\n const data = Buffer.from(`${JSON.stringify(raw, null, 2)}\\n`, 'utf8')\n return {\n data,\n ref: {\n filename: `capitalone-${name}.json`,\n hash: hashBinary(data),\n mimeType: 'application/json',\n size: data.length,\n },\n }\n}\n\nfunction requireConfig(config: CapitalOneConfig, key: keyof CapitalOneConfig, reason: string): string {\n const value = config[key]\n if (typeof value === 'string' && value.length > 0) return value\n throw new Error(`Capital One ${reason} is required: set bank.capitalone.${key} or ARIES_CAPITALONE_${String(key).replaceAll('-', '_').toUpperCase()}.`)\n}\n\nfunction endpointUrl(\n baseUrl: string,\n pathTemplate: string,\n replacements: Record<string, string | undefined>,\n query: Record<string, string | undefined>,\n): URL {\n let resolvedPath = pathTemplate\n for (const [key, value] of Object.entries(replacements)) {\n if (value !== undefined) resolvedPath = resolvedPath.replaceAll(`{${key}}`, encodeURIComponent(value))\n }\n const url = new URL(resolvedPath.startsWith('http') ? resolvedPath : resolvedPath.replace(/^\\//u, ''), baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`)\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value.length > 0) url.searchParams.set(key, value)\n }\n return url\n}\n\nasync function fetchJson(url: URL | string, init: RequestInit, label: string): Promise<JsonFetchResult> {\n const response = await fetch(url, init)\n const bodyText = await response.text()\n if (!response.ok) {\n const snippet = bodyText.trim().slice(0, 400)\n throw new Error(`Capital One ${label} request failed (${response.status} ${response.statusText}): ${snippet}`)\n }\n try {\n return { bodyText, json: bodyText.length > 0 ? JSON.parse(bodyText) as unknown : null }\n } catch (error) {\n throw new Error(`Capital One ${label} response was not valid JSON`, { cause: error })\n }\n}\n\nasync function mintAccessToken(config: CapitalOneConfig): Promise<string> {\n const tokenUrl = requireConfig(config, 'token-url', 'token URL')\n const clientId = requireConfig(config, 'client-id', 'client id')\n const clientSecret = requireConfig(config, 'client-secret', 'client secret')\n const body = new URLSearchParams()\n body.set('client_id', clientId)\n body.set('client_secret', clientSecret)\n body.set('grant_type', 'client_credentials')\n if (config.scope) body.set('scope', config.scope)\n\n const result = await fetchJson(tokenUrl, {\n body: body.toString(),\n headers: {\n ...DEFAULT_HEADERS,\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n method: 'POST',\n }, 'token')\n const token = (result.json as TokenResponse | undefined)?.access_token\n if (!token) throw new Error('Capital One token response did not include access_token')\n return token\n}\n\nasync function resolveAccessToken(options: BankWitnessOptions, config: CapitalOneConfig): Promise<string> {\n const token = options['access-token'] ?? process.env.ARIES_CAPITALONE_ACCESS_TOKEN\n if (token && token.length > 0) return token\n return mintAccessToken(config)\n}\n\nfunction accountQuery(accountId: string | undefined, pathTemplate: string): Record<string, string | undefined> {\n return pathTemplate.includes('{accountId}') ? {} : { accountId }\n}\n\nfunction environment(config: CapitalOneConfig): CapitalOneEnvironment {\n return config.env ?? 'sandbox'\n}\n\nasync function observeCapitalOne(args: Record<string, unknown>): Promise<WitnessObservation> {\n const options = args as BankWitnessOptions\n const config = resolveCapitalOneConfig({\n 'accounts-path': options['accounts-path'],\n 'balances-path': options['balances-path'],\n 'base-url': options['base-url'],\n 'client-id': options['client-id'],\n 'client-secret': options['client-secret'],\n 'env': options.env,\n 'scope': options.scope,\n 'token-url': options['token-url'],\n 'transactions-path': options['transactions-path'],\n })\n const redaction: BankRedactionMode = options.redaction ?? 'default'\n const baseUrl = requireConfig(config, 'base-url', 'base URL')\n const accountsPath = requireConfig(config, 'accounts-path', 'accounts endpoint path')\n const balancesPath = requireConfig(config, 'balances-path', 'balances endpoint path')\n const transactionsPath = requireConfig(config, 'transactions-path', 'transactions endpoint path')\n const accessToken = await resolveAccessToken(options, config)\n const authHeaders = {\n ...DEFAULT_HEADERS,\n Authorization: `Bearer ${accessToken}`,\n }\n const accountId = options['account-id']\n\n const accounts = await fetchJson(endpointUrl(baseUrl, accountsPath, {}, {}), {\n headers: authHeaders,\n method: 'GET',\n }, 'accounts')\n const balances = await fetchJson(endpointUrl(baseUrl, balancesPath, { accountId }, accountQuery(accountId, balancesPath)), {\n headers: authHeaders,\n method: 'GET',\n }, 'balances')\n const transactions = await fetchJson(endpointUrl(baseUrl, transactionsPath, { accountId }, {\n ...accountQuery(accountId, transactionsPath),\n from: options.from,\n to: options.to,\n }), {\n headers: authHeaders,\n method: 'GET',\n }, 'transactions')\n\n const accountItems = itemsAt(accounts.json, [\n ['Data', 'Account'],\n ['Data', 'Accounts'],\n ['data', 'accounts'],\n ['accounts'],\n ])\n const balanceItems = itemsAt(balances.json, [\n ['Data', 'Balance'],\n ['Data', 'Balances'],\n ['data', 'balances'],\n ['balances'],\n ])\n const transactionItems = itemsAt(transactions.json, [\n ['Data', 'Transaction'],\n ['Data', 'Transactions'],\n ['data', 'transactions'],\n ['transactions'],\n ])\n\n const rawArtifacts = options['include-raw'] === true\n ? {\n accounts: jsonBinary('accounts', accounts.json),\n balances: jsonBinary('balances', balances.json),\n transactions: jsonBinary('transactions', transactions.json),\n }\n : undefined\n\n const payload: XyoPayload = cleanObject({\n accounts: accountItems.map(item => cleanObject(normalizeAccount(item, 'capitalone', redaction))),\n balances: balanceItems.map(item => cleanObject(normalizeBalance(item, 'capitalone', redaction))),\n environment: environment(config),\n observedAt: new Date().toISOString(),\n provider: 'capitalone',\n raw: rawArtifacts\n ? {\n accounts: rawArtifacts.accounts.ref,\n balances: rawArtifacts.balances.ref,\n transactions: rawArtifacts.transactions.ref,\n }\n : undefined,\n request: cleanObject({\n accountId: redaction === 'none' ? accountId : undefined,\n accountIdHash: redaction === 'default' ? hashIdentifier('capitalone', 'account', accountId) : undefined,\n from: options.from,\n to: options.to,\n }),\n schema: BANK_ACCOUNT_SNAPSHOT_SCHEMA,\n transactions: transactionItems.map(item => cleanObject(normalizeTransaction(item, 'capitalone', redaction))),\n })\n\n return {\n binaries: rawArtifacts ? Object.values(rawArtifacts) : undefined,\n payloads: [payload],\n }\n}\n\nexport const capitalOneProvider: BankProvider = {\n name: 'capitalone',\n observe: observeCapitalOne,\n}\n", "import {\n chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync,\n} from 'node:fs'\nimport { homedir } from 'node:os'\nimport path from 'node:path'\n\nimport chalk from 'chalk'\n\nexport const CAPITAL_ONE_CONFIG_KEYS = [\n 'env',\n 'base-url',\n 'token-url',\n 'client-id',\n 'client-secret',\n 'scope',\n 'accounts-path',\n 'balances-path',\n 'transactions-path',\n] as const\n\nexport type CapitalOneConfigKey = typeof CAPITAL_ONE_CONFIG_KEYS[number]\n\nexport type CapitalOneEnvironment = 'production' | 'sandbox'\n\nexport interface CapitalOneConfig {\n 'accounts-path'?: string\n 'balances-path'?: string\n 'base-url'?: string\n 'client-id'?: string\n 'client-secret'?: string\n 'env'?: CapitalOneEnvironment\n 'scope'?: string\n 'token-url'?: string\n 'transactions-path'?: string\n}\n\nexport interface CapitalOneConfigGetOptions {\n json?: boolean\n key?: CapitalOneConfigKey\n showSecrets?: boolean\n}\n\nexport interface CapitalOneConfigSetOptions {\n key: CapitalOneConfigKey\n value: string\n}\n\nconst SECRET_KEYS = new Set<CapitalOneConfigKey>(['client-secret'])\n\nconst KEY_ALIASES: Record<string, CapitalOneConfigKey> = {\n 'accountsPath': 'accounts-path',\n 'accounts-path': 'accounts-path',\n 'balancesPath': 'balances-path',\n 'balances-path': 'balances-path',\n 'baseUrl': 'base-url',\n 'base-url': 'base-url',\n 'clientId': 'client-id',\n 'client-id': 'client-id',\n 'clientSecret': 'client-secret',\n 'client-secret': 'client-secret',\n 'env': 'env',\n 'environment': 'env',\n 'scope': 'scope',\n 'tokenUrl': 'token-url',\n 'token-url': 'token-url',\n 'transactionsPath': 'transactions-path',\n 'transactions-path': 'transactions-path',\n}\n\nconst ENV_KEY_MAP: Record<CapitalOneConfigKey, string> = {\n 'accounts-path': 'ARIES_CAPITALONE_ACCOUNTS_PATH',\n 'balances-path': 'ARIES_CAPITALONE_BALANCES_PATH',\n 'base-url': 'ARIES_CAPITALONE_BASE_URL',\n 'client-id': 'ARIES_CAPITALONE_CLIENT_ID',\n 'client-secret': 'ARIES_CAPITALONE_CLIENT_SECRET',\n 'env': 'ARIES_CAPITALONE_ENV',\n 'scope': 'ARIES_CAPITALONE_SCOPE',\n 'token-url': 'ARIES_CAPITALONE_TOKEN_URL',\n 'transactions-path': 'ARIES_CAPITALONE_TRANSACTIONS_PATH',\n}\n\nfunction ariesHome(): string {\n return process.env.ARIES_HOME ?? path.join(homedir(), '.aries')\n}\n\nexport function bankConfigDir(root: string = ariesHome()): string {\n return path.join(root, 'bank')\n}\n\nexport function capitalOneConfigPath(root: string = ariesHome()): string {\n return path.join(bankConfigDir(root), 'capitalone.json')\n}\n\nexport function defaultCapitalOneConfig(): CapitalOneConfig {\n return { env: 'sandbox' }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction readString(value: unknown, key: CapitalOneConfigKey): string {\n if (typeof value === 'string') return value\n throw new Error(`bank.capitalone.${key} must be a string`)\n}\n\nfunction parseEnvironment(value: string, key: CapitalOneConfigKey): CapitalOneEnvironment {\n if (value === 'sandbox' || value === 'production') return value\n throw new Error(`bank.capitalone.${key} must be one of: sandbox, production`)\n}\n\nfunction readConfigValue(key: CapitalOneConfigKey, value: unknown): string {\n const text = readString(value, key)\n return key === 'env' ? parseEnvironment(text, key) : text\n}\n\nfunction parseConfigValue(key: CapitalOneConfigKey, raw: string): string {\n return key === 'env' ? parseEnvironment(raw, key) : raw\n}\n\nfunction normalizeConfig(config: CapitalOneConfig): CapitalOneConfig {\n const next: CapitalOneConfig = {}\n for (const key of CAPITAL_ONE_CONFIG_KEYS) {\n const value = config[key]\n if (value !== undefined) next[key] = readConfigValue(key, value) as never\n }\n return next\n}\n\nfunction orderedConfig(config: CapitalOneConfig): Record<string, string> {\n const out: Record<string, string> = {}\n for (const key of CAPITAL_ONE_CONFIG_KEYS) {\n const value = config[key]\n if (value !== undefined) out[key] = value\n }\n return out\n}\n\nfunction envConfig(env: NodeJS.ProcessEnv = process.env): CapitalOneConfig {\n const config: CapitalOneConfig = {}\n for (const key of CAPITAL_ONE_CONFIG_KEYS) {\n const value = env[ENV_KEY_MAP[key]]\n if (value !== undefined && value.length > 0) {\n config[key] = parseConfigValue(key, value) as never\n }\n }\n return config\n}\n\nfunction displayValue(key: CapitalOneConfigKey, value: string | undefined, showSecrets: boolean): string {\n if (value === undefined) return ''\n if (!showSecrets && SECRET_KEYS.has(key)) return '********'\n return value\n}\n\nfunction outputValue(key: CapitalOneConfigKey, value: string | undefined, showSecrets: boolean): null | string {\n if (value === undefined) return null\n if (!showSecrets && SECRET_KEYS.has(key)) return '********'\n return value\n}\n\nexport function normalizeCapitalOneConfigKey(value: string): CapitalOneConfigKey {\n const withoutPrefix = value.startsWith('bank.capitalone.') ? value.slice('bank.capitalone.'.length) : value\n const key = withoutPrefix.startsWith('capitalone.') ? withoutPrefix.slice('capitalone.'.length) : withoutPrefix\n const normalized = KEY_ALIASES[key]\n if (normalized) return normalized\n throw new Error(`Unknown bank.capitalone config key \"${value}\". Known: ${CAPITAL_ONE_CONFIG_KEYS.join(', ')}`)\n}\n\nexport function readCapitalOneConfig(root: string = ariesHome()): CapitalOneConfig {\n const filePath = capitalOneConfigPath(root)\n if (!existsSync(filePath)) return {}\n const raw = readFileSync(filePath, 'utf8')\n if (raw.trim().length === 0) return {}\n\n const parsed = JSON.parse(raw) as unknown\n if (!isRecord(parsed)) throw new Error(`${filePath} must contain a JSON object`)\n\n const config: CapitalOneConfig = {}\n for (const key of CAPITAL_ONE_CONFIG_KEYS) {\n if (parsed[key] !== undefined) config[key] = readConfigValue(key, parsed[key]) as never\n }\n return config\n}\n\nexport function writeCapitalOneConfig(config: CapitalOneConfig, root: string = ariesHome()): void {\n const normalized = normalizeConfig(config)\n const dir = bankConfigDir(root)\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n const filePath = capitalOneConfigPath(root)\n const tmp = `${filePath}.tmp`\n writeFileSync(tmp, `${JSON.stringify(orderedConfig(normalized), null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 })\n renameSync(tmp, filePath)\n try {\n chmodSync(filePath, 0o600)\n } catch {\n // chmod is best-effort on platforms that do not support POSIX modes.\n }\n}\n\nexport function resolveCapitalOneConfig(\n overrides: CapitalOneConfig = {},\n root: string = ariesHome(),\n env: NodeJS.ProcessEnv = process.env,\n): CapitalOneConfig {\n return normalizeConfig({\n ...defaultCapitalOneConfig(),\n ...readCapitalOneConfig(root),\n ...envConfig(env),\n ...normalizeConfig(overrides),\n })\n}\n\nexport function capitalOneConfigSet(options: CapitalOneConfigSetOptions): void {\n const current = readCapitalOneConfig()\n const next: CapitalOneConfig = {\n ...current,\n [options.key]: parseConfigValue(options.key, options.value),\n }\n writeCapitalOneConfig(next)\n const display = displayValue(options.key, next[options.key], false)\n console.log(`${chalk.green('set')} bank.capitalone.${options.key}=${display}`)\n}\n\nexport function capitalOneConfigGet(options: CapitalOneConfigGetOptions = {}): void {\n const config = resolveCapitalOneConfig()\n const keys = options.key ? [options.key] : CAPITAL_ONE_CONFIG_KEYS\n const showSecrets = options.showSecrets === true\n\n if (options.json === true) {\n const out: Record<string, null | string> = {}\n for (const key of keys) {\n out[`bank.capitalone.${key}`] = outputValue(key, config[key], showSecrets)\n }\n console.log(JSON.stringify(out, null, 2))\n return\n }\n\n for (const key of keys) {\n console.log(`${chalk.cyan(`bank.capitalone.${key}`)}=${displayValue(key, config[key], showSecrets)}`)\n }\n}\n", "import { readFileSync } from 'node:fs'\n\nimport type {\n BinaryRef, WitnessObservation, XyoPayload,\n} from '@ariestools/aries-witness-core'\nimport { hashBinary } from '@ariestools/aries-witness-core'\n\nimport type { BankProvider } from './capitalOne.ts'\nimport {\n type CapitalOneConfig,\n type CapitalOneEnvironment,\n resolveCapitalOneConfig,\n} from './config.ts'\n\nexport const BANK_PRODUCT_CATALOG_SCHEMA = 'network.xyo.bank.product-catalog'\n\nexport type CapitalOneProductsOperation = 'retrieve-products' | 'retail-products' | 'search'\n\nexport interface CapitalOneProductsOptions extends CapitalOneConfig {\n 'access-token'?: string\n 'api-version'?: string\n 'body'?: string\n 'body-file'?: string\n 'include-raw'?: boolean\n 'operation'?: CapitalOneProductsOperation\n 'product-id'?: string\n}\n\ninterface JsonFetchResult {\n bodyText: string\n json: unknown\n}\n\ninterface RawArtifact {\n data: Buffer\n ref: BinaryRef\n}\n\ninterface TokenResponse {\n access_token?: string\n}\n\nconst CAPITAL_ONE_PRODUCTS_DEVEX_PRODUCT_ID = '1359-5'\nconst CAPITAL_ONE_PRODUCTS_NAME = 'Retrieve Consumer Bank Products'\nconst DEFAULT_API_VERSION = '5'\nconst DEFAULT_PRODUCTS_OPERATION: CapitalOneProductsOperation = 'search'\nconst DEFAULT_PRODUCTS_PATH_PRODUCT_ID = '~'\nconst SANDBOX_BASE_URL = 'https://api-sandbox.capitalone.com'\nconst SANDBOX_TOKEN_URL = `${SANDBOX_BASE_URL}/oauth2/token`\n\nconst PRODUCT_ENDPOINTS: Record<CapitalOneProductsOperation, { method: 'GET' | 'POST'; path: string; requiresProductId: boolean }> = {\n 'retrieve-products': {\n method: 'POST',\n path: '/deposits/products/retrieve-products',\n requiresProductId: false,\n },\n 'retail-products': {\n method: 'GET',\n path: '/deposits/products/{productId}/retail-products',\n requiresProductId: true,\n },\n 'search': {\n method: 'POST',\n path: '/deposits/products/{productId}/search',\n requiresProductId: true,\n },\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction stringValue(value: unknown): string | undefined {\n if (typeof value === 'string' && value.length > 0) return value\n if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n return undefined\n}\n\nfunction getPath(value: unknown, path: readonly string[]): unknown {\n let current = value\n for (const part of path) {\n if (!isRecord(current)) return undefined\n current = current[part]\n }\n return current\n}\n\nfunction firstValue(source: unknown, paths: readonly (readonly string[])[]): unknown {\n for (const path of paths) {\n const value = getPath(source, path)\n if (value !== undefined && value !== null) return value\n }\n return undefined\n}\n\nfunction firstString(source: unknown, paths: readonly (readonly string[])[]): string | undefined {\n return stringValue(firstValue(source, paths))\n}\n\nfunction itemsAt(raw: unknown, operation: CapitalOneProductsOperation): unknown[] {\n const paths = operation === 'retail-products'\n ? [['retailProducts'], ['RetailProducts'], ['data', 'retailProducts'], ['Data', 'RetailProducts']]\n : [['products'], ['Products'], ['data', 'products'], ['Data', 'Products']]\n for (const path of paths) {\n const value = getPath(raw, path)\n if (Array.isArray(value)) return value\n if (isRecord(value)) return [value]\n }\n return []\n}\n\nfunction cleanObject<T extends Record<string, unknown>>(value: T): T {\n for (const key of Object.keys(value)) {\n const child = value[key]\n if (child === undefined) {\n delete value[key]\n } else if (isRecord(child)) {\n cleanObject(child)\n if (Object.keys(child).length === 0) delete value[key]\n } else if (Array.isArray(child)) {\n for (const item of child) {\n if (isRecord(item)) cleanObject(item)\n }\n if (child.length === 0) delete value[key]\n }\n }\n return value\n}\n\nfunction jsonBinary(name: string, raw: unknown): RawArtifact {\n const data = Buffer.from(`${JSON.stringify(raw, null, 2)}\\n`, 'utf8')\n return {\n data,\n ref: {\n filename: `capitalone-${name}.json`,\n hash: hashBinary(data),\n mimeType: 'application/json',\n size: data.length,\n },\n }\n}\n\nfunction parseJsonInput(raw: string, label: string): unknown {\n try {\n return JSON.parse(raw) as unknown\n } catch (error) {\n throw new Error(`Capital One products ${label} must be valid JSON`, { cause: error })\n }\n}\n\nfunction gatewayHint(label: string, status: number, bodyText: string): string {\n if (status !== 403 || !bodyText.toLowerCase().includes('no endpoint matched for request')) return ''\n if (label === 'token') {\n return ' For direct CLI token minting, use https://api-sandbox.capitalone.com/oauth2/token; /sandbox/oauth2/token is a DevExchange-host relative route.'\n }\n return [\n ' Capital One token minting succeeded, but the sandbox API gateway did not match the product endpoint.',\n 'Verify the app is connected to DevExchange product 1359-5 in the sandbox and confirm the live sandbox base path with Capital One.',\n ].join(' ')\n}\n\nfunction requestBody(\n options: CapitalOneProductsOptions,\n method: 'GET' | 'POST',\n operation: CapitalOneProductsOperation,\n): unknown {\n if (method === 'GET') return undefined\n if (options['body-file']) return parseJsonInput(readFileSync(options['body-file'], 'utf8'), 'body file')\n if (options.body) return parseJsonInput(options.body, 'body')\n if (operation === 'search') return { isCollapseRate: true }\n return {}\n}\n\nfunction environment(config: CapitalOneConfig): CapitalOneEnvironment {\n return config.env ?? 'sandbox'\n}\n\nfunction requireConfig(config: CapitalOneConfig, key: keyof CapitalOneConfig, reason: string): string {\n const value = config[key]\n if (typeof value === 'string' && value.length > 0) return value\n throw new Error(`Capital One products ${reason} is required: set bank.capitalone.${key} or ARIES_CAPITALONE_${String(key).replaceAll('-', '_').toUpperCase()}.`)\n}\n\nfunction configuredOrSandboxDefault(config: CapitalOneConfig, key: 'base-url' | 'token-url', sandboxDefault: string, reason: string): string {\n const configured = config[key]\n if (configured && configured.length > 0) return configured\n if (environment(config) === 'sandbox') return sandboxDefault\n return requireConfig(config, key, reason)\n}\n\nasync function fetchJson(url: URL | string, init: RequestInit, label: string): Promise<JsonFetchResult> {\n const response = await fetch(url, init)\n const bodyText = await response.text()\n if (!response.ok) {\n const snippet = bodyText.trim().slice(0, 400)\n throw new Error(`Capital One products ${label} request failed (${response.status} ${response.statusText}): ${snippet}${gatewayHint(label, response.status, bodyText)}`)\n }\n try {\n return { bodyText, json: bodyText.length > 0 ? JSON.parse(bodyText) as unknown : null }\n } catch (error) {\n throw new Error(`Capital One products ${label} response was not valid JSON`, { cause: error })\n }\n}\n\nasync function mintAccessToken(config: CapitalOneConfig): Promise<string> {\n const tokenUrl = configuredOrSandboxDefault(config, 'token-url', SANDBOX_TOKEN_URL, 'token URL')\n const clientId = requireConfig(config, 'client-id', 'client id')\n const clientSecret = requireConfig(config, 'client-secret', 'client secret')\n const body = new URLSearchParams()\n body.set('client_id', clientId)\n body.set('client_secret', clientSecret)\n body.set('grant_type', 'client_credentials')\n if (config.scope) body.set('scope', config.scope)\n\n const result = await fetchJson(tokenUrl, {\n body: body.toString(),\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n method: 'POST',\n }, 'token')\n const token = (result.json as TokenResponse | undefined)?.access_token\n if (!token) throw new Error('Capital One products token response did not include access_token')\n return token\n}\n\nasync function resolveAccessToken(options: CapitalOneProductsOptions, config: CapitalOneConfig): Promise<string> {\n const token = options['access-token'] ?? process.env.ARIES_CAPITALONE_ACCESS_TOKEN\n if (token && token.length > 0) return token\n return mintAccessToken(config)\n}\n\nfunction endpointUrl(baseUrl: string, pathTemplate: string, productId: string | undefined): URL {\n const resolvedPath = productId === undefined ? pathTemplate : pathTemplate.replaceAll('{productId}', encodeURIComponent(productId))\n return new URL(resolvedPath.replace(/^\\//u, ''), baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`)\n}\n\nfunction normalizeProduct(source: unknown): Record<string, unknown> {\n const rates = firstValue(source, [['interest', 'rates'], ['rates']])\n const features = firstValue(source, [['features'], ['retailProductfeatures'], ['retailProductFeatures']])\n return cleanObject({\n baseCurrency: firstString(source, [['base', 'baseCurrency'], ['baseCurrency']]),\n features: Array.isArray(features) ? features : undefined,\n lineOfBusiness: firstString(source, [['base', 'lineOfBusiness'], ['productDefinition', 'lineOfBusiness'], ['lineOfBusiness']]),\n productDescription: firstString(source, [['productDefinition', 'productDescription'], ['productDescription']]),\n productFamily: firstString(source, [\n ['base', 'productFamily'],\n ['productDefinition', 'productGroup'],\n ['productFamily'],\n ['productFamilyName'],\n ]),\n productGroup: firstString(source, [['productDefinition', 'productGroup'], ['productGroup']]),\n productId: firstString(source, [\n ['base', 'productId'],\n ['base', 'productLineId'],\n ['productDefinition', 'productCode'],\n ['retailProductDefinition', 'retailProductCode'],\n ['retailProductDefinition', 'productCode'],\n ['productId'],\n ['productLineId'],\n ]),\n productLineId: firstString(source, [['base', 'productLineId'], ['productLineId']]),\n productName: firstString(source, [['productDefinition', 'productName'], ['retailProductfeatures', 'productName'], ['productName']]),\n productSourceId: firstString(source, [['base', 'productSourceId'], ['productSourceId']]),\n productStatus: firstString(source, [['productDefinition', 'productStatus'], ['productStatus']]),\n productType: firstString(source, [['base', 'productType'], ['productDefinition', 'productType'], ['productType']]),\n rates: Array.isArray(rates) ? rates : undefined,\n })\n}\n\nasync function observeCapitalOneProducts(args: Record<string, unknown>): Promise<WitnessObservation> {\n const options = args as CapitalOneProductsOptions\n const config = resolveCapitalOneConfig({\n 'base-url': options['base-url'],\n 'client-id': options['client-id'],\n 'client-secret': options['client-secret'],\n 'env': options.env,\n 'scope': options.scope,\n 'token-url': options['token-url'],\n })\n const operation = options.operation ?? DEFAULT_PRODUCTS_OPERATION\n const endpoint = PRODUCT_ENDPOINTS[operation]\n const productId = options['product-id'] ?? (endpoint.requiresProductId ? DEFAULT_PRODUCTS_PATH_PRODUCT_ID : undefined)\n if (endpoint.requiresProductId && (!productId || productId.length === 0)) {\n throw new Error(`Capital One products operation \"${operation}\" requires --product-id.`)\n }\n\n const baseUrl = configuredOrSandboxDefault(config, 'base-url', SANDBOX_BASE_URL, 'base URL')\n const apiVersion = options['api-version'] ?? DEFAULT_API_VERSION\n const accessToken = await resolveAccessToken(options, config)\n const body = requestBody(options, endpoint.method, operation)\n const headers: Record<string, string> = {\n Accept: `application/json;v=${apiVersion}`,\n Authorization: `Bearer ${accessToken}`,\n }\n if (endpoint.method === 'POST') headers['Content-Type'] = `application/json;v=${apiVersion}`\n\n const response = await fetchJson(endpointUrl(baseUrl, endpoint.path, productId), {\n body: body === undefined ? undefined : JSON.stringify(body),\n headers,\n method: endpoint.method,\n }, operation)\n const rawArtifact = options['include-raw'] === true ? jsonBinary('bank-products-response', response.json) : undefined\n const products = itemsAt(response.json, operation).map(normalizeProduct)\n\n const payload: XyoPayload = cleanObject({\n apiVersion,\n devExchangeProductId: CAPITAL_ONE_PRODUCTS_DEVEX_PRODUCT_ID,\n environment: environment(config),\n observedAt: new Date().toISOString(),\n operation,\n productCount: products.length,\n productId,\n productName: CAPITAL_ONE_PRODUCTS_NAME,\n products,\n provider: 'capitalone',\n raw: rawArtifact?.ref,\n request: cleanObject({\n body,\n method: endpoint.method,\n path: endpoint.path,\n productId,\n }),\n schema: BANK_PRODUCT_CATALOG_SCHEMA,\n })\n\n return {\n binaries: rawArtifact ? [rawArtifact] : undefined,\n payloads: [payload],\n }\n}\n\nexport const capitalOneProductsProvider: BankProvider = {\n name: 'capitalone-products',\n observe: observeCapitalOneProducts,\n}\n", "import chalk from 'chalk'\n\nimport type { PentairConfig } from './config.ts'\nimport { withScreenLogic } from './screenlogic.ts'\n\nexport interface PentairCircuitRuntimeSetOptions extends PentairConfig {\n 'circuit-id': number\n 'hours'?: number\n 'json'?: boolean\n 'minutes'?: number\n 'on'?: boolean\n}\n\nexport interface PentairCircuitRuntimeSetResult {\n circuitId: number\n runTimeMinutes: number\n state?: 'on'\n}\n\nfunction readPositiveInteger(value: number | undefined, name: string): number | undefined {\n if (value === undefined) return undefined\n if (Number.isInteger(value) && value > 0) return value\n throw new Error(`${name} must be a positive integer`)\n}\n\nexport function resolveCircuitRuntimeMinutes(options: Pick<PentairCircuitRuntimeSetOptions, 'hours' | 'minutes'>): number {\n const hours = readPositiveInteger(options.hours, '--hours')\n const minutes = readPositiveInteger(options.minutes, '--minutes')\n\n if (hours !== undefined && minutes !== undefined) {\n throw new Error('Use either --hours or --minutes, not both')\n }\n if (hours === undefined && minutes === undefined) {\n throw new Error('Either --hours or --minutes is required')\n }\n\n if (minutes !== undefined) return minutes\n if (hours !== undefined) return hours * 60\n throw new Error('Either --hours or --minutes is required')\n}\n\nexport async function setPentairCircuitRuntime(options: PentairCircuitRuntimeSetOptions): Promise<void> {\n const circuitId = readPositiveInteger(options['circuit-id'], '--circuit-id')\n if (circuitId === undefined) throw new Error('--circuit-id is required')\n\n const runTimeMinutes = resolveCircuitRuntimeMinutes(options)\n const turnOn = options.on === true\n\n await withScreenLogic(options, async (unit) => {\n await unit.circuits.setCircuitRuntimebyIdAsync(circuitId, runTimeMinutes)\n if (turnOn) await unit.circuits.setCircuitStateAsync(circuitId, true)\n })\n\n const result: PentairCircuitRuntimeSetResult = {\n circuitId,\n runTimeMinutes,\n ...(turnOn && { state: 'on' }),\n }\n\n if (options.json === true) {\n console.log(JSON.stringify(result, null, 2))\n return\n }\n\n console.log(`${chalk.green('set')} pentair.circuit.${circuitId}.runtime=${runTimeMinutes}m`)\n if (turnOn) console.log(`${chalk.green('set')} pentair.circuit.${circuitId}.state=on`)\n}\n", "import type { UnitConnection } from 'node-screenlogic'\nimport { FindUnits, screenlogic } from 'node-screenlogic'\n\nimport { type PentairConfig, resolvePentairConfig } from './config.ts'\n\nasync function findLocalUnit(searchTimeout: number, searchAttempts: number) {\n for (let attempt = 0; attempt < searchAttempts; attempt += 1) {\n const finder = new FindUnits()\n const localUnit = (await finder.searchAsync(searchTimeout)).shift()\n if (localUnit) return localUnit\n }\n return\n}\n\nexport async function withScreenLogic<T>(\n overrides: PentairConfig,\n callback: (unit: UnitConnection) => Promise<T>,\n): Promise<T> {\n const options = resolvePentairConfig(overrides)\n\n if (options.address) {\n const password = options.password ?? process.env.SCREENLOGIC_PASSWORD\n screenlogic.init(options['system-name'] ?? 'Pentair ScreenLogic', options.address, options.port ?? 80, password)\n } else {\n const localUnit = await findLocalUnit(options['search-timeout'] ?? 5000, options['search-attempts'] ?? 3)\n if (!localUnit) throw new Error('No local ScreenLogic unit found')\n screenlogic.initUnit(localUnit)\n }\n screenlogic.netTimeout = options['response-timeout'] ?? 15_000\n\n if (!await screenlogic.connectAsync()) {\n throw new Error('Failed to connect to ScreenLogic')\n }\n\n try {\n return await callback(screenlogic)\n } finally {\n await screenlogic.closeAsync().catch(() => false)\n }\n}\n", "import {\n chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync,\n} from 'node:fs'\nimport { homedir } from 'node:os'\nimport path from 'node:path'\n\nimport chalk from 'chalk'\n\nexport const PENTAIR_CONFIG_KEYS = [\n 'address',\n 'port',\n 'password',\n 'system-name',\n 'response-timeout',\n 'search-timeout',\n 'search-attempts',\n 'series-file',\n] as const\n\nexport type PentairConfigKey = typeof PENTAIR_CONFIG_KEYS[number]\n\nexport interface PentairConfig {\n 'address'?: string\n 'password'?: string\n 'port'?: number\n 'response-timeout'?: number\n 'search-attempts'?: number\n 'search-timeout'?: number\n 'series-file'?: string\n 'system-name'?: string\n}\n\nexport interface PentairConfigGetOptions {\n json?: boolean\n key?: PentairConfigKey\n showSecrets?: boolean\n}\n\nexport interface PentairConfigSetOptions {\n key: PentairConfigKey\n value: string\n}\n\nconst NUMBER_KEYS = new Set<PentairConfigKey>(['port', 'response-timeout', 'search-timeout', 'search-attempts'])\nconst SECRET_KEYS = new Set<PentairConfigKey>(['password'])\n\nconst KEY_ALIASES: Record<string, PentairConfigKey> = {\n 'address': 'address',\n 'password': 'password',\n 'port': 'port',\n 'responseTimeout': 'response-timeout',\n 'response-timeout': 'response-timeout',\n 'searchAttempts': 'search-attempts',\n 'search-attempts': 'search-attempts',\n 'searchTimeout': 'search-timeout',\n 'search-timeout': 'search-timeout',\n 'seriesFile': 'series-file',\n 'series-file': 'series-file',\n 'systemName': 'system-name',\n 'system-name': 'system-name',\n}\n\nfunction ariesHome(): string {\n return process.env.ARIES_HOME ?? path.join(homedir(), '.aries')\n}\n\nexport function pentairConfigDir(root: string = ariesHome()): string {\n return path.join(root, 'pentair')\n}\n\nexport function pentairConfigPath(root: string = ariesHome()): string {\n return path.join(pentairConfigDir(root), 'config.json')\n}\n\nexport function defaultPentairSeriesFile(root: string = ariesHome()): string {\n return path.join(pentairConfigDir(root), 'intellichem.jsonl')\n}\n\nexport function defaultPentairConfig(root: string = ariesHome()): Required<Pick<PentairConfig,\n 'port' | 'response-timeout' | 'search-attempts' | 'search-timeout' | 'series-file' | 'system-name'\n>> {\n return {\n 'port': 80,\n 'response-timeout': 15_000,\n 'search-attempts': 3,\n 'search-timeout': 5000,\n 'series-file': defaultPentairSeriesFile(root),\n 'system-name': 'Pentair ScreenLogic',\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction readNumber(value: unknown, key: PentairConfigKey): number {\n if (typeof value === 'number' && Number.isFinite(value) && value > 0) return value\n throw new Error(`pentair.${key} must be a positive number`)\n}\n\nfunction readString(value: unknown, key: PentairConfigKey): string {\n if (typeof value === 'string') return value\n throw new Error(`pentair.${key} must be a string`)\n}\n\nfunction parseNumber(raw: string, key: PentairConfigKey): number {\n const parsed = Number(raw)\n if (Number.isFinite(parsed) && parsed > 0) return parsed\n throw new Error(`pentair.${key} must be a positive number`)\n}\n\nfunction readConfigValue(key: PentairConfigKey, value: unknown): string | number {\n return NUMBER_KEYS.has(key) ? readNumber(value, key) : readString(value, key)\n}\n\nfunction parseConfigValue(key: PentairConfigKey, raw: string): string | number {\n return NUMBER_KEYS.has(key) ? parseNumber(raw, key) : raw\n}\n\nfunction normalizeConfig(config: PentairConfig): PentairConfig {\n const next: PentairConfig = {}\n for (const key of PENTAIR_CONFIG_KEYS) {\n const value = config[key]\n if (value !== undefined) next[key] = readConfigValue(key, value) as never\n }\n return next\n}\n\nfunction orderedConfig(config: PentairConfig): Record<string, number | string> {\n const out: Record<string, number | string> = {}\n for (const key of PENTAIR_CONFIG_KEYS) {\n const value = config[key]\n if (value !== undefined) out[key] = value\n }\n return out\n}\n\nfunction displayValue(key: PentairConfigKey, value: number | string | undefined, showSecrets: boolean): string {\n if (value === undefined) return ''\n if (!showSecrets && SECRET_KEYS.has(key)) return '********'\n return String(value)\n}\n\nfunction outputValue(key: PentairConfigKey, value: number | string | undefined, showSecrets: boolean): null | number | string {\n if (value === undefined) return null\n if (!showSecrets && SECRET_KEYS.has(key)) return '********'\n return value\n}\n\nexport function normalizePentairConfigKey(value: string): PentairConfigKey {\n const key = value.startsWith('pentair.') ? value.slice('pentair.'.length) : value\n const normalized = KEY_ALIASES[key]\n if (normalized) return normalized\n throw new Error(`Unknown pentair config key \"${value}\". Known: ${PENTAIR_CONFIG_KEYS.join(', ')}`)\n}\n\nexport function readPentairConfig(root: string = ariesHome()): PentairConfig {\n const filePath = pentairConfigPath(root)\n if (!existsSync(filePath)) return {}\n const raw = readFileSync(filePath, 'utf8')\n if (raw.trim().length === 0) return {}\n\n const parsed = JSON.parse(raw) as unknown\n if (!isRecord(parsed)) throw new Error(`${filePath} must contain a JSON object`)\n\n const config: PentairConfig = {}\n for (const key of PENTAIR_CONFIG_KEYS) {\n if (parsed[key] !== undefined) config[key] = readConfigValue(key, parsed[key]) as never\n }\n return config\n}\n\nexport function writePentairConfig(config: PentairConfig, root: string = ariesHome()): void {\n const normalized = normalizeConfig(config)\n const dir = pentairConfigDir(root)\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n const filePath = pentairConfigPath(root)\n const tmp = `${filePath}.tmp`\n writeFileSync(tmp, `${JSON.stringify(orderedConfig(normalized), null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 })\n renameSync(tmp, filePath)\n try {\n chmodSync(filePath, 0o600)\n } catch {\n // chmod is best-effort on platforms that do not support POSIX modes.\n }\n}\n\nexport function resolvePentairConfig(overrides: PentairConfig = {}, root: string = ariesHome()): PentairConfig {\n return normalizeConfig({\n ...defaultPentairConfig(root),\n ...readPentairConfig(root),\n ...normalizeConfig(overrides),\n })\n}\n\nexport function pentairConfigSet(options: PentairConfigSetOptions): void {\n const current = readPentairConfig()\n const next: PentairConfig = {\n ...current,\n [options.key]: parseConfigValue(options.key, options.value),\n }\n writePentairConfig(next)\n const display = displayValue(options.key, next[options.key], false)\n console.log(`${chalk.green('set')} pentair.${options.key}=${display}`)\n}\n\nexport function pentairConfigGet(options: PentairConfigGetOptions = {}): void {\n const config = resolvePentairConfig()\n const keys = options.key ? [options.key] : PENTAIR_CONFIG_KEYS\n const showSecrets = options.showSecrets === true\n\n if (options.json === true) {\n const out: Record<string, null | number | string> = {}\n for (const key of keys) {\n out[`pentair.${key}`] = outputValue(key, config[key], showSecrets)\n }\n console.log(JSON.stringify(out, null, 2))\n return\n }\n\n for (const key of keys) {\n console.log(`${chalk.cyan(`pentair.${key}`)}=${displayValue(key, config[key], showSecrets)}`)\n }\n}\n", "import {\n existsSync, readdirSync, readFileSync,\n} from 'node:fs'\nimport { homedir } from 'node:os'\nimport path from 'node:path'\n\nimport type { WitnessPlugin } from '@ariestools/aries-witness-core'\n\nconst PLUGIN_PREFIX_SCOPED = /^@(ariestools|xylabs)\\/aries-witness-.+/\nconst PLUGIN_PREFIX_UNSCOPED = /^aries-witness-.+/\n\nconst CONFIG_PATH = path.join(homedir(), '.aries', 'witness-plugins.json')\n\nfunction isWitnessPlugin(value: unknown): value is WitnessPlugin {\n if (typeof value !== 'object' || value === null) return false\n const obj = value as Record<string, unknown>\n if (typeof obj.meta !== 'object' || obj.meta === null) return false\n const meta = obj.meta as Record<string, unknown>\n return (\n typeof meta.name === 'string'\n && typeof meta.description === 'string'\n && typeof meta.schema === 'string'\n && typeof obj.observe === 'function'\n )\n}\n\nfunction readConfigPlugins(): string[] {\n if (!existsSync(CONFIG_PATH)) return []\n try {\n const raw = readFileSync(CONFIG_PATH, 'utf8')\n const parsed = JSON.parse(raw) as Record<string, unknown>\n const plugins = parsed.plugins\n return Array.isArray(plugins) ? plugins as string[] : []\n } catch {\n return []\n }\n}\n\nfunction scanConventionPlugins(): string[] {\n const packageNames: string[] = []\n\n const nodeModulesPath = path.resolve('node_modules')\n if (!existsSync(nodeModulesPath)) return packageNames\n\n for (const scope of ['@ariestools', '@xylabs']) {\n const scopePath = path.join(nodeModulesPath, scope)\n if (!existsSync(scopePath)) continue\n for (const entry of readdirSync(scopePath)) {\n const fullName = `${scope}/${entry}`\n if (PLUGIN_PREFIX_SCOPED.test(fullName)) {\n packageNames.push(fullName)\n }\n }\n }\n\n for (const entry of readdirSync(nodeModulesPath)) {\n if (PLUGIN_PREFIX_UNSCOPED.test(entry)) {\n packageNames.push(entry)\n }\n }\n\n return packageNames\n}\n\nexport async function discoverPlugins(): Promise<WitnessPlugin[]> {\n const configNames = readConfigPlugins()\n const conventionNames = scanConventionPlugins()\n\n const allNames = [...new Set([...configNames, ...conventionNames])]\n\n const plugins: WitnessPlugin[] = []\n\n for (const name of allNames) {\n try {\n const mod = await import(name) as Record<string, unknown>\n const plugin = mod.default ?? mod\n if (isWitnessPlugin(plugin)) {\n plugins.push(plugin)\n }\n } catch {\n // Skip packages that can't be imported or don't match the interface\n }\n }\n\n return plugins\n}\n", "import { mkdirSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport path from 'node:path'\n\nimport type {\n BinaryRef, WitnessPlugin, XyoBoundWitness, XyoPayload,\n} from '@ariestools/aries-witness-core'\nimport { hashPayload } from '@ariestools/aries-witness-core'\n\nimport { formatOutput } from './formatOutput.ts'\n\nexport interface BinaryResult {\n hash: string\n mimeType: string\n path?: string\n size: number\n}\n\nexport interface WitnessResult {\n binaries?: BinaryResult[]\n boundWitness?: XyoBoundWitness\n payloads: XyoPayload[]\n timestamp: number\n witnessName: string\n}\n\nfunction mimeToExtension(mimeType: string): string {\n const map: Record<string, string> = {\n 'application/json': 'json',\n 'application/pdf': 'pdf',\n 'image/gif': 'gif',\n 'image/jpeg': 'jpg',\n 'image/png': 'png',\n 'image/svg+xml': 'svg',\n 'image/webp': 'webp',\n 'text/html': 'html',\n 'text/plain': 'txt',\n }\n return map[mimeType] ?? 'bin'\n}\n\nfunction writeBinaries(\n binaries: { data: Buffer; ref: BinaryRef }[],\n binaryDir: string,\n): BinaryResult[] {\n mkdirSync(binaryDir, { recursive: true })\n const results: BinaryResult[] = []\n for (const { ref, data } of binaries) {\n const ext = mimeToExtension(ref.mimeType)\n const filePath = path.join(binaryDir, `${ref.hash}.${ext}`)\n writeFileSync(filePath, data)\n results.push({\n hash: ref.hash,\n mimeType: ref.mimeType,\n path: filePath,\n size: ref.size,\n })\n }\n return results\n}\n\nfunction buildBoundWitness(payloads: XyoPayload[]): XyoBoundWitness {\n return {\n addresses: [],\n payload_hashes: payloads.map(p => hashPayload(p)),\n payload_schemas: payloads.map(p => p.schema),\n previous_hashes: [null],\n schema: 'network.xyo.boundwitness',\n }\n}\n\nexport async function executeWitness(\n plugin: WitnessPlugin,\n argv: Record<string, unknown>,\n): Promise<void> {\n const observation = await plugin.observe(argv)\n const defaultBinaryDir = path.join(homedir(), '.aries', 'binaries')\n const binaryDir = (argv['binary-dir'] as string | undefined) ?? defaultBinaryDir\n\n let savedBinaries: BinaryResult[] | undefined\n if (observation.binaries && observation.binaries.length > 0) {\n savedBinaries = writeBinaries(observation.binaries, binaryDir)\n }\n\n const result: WitnessResult = {\n binaries: savedBinaries,\n payloads: observation.payloads,\n timestamp: Date.now(),\n witnessName: plugin.meta.name,\n }\n\n if (argv['bound-witness']) {\n result.boundWitness = buildBoundWitness(observation.payloads)\n }\n\n formatOutput(result, {\n json: (argv.json as boolean) ?? false,\n output: argv.output as string | undefined,\n pretty: (argv.pretty as boolean) ?? true,\n })\n}\n", "import { writeFileSync } from 'node:fs'\n\nimport chalk from 'chalk'\n\nimport type { WitnessResult } from './executeWitness.ts'\n\nexport interface FormatOptions {\n json: boolean\n output?: string\n pretty: boolean\n}\n\nfunction formatPayloadValue(value: unknown): string {\n if (value === null || value === undefined) return JSON.stringify(value)\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'bigint': {\n return String(value)\n }\n default: {\n return JSON.stringify(value, null, 2)\n }\n }\n}\n\nfunction formatHuman(result: WitnessResult): void {\n console.log(chalk.cyan(`\\nWitness: ${result.witnessName}`))\n console.log(chalk.gray(`Time: ${new Date(result.timestamp).toISOString()}`))\n\n if (result.boundWitness) {\n console.log(chalk.yellow('\\nBound Witness'))\n console.log(chalk.gray(` payload_hashes: ${result.boundWitness.payload_hashes.length}`))\n console.log(chalk.gray(` payload_schemas: ${result.boundWitness.payload_schemas.join(', ')}`))\n }\n\n for (const payload of result.payloads) {\n console.log(chalk.green(`\\nSchema: ${payload.schema}`))\n for (const [key, value] of Object.entries(payload)) {\n if (key === 'schema') continue\n console.log(` ${chalk.white(key)}: ${formatPayloadValue(value)}`)\n }\n }\n\n if (result.binaries && result.binaries.length > 0) {\n console.log(chalk.yellow(`\\nBinaries: ${result.binaries.length}`))\n for (const bin of result.binaries) {\n console.log(` ${chalk.gray(bin.hash.slice(0, 12))}... ${bin.mimeType} (${bin.size} bytes)`)\n if (bin.path) {\n console.log(` ${chalk.gray(`saved: ${bin.path}`)}`)\n }\n }\n }\n\n console.log(chalk.gray(`\\n${result.payloads.length} payload(s) observed`))\n}\n\nfunction toJson(result: WitnessResult, pretty: boolean): string {\n return JSON.stringify(result, null, pretty ? 2 : undefined)\n}\n\nexport function formatOutput(result: WitnessResult, options: FormatOptions): void {\n if (options.output) {\n const json = toJson(result, options.pretty)\n writeFileSync(options.output, json + '\\n', 'utf8')\n console.error(chalk.green(`Written to ${options.output}`))\n return\n }\n\n if (options.json) {\n console.log(toJson(result, options.pretty))\n return\n }\n\n formatHuman(result)\n}\n", "import type { WitnessPlugin } from '@ariestools/aries-witness-core'\nimport type { CommandModule } from 'yargs'\n\nimport { executeWitness } from './executeWitness.ts'\n\nexport function registerWitnessCommand(plugin: WitnessPlugin): CommandModule {\n return {\n builder: (yargs) => {\n yargs\n .option('json', {\n default: false,\n describe: 'Output raw JSON',\n type: 'boolean',\n })\n .option('output', {\n alias: 'o',\n describe: 'Write output to file',\n type: 'string',\n })\n .option('pretty', {\n default: true,\n describe: 'Pretty-print JSON output',\n type: 'boolean',\n })\n .option('bound-witness', {\n default: false,\n describe: 'Wrap payloads in a BoundWitness',\n type: 'boolean',\n })\n .option('binary-dir', {\n describe: 'Directory for binary artifacts (default: ~/.aries/binaries/)',\n type: 'string',\n })\n if (plugin.builder) plugin.builder(yargs)\n return yargs\n },\n command: plugin.meta.name,\n describe: plugin.meta.description,\n handler: async (argv) => {\n await executeWitness(plugin, argv)\n },\n }\n}\n", "import { noopHandler } from '@ariestools/aries-cli-core'\nimport type { CommandModule } from 'yargs'\n\nimport {\n capitalOneConfigGet,\n capitalOneConfigSet,\n normalizeCapitalOneConfigKey,\n} from '../actions/bank/index.ts'\n\nconst capitalOneConfigGetCommand: CommandModule = {\n command: 'get [key]',\n describe: 'Read Capital One bank witness config',\n builder: yargs =>\n yargs\n .positional('key', {\n describe: 'Config key; omit to list all Capital One config',\n type: 'string',\n })\n .option('json', {\n default: false,\n describe: 'Output as JSON',\n type: 'boolean',\n })\n .option('show-secrets', {\n default: false,\n describe: 'Show secret values instead of redacting them',\n type: 'boolean',\n }),\n handler: (argv) => {\n const keyArg = argv.key as string | undefined\n capitalOneConfigGet({\n ...(keyArg && { key: normalizeCapitalOneConfigKey(keyArg) }),\n json: argv.json === true,\n showSecrets: argv['show-secrets'] === true,\n })\n },\n}\n\nconst capitalOneConfigSetCommand: CommandModule = {\n command: 'set <key> <value>',\n describe: 'Set Capital One bank witness config',\n builder: yargs =>\n yargs\n .positional('key', {\n demandOption: true,\n describe: 'Config key',\n type: 'string',\n })\n .positional('value', {\n demandOption: true,\n describe: 'New value',\n type: 'string',\n }),\n handler: (argv) => {\n capitalOneConfigSet({\n key: normalizeCapitalOneConfigKey(argv.key as string),\n value: argv.value as string,\n })\n },\n}\n\nconst capitalOneConfigCommand: CommandModule = {\n command: 'config',\n describe: 'Manage Capital One bank witness config',\n builder: yargs =>\n yargs\n .command(capitalOneConfigGetCommand)\n .command(capitalOneConfigSetCommand)\n .demandCommand(1)\n .strictCommands(),\n handler: noopHandler,\n}\n\nconst capitalOneCommand: CommandModule = {\n command: 'capitalone',\n describe: 'Manage Capital One bank witness settings',\n builder: yargs =>\n yargs\n .command(capitalOneConfigCommand)\n .demandCommand(1)\n .strictCommands(),\n handler: noopHandler,\n}\n\nexport const bankCommand: CommandModule = {\n command: 'bank',\n describe: 'Manage bank witness settings',\n builder: yargs =>\n yargs\n .command(capitalOneCommand)\n .demandCommand(1)\n .strictCommands(),\n handler: noopHandler,\n}\n", "import { noopHandler } from '@ariestools/aries-cli-core'\nimport type { Argv, CommandModule } from 'yargs'\n\nimport {\n normalizePentairConfigKey,\n pentairConfigGet,\n pentairConfigSet,\n setPentairCircuitRuntime,\n} from '../actions/pentair/index.ts'\n\nfunction addConnectionOptions(yargs: Argv): Argv {\n return yargs\n .option('address', {\n describe: 'ScreenLogic adapter IP for direct connection',\n type: 'string',\n })\n .option('port', {\n describe: 'ScreenLogic adapter TCP port for direct connection',\n type: 'number',\n })\n .option('password', {\n describe: 'ScreenLogic password for direct connection',\n type: 'string',\n })\n .option('system-name', {\n describe: 'ScreenLogic system name for direct connection',\n type: 'string',\n })\n .option('search-timeout', {\n describe: 'Milliseconds to wait for each UDP discovery attempt',\n type: 'number',\n })\n .option('search-attempts', {\n describe: 'Number of UDP discovery attempts before failing',\n type: 'number',\n })\n .option('response-timeout', {\n describe: 'Milliseconds to wait for each ScreenLogic command response',\n type: 'number',\n })\n}\n\nconst pentairConfigGetCommand: CommandModule = {\n command: 'get [key]',\n describe: 'Read Pentair ScreenLogic config',\n builder: yargs =>\n yargs\n .positional('key', {\n type: 'string',\n describe: 'Config key; omit to list all Pentair config',\n })\n .option('json', {\n type: 'boolean',\n default: false,\n describe: 'Output as JSON',\n })\n .option('show-secrets', {\n type: 'boolean',\n default: false,\n describe: 'Show secret values instead of redacting them',\n }),\n handler: (argv) => {\n const keyArg = argv.key as string | undefined\n pentairConfigGet({\n ...(keyArg && { key: normalizePentairConfigKey(keyArg) }),\n json: argv.json === true,\n showSecrets: argv['show-secrets'] === true,\n })\n },\n}\n\nconst pentairConfigSetCommand: CommandModule = {\n command: 'set <key> <value>',\n describe: 'Set Pentair ScreenLogic config',\n builder: yargs =>\n yargs\n .positional('key', {\n type: 'string',\n demandOption: true,\n describe: 'Config key',\n })\n .positional('value', {\n type: 'string',\n demandOption: true,\n describe: 'New value',\n }),\n handler: (argv) => {\n pentairConfigSet({\n key: normalizePentairConfigKey(argv.key as string),\n value: argv.value as string,\n })\n },\n}\n\nconst pentairConfigCommand: CommandModule = {\n command: 'config',\n describe: 'Manage Pentair ScreenLogic config',\n builder: yargs =>\n yargs\n .command(pentairConfigGetCommand)\n .command(pentairConfigSetCommand)\n .demandCommand(1)\n .strictCommands(),\n handler: noopHandler,\n}\n\nconst pentairCircuitRuntimeSetCommand: CommandModule = {\n command: 'set',\n describe: 'Set a circuit egg-timer runtime',\n builder: yargs =>\n addConnectionOptions(yargs)\n .option('circuit-id', {\n type: 'number',\n demandOption: true,\n describe: 'Pentair circuit id to update',\n })\n .option('hours', {\n type: 'number',\n describe: 'Runtime in hours',\n })\n .option('minutes', {\n type: 'number',\n describe: 'Runtime in minutes',\n })\n .option('on', {\n type: 'boolean',\n default: false,\n describe: 'Turn the circuit on after setting the runtime',\n })\n .option('json', {\n type: 'boolean',\n default: false,\n describe: 'Output as JSON',\n })\n .check((argv) => {\n const hasHours = argv.hours !== undefined\n const hasMinutes = argv.minutes !== undefined\n if (hasHours === hasMinutes) throw new Error('Use exactly one of --hours or --minutes')\n return true\n }),\n handler: async (argv) => {\n await setPentairCircuitRuntime({\n 'address': argv.address as string | undefined,\n 'circuit-id': argv['circuit-id'] as number,\n 'hours': argv.hours as number | undefined,\n 'json': argv.json === true,\n 'minutes': argv.minutes as number | undefined,\n 'on': argv.on === true,\n 'password': argv.password as string | undefined,\n 'port': argv.port as number | undefined,\n 'response-timeout': argv['response-timeout'] as number | undefined,\n 'search-attempts': argv['search-attempts'] as number | undefined,\n 'search-timeout': argv['search-timeout'] as number | undefined,\n 'system-name': argv['system-name'] as string | undefined,\n })\n },\n}\n\nconst pentairCircuitRuntimeCommand: CommandModule = {\n command: 'runtime',\n describe: 'Manage circuit egg-timer runtimes',\n builder: yargs =>\n yargs\n .command(pentairCircuitRuntimeSetCommand)\n .demandCommand(1)\n .strictCommands(),\n handler: noopHandler,\n}\n\nconst pentairCircuitCommand: CommandModule = {\n command: 'circuit',\n describe: 'Manage Pentair ScreenLogic circuits',\n builder: yargs =>\n yargs\n .command(pentairCircuitRuntimeCommand)\n .demandCommand(1)\n .strictCommands(),\n handler: noopHandler,\n}\n\nexport const pentairCommand: CommandModule = {\n command: 'pentair',\n describe: 'Manage Pentair ScreenLogic systems',\n builder: yargs =>\n yargs\n .command(pentairCircuitCommand)\n .command(pentairConfigCommand)\n .demandCommand(1)\n .strictCommands(),\n handler: noopHandler,\n}\n", "import { homedir } from 'node:os'\nimport PATH from 'node:path'\n\nimport type { WitnessPlugin } from '@ariestools/aries-witness-core'\nimport type { CommandModule } from 'yargs'\n\nimport {\n APP_INFO_SCHEMA, APP_LIST_SCHEMA, scanApps,\n} from '../actions/witness/app/index.ts'\nimport { executeWitness } from '../actions/witness/index.ts'\n\nexport const witnessAppListCommand: CommandModule = {\n command: 'list',\n describe: 'List installed macOS applications',\n builder: yargs =>\n yargs\n .option('json', {\n default: false,\n describe: 'Output raw JSON',\n type: 'boolean',\n })\n .option('output', {\n alias: 'o',\n describe: 'Write output to file',\n type: 'string',\n })\n .option('pretty', {\n default: true,\n describe: 'Pretty-print JSON output',\n type: 'boolean',\n })\n .option('bound-witness', {\n default: false,\n describe: 'Wrap payloads in a BoundWitness',\n type: 'boolean',\n })\n .option('binary-dir', {\n describe: 'Directory for binary artifacts (default: ~/.aries/binaries/)',\n type: 'string',\n })\n .option('scope', {\n choices: ['all', 'global', 'system', 'user'] as const,\n default: 'all',\n describe: 'Filter by install scope',\n type: 'string',\n }),\n handler: async (argv) => {\n const scope = argv.scope as 'all' | 'global' | 'system' | 'user'\n const allApps = await scanApps()\n const apps = scope === 'all' ? allApps : allApps.filter(a => a.scope === scope)\n\n const searchPaths = [\n '/Applications',\n '/System/Applications',\n PATH.join(homedir(), 'Applications'),\n ]\n\n const plugin: WitnessPlugin = {\n meta: {\n description: 'List installed macOS applications',\n name: 'app-list',\n schema: APP_LIST_SCHEMA,\n },\n observe: async () => ({\n payloads: [\n {\n appCount: apps.length,\n schema: APP_LIST_SCHEMA,\n scannedAt: Date.now(),\n searchPaths,\n },\n ...apps.map(app => ({\n buildVersion: app.buildVersion,\n bundleIdentifier: app.bundleIdentifier,\n copyright: app.copyright,\n developer: app.developer,\n name: app.name,\n obtainedFrom: app.obtainedFrom,\n path: app.path,\n schema: APP_INFO_SCHEMA,\n scope: app.scope,\n teamIdentifier: app.teamIdentifier,\n version: app.version,\n })),\n ],\n }),\n }\n\n await executeWitness(plugin, argv)\n },\n}\n", "import { execFile as execFileCb } from 'node:child_process'\nimport { existsSync, readdirSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport PATH from 'node:path'\nimport { promisify } from 'node:util'\n\nimport type { AppInfo } from './types.ts'\n\nconst execFile = promisify(execFileCb)\n\ninterface ScanDir {\n path: string\n scope: 'global' | 'system' | 'user'\n}\n\nasync function readPlist(appPath: string): Promise<Record<string, unknown> | null> {\n const plistPath = PATH.join(appPath, 'Contents', 'Info.plist')\n try {\n const { stdout } = await execFile('plutil', ['-convert', 'json', '-o', '-', plistPath])\n return JSON.parse(stdout) as Record<string, unknown>\n } catch {\n return null\n }\n}\n\ntype ObtainedFrom = 'apple-system' | 'developer-id' | 'mac-app-store' | 'unknown'\n\ninterface CodesignInfo {\n developer: string | null\n obtainedFrom: ObtainedFrom\n teamIdentifier: string | null\n}\n\nasync function readCodesign(appPath: string): Promise<CodesignInfo> {\n try {\n const { stderr } = await execFile('codesign', ['-dv', '--verbose=2', appPath])\n const authorityMatch = /^Authority=(.+)$/m.exec(stderr)\n const teamMatch = /^TeamIdentifier=(.+)$/m.exec(stderr)\n\n let developer: string | null = null\n let obtainedFrom: ObtainedFrom = 'unknown'\n\n if (authorityMatch) {\n const authority = authorityMatch[1]\n const devIdMatch = /^Developer ID Application: (.+?)(?:\\s*\\([A-Z\\d]+\\))?$/.exec(authority)\n if (devIdMatch) {\n developer = devIdMatch[1]\n obtainedFrom = 'developer-id'\n } else if (authority === 'Software Signing') {\n developer = 'Apple'\n obtainedFrom = 'apple-system'\n } else if (authority === 'Apple Mac OS Application Signing') {\n obtainedFrom = 'mac-app-store'\n } else {\n developer = authority\n }\n }\n\n const teamId = teamMatch?.[1]\n const teamIdentifier = teamId && teamId !== 'not set' ? teamId : null\n\n return {\n developer, obtainedFrom, teamIdentifier,\n }\n } catch {\n return {\n developer: null, obtainedFrom: 'unknown' as ObtainedFrom, teamIdentifier: null,\n }\n }\n}\n\nasync function lookupAppStoreDeveloper(bundleId: string): Promise<string | null> {\n try {\n const url = `https://itunes.apple.com/lookup?bundleId=${encodeURIComponent(bundleId)}&entity=macSoftware`\n const response = await fetch(url)\n const data = await response.json() as { resultCount: number; results: { artistName?: string }[] }\n if (data.resultCount > 0 && data.results[0].artistName) {\n return data.results[0].artistName\n }\n return null\n } catch {\n return null\n }\n}\n\nfunction appNameFromDir(dirName: string): string {\n return dirName.replace(/\\.app$/i, '')\n}\n\nasync function scanDirectory(dir: ScanDir): Promise<AppInfo[]> {\n if (!existsSync(dir.path)) return []\n\n const entries = readdirSync(dir.path, { withFileTypes: true })\n const appEntries = entries.filter(e => e.name.endsWith('.app') && e.isDirectory())\n\n const results = await Promise.allSettled(\n appEntries.map(async (entry) => {\n const appPath = PATH.join(dir.path, entry.name)\n const [plist, codesign] = await Promise.all([\n readPlist(appPath),\n readCodesign(appPath),\n ])\n\n const bundleIdentifier = (plist?.CFBundleIdentifier as string | undefined) ?? null\n\n let { developer } = codesign\n if (!developer && codesign.obtainedFrom === 'mac-app-store' && bundleIdentifier) {\n developer = await lookupAppStoreDeveloper(bundleIdentifier)\n }\n\n const name = (plist?.CFBundleDisplayName as string | undefined)\n ?? (plist?.CFBundleName as string | undefined)\n ?? appNameFromDir(entry.name)\n\n return {\n buildVersion: (plist?.CFBundleVersion as string | undefined) ?? null,\n bundleIdentifier,\n copyright: (plist?.NSHumanReadableCopyright as string | undefined) ?? null,\n developer,\n name,\n obtainedFrom: codesign.obtainedFrom,\n path: appPath,\n scope: dir.scope,\n teamIdentifier: codesign.teamIdentifier,\n version: (plist?.CFBundleShortVersionString as string | undefined) ?? null,\n } satisfies AppInfo\n }),\n )\n\n return results\n .filter((r): r is PromiseFulfilledResult<AppInfo> => r.status === 'fulfilled')\n .map(r => r.value)\n}\n\nexport async function scanApps(): Promise<AppInfo[]> {\n if (process.platform !== 'darwin') return []\n\n const dirs: ScanDir[] = [\n { path: '/Applications', scope: 'global' },\n { path: '/System/Applications', scope: 'system' },\n { path: PATH.join(homedir(), 'Applications'), scope: 'user' },\n ]\n\n const results = await Promise.all(dirs.map(d => scanDirectory(d)))\n return results.flat().toSorted((a, b) => a.name.localeCompare(b.name))\n}\n", "export const APP_LIST_SCHEMA = 'network.xyo.macos.app.list'\nexport const APP_INFO_SCHEMA = 'network.xyo.macos.app.info'\n\nexport interface AppInfo {\n buildVersion: string | null\n bundleIdentifier: string | null\n copyright: string | null\n developer: string | null\n name: string\n obtainedFrom: 'apple-system' | 'developer-id' | 'mac-app-store' | 'unknown'\n path: string\n scope: 'global' | 'system' | 'user'\n teamIdentifier: string | null\n version: string | null\n}\n", "import type { CommandModule } from 'yargs'\n\nimport { witnessAppListCommand } from './witnessAppListCommand.ts'\n\nexport const witnessAppCommand: CommandModule = {\n command: 'app',\n describe: 'Inspect installed applications',\n builder: yargs =>\n yargs\n .command(witnessAppListCommand)\n .demandCommand(1)\n .strictCommands(),\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n handler: () => {},\n}\n", "import { noopHandler } from '@ariestools/aries-cli-core'\nimport type { Argv, CommandModule } from 'yargs'\n\nimport { discoverPlugins, registerWitnessCommand } from '../actions/witness/index.ts'\nimport { builtInWitnesses } from '../actions/witness/witnesses/index.ts'\nimport { witnessAppCommand } from './witnessAppCommand.ts'\n\nexport const buildWitnessCommands = async (yargs: Argv): Promise<Argv> => {\n for (const plugin of builtInWitnesses) {\n yargs.command(registerWitnessCommand(plugin))\n }\n\n const discovered = await discoverPlugins()\n for (const plugin of discovered) {\n yargs.command(registerWitnessCommand(plugin))\n }\n\n yargs.command(witnessAppCommand)\n\n return yargs.demandCommand(1).strictCommands()\n}\n\nexport const witnessCommand: CommandModule = {\n command: 'witness',\n describe: 'Observe data and produce XYO-compliant payloads',\n builder: buildWitnessCommands,\n handler: noopHandler,\n}\n", "import type { WitnessObservation, WitnessPlugin } from '@ariestools/aries-witness-core'\nimport type { Argv } from 'yargs'\n\nimport {\n capitalOneProductsProvider,\n capitalOneProvider,\n} from '../../bank/index.ts'\n\nconst BANK_WITNESS_SCHEMA = 'network.xyo.bank.account-snapshot'\n\nexport const bankWitness: WitnessPlugin = {\n builder: (yargs: unknown) => {\n return (yargs as Argv)\n .option('provider', {\n choices: ['capitalone'] as const,\n default: 'capitalone',\n describe: 'Bank provider to witness',\n type: 'string',\n })\n .option('resource', {\n choices: ['accounts', 'products'] as const,\n default: 'accounts',\n describe: 'Capital One resource to witness',\n type: 'string',\n })\n .option('from', {\n describe: 'Transaction window start passed to the provider endpoint',\n type: 'string',\n })\n .option('to', {\n describe: 'Transaction window end passed to the provider endpoint',\n type: 'string',\n })\n .option('account-id', {\n describe: 'Provider account id to filter balances and transactions',\n type: 'string',\n })\n .option('include-raw', {\n default: false,\n describe: 'Store raw provider JSON responses as witness binary artifacts',\n type: 'boolean',\n })\n .option('redaction', {\n choices: ['default', 'none'] as const,\n default: 'default',\n describe: 'Redaction mode for provider account and transaction ids',\n type: 'string',\n })\n .option('env', {\n choices: ['sandbox', 'production'] as const,\n describe: 'Capital One environment label',\n type: 'string',\n })\n .option('base-url', {\n describe: 'Capital One API base URL',\n type: 'string',\n })\n .option('token-url', {\n describe: 'Capital One OAuth client-credentials token URL',\n type: 'string',\n })\n .option('access-token', {\n describe: 'Pre-issued Capital One bearer token; not persisted',\n type: 'string',\n })\n .option('client-id', {\n describe: 'Capital One OAuth client id',\n type: 'string',\n })\n .option('client-secret', {\n describe: 'Capital One OAuth client secret',\n type: 'string',\n })\n .option('scope', {\n describe: 'Optional Capital One OAuth client-credentials scope',\n type: 'string',\n })\n .option('api-version', {\n default: '5',\n describe: 'Capital One products API media-type version',\n type: 'string',\n })\n .option('operation', {\n choices: ['retrieve-products', 'retail-products', 'search'] as const,\n default: 'search',\n describe: 'Capital One products operation',\n type: 'string',\n })\n .option('product-id', {\n describe: 'Capital One deposit product id for product-specific operations (default: ~)',\n type: 'string',\n })\n .option('body', {\n describe: 'JSON request body for Capital One products POST operations',\n type: 'string',\n })\n .option('body-file', {\n describe: 'Path to JSON request body for Capital One products POST operations',\n type: 'string',\n })\n .option('accounts-path', {\n describe: 'Capital One accounts endpoint path, relative to --base-url',\n type: 'string',\n })\n .option('balances-path', {\n describe: 'Capital One balances endpoint path; may include {accountId}',\n type: 'string',\n })\n .option('transactions-path', {\n describe: 'Capital One transactions endpoint path; may include {accountId}',\n type: 'string',\n })\n },\n meta: {\n description: 'Capture bank accounts, balances, transactions, or product catalog data',\n name: 'bank',\n schema: BANK_WITNESS_SCHEMA,\n },\n observe: async (args): Promise<WitnessObservation> => {\n const provider = (args.provider as string | undefined) ?? 'capitalone'\n if (provider !== 'capitalone') throw new Error(`Unsupported bank provider: ${provider}`)\n const resource = (args.resource as string | undefined) ?? 'accounts'\n if (resource === 'products') return capitalOneProductsProvider.observe(args)\n if (resource !== 'accounts') throw new Error(`Unsupported Capital One bank resource: ${resource}`)\n return capitalOneProvider.observe(args)\n },\n}\n", "import { readFile } from 'node:fs/promises'\nimport PATH from 'node:path'\n\nimport {\n ingestStreamingCatalogSnapshot,\n type StreamingCatalogObservationInput,\n type StreamingCatalogSnapshotScope,\n} from '@ariestools/aries-streaming-catalog-core'\nimport type {\n BinaryRef, WitnessObservation, WitnessPlugin, XyoPayload,\n} from '@ariestools/aries-witness-core'\nimport { hashBinary } from '@ariestools/aries-witness-core'\nimport type { Argv } from 'yargs'\n\nimport {\n type BrowserPageSnapshot,\n captureNetflixPagesWithChrome,\n defaultChromeProfileDir,\n} from './netflixCatalogBrowser.ts'\nimport {\n enrichNetflixCatalogObservations,\n type NetflixCatalogCaptureMethod,\n} from './netflixCatalogDetail.ts'\nimport {\n extractNetflixCatalogObservations,\n netflixTitleIdFromUrl,\n netflixTitleUrl,\n} from './netflixCatalogExtract.ts'\n\nconst NETFLIX_CATALOG_SCHEMA = 'network.xyo.streaming.catalog.snapshot'\nconst JSONL_MIME_TYPE = 'application/x-ndjson'\n\ntype NetflixCatalogMode = 'genre' | 'html-file' | 'search' | 'title' | 'url' | 'url-file'\n\ninterface CaptureSource {\n content: string\n sourceName: string\n sourceUrl?: string\n titleId?: string\n}\n\nexport const netflixCatalogWitness: WitnessPlugin = {\n builder: (yargs: unknown) => {\n return (yargs as Argv)\n .option('mode', {\n choices: ['genre', 'html-file', 'search', 'title', 'url', 'url-file'],\n describe: 'Netflix capture mode; inferred from the supplied target option when omitted',\n type: 'string',\n })\n .option('region', {\n default: 'US',\n describe: 'Netflix catalog region label to attach to observations',\n type: 'string',\n })\n .option('query', {\n describe: 'Search query for mode=search',\n type: 'string',\n })\n .option('genre-id', {\n describe: 'Netflix genre id for mode=genre',\n type: 'string',\n })\n .option('title-id', {\n describe: 'Netflix title id for mode=title',\n type: 'string',\n })\n .option('url', {\n array: true,\n describe: 'Netflix URL to fetch for mode=url',\n type: 'string',\n })\n .option('url-file', {\n describe: 'File containing one Netflix URL per line for mode=url-file',\n type: 'string',\n })\n .option('html-file', {\n array: true,\n describe: 'Saved Netflix HTML or DOM file to parse for mode=html-file',\n type: 'string',\n })\n .option('limit', {\n default: 100,\n describe: 'Maximum observations to keep from extracted title links',\n type: 'number',\n })\n .option('scope-key', {\n describe: 'Override the snapshot scope key stored in the catalog index',\n type: 'string',\n })\n .option('observed-at', {\n describe: 'Override observation timestamp',\n type: 'string',\n })\n .option('save', {\n default: false,\n describe: 'Ingest the snapshot into ARIES_HOME/streaming-catalog',\n type: 'boolean',\n })\n .option('allow-empty', {\n default: false,\n describe: 'Allow --save to ingest a successful snapshot with zero extracted titles',\n type: 'boolean',\n })\n .option('include-details', {\n default: false,\n describe: 'Navigate captured title URLs and merge detail-page metadata into observations',\n type: 'boolean',\n })\n .option('detail-limit', {\n describe: 'Maximum captured titles to enrich when --include-details is set',\n type: 'number',\n })\n .option('detail-wait-ms', {\n default: 5000,\n describe: 'Milliseconds to wait after opening each Netflix title detail page',\n type: 'number',\n })\n .option('detail-scrolls', {\n default: 1,\n describe: 'Number of vertical scroll steps to run on each detail page',\n type: 'number',\n })\n .option('detail-scroll-wait-ms', {\n default: 750,\n describe: 'Milliseconds to wait after each detail-page scroll step',\n type: 'number',\n })\n .option('capture-method', {\n choices: ['browser', 'fetch'],\n describe: 'How to load Netflix URL/search/genre/title pages; browser renders the live site, fetch retrieves static HTML only',\n type: 'string',\n })\n .option('chrome-path', {\n describe: 'Chrome/Chromium executable path for browser capture',\n type: 'string',\n })\n .option('browser-profile-dir', {\n describe: 'Persistent Chrome profile directory for Netflix login/session state',\n type: 'string',\n })\n .option('devtools-timeout-ms', {\n default: 30_000,\n describe: 'Milliseconds to wait for Chrome to expose its DevTools endpoint before capture starts',\n type: 'number',\n })\n .option('headless', {\n default: false,\n describe: 'Run Chrome in headless mode for browser capture',\n type: 'boolean',\n })\n .option('wait-ms', {\n default: 8000,\n describe: 'Milliseconds to wait after opening each Netflix page before extracting the first DOM snapshot',\n type: 'number',\n })\n .option('scrolls', {\n default: 8,\n describe: 'Number of vertical scroll steps to run before final extraction',\n type: 'number',\n })\n .option('scroll-wait-ms', {\n default: 1000,\n describe: 'Milliseconds to wait after each scroll step',\n type: 'number',\n })\n .option('viewport-width', {\n default: 1440,\n describe: 'Browser viewport width for rendered Netflix capture',\n type: 'number',\n })\n .option('viewport-height', {\n default: 1200,\n describe: 'Browser viewport height for rendered Netflix capture',\n type: 'number',\n })\n },\n meta: {\n description: 'Snapshot visible Netflix catalog title links as scoped streaming catalog observations',\n name: 'netflix-catalog',\n schema: NETFLIX_CATALOG_SCHEMA,\n },\n observe: async (args): Promise<WitnessObservation> => {\n const observedAt = normalizeObservedAt(args['observed-at'])\n const mode = inferMode(args)\n const region = normalizeRegion(args.region)\n const limit = normalizeLimit(args.limit)\n const sources = await resolveCaptureSources(mode, args)\n const scope = buildScope(mode, args, sources, limit)\n const scopeKey = stringArg(args['scope-key']) ?? defaultScopeKey(scope)\n let observations = collectObservations(sources, {\n limit, observedAt, region,\n })\n\n if (mode === 'title') {\n const titleId = requiredString(args['title-id'], '--title-id is required for mode=title')\n observations = observations.filter(observation => observation.sourceTitleId === titleId)\n if (observations.length === 0) observations.push(fallbackTitleObservation(titleId, observedAt, region))\n }\n\n const detailResult = await enrichObservationsWithDetails(observations, args, {\n limit,\n observedAt,\n region,\n })\n observations = detailResult.observations\n\n assertNonEmptySave(args, observations.length)\n\n const jsonl = Buffer.from(`${observations.map(observation => JSON.stringify(observation)).join('\\n')}${observations.length > 0 ? '\\n' : ''}`)\n const observationsHash = hashBinary(jsonl)\n const snapshot = (args.save === true)\n ? ingestStreamingCatalogSnapshot({\n complete: false,\n observations,\n observedAt,\n provider: 'netflix',\n region,\n removalPolicy: 'scope',\n scope,\n scopeKey,\n sourceKind: 'browser-witness',\n sourceName: 'netflix-catalog-witness',\n status: 'success',\n })\n : undefined\n const binaryRef: BinaryRef = {\n filename: `netflix-catalog-${region.toLowerCase()}-${scopeKey}-${observedAt.slice(0, 10)}.jsonl`,\n hash: observationsHash,\n mimeType: JSONL_MIME_TYPE,\n size: jsonl.length,\n }\n const payload: XyoPayload = {\n complete: false,\n observedAt,\n observations: binaryRef,\n observationsHash,\n observationsMimeType: JSONL_MIME_TYPE,\n provider: 'netflix',\n region,\n removalPolicy: 'scope',\n schema: NETFLIX_CATALOG_SCHEMA,\n scope,\n scopeKey,\n sourceCount: sources.length,\n sourceKind: 'browser-witness',\n titleCount: observations.length,\n ...(detailResult.detailSourceCount > 0 && { detailSourceCount: detailResult.detailSourceCount }),\n ...(snapshot !== undefined && { snapshot }),\n }\n\n return {\n binaries: [{ data: jsonl, ref: binaryRef }],\n payloads: [payload],\n }\n },\n}\n\nfunction assertNonEmptySave(args: Record<string, unknown>, titleCount: number): void {\n if (args.save !== true || booleanArg(args['allow-empty']) || titleCount > 0) return\n throw new Error([\n 'Refusing to save an empty Netflix catalog snapshot.',\n 'The capture returned 0 titles; rerun after login/profile selection or pass --allow-empty',\n 'to intentionally record an empty successful snapshot.',\n ].join(' '))\n}\n\nfunction collectObservations(\n sources: readonly CaptureSource[],\n options: { limit: number; observedAt: string; region: string },\n): StreamingCatalogObservationInput[] {\n const byTitleId = new Map<string, StreamingCatalogObservationInput>()\n for (const source of sources) {\n const rawResponseHash = hashBinary(Buffer.from(source.content))\n for (const observation of extractNetflixCatalogObservations(source.content, {\n observedAt: options.observedAt,\n rawResponseHash,\n region: options.region,\n sourceName: source.sourceName,\n sourceUrl: source.sourceUrl,\n })) {\n byTitleId.set(observation.sourceTitleId, observation)\n if (byTitleId.size >= options.limit) break\n }\n if (byTitleId.size >= options.limit) break\n }\n return [...byTitleId.values()].toSorted((a, b) => a.sourceTitleId.localeCompare(b.sourceTitleId))\n}\n\nasync function enrichObservationsWithDetails(\n observations: readonly StreamingCatalogObservationInput[],\n args: Record<string, unknown>,\n options: { limit: number; observedAt: string; region: string },\n): Promise<{ detailSourceCount: number; observations: StreamingCatalogObservationInput[] }> {\n if (!booleanArg(args['include-details']) || observations.length === 0) {\n return {\n detailSourceCount: 0,\n observations: [...observations],\n }\n }\n\n return enrichNetflixCatalogObservations(observations, {\n captureMethod: captureMethod(args),\n chromePath: stringArg(args['chrome-path']),\n devtoolsTimeoutMs: normalizePositiveInteger(args['devtools-timeout-ms'], '--devtools-timeout-ms', 30_000),\n detailLimit: normalizeDetailLimit(args['detail-limit'], options.limit),\n detailScrolls: normalizeNonNegativeInteger(args['detail-scrolls'], '--detail-scrolls', 1),\n detailScrollWaitMs: normalizePositiveInteger(args['detail-scroll-wait-ms'], '--detail-scroll-wait-ms', 750),\n detailWaitMs: normalizeNonNegativeInteger(args['detail-wait-ms'], '--detail-wait-ms', 5000),\n fetchText,\n headless: args.headless === true,\n observedAt: options.observedAt,\n profileDir: stringArg(args['browser-profile-dir']) ?? defaultChromeProfileDir(),\n region: options.region,\n viewportHeight: normalizePositiveInteger(args['viewport-height'], '--viewport-height', 1200),\n viewportWidth: normalizePositiveInteger(args['viewport-width'], '--viewport-width', 1440),\n })\n}\n\nasync function resolveCaptureSources(mode: NetflixCatalogMode, args: Record<string, unknown>): Promise<CaptureSource[]> {\n if (mode === 'html-file') {\n const files = arrayArg(args['html-file'])\n if (files.length === 0) throw new Error('--html-file is required for mode=html-file')\n return Promise.all(files.map(async file => ({\n content: await readRequiredTextFile(\n file,\n `Netflix HTML file not found: ${file}. Pass an existing saved Netflix HTML/DOM file, or use --query, --genre-id, --title-id, or --url to fetch a page directly.`,\n ),\n sourceName: `html-file:${PATH.basename(file)}`,\n })))\n }\n\n const urls = await urlsForMode(mode, args)\n if (captureMethod(args) === 'browser') {\n return (await captureNetflixPagesWithChrome(urls, {\n chromePath: stringArg(args['chrome-path']),\n devtoolsTimeoutMs: normalizePositiveInteger(args['devtools-timeout-ms'], '--devtools-timeout-ms', 30_000),\n headless: args.headless === true,\n profileDir: stringArg(args['browser-profile-dir']) ?? defaultChromeProfileDir(),\n scrolls: normalizeNonNegativeInteger(args.scrolls, '--scrolls', 8),\n scrollWaitMs: normalizePositiveInteger(args['scroll-wait-ms'], '--scroll-wait-ms', 1000),\n viewportHeight: normalizePositiveInteger(args['viewport-height'], '--viewport-height', 1200),\n viewportWidth: normalizePositiveInteger(args['viewport-width'], '--viewport-width', 1440),\n waitMs: normalizeNonNegativeInteger(args['wait-ms'], '--wait-ms', 8000),\n })).map(browserSnapshotToCaptureSource)\n }\n\n return Promise.all(urls.map(async (url): Promise<CaptureSource> => ({\n content: await fetchText(url),\n sourceName: `url:${url}`,\n sourceUrl: url,\n titleId: netflixTitleIdFromUrl(url),\n })))\n}\n\nfunction browserSnapshotToCaptureSource(snapshot: BrowserPageSnapshot): CaptureSource {\n return {\n content: snapshot.content,\n sourceName: snapshot.sourceName,\n sourceUrl: snapshot.sourceUrl,\n titleId: netflixTitleIdFromUrl(snapshot.sourceUrl),\n }\n}\n\nfunction captureMethod(args: Record<string, unknown>): NetflixCatalogCaptureMethod {\n const method = stringArg(args['capture-method'])\n if (method === undefined) return 'browser'\n if (method === 'browser' || method === 'fetch') return method\n throw new Error(`Invalid --capture-method value: ${method}`)\n}\n\nasync function urlsForMode(mode: NetflixCatalogMode, args: Record<string, unknown>): Promise<string[]> {\n if (mode === 'search') {\n const query = requiredString(args.query, '--query is required for mode=search')\n return [`https://www.netflix.com/search?q=${encodeURIComponent(query)}`]\n }\n if (mode === 'genre') {\n const genreId = requiredString(args['genre-id'], '--genre-id is required for mode=genre')\n return [`https://www.netflix.com/browse/genre/${genreId}`]\n }\n if (mode === 'title') {\n const titleId = requiredString(args['title-id'], '--title-id is required for mode=title')\n return [netflixTitleUrl(titleId)]\n }\n if (mode === 'url') {\n const urls = arrayArg(args.url)\n if (urls.length === 0) throw new Error('--url is required for mode=url')\n return urls\n }\n if (mode === 'url-file') {\n const file = requiredString(args['url-file'], '--url-file is required for mode=url-file')\n return (await readRequiredTextFile(file, `Netflix URL file not found: ${file}. Pass an existing file with one Netflix URL per line.`))\n .split(/\\r?\\n/u)\n .map(line => line.trim())\n .filter(line => line.length > 0 && !line.startsWith('#'))\n }\n throw new Error(`Unsupported Netflix catalog mode: ${mode}`)\n}\n\nasync function fetchText(url: string): Promise<string> {\n const response = await fetch(url, {\n headers: {\n 'accept-language': 'en-US,en;q=0.9',\n 'user-agent': 'Mozilla/5.0 AriesNetflixCatalogWitness/0.1',\n },\n })\n return response.text()\n}\n\nasync function readRequiredTextFile(file: string, missingMessage: string): Promise<string> {\n try {\n return await readFile(file, 'utf8')\n } catch (error) {\n if (isNodeFileNotFoundError(error)) throw new Error(missingMessage, { cause: error })\n throw error\n }\n}\n\nfunction isNodeFileNotFoundError(error: unknown): error is Error & { code: string } {\n return error instanceof Error && 'code' in error && error.code === 'ENOENT'\n}\n\nfunction inferMode(args: Record<string, unknown>): NetflixCatalogMode {\n const mode = stringArg(args.mode)\n if (mode !== undefined) return mode as NetflixCatalogMode\n if (arrayArg(args['html-file']).length > 0) return 'html-file'\n if (stringArg(args['url-file']) !== undefined) return 'url-file'\n if (arrayArg(args.url).length > 0) return 'url'\n if (stringArg(args['title-id']) !== undefined) return 'title'\n if (stringArg(args['genre-id']) !== undefined) return 'genre'\n if (stringArg(args.query) !== undefined) return 'search'\n throw new Error('Netflix catalog witness requires one target: --query, --genre-id, --title-id, --url, --url-file, or --html-file.')\n}\n\nfunction buildScope(\n mode: NetflixCatalogMode,\n args: Record<string, unknown>,\n sources: readonly CaptureSource[],\n limit: number,\n): StreamingCatalogSnapshotScope {\n const scope: StreamingCatalogSnapshotScope = { limit, mode }\n if (mode !== 'html-file') assignScopeValue(scope, 'captureMethod', captureMethod(args))\n if (booleanArg(args['include-details'])) {\n scope.includeDetails = true\n scope.detailLimit = normalizeDetailLimit(args['detail-limit'], limit)\n }\n assignScopeValue(scope, 'query', stringArg(args.query))\n assignScopeValue(scope, 'genreId', stringArg(args['genre-id']))\n assignScopeValue(scope, 'titleId', stringArg(args['title-id']))\n if (sources.length > 0) scope.sources = sources.map(source => source.sourceUrl ?? source.sourceName)\n return scope\n}\n\nfunction defaultScopeKey(scope: StreamingCatalogSnapshotScope): string {\n if (scope.mode === 'search' && typeof scope.query === 'string') return slug(`search-${scope.query}`)\n if (scope.mode === 'genre' && typeof scope.genreId === 'string') return slug(`genre-${scope.genreId}`)\n if (scope.mode === 'title' && typeof scope.titleId === 'string') return slug(`title-${scope.titleId}`)\n return slug(`${scope.mode}-${hashBinary(Buffer.from(JSON.stringify(scope))).slice(0, 12)}`)\n}\nfunction fallbackTitleObservation(\n titleId: string,\n observedAt: string,\n region: string,\n): StreamingCatalogObservationInput {\n return {\n available: true,\n evidence: {\n region,\n source: 'netflix-catalog-witness',\n },\n observedAt,\n provider: 'netflix',\n quality: { badges: [], encodes: [] },\n region,\n sourceKind: 'browser-witness',\n sourceTitleId: titleId,\n title: `Netflix title ${titleId}`,\n type: 'unknown',\n url: netflixTitleUrl(titleId),\n }\n}\nfunction normalizeObservedAt(value: unknown): string {\n const parsed = new Date(stringArg(value) ?? Date.now())\n if (Number.isNaN(parsed.getTime())) throw new Error(`Invalid --observed-at value: ${String(value)}`)\n return parsed.toISOString()\n}\nfunction normalizeRegion(value: unknown): string {\n return (stringArg(value) ?? 'US').toUpperCase()\n}\nfunction normalizeLimit(value: unknown): number {\n const limit = normalizePositiveInteger(value, '--limit', 100)\n return Math.min(limit, 1000)\n}\nfunction normalizeDetailLimit(value: unknown, limit: number): number {\n const detailLimit = normalizePositiveInteger(value, '--detail-limit', Math.min(limit, 25))\n return Math.min(detailLimit, limit, 1000)\n}\nfunction normalizePositiveInteger(value: unknown, field: string, defaultValue: number): number {\n const integer = numberArg(value, defaultValue)\n if (!Number.isInteger(integer) || integer <= 0) throw new Error(`${field} must be a positive integer.`)\n return integer\n}\nfunction normalizeNonNegativeInteger(value: unknown, field: string, defaultValue: number): number {\n const integer = numberArg(value, defaultValue)\n if (!Number.isInteger(integer) || integer < 0) throw new Error(`${field} must be a non-negative integer.`)\n return integer\n}\nfunction numberArg(value: unknown, defaultValue: number): number {\n if (typeof value === 'number') return value\n const parsed = stringArg(value)\n return parsed === undefined ? defaultValue : Number(parsed)\n}\nfunction requiredString(value: unknown, message: string): string {\n const parsed = stringArg(value)\n if (parsed === undefined) throw new Error(message)\n return parsed\n}\nfunction stringArg(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined\n}\nfunction arrayArg(value: unknown): string[] {\n if (Array.isArray(value)) return value.map(String).map(item => item.trim()).filter(item => item.length > 0)\n const parsed = stringArg(value)\n return parsed === undefined ? [] : [parsed]\n}\nfunction booleanArg(value: unknown): boolean {\n return value === true || value === 'true'\n}\nfunction assignScopeValue(scope: StreamingCatalogSnapshotScope, key: string, value: string | undefined): void {\n if (value !== undefined) scope[key] = value\n}\nfunction slug(value: string): string {\n return value.toLowerCase().replaceAll(/[^a-z0-9._-]+/gu, '-').replaceAll(/^-|-$/gu, '') || 'netflix'\n}\n", "import type { ChildProcess } from 'node:child_process'\nimport { spawn } from 'node:child_process'\nimport FS from 'node:fs'\nimport NET from 'node:net'\nimport OS from 'node:os'\nimport PATH from 'node:path'\n\nexport interface BrowserPageSnapshot {\n content: string\n sourceName: string\n sourceUrl: string\n}\n\nexport interface CaptureNetflixPagesWithChromeOptions {\n chromePath?: string\n devtoolsTimeoutMs: number\n headless: boolean\n profileDir: string\n scrollWaitMs: number\n scrolls: number\n viewportHeight: number\n viewportWidth: number\n waitMs: number\n}\n\ninterface ChromeTarget {\n id: string\n webSocketDebuggerUrl: string\n}\n\ninterface CdpMessage {\n error?: { code: number; message: string }\n id?: number\n result?: unknown\n}\n\ninterface RuntimeEvaluateResult {\n exceptionDetails?: unknown\n result?: {\n value?: unknown\n }\n}\n\ninterface PendingCdpRequest {\n reject: (error: Error) => void\n resolve: (value: unknown) => void\n}\n\nexport async function captureNetflixPagesWithChrome(\n urls: readonly string[],\n options: CaptureNetflixPagesWithChromeOptions,\n): Promise<BrowserPageSnapshot[]> {\n const chromePath = resolveChromePath(options.chromePath)\n const port = await freePort()\n ensureDir(options.profileDir)\n const chrome = launchChrome(chromePath, port, options)\n const readStderr = collectProcessStderr(chrome)\n\n try {\n await waitForDevTools(port, options.devtoolsTimeoutMs, chrome, readStderr)\n const snapshots: BrowserPageSnapshot[] = []\n for (const url of urls) {\n snapshots.push(...await captureUrl(port, url, options))\n }\n return snapshots\n } finally {\n stopChrome(chrome)\n }\n}\n\nexport function defaultChromeProfileDir(): string {\n return PATH.join(process.env.ARIES_HOME ?? PATH.join(OS.homedir(), '.aries'), 'browser-profiles', 'netflix-catalog')\n}\n\nasync function captureUrl(\n port: number,\n url: string,\n options: CaptureNetflixPagesWithChromeOptions,\n): Promise<BrowserPageSnapshot[]> {\n const target = await openTarget(port, url)\n const client = await CdpClient.connect(target.webSocketDebuggerUrl)\n try {\n await client.send('Page.enable')\n await client.send('Runtime.enable')\n await sleep(options.waitMs)\n return await captureScrolledSnapshots(client, url, options)\n } finally {\n client.close()\n await closeTarget(port, target.id)\n }\n}\n\nasync function captureScrolledSnapshots(\n client: CdpClient,\n url: string,\n options: Pick<CaptureNetflixPagesWithChromeOptions, 'scrollWaitMs' | 'scrolls'>,\n): Promise<BrowserPageSnapshot[]> {\n const snapshots: BrowserPageSnapshot[] = []\n for (let index = 0; index <= options.scrolls; index += 1) {\n snapshots.push({\n content: await evaluateString(client, 'document.documentElement ? document.documentElement.outerHTML : \"\"'),\n sourceName: `browser:${url}#${index}`,\n sourceUrl: url,\n })\n if (index < options.scrolls) {\n await client.send('Runtime.evaluate', {\n awaitPromise: true,\n expression: 'window.scrollBy(0, Math.max(1, Math.floor(window.innerHeight * 0.85)))',\n returnByValue: true,\n })\n await sleep(options.scrollWaitMs)\n }\n }\n return snapshots\n}\n\nasync function evaluateString(client: CdpClient, expression: string): Promise<string> {\n const result = await client.send<RuntimeEvaluateResult>('Runtime.evaluate', {\n awaitPromise: true,\n expression,\n returnByValue: true,\n })\n if (result.exceptionDetails !== undefined) throw new Error(`Chrome evaluation failed for expression: ${expression}`)\n return typeof result.result?.value === 'string' ? result.result.value : ''\n}\n\nfunction launchChrome(\n chromePath: string,\n port: number,\n options: Pick<CaptureNetflixPagesWithChromeOptions, 'headless' | 'profileDir' | 'viewportHeight' | 'viewportWidth'>,\n): ChildProcess {\n const args = [\n `--remote-debugging-port=${port}`,\n '--remote-debugging-address=127.0.0.1',\n `--user-data-dir=${options.profileDir}`,\n '--no-first-run',\n '--no-default-browser-check',\n `--window-size=${options.viewportWidth},${options.viewportHeight}`,\n ...(options.headless ? ['--headless=new', '--disable-gpu'] : []),\n 'about:blank',\n ]\n return spawn(chromePath, args, { stdio: ['ignore', 'ignore', 'pipe'] })\n}\n\nfunction collectProcessStderr(chrome: ChildProcess): () => string {\n let stderr = ''\n chrome.stderr?.setEncoding('utf8')\n chrome.stderr?.on('data', (chunk: Buffer | string) => {\n stderr = `${stderr}${String(chunk)}`.slice(-4000)\n })\n return () => stderr.trim()\n}\n\nfunction stopChrome(chrome: ChildProcess): void {\n if (chrome.exitCode !== null || chrome.signalCode !== null) return\n chrome.kill('SIGTERM')\n}\n\nasync function openTarget(port: number, url: string): Promise<ChromeTarget> {\n const endpoint = `http://127.0.0.1:${port}/json/new?${encodeURIComponent(url)}`\n const response = await fetch(endpoint, { method: 'PUT' })\n if (!response.ok) throw new Error(`Chrome failed to open ${url}: HTTP ${response.status}`)\n return response.json() as Promise<ChromeTarget>\n}\n\nasync function closeTarget(port: number, targetId: string): Promise<void> {\n try {\n await fetch(`http://127.0.0.1:${port}/json/close/${encodeURIComponent(targetId)}`)\n } catch {\n // Best-effort cleanup; the browser process is also terminated.\n }\n}\n\nasync function waitForDevTools(\n port: number,\n timeoutMs: number,\n chrome: ChildProcess,\n readStderr: () => string,\n): Promise<void> {\n const deadline = Date.now() + timeoutMs\n while (Date.now() < deadline) {\n if (chrome.exitCode !== null || chrome.signalCode !== null) {\n throw chromeDevToolsError(`Chrome exited before exposing a DevTools endpoint (${exitStatus(chrome)}).`, readStderr)\n }\n try {\n const response = await fetch(`http://127.0.0.1:${port}/json/version`)\n if (response.ok) return\n } catch {\n // Retry until Chrome starts its debugging endpoint.\n }\n await sleep(100)\n }\n throw chromeDevToolsError(`Chrome did not expose a DevTools endpoint within ${timeoutMs} ms.`, readStderr)\n}\n\nfunction chromeDevToolsError(message: string, readStderr: () => string): Error {\n const stderr = readStderr()\n return new Error(stderr.length === 0 ? message : `${message} Chrome stderr: ${stderr}`)\n}\n\nfunction exitStatus(chrome: ChildProcess): string {\n if (chrome.exitCode !== null) return `exit code ${chrome.exitCode}`\n return `signal ${chrome.signalCode ?? 'unknown'}`\n}\n\nfunction resolveChromePath(chromePath: string | undefined): string {\n if (chromePath !== undefined && chromePath.length > 0) {\n if (FS.existsSync(chromePath)) return chromePath\n throw new Error(`Chrome executable not found at --chrome-path: ${chromePath}`)\n }\n if (process.env.CHROME_PATH !== undefined && process.env.CHROME_PATH.length > 0) {\n if (FS.existsSync(process.env.CHROME_PATH)) return process.env.CHROME_PATH\n throw new Error(`Chrome executable not found at CHROME_PATH: ${process.env.CHROME_PATH}`)\n }\n const candidates = platformChromeCandidates()\n const found = candidates.find(candidate => FS.existsSync(candidate))\n if (found !== undefined) return found\n throw new Error('Chrome executable not found. Install Chrome/Chromium or pass --chrome-path with the executable path.')\n}\n\nfunction platformChromeCandidates(): string[] {\n if (process.platform === 'darwin') {\n return [\n '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',\n PATH.join(OS.homedir(), 'Applications/Google Chrome.app/Contents/MacOS/Google Chrome'),\n '/Applications/Chromium.app/Contents/MacOS/Chromium',\n ]\n }\n if (process.platform === 'win32') {\n return [\n process.env.PROGRAMFILES === undefined ? undefined : PATH.join(process.env.PROGRAMFILES, 'Google/Chrome/Application/chrome.exe'),\n process.env['PROGRAMFILES(X86)'] === undefined ? undefined : PATH.join(process.env['PROGRAMFILES(X86)'], 'Google/Chrome/Application/chrome.exe'),\n process.env.LOCALAPPDATA === undefined ? undefined : PATH.join(process.env.LOCALAPPDATA, 'Google/Chrome/Application/chrome.exe'),\n ].filter((candidate): candidate is string => candidate !== undefined)\n }\n return [\n '/usr/bin/google-chrome',\n '/usr/bin/google-chrome-stable',\n '/usr/bin/chromium',\n '/usr/bin/chromium-browser',\n ]\n}\n\nasync function freePort(): Promise<number> {\n const server = NET.createServer()\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject)\n server.listen(0, '127.0.0.1', resolve)\n })\n const address = server.address()\n await new Promise<void>(resolve => server.close(() => resolve()))\n if (typeof address === 'object' && address !== null) return address.port\n throw new Error('Failed to allocate a local Chrome debugging port.')\n}\n\nfunction ensureDir(dir: string): void {\n FS.mkdirSync(dir, { recursive: true, mode: 0o700 })\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nclass CdpClient {\n #nextId = 1\n readonly #pending = new Map<number, PendingCdpRequest>()\n readonly #socket: WebSocket\n\n private constructor(socket: WebSocket) {\n this.#socket = socket\n socket.addEventListener('message', event => this.handleMessage(event.data))\n socket.addEventListener('error', () => this.rejectAll(new Error('Chrome DevTools WebSocket failed.')))\n socket.addEventListener('close', () => this.rejectAll(new Error('Chrome DevTools WebSocket closed.')))\n }\n\n static async connect(url: string): Promise<CdpClient> {\n if (typeof WebSocket !== 'function') {\n throw new TypeError('Browser capture requires a Node.js runtime with global WebSocket support.')\n }\n const socket = await new Promise<WebSocket>((resolve, reject) => {\n const ws = new WebSocket(url)\n ws.addEventListener('open', () => resolve(ws), { once: true })\n ws.addEventListener('error', () => reject(new Error('Failed to connect to Chrome DevTools WebSocket.')), { once: true })\n })\n return new CdpClient(socket)\n }\n\n close(): void {\n this.#socket.close()\n }\n\n send<T = unknown>(method: string, params?: Record<string, unknown>): Promise<T> {\n const id = this.#nextId\n this.#nextId += 1\n const promise = new Promise<T>((resolve, reject) => {\n this.#pending.set(id, {\n reject,\n resolve: value => resolve(value as T),\n })\n })\n const message = params === undefined\n ? {\n id,\n method,\n }\n : {\n id,\n method,\n params,\n }\n this.#socket.send(JSON.stringify(message))\n return promise\n }\n\n private handleMessage(data: unknown): void {\n const message = JSON.parse(messageText(data)) as CdpMessage\n if (message.id === undefined) return\n const pending = this.#pending.get(message.id)\n if (pending === undefined) return\n this.#pending.delete(message.id)\n if (message.error === undefined) {\n pending.resolve(message.result)\n } else {\n pending.reject(new Error(`Chrome DevTools error ${message.error.code}: ${message.error.message}`))\n }\n }\n\n private rejectAll(error: Error): void {\n for (const pending of this.#pending.values()) {\n pending.reject(error)\n }\n this.#pending.clear()\n }\n}\n\nfunction messageText(data: unknown): string {\n if (typeof data === 'string') return data\n if (data instanceof ArrayBuffer) return Buffer.from(data).toString('utf8')\n return String(data)\n}\n", "import type { StreamingCatalogObservationInput } from '@ariestools/aries-streaming-catalog-core'\nimport { hashBinary } from '@ariestools/aries-witness-core'\n\nimport {\n type BrowserPageSnapshot,\n captureNetflixPagesWithChrome,\n} from './netflixCatalogBrowser.ts'\nimport {\n extractNetflixTitleDetails,\n isWeakNetflixTitle,\n type NetflixTitleDetailPatch,\n netflixTitleIdFromUrl,\n netflixTitleUrl,\n} from './netflixCatalogExtract.ts'\n\nexport type NetflixCatalogCaptureMethod = 'browser' | 'fetch'\ntype NetflixCatalogDetailObservation = StreamingCatalogObservationInput & NetflixTitleDetailPatch\n\nexport interface EnrichNetflixCatalogObservationsOptions {\n captureMethod: NetflixCatalogCaptureMethod\n chromePath?: string\n detailLimit: number\n detailScrollWaitMs: number\n detailScrolls: number\n detailWaitMs: number\n devtoolsTimeoutMs: number\n fetchText: (url: string) => Promise<string>\n headless: boolean\n observedAt: string\n profileDir: string\n region: string\n viewportHeight: number\n viewportWidth: number\n}\n\ninterface CaptureSource {\n content: string\n sourceName: string\n sourceUrl?: string\n titleId?: string\n}\n\nexport async function enrichNetflixCatalogObservations(\n observations: readonly NetflixCatalogDetailObservation[],\n options: EnrichNetflixCatalogObservationsOptions,\n): Promise<{ detailSourceCount: number; observations: StreamingCatalogObservationInput[] }> {\n if (observations.length === 0) {\n return {\n detailSourceCount: 0,\n observations: [],\n }\n }\n\n const detailUrls = [...new Set(observations\n .slice(0, options.detailLimit)\n .map(observation => observation.url ?? netflixTitleUrl(observation.sourceTitleId)))]\n const detailSources = await resolveDetailSources(detailUrls, options)\n const detailsByTitleId = new Map<string, NetflixTitleDetailPatch>()\n\n for (const source of detailSources) {\n const sourceTitleId = source.titleId ?? netflixTitleIdFromUrl(source.sourceUrl ?? '')\n if (sourceTitleId === undefined) continue\n const rawResponseHash = hashBinary(Buffer.from(source.content))\n const detail = extractNetflixTitleDetails(source.content, {\n observedAt: options.observedAt,\n rawResponseHash,\n region: options.region,\n sourceName: source.sourceName,\n sourceTitleId,\n sourceUrl: source.sourceUrl,\n })\n detailsByTitleId.set(sourceTitleId, mergeDetailPatch(detailsByTitleId.get(sourceTitleId), detail))\n }\n\n return {\n detailSourceCount: detailSources.length,\n observations: observations.map(observation => mergeObservationDetail(observation, detailsByTitleId.get(observation.sourceTitleId))),\n }\n}\n\nasync function resolveDetailSources(\n urls: readonly string[],\n options: EnrichNetflixCatalogObservationsOptions,\n): Promise<CaptureSource[]> {\n if (options.captureMethod === 'browser') {\n return (await captureNetflixPagesWithChrome(urls, {\n chromePath: options.chromePath,\n devtoolsTimeoutMs: options.devtoolsTimeoutMs,\n headless: options.headless,\n profileDir: options.profileDir,\n scrolls: options.detailScrolls,\n scrollWaitMs: options.detailScrollWaitMs,\n viewportHeight: options.viewportHeight,\n viewportWidth: options.viewportWidth,\n waitMs: options.detailWaitMs,\n })).map(browserSnapshotToCaptureSource)\n }\n\n return Promise.all(urls.map(async (url): Promise<CaptureSource> => ({\n content: await options.fetchText(url),\n sourceName: `detail-url:${url}`,\n sourceUrl: url,\n titleId: netflixTitleIdFromUrl(url),\n })))\n}\n\nfunction browserSnapshotToCaptureSource(snapshot: BrowserPageSnapshot): CaptureSource {\n return {\n content: snapshot.content,\n sourceName: `detail-${snapshot.sourceName}`,\n sourceUrl: snapshot.sourceUrl,\n titleId: netflixTitleIdFromUrl(snapshot.sourceUrl),\n }\n}\n\nfunction mergeObservationDetail(\n observation: NetflixCatalogDetailObservation,\n detail: NetflixTitleDetailPatch | undefined,\n): NetflixCatalogDetailObservation {\n if (detail === undefined || !hasDetailData(detail)) return observation\n return {\n ...observation,\n cast: mergeStringList(observation.cast, detail.cast),\n creators: mergeStringList(observation.creators, detail.creators),\n evidence: detail.evidence ?? observation.evidence,\n genres: mergeStringList(observation.genres, detail.genres),\n maturityRating: detail.maturityRating ?? observation.maturityRating,\n quality: mergeQuality(observation.quality, detail.quality),\n runtime: detail.runtime ?? observation.runtime,\n synopsis: detail.synopsis ?? observation.synopsis,\n title: chooseMergedTitle(observation, detail),\n type: detail.type ?? observation.type,\n url: detail.url ?? observation.url,\n year: detail.year ?? observation.year,\n }\n}\n\nfunction mergeDetailPatch(\n existing: NetflixTitleDetailPatch | undefined,\n next: NetflixTitleDetailPatch,\n): NetflixTitleDetailPatch {\n if (existing === undefined) return next\n return {\n ...existing,\n cast: mergeStringList(existing.cast, next.cast),\n creators: mergeStringList(existing.creators, next.creators),\n evidence: next.evidence ?? existing.evidence,\n genres: mergeStringList(existing.genres, next.genres),\n maturityRating: next.maturityRating ?? existing.maturityRating,\n quality: mergeQuality(existing.quality, next.quality),\n runtime: next.runtime ?? existing.runtime,\n sourceTitleId: existing.sourceTitleId ?? next.sourceTitleId,\n synopsis: next.synopsis ?? existing.synopsis,\n title: next.title ?? existing.title,\n type: next.type ?? existing.type,\n url: next.url ?? existing.url,\n year: next.year ?? existing.year,\n }\n}\n\nfunction hasDetailData(detail: NetflixTitleDetailPatch): boolean {\n const values = [\n detail.title,\n detail.year,\n detail.runtime,\n detail.maturityRating,\n detail.synopsis,\n ]\n const arrays = [\n detail.genres,\n detail.cast,\n detail.creators,\n detail.quality?.badges,\n detail.quality?.encodes,\n ]\n return values.some(value => value !== undefined) || arrays.some(value => (value?.length ?? 0) > 0)\n}\n\nfunction chooseMergedTitle(\n observation: StreamingCatalogObservationInput,\n detail: NetflixTitleDetailPatch,\n): string {\n if (detail.title === undefined) return observation.title\n if (isWeakNetflixTitle(observation.title, observation.sourceTitleId)) return detail.title\n return observation.title\n}\n\nfunction mergeQuality(\n existing: StreamingCatalogObservationInput['quality'],\n next: StreamingCatalogObservationInput['quality'],\n): StreamingCatalogObservationInput['quality'] {\n return {\n badges: mergeStringList(existing?.badges, next?.badges) ?? [],\n encodes: [...(existing?.encodes ?? []), ...(next?.encodes ?? [])],\n }\n}\n\nfunction mergeStringList(existing: readonly string[] | undefined, next: readonly string[] | undefined): string[] | undefined {\n const merged = [...new Set([...(existing ?? []), ...(next ?? [])]\n .map(item => item.trim())\n .filter(item => item.length > 0))]\n .toSorted((a, b) => a.localeCompare(b))\n return merged.length === 0 ? undefined : merged\n}\n", "import type { StreamingCatalogObservationInput } from '@ariestools/aries-streaming-catalog-core'\n\nexport interface NetflixCatalogExtractionContext {\n observedAt: string\n rawResponseHash: string\n region: string\n sourceName: string\n sourceUrl?: string\n}\n\nexport interface NetflixTitleDetailExtractionContext extends NetflixCatalogExtractionContext {\n sourceTitleId: string\n}\n\nexport type NetflixTitleDetailPatch = Partial<StreamingCatalogObservationInput> & {\n cast?: string[]\n creators?: string[]\n genres?: string[]\n maturityRating?: string\n synopsis?: string\n}\n\nconst TITLE_URL_PATTERN = /(?:href|src)=[\"'][^\"']*(?:\\/(?:watch|title)\\/|netflix:\\/\\/title\\/)(\\d+)[^\"']*[\"']/giu\nconst QUALITY_BADGES = [\n { badge: 'Dolby Vision', pattern: /\\bDolby\\s+Vision\\b/iu },\n { badge: 'Atmos', pattern: /\\b(?:Dolby\\s+)?Atmos\\b/iu },\n { badge: 'HDR', pattern: /\\bHDR\\b/iu },\n { badge: '4K', pattern: /\\b(?:4K|Ultra\\s+HD|UHD)\\b/iu },\n { badge: 'HD', pattern: /\\bHD\\b/iu },\n] as const\nconst WEAK_TITLE_PATTERNS = [\n /^-/u,\n /\\baudio description\\b/iu,\n /\\b(?:episodes|more info|netflix home|sign in|subtitles|trailers? & more)\\b/iu,\n /\\b(?:add to my list|remove from my list|start with)\\b/iu,\n] as const\n\nexport function extractNetflixCatalogObservations(\n html: string,\n context: NetflixCatalogExtractionContext,\n): StreamingCatalogObservationInput[] {\n const observations = new Map<string, StreamingCatalogObservationInput>()\n for (const match of html.matchAll(TITLE_URL_PATTERN)) {\n const sourceTitleId = match[1]\n if (sourceTitleId === undefined) continue\n const windowText = nearbyHtml(html, match.index ?? 0)\n const title = extractBestTitle(windowText) ?? fallbackTitle(sourceTitleId)\n const existing = observations.get(sourceTitleId)\n const badges = qualityBadges(windowText)\n if (existing && !isWeakNetflixTitle(existing.title, sourceTitleId)) {\n existing.quality = mergeQualityBadges(existing.quality?.badges ?? [], badges)\n continue\n }\n observations.set(sourceTitleId, {\n available: true,\n evidence: {\n rawResponseHash: context.rawResponseHash,\n region: context.region,\n source: context.sourceName,\n },\n observedAt: context.observedAt,\n provider: 'netflix',\n quality: mergeQualityBadges(existing?.quality?.badges ?? [], badges),\n region: context.region,\n sourceKind: 'browser-witness',\n sourceTitleId,\n title,\n type: 'unknown',\n url: netflixTitleUrl(sourceTitleId),\n })\n }\n return [...observations.values()].toSorted((a, b) => a.sourceTitleId.localeCompare(b.sourceTitleId))\n}\n\nexport function extractNetflixTitleDetails(\n html: string,\n context: NetflixTitleDetailExtractionContext,\n): NetflixTitleDetailPatch {\n const jsonLdRecords = extractJsonLdRecords(html)\n const detail: NetflixTitleDetailPatch = {\n evidence: {\n rawResponseHash: context.rawResponseHash,\n region: context.region,\n source: context.sourceName,\n },\n quality: mergeQualityBadges([], qualityBadges(html)),\n sourceTitleId: context.sourceTitleId,\n url: netflixTitleUrl(context.sourceTitleId),\n }\n\n assignDetailString(detail, 'title', extractDetailTitle(html, jsonLdRecords))\n assignDetailString(detail, 'type', extractTitleType(html, jsonLdRecords))\n assignDetailString(detail, 'maturityRating', firstString([\n ...jsonLdRecords.map(record => record.contentRating),\n jsonStringValue(html, 'contentRating'),\n jsonStringValue(html, 'maturityRating'),\n jsonStringValue(html, 'rating'),\n ]))\n assignDetailString(detail, 'synopsis', firstString([\n ...jsonLdRecords.map(record => record.description),\n metaContent(html, 'description'),\n metaContent(html, 'og:description'),\n jsonStringValue(html, 'synopsis'),\n jsonStringValue(html, 'description'),\n jsonStringValue(html, 'summary'),\n ]))\n\n const year = extractYear(html, jsonLdRecords)\n if (year !== undefined) detail.year = year\n\n const runtime = extractRuntimeMinutes(html, jsonLdRecords)\n if (runtime !== undefined) detail.runtime = runtime\n\n assignDetailStrings(detail, 'genres', [\n ...jsonLdRecords.flatMap(record => stringsFromUnknown(record.genre)),\n ...jsonStringArrayValues(html, 'genre'),\n ...jsonStringArrayValues(html, 'genres'),\n ])\n assignDetailStrings(detail, 'cast', [\n ...jsonLdRecords.flatMap(record => namesFromUnknown(record.actor)),\n ...jsonLdRecords.flatMap(record => namesFromUnknown(record.actors)),\n ...jsonStringArrayValues(html, 'cast'),\n ])\n assignDetailStrings(detail, 'creators', [\n ...jsonLdRecords.flatMap(record => namesFromUnknown(record.creator)),\n ...jsonLdRecords.flatMap(record => namesFromUnknown(record.creators)),\n ...jsonLdRecords.flatMap(record => namesFromUnknown(record.director)),\n ...jsonLdRecords.flatMap(record => namesFromUnknown(record.directors)),\n ...jsonStringArrayValues(html, 'creators'),\n ...jsonStringArrayValues(html, 'directors'),\n ])\n\n return detail\n}\n\nexport function isWeakNetflixTitle(title: string | undefined, sourceTitleId: string): boolean {\n const cleaned = cleanTitleText(title)\n return cleaned === undefined || cleaned === fallbackTitle(sourceTitleId) || WEAK_TITLE_PATTERNS.some(pattern => pattern.test(cleaned))\n}\n\nexport function netflixTitleIdFromUrl(url: string): string | undefined {\n return /(?:\\/(?:watch|title)\\/|netflix:\\/\\/title\\/)(\\d+)/iu.exec(url)?.[1]\n}\n\nexport function netflixTitleUrl(sourceTitleId: string): string {\n return `https://www.netflix.com/title/${sourceTitleId}`\n}\n\nfunction nearbyHtml(html: string, index: number): string {\n return html.slice(Math.max(0, index - 1200), Math.min(html.length, index + 1200))\n}\n\nfunction extractBestTitle(html: string): string | undefined {\n const attributes = [\n attributeValue(html, 'aria-label'),\n attributeValue(html, 'alt'),\n attributeValue(html, 'title'),\n attributeValue(html, 'data-title'),\n jsonStringValue(html, 'title'),\n jsonStringValue(html, 'name'),\n ]\n return attributes.map(cleanTitleText).find(value => value !== undefined)\n}\n\nfunction attributeValue(html: string, name: string): string | undefined {\n const match = new RegExp(String.raw`${name}\\s*=\\s*[\"']([^\"']+)[\"']`, 'iu').exec(html)\n return match?.[1]\n}\n\nfunction jsonStringValue(html: string, name: string): string | undefined {\n const match = new RegExp(String.raw`[\"']${name}[\"']\\s*:\\s*[\"']((?:\\\\.|[^\"'])+)[\"']`, 'iu').exec(html)\n return unescapeJsonString(match?.[1])\n}\n\nfunction cleanTitleText(value: string | undefined): string | undefined {\n if (value === undefined) return undefined\n const decoded = decodeHtml(value)\n .replaceAll(/\\s+/gu, ' ')\n .replace(/\\s*\\|\\s*Netflix(?:\\s+Official\\s+Site)?\\s*$/iu, '')\n .replace(/\\s*-\\s*Netflix(?:\\s+Official\\s+Site)?\\s*$/iu, '')\n .replace(/^\\s*(?:go\\s+to|watch|play)\\s+/iu, '')\n .trim()\n if (decoded.length === 0 || decoded.length > 120 || /^\\d+$/u.test(decoded)) return undefined\n if (WEAK_TITLE_PATTERNS.some(pattern => pattern.test(decoded))) return undefined\n return decoded\n}\n\nfunction cleanDetailText(value: string | undefined): string | undefined {\n if (value === undefined) return undefined\n const decoded = decodeHtml(value)\n .replaceAll(/\\s+/gu, ' ')\n .trim()\n return decoded.length === 0 ? undefined : decoded\n}\n\nfunction decodeHtml(value: string): string {\n return value\n .replaceAll(/&#(\\d+);/gu, (_match, code: string) => String.fromCodePoint(Number.parseInt(code, 10)))\n .replaceAll(/&#x([a-f0-9]+);/giu, (_match, code: string) => String.fromCodePoint(Number.parseInt(code, 16)))\n .replaceAll('&', '&')\n .replaceAll('"', '\"')\n .replaceAll(''', \"'\")\n .replaceAll(''', \"'\")\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n}\n\nfunction extractDetailTitle(html: string, jsonLdRecords: readonly Record<string, unknown>[]): string | undefined {\n return [\n ...jsonLdRecords.map(record => record.name),\n metaContent(html, 'og:title'),\n metaContent(html, 'twitter:title'),\n metaContent(html, 'title'),\n tagText(html, 'title'),\n jsonStringValue(html, 'title'),\n jsonStringValue(html, 'name'),\n ].map(value => cleanTitleText(stringFromUnknown(value))).find(value => value !== undefined)\n}\n\nfunction extractTitleType(html: string, jsonLdRecords: readonly Record<string, unknown>[]): string | undefined {\n for (const rawType of [\n ...jsonLdRecords.map(record => record['@type']),\n jsonStringValue(html, 'type'),\n jsonStringValue(html, 'videoType'),\n ]) {\n const type = stringFromUnknown(rawType)?.toLowerCase()\n if (type === undefined) continue\n if (/\\b(?:movie|film)\\b/u.test(type)) return 'movie'\n if (/\\b(?:series|tvseries|show|season)\\b/u.test(type)) return 'series'\n }\n return undefined\n}\n\nfunction extractYear(html: string, jsonLdRecords: readonly Record<string, unknown>[]): number | undefined {\n for (const value of [\n ...jsonLdRecords.flatMap(record => [record.dateCreated, record.datePublished, record.releaseDate, record.releaseYear]),\n jsonNumberValue(html, 'releaseYear'),\n jsonNumberValue(html, 'year'),\n jsonStringValue(html, 'datePublished'),\n jsonStringValue(html, 'releaseDate'),\n ]) {\n const year = yearFromUnknown(value)\n if (year !== undefined) return year\n }\n return undefined\n}\n\nfunction extractRuntimeMinutes(html: string, jsonLdRecords: readonly Record<string, unknown>[]): number | undefined {\n for (const value of [\n ...jsonLdRecords.flatMap(record => [record.duration, record.runtime]),\n jsonStringValue(html, 'duration'),\n jsonStringValue(html, 'runtime'),\n jsonNumberValue(html, 'runtime'),\n ]) {\n const runtime = runtimeMinutesFromUnknown(value)\n if (runtime !== undefined) return runtime\n }\n return runtimeMinutesFromText(html)\n}\n\nfunction extractJsonLdRecords(html: string): Record<string, unknown>[] {\n const records: Record<string, unknown>[] = []\n for (const match of html.matchAll(/<script\\b[^>]*type=[\"']application\\/ld\\+json[\"'][^>]*>([\\s\\S]*?)<\\/script>/giu)) {\n const json = cleanDetailText(match[1])\n if (json === undefined) continue\n try {\n records.push(...flattenJsonLd(JSON.parse(json) as unknown))\n } catch {\n // Netflix changes script payloads frequently; malformed JSON-LD should not fail the witness.\n }\n }\n return records\n}\n\nfunction flattenJsonLd(value: unknown): Record<string, unknown>[] {\n if (Array.isArray(value)) return value.flatMap(flattenJsonLd)\n if (!isRecord(value)) return []\n const graph = value['@graph']\n return [\n value,\n ...(Array.isArray(graph) ? graph.flatMap(flattenJsonLd) : []),\n ]\n}\n\nfunction metaContent(html: string, target: string): string | undefined {\n for (const tag of html.matchAll(/<meta\\b[^>]*>/giu)) {\n const attributes = tagAttributes(tag[0])\n if (attributes.property !== target && attributes.name !== target) continue\n const content = cleanDetailText(attributes.content)\n if (content !== undefined) return content\n }\n return undefined\n}\n\nfunction tagText(html: string, tagName: string): string | undefined {\n const match = new RegExp(String.raw`<${tagName}\\b[^>]*>([\\s\\S]*?)<\\/${tagName}>`, 'iu').exec(html)\n return cleanDetailText(match?.[1]?.replaceAll(/<[^>]+>/gu, ' '))\n}\n\nfunction tagAttributes(tag: string): Record<string, string> {\n const attributes: Record<string, string> = {}\n for (const match of tag.matchAll(/([a-z0-9:_-]+)\\s*=\\s*([\"'])(.*?)\\2/giu)) {\n const key = match[1]\n const value = match[3]\n if (key !== undefined && value !== undefined) attributes[key.toLowerCase()] = decodeHtml(value)\n }\n return attributes\n}\n\nfunction jsonStringArrayValues(html: string, name: string): string[] {\n const values: string[] = []\n const pattern = new RegExp(String.raw`[\"']${name}[\"']\\s*:\\s*\\[([\\s\\S]{0,3000}?)\\]`, 'giu')\n for (const match of html.matchAll(pattern)) {\n const content = match[1] ?? ''\n if (/[{}]/u.test(content)) continue\n for (const stringMatch of content.matchAll(/[\"']((?:\\\\.|[^\"'])+)[\"']/gu)) {\n const value = cleanDetailText(unescapeJsonString(stringMatch[1]))\n if (value !== undefined) values.push(value)\n }\n }\n return values\n}\n\nfunction jsonNumberValue(html: string, name: string): number | undefined {\n const match = new RegExp(String.raw`[\"']${name}[\"']\\s*:\\s*(\\d+)`, 'iu').exec(html)\n return match?.[1] === undefined ? undefined : Number.parseInt(match[1], 10)\n}\n\nfunction firstString(values: readonly unknown[]): string | undefined {\n return values.map(value => cleanDetailText(stringFromUnknown(value))).find(value => value !== undefined)\n}\n\nfunction namesFromUnknown(value: unknown): string[] {\n if (Array.isArray(value)) return value.flatMap(namesFromUnknown)\n if (isRecord(value)) return stringsFromUnknown(value.name)\n return stringsFromUnknown(value)\n}\n\nfunction stringsFromUnknown(value: unknown): string[] {\n if (Array.isArray(value)) return value.flatMap(stringsFromUnknown)\n const text = cleanDetailText(stringFromUnknown(value))\n return text === undefined ? [] : [text]\n}\n\nfunction stringFromUnknown(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined\n}\n\nfunction yearFromUnknown(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isInteger(value) && value >= 1888 && value <= 3000) return value\n const text = stringFromUnknown(value)\n const match = text === undefined ? undefined : /\\b(19|20|21)\\d{2}\\b/u.exec(text)\n return match?.[0] === undefined ? undefined : Number.parseInt(match[0], 10)\n}\n\nfunction runtimeMinutesFromUnknown(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value) && value > 0) return Math.round(value)\n const text = stringFromUnknown(value)\n if (text === undefined) return undefined\n const isoMatch = /^P(?:T)?(?:(\\d+)H)?(?:(\\d+)M)?$/iu.exec(text)\n if (isoMatch !== null) {\n const hours = isoMatch[1] === undefined ? 0 : Number.parseInt(isoMatch[1], 10)\n const minutes = isoMatch[2] === undefined ? 0 : Number.parseInt(isoMatch[2], 10)\n const total = hours * 60 + minutes\n return total > 0 ? total : undefined\n }\n return runtimeMinutesFromText(text)\n}\n\nfunction runtimeMinutesFromText(text: string): number | undefined {\n const match = /\\b(?:(\\d+)\\s*h(?:ours?)?)?\\s*(?:(\\d+)\\s*m(?:in(?:utes?)?)?)\\b/iu.exec(decodeHtml(text))\n if (match === null || (match[1] === undefined && match[2] === undefined)) return undefined\n const hours = match[1] === undefined ? 0 : Number.parseInt(match[1], 10)\n const minutes = match[2] === undefined ? 0 : Number.parseInt(match[2], 10)\n const total = hours * 60 + minutes\n return total > 0 ? total : undefined\n}\n\nfunction assignDetailString<T extends object, K extends keyof T>(target: T, key: K, value: string | undefined): void {\n const parsed = cleanDetailText(value)\n if (parsed !== undefined) target[key] = parsed as T[K]\n}\n\nfunction assignDetailStrings<T extends object, K extends keyof T>(target: T, key: K, value: readonly string[]): void {\n const strings = [...new Set(value\n .map(cleanDetailText)\n .filter((item): item is string => item !== undefined))]\n .toSorted((a, b) => a.localeCompare(b))\n if (strings.length > 0) target[key] = strings as T[K]\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction unescapeJsonString(value: string | undefined): string | undefined {\n return value\n ?.replaceAll(String.raw`\\\"`, '\"')\n .replaceAll(String.raw`\\'`, \"'\")\n .replaceAll(String.raw`\\/`, '/')\n}\n\nfunction fallbackTitle(sourceTitleId: string): string {\n return `Netflix title ${sourceTitleId}`\n}\n\nfunction qualityBadges(html: string): string[] {\n return QUALITY_BADGES\n .filter(({ pattern }) => pattern.test(html))\n .map(({ badge }) => badge)\n}\n\nfunction mergeQualityBadges(existing: readonly string[], next: readonly string[]): { badges: string[]; encodes: [] } {\n return {\n badges: [...new Set([...existing, ...next])].toSorted((a, b) => a.localeCompare(b)),\n encodes: [],\n }\n}\n", "import type { WitnessObservation, WitnessPlugin } from '@ariestools/aries-witness-core'\nimport { SchedTypes } from 'node-screenlogic'\n\nimport { type PentairConfig, withScreenLogic } from '../../pentair/index.ts'\n\nconst PENTAIR_SCHEMA = 'network.xyo.pentair.screenlogic'\n\nexport const pentairWitness: WitnessPlugin = {\n meta: {\n description: 'Capture Pentair ScreenLogic pool equipment state',\n name: 'pentair',\n schema: PENTAIR_SCHEMA,\n },\n observe: async (args): Promise<WitnessObservation> => {\n const payload = await withScreenLogic(args as PentairConfig, async unit => ({\n chem: await unit.chem.getChemicalDataAsync(),\n chlor: await unit.chlor.getIntellichlorConfigAsync(),\n equipment: {\n circuitNames: await unit.equipment.getAllCircuitNamesAsync(),\n config: await unit.equipment.getEquipmentConfigurationAsync(),\n controllerConfig: await unit.equipment.getControllerConfigAsync(),\n customNames: await unit.equipment.getCustomNamesAsync(),\n state: await unit.equipment.getEquipmentStateAsync(),\n systemTime: await unit.equipment.getSystemTimeAsync(),\n weatherForecast: await unit.equipment.getWeatherForecastAsync(),\n },\n schedule: {\n once: await unit.schedule.getScheduleDataAsync(SchedTypes.RUNONCE),\n recurring: await unit.schedule.getScheduleDataAsync(SchedTypes.RECURRING),\n },\n schema: PENTAIR_SCHEMA,\n version: await unit.getVersionAsync(),\n }))\n\n return { payloads: [payload] }\n },\n}\n", "import {\n existsSync, mkdirSync, readFileSync, writeFileSync,\n} from 'node:fs'\nimport path from 'node:path'\n\nimport type {\n WitnessObservation, WitnessPlugin, XyoPayload,\n} from '@ariestools/aries-witness-core'\nimport type { SLChemData, SLChemHistory } from 'node-screenlogic'\nimport type { Argv } from 'yargs'\n\nimport {\n defaultPentairSeriesFile,\n type PentairConfig,\n resolvePentairConfig,\n withScreenLogic,\n} from '../../pentair/index.ts'\nimport { writeGraph } from './pentairIntellichemGraph.ts'\nimport type { IntelliChemSample } from './pentairIntellichemTypes.ts'\n\nconst DAY_MS = 24 * 60 * 60 * 1000\nconst DEFAULT_HISTORY_AGE = '24h'\nconst INTELLICHEM_SCHEMA = 'network.xyo.pentair.screenlogic.intellichem'\n\ninterface ObserveOptions extends PentairConfig {\n 'from'?: string\n 'graph'?: string\n 'graph-only'?: boolean\n 'history'?: boolean\n 'save'?: boolean\n 'to'?: string\n}\n\nfunction assertNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction parseDateOrAge(value: string | undefined, now: Date, fallback: Date): Date {\n if (!value) return fallback\n\n const age = /^(\\d+)(m|h|d)$/i.exec(value.trim())\n if (age) {\n const amount = Number(age[1])\n const unit = age[2]?.toLowerCase()\n const multiplier = unit === 'm' ? 60 * 1000 : unit === 'h' ? 60 * 60 * 1000 : DAY_MS\n return new Date(now.getTime() - amount * multiplier)\n }\n\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) {\n throw new TypeError(`Invalid date or relative age: ${value}`)\n }\n return date\n}\n\nfunction sampleKey(sample: IntelliChemSample): string {\n return sample.timestamp\n}\n\nfunction mergeSamples(samples: IntelliChemSample[]): IntelliChemSample[] {\n const byTimestamp = new Map<string, IntelliChemSample>()\n for (const sample of samples) {\n const existing = byTimestamp.get(sampleKey(sample))\n byTimestamp.set(sampleKey(sample), existing ? { ...existing, ...sample } : sample)\n }\n return [...byTimestamp.values()].toSorted((a, b) => Date.parse(a.timestamp) - Date.parse(b.timestamp))\n}\n\nfunction currentChemSample(chem: SLChemData, observedAt: Date): IntelliChemSample {\n return {\n alkalinity: assertNumber(chem.alkalinity),\n calcium: assertNumber(chem.calcium),\n corrosive: chem.corrosive,\n cyanuricAcid: assertNumber(chem.cyanuricAcid),\n error: chem.error,\n orp: assertNumber(chem.orp),\n orpSetPoint: assertNumber(chem.orpSetPoint),\n orpTankLevel: assertNumber(chem.orpTankLevel),\n pH: assertNumber(chem.pH),\n pHSetPoint: assertNumber(chem.pHSetPoint),\n pHTankLevel: assertNumber(chem.pHTankLevel),\n saltPPM: assertNumber(chem.saltPPM),\n saturation: assertNumber(chem.saturation),\n scaling: chem.scaling,\n source: 'current',\n temperature: assertNumber(chem.temperature),\n timestamp: observedAt.toISOString(),\n }\n}\n\nfunction historySamples(history: SLChemHistory): IntelliChemSample[] {\n const samples = new Map<string, IntelliChemSample>()\n\n for (const point of history.phPoints ?? []) {\n const timestamp = point.time.toISOString()\n samples.set(timestamp, {\n ...samples.get(timestamp),\n pH: point.pH,\n source: 'history',\n timestamp,\n })\n }\n\n for (const point of history.orpPoints ?? []) {\n const timestamp = point.time.toISOString()\n samples.set(timestamp, {\n ...samples.get(timestamp),\n orp: point.orp,\n source: 'history',\n timestamp,\n })\n }\n\n return mergeSamples([...samples.values()])\n}\n\nfunction loadSamples(filePath: string): IntelliChemSample[] {\n if (!existsSync(filePath)) return []\n const raw = readFileSync(filePath, 'utf8')\n const samples: IntelliChemSample[] = []\n\n for (const line of raw.split(/\\r?\\n/)) {\n if (!line.trim()) continue\n try {\n const parsed = JSON.parse(line) as Partial<IntelliChemSample>\n if (typeof parsed.timestamp === 'string' && typeof parsed.source === 'string') {\n samples.push(parsed as IntelliChemSample)\n }\n } catch {\n // Ignore malformed lines so one bad append does not break graphing.\n }\n }\n\n return mergeSamples(samples)\n}\n\nfunction saveSamples(filePath: string, samples: IntelliChemSample[]): IntelliChemSample[] {\n const merged = mergeSamples([...loadSamples(filePath), ...samples])\n mkdirSync(path.dirname(filePath), { recursive: true })\n writeFileSync(filePath, `${merged.map(sample => JSON.stringify(sample)).join('\\n')}\\n`, 'utf8')\n return merged\n}\n\nexport const pentairIntellichemWitness: WitnessPlugin = {\n builder: (yargs: unknown) => {\n return (yargs as Argv)\n .option('history', {\n default: false,\n describe: 'Fetch IntelliChem controller history for the time window',\n type: 'boolean',\n })\n .option('from', {\n default: DEFAULT_HISTORY_AGE,\n describe: 'History start as ISO date or relative age like 30m, 6h, 7d',\n type: 'string',\n })\n .option('to', {\n describe: 'History end as ISO date or relative age (default: now)',\n type: 'string',\n })\n .option('address', {\n describe: 'Connect directly to a ScreenLogic adapter IP instead of UDP discovery',\n type: 'string',\n })\n .option('port', {\n describe: 'ScreenLogic adapter TCP port for direct connection (default: config or 80)',\n type: 'number',\n })\n .option('password', {\n describe: 'ScreenLogic password for direct connection, if configured',\n type: 'string',\n })\n .option('system-name', {\n describe: 'ScreenLogic system name for direct connection (default: config or Pentair ScreenLogic)',\n type: 'string',\n })\n .option('search-timeout', {\n describe: 'Milliseconds to wait for each UDP discovery attempt (default: config or 5000)',\n type: 'number',\n })\n .option('search-attempts', {\n describe: 'Number of UDP discovery attempts before failing (default: config or 3)',\n type: 'number',\n })\n .option('response-timeout', {\n describe: 'Milliseconds to wait for each ScreenLogic command response (default: config or 15000)',\n type: 'number',\n })\n .option('save', {\n default: false,\n describe: 'Save normalized IntelliChem samples to the series file',\n type: 'boolean',\n })\n .option('series-file', {\n describe: `JSONL file used for saved IntelliChem samples and graphing (default: config or ${defaultPentairSeriesFile()})`,\n type: 'string',\n })\n .option('graph', {\n describe: 'Write a standalone HTML graph to this path',\n type: 'string',\n })\n .option('graph-only', {\n default: false,\n describe: 'Render a graph from the series file without connecting to ScreenLogic',\n type: 'boolean',\n })\n },\n meta: {\n description: 'Capture and graph Pentair IntelliChem chemistry data',\n name: 'pentair-intellichem',\n schema: INTELLICHEM_SCHEMA,\n },\n observe: async (args): Promise<WitnessObservation> => {\n const options = args as ObserveOptions\n const pentairOptions = resolvePentairConfig(options)\n const now = new Date()\n const wantsHistory = options.history === true || typeof options.graph === 'string'\n const from = parseDateOrAge(options.from, now, new Date(now.getTime() - DAY_MS))\n const to = parseDateOrAge(options.to, now, now)\n const seriesFile = pentairOptions['series-file'] ?? defaultPentairSeriesFile()\n\n if (from.getTime() >= to.getTime()) {\n throw new Error('History start must be before history end')\n }\n\n if (options['graph-only']) {\n if (!options.graph) throw new Error('--graph-only requires --graph')\n const graphSamples = loadSamples(seriesFile)\n writeGraph(options.graph, {\n generatedAt: now.toISOString(),\n samples: graphSamples,\n sourcePath: seriesFile,\n title: 'Pentair IntelliChem',\n })\n\n return {\n payloads: [{\n graph: {\n path: options.graph,\n samples: graphSamples.length,\n },\n samples: {\n seriesFile,\n stored: graphSamples.length,\n },\n schema: INTELLICHEM_SCHEMA,\n }],\n }\n }\n\n const observed = await withScreenLogic(options, async unit => ({\n current: await unit.chem.getChemicalDataAsync(),\n history: wantsHistory ? await unit.chem.getChemHistoryDataAsync(from, to) : undefined,\n }))\n\n const currentSample = currentChemSample(observed.current, now)\n const observedSamples = mergeSamples([\n ...(observed.history ? historySamples(observed.history) : []),\n currentSample,\n ])\n const savedSamples = options.save ? saveSamples(seriesFile, observedSamples) : undefined\n const graphSamples = options.graph\n ? mergeSamples([...loadSamples(seriesFile), ...observedSamples])\n : undefined\n\n if (options.graph && graphSamples) {\n writeGraph(options.graph, {\n generatedAt: now.toISOString(),\n samples: graphSamples,\n sourcePath: seriesFile,\n title: 'Pentair IntelliChem',\n })\n }\n\n const payload: XyoPayload = {\n current: observed.current,\n graph: options.graph\n ? {\n path: options.graph,\n samples: graphSamples?.length ?? 0,\n }\n : undefined,\n history: observed.history,\n historyWindow: wantsHistory\n ? {\n from: from.toISOString(),\n to: to.toISOString(),\n }\n : undefined,\n samples: {\n observed: observedSamples.length,\n saved: savedSamples?.length,\n seriesFile: options.save || options.graph ? seriesFile : undefined,\n },\n schema: INTELLICHEM_SCHEMA,\n }\n\n return { payloads: [payload] }\n },\n}\n", "import { mkdirSync, writeFileSync } from 'node:fs'\nimport path from 'node:path'\n\nimport type { IntelliChemSample } from './pentairIntellichemTypes.ts'\n\ninterface GraphSeries {\n generatedAt: string\n samples: IntelliChemSample[]\n sourcePath?: string\n title: string\n}\n\nconst DATA_GAP_MS = 2 * 60 * 60 * 1000\n\nfunction assertNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction escapeHtml(value: unknown): string {\n return String(value)\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''')\n}\n\nfunction mergeSamples(samples: IntelliChemSample[]): IntelliChemSample[] {\n const byTimestamp = new Map<string, IntelliChemSample>()\n for (const sample of samples) {\n const existing = byTimestamp.get(sample.timestamp)\n byTimestamp.set(sample.timestamp, existing ? { ...existing, ...sample } : sample)\n }\n return [...byTimestamp.values()].toSorted((a, b) => Date.parse(a.timestamp) - Date.parse(b.timestamp))\n}\n\nfunction pointPath(\n points: { time: number; value: number }[],\n scaleX: (time: number) => number,\n scaleY: (value: number) => number,\n gapMs: number = Number.POSITIVE_INFINITY,\n): string {\n let previous: { time: number; value: number } | undefined\n return points.map((point, index) => {\n const startsSegment = index === 0 || (previous !== undefined && point.time - previous.time > gapMs)\n previous = point\n return `${startsSegment ? 'M' : 'L'} ${scaleX(point.time).toFixed(1)} ${scaleY(point.value).toFixed(1)}`\n }).join(' ')\n}\n\nfunction tickValues(min: number, max: number, count: number): number[] {\n if (count <= 1 || min === max) return [min]\n return Array.from({ length: count }, (_, index) => min + ((max - min) * index) / (count - 1))\n}\n\nfunction metricPoints(samples: IntelliChemSample[], metric: 'pH' | 'orp' | 'pHSetPoint' | 'orpSetPoint') {\n return samples\n .map(sample => ({ time: Date.parse(sample.timestamp), value: assertNumber(sample[metric]) }))\n .filter((point): point is { time: number; value: number } => Number.isFinite(point.time) && point.value !== undefined)\n}\n\nfunction dataGaps(points: { time: number; value: number }[]) {\n const gaps: { end: number; hours: number; start: number }[] = []\n for (let index = 1; index < points.length; index += 1) {\n const previous = points[index - 1]\n const point = points[index]\n if (previous && point && point.time - previous.time > DATA_GAP_MS) {\n gaps.push({\n end: point.time,\n hours: (point.time - previous.time) / (60 * 60 * 1000),\n start: previous.time,\n })\n }\n }\n return gaps\n}\n\nfunction renderLineChart(\n samples: IntelliChemSample[],\n metric: 'pH' | 'orp',\n label: string,\n color: string,\n setPointMetric?: 'pHSetPoint' | 'orpSetPoint',\n): string {\n const width = 1040\n const height = 340\n const margin = {\n bottom: 48, left: 58, right: 22, top: 32,\n }\n\n const points = metricPoints(samples, metric)\n if (points.length === 0) {\n return `<section class=\"chart\"><h2>${escapeHtml(label)}</h2><div class=\"empty\">No ${escapeHtml(label)} samples yet.</div></section>`\n }\n\n const setPoints = setPointMetric ? metricPoints(samples, setPointMetric) : []\n const latestSetPoint = setPoints.at(-1)\n const minTime = Math.min(...points.map(point => point.time))\n const maxTime = Math.max(...points.map(point => point.time))\n const values = [...points.map(point => point.value), ...(latestSetPoint ? [latestSetPoint.value] : [])]\n const minValue = Math.min(...values)\n const maxValue = Math.max(...values)\n const padding = Math.max((maxValue - minValue) * 0.12, metric === 'pH' ? 0.1 : 10)\n const yMin = Math.max(0, minValue - padding)\n const yMax = metric === 'pH' ? Math.min(14, maxValue + padding) : maxValue + padding\n const chartWidth = width - margin.left - margin.right\n const chartHeight = height - margin.top - margin.bottom\n const span = Math.max(maxTime - minTime, 1)\n const valueSpan = Math.max(yMax - yMin, 1)\n const scaleX = (time: number) => margin.left + ((time - minTime) / span) * chartWidth\n const scaleY = (value: number) => margin.top + chartHeight - ((value - yMin) / valueSpan) * chartHeight\n const xTicks = tickValues(minTime, maxTime, 5)\n const yTicks = tickValues(yMin, yMax, 5)\n const latest = points.at(-1)\n const latestLabel = latest ? `${latest.value.toFixed(metric === 'pH' ? 2 : 0)} ${metric}` : ''\n const gaps = dataGaps(points)\n const setPointY = latestSetPoint ? scaleY(latestSetPoint.value).toFixed(1) : undefined\n const setPointLine = setPointY\n ? `<line x1=\"${margin.left}\" x2=\"${width - margin.right}\" y1=\"${setPointY}\" y2=\"${setPointY}\" class=\"setpoint\" />`\n : ''\n\n return `\n <section class=\"chart\">\n <div class=\"chart-title\">\n <h2>${escapeHtml(label)}</h2>\n <span>${escapeHtml(latestLabel)}${gaps.length > 0 ? ` \u00B7 ${gaps.length} data gaps shaded` : ''}</span>\n </div>\n <svg viewBox=\"0 0 ${width} ${height}\" role=\"img\" aria-label=\"${escapeHtml(label)} over time\">\n <rect x=\"${margin.left}\" y=\"${margin.top}\" width=\"${chartWidth}\" height=\"${chartHeight}\" class=\"plot\" />\n ${gaps.map((gap) => {\n const x = scaleX(gap.start)\n const gapWidth = Math.max(scaleX(gap.end) - x, 1)\n return `<rect x=\"${x.toFixed(1)}\" y=\"${margin.top}\" width=\"${gapWidth.toFixed(1)}\" height=\"${chartHeight}\" class=\"gap-band\">\n <title>No ${escapeHtml(label)} samples for ${escapeHtml(gap.hours.toFixed(1))} hours</title>\n </rect>`\n }).join('')}\n ${yTicks.map((tick) => {\n const y = scaleY(tick)\n return `<line x1=\"${margin.left}\" x2=\"${width - margin.right}\" y1=\"${y.toFixed(1)}\" y2=\"${y.toFixed(1)}\" class=\"grid\" />\n <text x=\"${margin.left - 10}\" y=\"${(y + 4).toFixed(1)}\" text-anchor=\"end\" class=\"axis\">${escapeHtml(tick.toFixed(metric === 'pH' ? 2 : 0))}</text>`\n }).join('')}\n ${xTicks.map((tick) => {\n const x = scaleX(tick)\n const labelText = new Date(tick).toLocaleString()\n return `<line x1=\"${x.toFixed(1)}\" x2=\"${x.toFixed(1)}\" y1=\"${margin.top}\" y2=\"${height - margin.bottom}\" class=\"grid-soft\" />\n <text x=\"${x.toFixed(1)}\" y=\"${height - 16}\" text-anchor=\"middle\" class=\"axis\">${escapeHtml(labelText)}</text>`\n }).join('')}\n <path d=\"${pointPath(points, scaleX, scaleY, DATA_GAP_MS)}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n ${setPointLine}\n </svg>\n </section>\n `\n}\n\nfunction renderGraph({\n generatedAt, samples, sourcePath, title,\n}: GraphSeries): string {\n const merged = mergeSamples(samples)\n const latest = merged.findLast(sample => sample.pH !== undefined || sample.orp !== undefined)\n const firstTimestamp = merged.at(0)?.timestamp\n const lastTimestamp = merged.at(-1)?.timestamp\n const timeRange = merged.length > 0\n ? `${new Date(firstTimestamp ?? generatedAt).toLocaleString()} to ${new Date(lastTimestamp ?? generatedAt).toLocaleString()}`\n : 'No samples'\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(title)}</title>\n <style>\n :root {\n color-scheme: light;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n background: #f8fafc;\n color: #172033;\n }\n body {\n margin: 0;\n }\n main {\n max-width: 1120px;\n margin: 0 auto;\n padding: 28px 20px 40px;\n }\n header {\n display: flex;\n flex-wrap: wrap;\n gap: 18px;\n justify-content: space-between;\n align-items: flex-end;\n border-bottom: 1px solid #d7dee8;\n padding-bottom: 18px;\n margin-bottom: 22px;\n }\n h1, h2, p {\n margin: 0;\n }\n h1 {\n font-size: 28px;\n font-weight: 720;\n letter-spacing: 0;\n }\n h2 {\n font-size: 17px;\n letter-spacing: 0;\n }\n .meta {\n color: #506174;\n font-size: 13px;\n line-height: 1.55;\n text-align: right;\n }\n .metrics {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 10px;\n margin: 18px 0 20px;\n }\n .metric {\n background: #ffffff;\n border: 1px solid #d7dee8;\n border-radius: 6px;\n padding: 12px 14px;\n }\n .metric span {\n display: block;\n color: #64748b;\n font-size: 12px;\n margin-bottom: 4px;\n }\n .metric strong {\n font-size: 22px;\n letter-spacing: 0;\n }\n .chart {\n background: #ffffff;\n border: 1px solid #d7dee8;\n border-radius: 6px;\n margin-top: 14px;\n padding: 16px;\n }\n .chart-title {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 12px;\n margin-bottom: 8px;\n }\n .chart-title span {\n color: #506174;\n font-size: 13px;\n }\n svg {\n width: 100%;\n height: auto;\n display: block;\n }\n .plot {\n fill: #fbfdff;\n stroke: #d7dee8;\n }\n .gap-band {\n fill: #eef2f6;\n opacity: 0.7;\n }\n .grid {\n stroke: #dbe4ee;\n stroke-width: 1;\n }\n .grid-soft {\n stroke: #eef3f8;\n stroke-width: 1;\n }\n .axis {\n fill: #64748b;\n font-size: 11px;\n }\n .setpoint {\n stroke: #64748b;\n stroke-width: 2;\n stroke-dasharray: 7 6;\n }\n .empty {\n color: #64748b;\n padding: 36px 0;\n text-align: center;\n }\n </style>\n</head>\n<body>\n <main>\n <header>\n <div>\n <h1>${escapeHtml(title)}</h1>\n <p>${escapeHtml(timeRange)}</p>\n </div>\n <div class=\"meta\">\n <div>Generated: ${escapeHtml(new Date(generatedAt).toLocaleString())}</div>\n ${sourcePath ? `<div>Series: ${escapeHtml(sourcePath)}</div>` : ''}\n <div>Samples: ${merged.length}</div>\n </div>\n </header>\n <section class=\"metrics\">\n <div class=\"metric\"><span>Latest pH</span><strong>${escapeHtml(latest?.pH?.toFixed(2) ?? 'n/a')}</strong></div>\n <div class=\"metric\"><span>Latest ORP</span><strong>${escapeHtml(latest?.orp?.toFixed(0) ?? 'n/a')}</strong></div>\n <div class=\"metric\"><span>pH tank</span><strong>${escapeHtml(latest?.pHTankLevel ?? 'n/a')}</strong></div>\n <div class=\"metric\"><span>ORP tank</span><strong>${escapeHtml(latest?.orpTankLevel ?? 'n/a')}</strong></div>\n </section>\n ${renderLineChart(merged, 'pH', 'pH', '#0f8b8d', 'pHSetPoint')}\n ${renderLineChart(merged, 'orp', 'ORP', '#d95d39', 'orpSetPoint')}\n </main>\n</body>\n</html>\n`\n}\n\nexport function writeGraph(filePath: string, series: GraphSeries): void {\n mkdirSync(path.dirname(filePath), { recursive: true })\n writeFileSync(filePath, renderGraph(series), 'utf8')\n}\n", "import type {\n WitnessObservation, WitnessPlugin, XyoPayload,\n} from '@ariestools/aries-witness-core'\nimport { SchedTypes } from 'node-screenlogic'\nimport type { Argv } from 'yargs'\n\nimport { type PentairConfig, withScreenLogic } from '../../pentair/index.ts'\n\nconst PENTAIR_SCHEDULES_SCHEMA = 'network.xyo.pentair.screenlogic.schedules'\n\ninterface ScreenLogicCircuit {\n circuitId: number\n eggTimer: number\n function: number\n interface: number\n name: string\n}\n\ninterface ScreenLogicCircuitState {\n id: number\n state: number\n}\n\ninterface ScreenLogicEquipmentState {\n circuitArray: ScreenLogicCircuitState[]\n}\n\ninterface ScreenLogicPumpCircuit {\n circuit: number\n flow?: number\n speed?: number\n units: number\n}\n\ninterface ScreenLogicPump {\n circuits: ScreenLogicPumpCircuit[]\n id: number\n maxSpeed?: number\n minSpeed?: number\n name: string\n}\n\ntype ScreenLogicPumpStatus = object\n\ninterface ScreenLogicScheduleData {\n data: ScreenLogicScheduleDatum[]\n senderId?: number\n}\n\ninterface ScreenLogicScheduleDatum {\n circuitId: number\n dayMask: number\n days: string[]\n flags: number\n heatCmd: number\n heatSetPoint: number\n scheduleId: number\n startTime: string\n stopTime: string\n}\n\nexport interface PentairPumpProfile {\n circuitId: number\n circuitName?: string\n flow?: number\n pumpId: number\n pumpName: string\n speed?: number\n units: number\n}\n\nexport interface PentairPumpSummary {\n circuits: PentairPumpProfile[]\n id: number\n maxSpeed?: number\n minSpeed?: number\n name: string\n status?: ScreenLogicPumpStatus\n statusError?: string\n}\n\nexport interface PentairScheduleSummary extends ScreenLogicScheduleDatum {\n circuitName?: string\n currentState?: number\n eggTimer?: number\n pumpProfile?: PentairPumpProfile\n scheduleType: 'recurring' | 'runOnce'\n}\n\ninterface BuildPentairSchedulesOptions {\n controllerCircuits: ScreenLogicCircuit[]\n equipmentState: ScreenLogicEquipmentState\n pumpStatuses?: Map<number, ScreenLogicPumpStatus | string>\n pumps: ScreenLogicPump[]\n recurring: ScreenLogicScheduleData\n runOnce: ScreenLogicScheduleData\n systemTime: unknown\n}\n\nfunction circuitName(circuit: ScreenLogicCircuit | undefined): string | undefined {\n return circuit?.name && circuit.name.length > 0 ? circuit.name : undefined\n}\n\nfunction normalizePumpProfile(\n pump: ScreenLogicPump,\n pumpCircuit: ScreenLogicPump['circuits'][number],\n circuitsById: Map<number, ScreenLogicCircuit>,\n): PentairPumpProfile {\n const name = circuitName(circuitsById.get(pumpCircuit.circuit))\n return {\n circuitId: pumpCircuit.circuit,\n ...(name && { circuitName: name }),\n ...(!(pumpCircuit.flow === undefined) && { flow: pumpCircuit.flow }),\n pumpId: pump.id,\n pumpName: pump.name,\n ...(!(pumpCircuit.speed === undefined) && { speed: pumpCircuit.speed }),\n units: pumpCircuit.units,\n }\n}\n\nfunction normalizePump(\n pump: ScreenLogicPump,\n circuitsById: Map<number, ScreenLogicCircuit>,\n pumpStatuses: Map<number, ScreenLogicPumpStatus | string>,\n): PentairPumpSummary {\n const status = pumpStatuses.get(pump.id)\n return {\n circuits: pump.circuits.map(pumpCircuit => normalizePumpProfile(pump, pumpCircuit, circuitsById)),\n id: pump.id,\n maxSpeed: pump.maxSpeed,\n minSpeed: pump.minSpeed,\n name: pump.name,\n ...((typeof status === 'string') && { statusError: status }),\n ...((typeof status === 'object') && { status }),\n }\n}\n\nfunction normalizeSchedules(\n rows: ScreenLogicScheduleDatum[],\n scheduleType: PentairScheduleSummary['scheduleType'],\n circuitsById: Map<number, ScreenLogicCircuit>,\n statesById: Map<number, number>,\n profilesByCircuitId: Map<number, PentairPumpProfile>,\n): PentairScheduleSummary[] {\n return rows.map((schedule) => {\n const circuit = circuitsById.get(schedule.circuitId)\n const name = circuitName(circuit)\n const currentState = statesById.get(schedule.circuitId)\n const pumpProfile = profilesByCircuitId.get(schedule.circuitId)\n return {\n ...schedule,\n ...(name && { circuitName: name }),\n ...(!(currentState === undefined) && { currentState }),\n ...(!(circuit?.eggTimer === undefined) && { eggTimer: circuit.eggTimer }),\n ...(!(pumpProfile === undefined) && { pumpProfile }),\n scheduleType,\n }\n })\n}\n\nexport function buildPentairSchedulesPayload({\n controllerCircuits,\n equipmentState,\n pumps,\n pumpStatuses = new Map(),\n recurring,\n runOnce,\n systemTime,\n}: BuildPentairSchedulesOptions): Omit<XyoPayload, 'schema'> {\n const circuitsById = new Map(controllerCircuits.map(circuit => [circuit.circuitId, circuit]))\n const statesById = new Map(equipmentState.circuitArray.map(circuit => [circuit.id, circuit.state]))\n const pumpSummaries = pumps.map(pump => normalizePump(pump, circuitsById, pumpStatuses))\n const profilesByCircuitId = new Map(\n pumpSummaries.flatMap(pump => pump.circuits.map(profile => [profile.circuitId, profile] as const)),\n )\n const recurringSchedules = normalizeSchedules(\n recurring.data,\n 'recurring',\n circuitsById,\n statesById,\n profilesByCircuitId,\n )\n const runOnceSchedules = normalizeSchedules(\n runOnce.data,\n 'runOnce',\n circuitsById,\n statesById,\n profilesByCircuitId,\n )\n const allSchedules = [...recurringSchedules, ...runOnceSchedules]\n .toSorted((a, b) => (\n a.scheduleType.localeCompare(b.scheduleType)\n || a.scheduleId - b.scheduleId\n || a.circuitId - b.circuitId\n ))\n\n return {\n circuits: controllerCircuits.map(circuit => ({\n circuitId: circuit.circuitId,\n eggTimer: circuit.eggTimer,\n function: circuit.function,\n interface: circuit.interface,\n name: circuit.name,\n state: statesById.get(circuit.circuitId),\n })),\n counts: {\n all: allSchedules.length,\n recurring: recurringSchedules.length,\n runOnce: runOnceSchedules.length,\n },\n pumps: pumpSummaries,\n schedules: {\n all: allSchedules,\n recurring: recurringSchedules,\n runOnce: runOnceSchedules,\n },\n systemTime,\n }\n}\n\nfunction addPentairConnectionOptions(yargs: Argv): Argv {\n return yargs\n .option('address', {\n describe: 'Connect directly to a ScreenLogic adapter IP instead of UDP discovery',\n type: 'string',\n })\n .option('port', {\n describe: 'ScreenLogic adapter TCP port for direct connection (default: config or 80)',\n type: 'number',\n })\n .option('password', {\n describe: 'ScreenLogic password for direct connection, if configured',\n type: 'string',\n })\n .option('system-name', {\n describe: 'ScreenLogic system name for direct connection (default: config or Pentair ScreenLogic)',\n type: 'string',\n })\n .option('search-timeout', {\n describe: 'Milliseconds to wait for each UDP discovery attempt (default: config or 5000)',\n type: 'number',\n })\n .option('search-attempts', {\n describe: 'Number of UDP discovery attempts before failing (default: config or 3)',\n type: 'number',\n })\n .option('response-timeout', {\n describe: 'Milliseconds to wait for each ScreenLogic command response (default: config or 15000)',\n type: 'number',\n })\n}\n\nexport const pentairSchedulesWitness: WitnessPlugin = {\n builder: (yargs: unknown) => addPentairConnectionOptions(yargs as Argv),\n meta: {\n description: 'Capture Pentair ScreenLogic schedules with circuit and pump context',\n name: 'pentair-schedules',\n schema: PENTAIR_SCHEDULES_SCHEMA,\n },\n observe: async (args): Promise<WitnessObservation> => {\n const payload = await withScreenLogic(args as PentairConfig, async (unit) => {\n const equipmentConfig = await unit.equipment.getEquipmentConfigurationAsync()\n const controllerConfig = await unit.equipment.getControllerConfigAsync()\n const equipmentState = await unit.equipment.getEquipmentStateAsync()\n const systemTime = await unit.equipment.getSystemTimeAsync()\n const recurring = await unit.schedule.getScheduleDataAsync(SchedTypes.RECURRING)\n const runOnce = await unit.schedule.getScheduleDataAsync(SchedTypes.RUNONCE)\n const pumpStatuses = new Map<number, ScreenLogicPumpStatus | string>()\n\n for (const pump of equipmentConfig.pumps) {\n try {\n pumpStatuses.set(pump.id, await unit.pump.getPumpStatusAsync(pump.id))\n } catch (error) {\n pumpStatuses.set(pump.id, error instanceof Error ? error.message : String(error))\n }\n }\n\n return {\n ...buildPentairSchedulesPayload({\n controllerCircuits: controllerConfig.circuitArray,\n equipmentState,\n pumps: equipmentConfig.pumps,\n pumpStatuses,\n recurring,\n runOnce,\n systemTime,\n }),\n schema: PENTAIR_SCHEDULES_SCHEMA,\n }\n })\n\n return { payloads: [payload] }\n },\n}\n", "import {\n arch, cpus, freemem, hostname, platform, release, totalmem, uptime,\n} from 'node:os'\n\nimport type { WitnessPlugin } from '@ariestools/aries-witness-core'\n\nexport const systemInfoWitness: WitnessPlugin = {\n meta: {\n description: 'Capture system information (OS, CPU, memory, etc.)',\n name: 'system-info',\n schema: 'network.xyo.system.info',\n },\n observe: async () => ({\n payloads: [{\n arch: arch(),\n cpus: cpus().length,\n freeMemory: freemem(),\n hostname: hostname(),\n nodeVersion: process.version,\n os: release(),\n platform: platform(),\n schema: 'network.xyo.system.info',\n totalMemory: totalmem(),\n uptime: uptime(),\n }],\n }),\n}\n", "import type { WitnessPlugin } from '@ariestools/aries-witness-core'\n\nexport const timestampWitness: WitnessPlugin = {\n meta: {\n description: 'Capture the current timestamp',\n name: 'timestamp',\n schema: 'network.xyo.timestamp',\n },\n observe: async () => ({\n payloads: [{\n schema: 'network.xyo.timestamp',\n timestamp: Date.now(),\n }],\n }),\n}\n", "import type {\n BinaryRef, WitnessObservation, WitnessPlugin, XyoPayload,\n} from '@ariestools/aries-witness-core'\nimport { hashBinary } from '@ariestools/aries-witness-core'\nimport type { Argv } from 'yargs'\n\ninterface FetchResult {\n body: Buffer\n headers: Record<string, string>\n statusCode: number\n}\n\nasync function fetchUrl(url: string): Promise<FetchResult> {\n const response = await fetch(url)\n const arrayBuffer = await response.arrayBuffer()\n const body = Buffer.from(arrayBuffer)\n const headers: Record<string, string> = Object.fromEntries(response.headers.entries())\n return {\n body, headers, statusCode: response.status,\n }\n}\n\nfunction extractTitle(html: string): string | undefined {\n const match = /<title[^>]*>([^<]*)<\\/title>/i.exec(html)\n return match?.[1]?.trim()\n}\n\nfunction isBinaryContentType(contentType: string): boolean {\n return (\n contentType.startsWith('image/')\n || contentType.startsWith('audio/')\n || contentType.startsWith('video/')\n || contentType === 'application/pdf'\n || contentType === 'application/octet-stream'\n )\n}\n\nexport const urlWitness: WitnessPlugin = {\n builder: (yargs: unknown) => {\n return (yargs as Argv).option('url', {\n demandOption: true,\n describe: 'The URL to fetch',\n type: 'string',\n })\n },\n meta: {\n description: 'Capture metadata and content from a URL',\n name: 'url',\n schema: 'network.xyo.url',\n },\n observe: async (args): Promise<WitnessObservation> => {\n const url = args.url as string\n const {\n body, statusCode, headers,\n } = await fetchUrl(url)\n const contentType = headers['content-type']?.split(';', 1)[0]?.trim() ?? 'application/octet-stream'\n const contentHash = hashBinary(body)\n\n const payload: XyoPayload = {\n contentHash,\n contentLength: body.length,\n contentType,\n fetchedAt: Date.now(),\n schema: 'network.xyo.url',\n statusCode,\n url,\n }\n\n if (contentType === 'text/html') {\n const html = body.toString('utf8')\n const title = extractTitle(html)\n if (title) payload.title = title\n }\n\n const binaries: { data: Buffer; ref: BinaryRef }[] = []\n\n if (isBinaryContentType(contentType)) {\n const ref: BinaryRef = {\n filename: url.split('/').pop()?.split('?', 1)[0],\n hash: contentHash,\n mimeType: contentType,\n size: body.length,\n }\n binaries.push({ data: body, ref })\n }\n\n return { binaries, payloads: [payload] }\n },\n}\n", "import type { WitnessPlugin } from '@ariestools/aries-witness-core'\n\nimport { bankWitness } from './bank.ts'\nimport { netflixCatalogWitness } from './netflixCatalog.ts'\nimport { pentairWitness } from './pentair.ts'\nimport { pentairIntellichemWitness } from './pentairIntellichem.ts'\nimport { pentairSchedulesWitness } from './pentairSchedules.ts'\nimport { systemInfoWitness } from './systemInfo.ts'\nimport { timestampWitness } from './timestamp.ts'\nimport { urlWitness } from './url.ts'\n\nexport { bankWitness } from './bank.ts'\nexport { netflixCatalogWitness } from './netflixCatalog.ts'\nexport { pentairWitness } from './pentair.ts'\nexport { pentairIntellichemWitness } from './pentairIntellichem.ts'\nexport { pentairSchedulesWitness } from './pentairSchedules.ts'\nexport { systemInfoWitness } from './systemInfo.ts'\nexport { timestampWitness } from './timestamp.ts'\nexport { urlWitness } from './url.ts'\n\nexport const builtInWitnesses: WitnessPlugin[] = [\n timestampWitness,\n systemInfoWitness,\n urlWitness,\n bankWitness,\n netflixCatalogWitness,\n pentairWitness,\n pentairIntellichemWitness,\n pentairSchedulesWitness,\n]\n", "import { runYargsCli } from '@ariestools/aries-cli-core'\n\nimport { buildWitnessCommands } from './commands/witnessCommand.ts'\n\nexport const witness = async (): Promise<void> => {\n await runYargsCli({\n configure: buildWitnessCommands,\n demandCommand: false,\n scriptName: 'aries-witness',\n strictCommands: false,\n usage: '$0 <command> [options]',\n })\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["isRecord", "path", "readFileSync", "hashBinary", "isRecord", "stringValue", "getPath", "path", "firstValue", "firstString", "itemsAt", "cleanObject", "jsonBinary", "hashBinary", "readFileSync", "environment", "requireConfig", "fetchJson", "mintAccessToken", "resolveAccessToken", "endpointUrl", "chalk", "chmodSync", "existsSync", "mkdirSync", "readFileSync", "renameSync", "writeFileSync", "homedir", "path", "chalk", "SECRET_KEYS", "KEY_ALIASES", "ariesHome", "isRecord", "readString", "readConfigValue", "parseConfigValue", "normalizeConfig", "orderedConfig", "displayValue", "outputValue", "chalk", "existsSync", "readFileSync", "homedir", "path", "mkdirSync", "writeFileSync", "homedir", "path", "writeFileSync", "chalk", "mkdirSync", "path", "writeFileSync", "homedir", "noopHandler", "noopHandler", "homedir", "PATH", "existsSync", "readdirSync", "homedir", "PATH", "homedir", "noopHandler", "PATH", "hashBinary", "PATH", "hashBinary", "firstString", "isRecord", "hashBinary", "hashBinary", "PATH", "browserSnapshotToCaptureSource", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "path", "mkdirSync", "writeFileSync", "path", "assertNumber", "mergeSamples", "existsSync", "readFileSync", "mkdirSync", "path", "writeFileSync", "graphSamples", "SchedTypes", "SchedTypes", "hashBinary", "noopHandler"]
|
|
7
|
+
}
|