@geolonia/geonicdb-cli 0.6.4 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/config.ts","../src/output.ts","../src/commands/help.ts","../src/commands/config.ts","../src/commands/auth.ts","../src/oauth.ts","../src/client.ts","../src/helpers.ts","../src/prompt.ts","../src/token.ts","../src/input.ts","../src/commands/me-oauth-clients.ts","../src/commands/me-api-keys.ts","../src/commands/profile.ts","../src/commands/attrs.ts","../src/commands/entities.ts","../src/commands/batch.ts","../src/commands/subscriptions.ts","../src/commands/registrations.ts","../src/commands/types.ts","../src/commands/temporal.ts","../src/commands/snapshots.ts","../src/commands/admin/tenants.ts","../src/commands/admin/users.ts","../src/commands/admin/policies.ts","../src/commands/admin/oauth-clients.ts","../src/commands/admin/api-keys.ts","../src/commands/admin/index.ts","../src/commands/rules.ts","../src/commands/models.ts","../src/commands/catalog.ts","../src/commands/health.ts","../src/commands/cli.ts","../src/update-notifier.ts","../src/index.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { Command } from \"commander\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerProfileCommands } from \"./commands/profile.js\";\nimport { registerEntitiesCommand } from \"./commands/entities.js\";\nimport { registerBatchCommand } from \"./commands/batch.js\";\nimport { registerSubscriptionsCommand } from \"./commands/subscriptions.js\";\nimport { registerRegistrationsCommand } from \"./commands/registrations.js\";\nimport { registerTypesCommand } from \"./commands/types.js\";\nimport { registerTemporalCommand } from \"./commands/temporal.js\";\nimport { registerSnapshotsCommand } from \"./commands/snapshots.js\";\nimport { registerAdminCommand } from \"./commands/admin/index.js\";\nimport { registerRulesCommand } from \"./commands/rules.js\";\nimport { registerModelsCommand } from \"./commands/models.js\";\nimport { registerCatalogCommand } from \"./commands/catalog.js\";\nimport { registerHealthCommand, registerVersionCommand } from \"./commands/health.js\";\nimport { registerHelpCommand } from \"./commands/help.js\";\nimport { registerCliCommand } from \"./commands/cli.js\";\nimport { addAttrsSubcommands } from \"./commands/attrs.js\";\n\nexport function createProgram(): Command {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { description: string };\n const program = new Command();\n\n program\n .name(\"geonic\")\n .description(pkg.description)\n .option(\"-u, --url <url>\", \"Base URL of the GeonicDB server\")\n .option(\"-s, --service <name>\", \"NGSILD-Tenant header\")\n .option(\"--token <token>\", \"Authentication token\")\n .option(\"-p, --profile <name>\", \"Use a named profile\")\n .option(\"--api-key <key>\", \"API key for authentication\")\n .option(\"-f, --format <fmt>\", \"Output format: json, table, geojson\")\n .option(\"--no-color\", \"Disable color output\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .option(\"--dry-run\", \"Print the equivalent curl command without executing\");\n\n registerHelpCommand(program);\n registerConfigCommand(program);\n registerAuthCommands(program);\n registerProfileCommands(program);\n registerEntitiesCommand(program);\n registerBatchCommand(program);\n registerSubscriptionsCommand(program);\n registerRegistrationsCommand(program);\n registerTypesCommand(program);\n registerTemporalCommand(program);\n registerSnapshotsCommand(program);\n registerAdminCommand(program);\n registerRulesCommand(program);\n registerModelsCommand(program);\n registerCatalogCommand(program);\n registerHealthCommand(program);\n registerVersionCommand(program);\n registerCliCommand(program);\n\n // Backward-compatible hidden 'attrs' command at top level\n const hiddenAttrs = new Command(\"attrs\")\n .description(\"Manage entity attributes\");\n addAttrsSubcommands(hiddenAttrs);\n program.addCommand(hiddenAttrs, { hidden: true });\n\n return program;\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { GdbConfig, GdbConfigFile } from \"./types.js\";\n\nexport function getConfigDir(): string {\n return process.env.GEONIC_CONFIG_DIR ?? join(homedir(), \".config\", \"geonic\");\n}\n\nfunction getConfigFile(): string {\n return join(getConfigDir(), \"config.json\");\n}\n\nexport function ensureConfigDir(): void {\n const dir = getConfigDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nfunction migrateV1ToV2(data: Record<string, unknown>): GdbConfigFile {\n const profile: GdbConfig = {};\n const knownKeys = [\n \"url\",\n \"service\",\n \"token\",\n \"refreshToken\",\n \"format\",\n \"apiKey\",\n ];\n for (const key of knownKeys) {\n if (key in data) {\n (profile as Record<string, unknown>)[key] = data[key];\n }\n }\n return {\n version: 2,\n currentProfile: \"default\",\n profiles: { default: profile },\n };\n}\n\nfunction isGdbConfigFile(value: unknown): value is GdbConfigFile {\n /* v8 ignore next -- loadConfigFile always passes an object with version key */\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n v.version === 2 &&\n typeof v.currentProfile === \"string\" &&\n typeof v.profiles === \"object\" &&\n v.profiles !== null\n );\n}\n\nfunction defaultConfig(): GdbConfigFile {\n return { version: 2, currentProfile: \"default\", profiles: { default: {} } };\n}\n\nexport function loadConfigFile(): GdbConfigFile {\n try {\n const raw = readFileSync(getConfigFile(), \"utf-8\");\n const data = JSON.parse(raw) as Record<string, unknown>;\n\n if (!(\"version\" in data)) {\n const migrated = migrateV1ToV2(data);\n saveConfigFile(migrated);\n return migrated;\n }\n\n if (!isGdbConfigFile(data)) {\n return defaultConfig();\n }\n\n return data;\n } catch {\n return defaultConfig();\n }\n}\n\nexport function saveConfigFile(configFile: GdbConfigFile): void {\n ensureConfigDir();\n writeFileSync(getConfigFile(), JSON.stringify(configFile, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function loadConfig(profileName?: string): GdbConfig {\n const configFile = loadConfigFile();\n const name = profileName ?? configFile.currentProfile;\n return configFile.profiles[name] ?? {};\n}\n\nexport function saveConfig(config: GdbConfig, profileName?: string): void {\n const configFile = loadConfigFile();\n const name = profileName ?? configFile.currentProfile;\n configFile.profiles[name] = config;\n saveConfigFile(configFile);\n}\n\nexport function getConfigValue(key: string, profileName?: string): unknown {\n const config = loadConfig(profileName);\n return config[key as keyof GdbConfig];\n}\n\nexport function validateUrl(url: string): string {\n url = url.trim();\n if (!url) {\n throw new Error(\"URL must not be empty.\");\n }\n if (!/^https?:\\/\\//i.test(url)) {\n throw new Error(`Invalid URL: \"${url}\". URL must start with http:// or https://.`);\n }\n try {\n new URL(url);\n } catch {\n throw new Error(`Invalid URL: \"${url}\".`);\n }\n return url.replace(/\\/+$/, \"\") + \"/\";\n}\n\nexport function setConfigValue(key: string, value: string, profileName?: string): void {\n const config = loadConfig(profileName);\n if (key === \"url\") {\n value = validateUrl(value);\n }\n (config as Record<string, unknown>)[key] = value;\n saveConfig(config, profileName);\n}\n\nexport function deleteConfigValue(key: string, profileName?: string): void {\n const config = loadConfig(profileName);\n delete (config as Record<string, unknown>)[key];\n saveConfig(config, profileName);\n}\n\nexport function getConfigPath(): string {\n return getConfigFile();\n}\n\nexport function listProfiles(): { name: string; active: boolean }[] {\n const configFile = loadConfigFile();\n return Object.keys(configFile.profiles).map((name) => ({\n name,\n active: name === configFile.currentProfile,\n }));\n}\n\nexport function getCurrentProfile(): string {\n return loadConfigFile().currentProfile;\n}\n\nexport function setCurrentProfile(name: string): void {\n const configFile = loadConfigFile();\n if (!(name in configFile.profiles)) {\n throw new Error(`Profile \"${name}\" does not exist.`);\n }\n configFile.currentProfile = name;\n saveConfigFile(configFile);\n}\n\nexport function createProfile(name: string): void {\n const configFile = loadConfigFile();\n if (name in configFile.profiles) {\n throw new Error(`Profile \"${name}\" already exists.`);\n }\n configFile.profiles[name] = {};\n saveConfigFile(configFile);\n}\n\nexport function deleteProfile(name: string): void {\n if (name === \"default\") {\n throw new Error('Cannot delete the \"default\" profile.');\n }\n const configFile = loadConfigFile();\n if (!(name in configFile.profiles)) {\n throw new Error(`Profile \"${name}\" does not exist.`);\n }\n delete configFile.profiles[name];\n if (configFile.currentProfile === name) {\n configFile.currentProfile = \"default\";\n }\n saveConfigFile(configFile);\n}\n","import chalk from \"chalk\";\nimport type { OutputFormat } from \"./types.js\";\n\nexport function formatOutput(data: unknown, format: OutputFormat): string {\n switch (format) {\n case \"json\":\n return JSON.stringify(data, null, 2);\n case \"table\":\n return formatTable(data);\n case \"geojson\":\n return JSON.stringify(toGeoJSON(data), null, 2);\n default:\n return JSON.stringify(data, null, 2);\n }\n}\n\nexport function printOutput(data: unknown, format: OutputFormat): void {\n console.log(formatOutput(data, format));\n}\n\nexport function printSuccess(message: string): void {\n console.log(chalk.green(message));\n}\n\nexport function printError(message: string): void {\n console.error(chalk.red(`Error: ${message}`));\n}\n\nexport function printInfo(message: string): void {\n console.log(chalk.cyan(message));\n}\n\nexport function printWarning(message: string): void {\n console.error(chalk.yellow(message));\n}\n\nexport function printCount(count: number): void {\n console.log(chalk.dim(`Count: ${count}`));\n}\n\nfunction formatTable(data: unknown): string {\n if (!Array.isArray(data)) {\n if (typeof data === \"object\" && data !== null) {\n return formatObjectTable(data as Record<string, unknown>);\n }\n return String(data);\n }\n\n if (data.length === 0) return \"(empty)\";\n\n const items = data as Record<string, unknown>[];\n const keys = collectKeys(items);\n\n const widths = new Map<string, number>();\n for (const key of keys) {\n widths.set(key, key.length);\n }\n for (const item of items) {\n for (const key of keys) {\n const val = cellValue(item[key]);\n widths.set(key, Math.max(widths.get(key)!, val.length));\n }\n }\n\n const header = keys.map((k) => chalk.bold(k.padEnd(widths.get(k)!))).join(\" \");\n const separator = keys.map((k) => \"─\".repeat(widths.get(k)!)).join(\"──\");\n const rows = items.map((item) =>\n keys.map((k) => cellValue(item[k]).padEnd(widths.get(k)!)).join(\" \"),\n );\n\n return [header, separator, ...rows].join(\"\\n\");\n}\n\nfunction formatObjectTable(obj: Record<string, unknown>): string {\n const entries = Object.entries(obj);\n if (entries.length === 0) return \"(empty)\";\n\n const keyWidth = Math.max(...entries.map(([k]) => k.length));\n return entries.map(([k, v]) => `${chalk.bold(k.padEnd(keyWidth))} ${cellValue(v)}`).join(\"\\n\");\n}\n\nfunction collectKeys(items: Record<string, unknown>[]): string[] {\n const priority = [\"id\", \"type\"];\n const keySet = new Set<string>();\n for (const item of items) {\n for (const key of Object.keys(item)) {\n keySet.add(key);\n }\n }\n const sorted: string[] = [];\n for (const p of priority) {\n if (keySet.has(p)) {\n sorted.push(p);\n keySet.delete(p);\n }\n }\n sorted.push(...Array.from(keySet).sort());\n return sorted;\n}\n\nfunction formatGeoJSON(geo: Record<string, unknown>): string {\n const geoType = String(geo.type);\n const coords = geo.coordinates;\n if (geoType === \"Point\" && Array.isArray(coords) && coords.length >= 2) {\n return `Point(${Number(coords[0]).toFixed(2)}, ${Number(coords[1]).toFixed(2)})`;\n }\n if (Array.isArray(coords)) {\n const count = geoType === \"Polygon\"\n ? (Array.isArray(coords[0]) ? (coords[0] as unknown[]).length : 0)\n : coords.length;\n return `${geoType}(${count} coords)`;\n }\n return `${geoType}(...)`;\n}\n\nfunction isGeoJSON(v: unknown): boolean {\n if (typeof v !== \"object\" || v === null) return false;\n const o = v as Record<string, unknown>;\n return typeof o.type === \"string\" && \"coordinates\" in o;\n}\n\nfunction cellValue(val: unknown): string {\n if (val === undefined || val === null) return \"\";\n if (typeof val !== \"object\") return String(val);\n const obj = val as Record<string, unknown>;\n if (isGeoJSON(obj)) return formatGeoJSON(obj);\n if (\"value\" in obj) {\n const v = obj.value;\n if (isGeoJSON(v)) return formatGeoJSON(v as Record<string, unknown>);\n return String(v);\n }\n return JSON.stringify(val);\n}\n\nfunction toGeoJSON(data: unknown): unknown {\n if (Array.isArray(data)) {\n return {\n type: \"FeatureCollection\",\n features: data.map(entityToFeature),\n };\n }\n return entityToFeature(data);\n}\n\nfunction entityToFeature(entity: unknown): unknown {\n if (typeof entity !== \"object\" || entity === null) {\n return { type: \"Feature\", geometry: null, properties: entity };\n }\n\n const obj = entity as Record<string, unknown>;\n let geometry = null;\n\n if (obj.location) {\n const loc = obj.location as Record<string, unknown>;\n geometry = loc.value ?? loc;\n }\n\n const properties: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"location\") continue;\n if (typeof value === \"object\" && value !== null && \"value\" in (value as object)) {\n properties[key] = (value as Record<string, unknown>).value;\n } else {\n properties[key] = value;\n }\n }\n\n return { type: \"Feature\", geometry, properties };\n}\n","import chalk from \"chalk\";\nimport type { Command, Help, Option } from \"commander\";\n\ninterface Example {\n description: string;\n command: string;\n}\n\nconst examplesMap = new WeakMap<Command, Example[]>();\nconst notesMap = new WeakMap<Command, string[]>();\n\nexport function addExamples(cmd: Command, examples: Example[]): void {\n examplesMap.set(cmd, examples);\n}\n\nexport function addNotes(cmd: Command, notes: string[]): void {\n notesMap.set(cmd, notes);\n}\n\nfunction header(title: string): string {\n return chalk.yellow.bold(title);\n}\n\nfunction findCommand(parent: Command, name: string): Command | undefined {\n return parent.commands.find(\n (c) => c.name() === name || c.aliases().includes(name),\n );\n}\n\nfunction getCommandPath(cmd: Command): string {\n const parts: string[] = [];\n let current: Command | null = cmd;\n while (current) {\n parts.unshift(current.name());\n current = current.parent;\n }\n return parts.join(\" \");\n}\n\nfunction getRootProgram(cmd: Command): Command {\n let root = cmd;\n while (root.parent) {\n root = root.parent;\n }\n return root;\n}\n\nfunction formatOptionSynopsis(opt: Option): string {\n /* v8 ignore next -- Commander always sets long or short */\n const flag = opt.long || opt.short || \"\";\n if (opt.required) {\n const match = opt.flags.match(/<([^>]+)>/);\n const valueName = match ? match[1] : \"value\";\n return `[${flag}=<${valueName}>]`;\n } else if (opt.optional) {\n const match = opt.flags.match(/\\[([^\\]]+)\\]/);\n const valueName = match ? match[1] : \"value\";\n return `[${flag}[=<${valueName}>]]`;\n }\n return `[${flag}]`;\n}\n\nfunction formatSynopsis(path: string, cmd: Command): string {\n const parts = [path];\n\n for (const arg of cmd.registeredArguments) {\n if (arg.required) {\n parts.push(`<${arg.name()}>`);\n } else {\n parts.push(`[<${arg.name()}>]`);\n }\n }\n\n for (const opt of cmd.options) {\n if (opt.hidden) continue;\n parts.push(formatOptionSynopsis(opt));\n }\n\n return parts.join(\" \");\n}\n\nfunction formatOptionList(options: readonly Option[]): string[] {\n const maxLen = Math.max(...options.map((o) => o.flags.length));\n return options.map((opt) => {\n const flags = opt.flags.padEnd(maxLen + 2);\n /* v8 ignore next -- Commander always sets description to '' */\n return ` ${chalk.green(flags)}${opt.description ?? \"\"}`;\n });\n}\n\nfunction formatGlobalParameters(program: Command): string {\n const lines: string[] = [];\n lines.push(header(\"GLOBAL PARAMETERS\"));\n lines.push(\"\");\n lines.push(...formatOptionList(program.options));\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nexport function formatTopLevelHelp(program: Command): string {\n const lines: string[] = [];\n\n lines.push(header(\"NAME\"));\n lines.push(\"\");\n lines.push(` ${program.name()}`);\n lines.push(\"\");\n lines.push(header(\"DESCRIPTION\"));\n lines.push(\"\");\n lines.push(` ${program.description()}`);\n lines.push(\"\");\n lines.push(header(\"AVAILABLE COMMANDS\"));\n lines.push(\"\");\n\n const commands = program.commands\n .filter((c) => !(c as Command & { _hidden?: boolean })._hidden)\n .slice()\n .sort((a, b) => a.name().localeCompare(b.name()));\n\n const maxLen = Math.max(...commands.map((c) => c.name().length));\n\n for (const cmd of commands) {\n const name = cmd.name().padEnd(maxLen + 2);\n lines.push(` ${chalk.green(name)}${cmd.summary() || cmd.description()}`);\n }\n\n lines.push(\"\");\n lines.push(formatGlobalParameters(program));\n\n return lines.join(\"\\n\");\n}\n\nexport function formatCommandDetails(\n program: Command,\n cmd: Command,\n path: string,\n): string {\n const lines: string[] = [];\n\n // NAME\n lines.push(header(\"NAME\"));\n lines.push(\"\");\n const aliases = cmd.aliases().filter((a) => a.length > 0);\n if (aliases.length > 0) {\n lines.push(` ${path} ${chalk.dim(`(alias: ${aliases.join(\", \")})`)}`);\n } else {\n lines.push(` ${path}`);\n }\n\n // DESCRIPTION\n lines.push(\"\");\n lines.push(header(\"DESCRIPTION\"));\n lines.push(\"\");\n for (const descLine of cmd.description().split(\"\\n\")) {\n lines.push(` ${descLine}`);\n }\n\n const subcommands = cmd.commands.filter(\n (c) => !(c as Command & { _hidden?: boolean })._hidden,\n );\n\n if (subcommands.length > 0) {\n // Command group with subcommands\n lines.push(\"\");\n lines.push(header(\"SYNOPSIS\"));\n lines.push(\"\");\n lines.push(` ${path} <command>`);\n lines.push(\"\");\n lines.push(header(\"SUBCOMMANDS\"));\n lines.push(\"\");\n\n const maxLen = Math.max(...subcommands.map((c) => c.name().length));\n for (const sub of subcommands) {\n const name = sub.name().padEnd(maxLen + 2);\n lines.push(` ${chalk.green(name)}${sub.summary() || sub.description()}`);\n }\n } else {\n // Leaf command\n lines.push(\"\");\n lines.push(header(\"SYNOPSIS\"));\n lines.push(\"\");\n lines.push(` ${formatSynopsis(path, cmd)}`);\n\n const options = cmd.options.filter((o) => !o.hidden);\n if (options.length > 0) {\n lines.push(\"\");\n lines.push(header(\"OPTIONS\"));\n lines.push(\"\");\n lines.push(...formatOptionList(options));\n }\n }\n\n // EXAMPLES\n const examples = examplesMap.get(cmd);\n if (examples && examples.length > 0) {\n lines.push(\"\");\n lines.push(header(\"EXAMPLES\"));\n lines.push(\"\");\n for (const ex of examples) {\n lines.push(` ${ex.description}:`);\n lines.push(` $ ${ex.command}`);\n lines.push(\"\");\n }\n }\n\n // NOTES\n const notes = notesMap.get(cmd);\n if (notes && notes.length > 0) {\n lines.push(\"\");\n lines.push(header(\"NOTES\"));\n lines.push(\"\");\n for (const note of notes) {\n lines.push(` ${note}`);\n }\n }\n\n // GLOBAL PARAMETERS\n lines.push(\"\");\n lines.push(formatGlobalParameters(program));\n\n return lines.join(\"\\n\");\n}\n\nfunction showHelp(program: Command, args: string[]): void {\n if (args.length === 0) {\n console.log(formatTopLevelHelp(program));\n return;\n }\n\n let current = program;\n const resolved: Command[] = [];\n\n for (let i = 0; i < args.length; i++) {\n const found = findCommand(current, args[i]);\n if (!found) {\n const attempted = args.slice(0, i + 1).join(\" \");\n console.error(\n chalk.red(`Error: '${attempted}' is not a geonic command.`),\n );\n console.error(`\\nSee 'geonic help' for available commands.`);\n process.exit(1);\n }\n resolved.push(found);\n current = found;\n }\n\n const target = resolved[resolved.length - 1];\n const path = [program.name(), ...resolved.map((c) => c.name())].join(\" \");\n\n console.log(formatCommandDetails(program, target, path));\n}\n\nexport function registerHelpCommand(program: Command): void {\n // Disable Commander's built-in help command\n program.addHelpCommand(false);\n\n // Override --help to use our wp-cli style format\n program.configureHelp({\n formatHelp: (cmd: Command, _helper: Help): string => {\n const root = getRootProgram(cmd);\n if (cmd === root) {\n return formatTopLevelHelp(root);\n }\n const path = getCommandPath(cmd);\n return formatCommandDetails(root, cmd, path);\n },\n });\n\n // Register the `help` command\n program\n .command(\"help\")\n .description(\"Get help on a specific command\")\n .argument(\"[args...]\")\n .allowUnknownOption()\n .action((args: string[]) => {\n showHelp(program, args);\n });\n\n // Show help when `geonic` is run with no arguments, or show error for unknown commands\n program.argument(\"[command...]\").action((commands: string[]) => {\n if (commands.length > 0) {\n console.error(\n `geonic: '${commands[0]}' is not a geonic command. See 'geonic help'.`,\n );\n process.exitCode = 1;\n return;\n }\n showHelp(program, []);\n });\n}\n","import type { Command } from \"commander\";\nimport {\n loadConfig,\n getConfigValue,\n setConfigValue,\n deleteConfigValue,\n getConfigPath,\n} from \"../config.js\";\nimport { printOutput, printSuccess, printInfo } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nconst SENSITIVE_CONFIG_KEYS = new Set([\"token\", \"refreshToken\", \"apiKey\"]);\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"Manage CLI configuration\");\n\n const set = config\n .command(\"set\")\n .description(\"Save a config value\")\n .argument(\n \"<key>\",\n \"Configuration key (url, service, token, refreshToken, format, apiKey)\",\n )\n .argument(\"<value>\", \"Configuration value\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const value = args[1] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n setConfigValue(key, value, profile);\n const display = SENSITIVE_CONFIG_KEYS.has(key) ? \"***\" : value;\n printSuccess(`Set ${key} = ${display}`);\n });\n\n addExamples(set, [\n {\n description: \"Set server URL\",\n command: \"geonic config set url https://api.example.com\",\n },\n {\n description: \"Set tenant (NGSILD-Tenant header)\",\n command: \"geonic config set service my-tenant\",\n },\n {\n description: \"Set authentication token\",\n command: \"geonic config set token eyJhbGciOi...\",\n },\n {\n description: \"Set API key\",\n command: \"geonic config set apiKey your-api-key\",\n },\n {\n description: \"Set default output format\",\n command: \"geonic config set format table\",\n },\n {\n description: \"Set config for a specific profile\",\n command:\n \"geonic config set url https://staging.example.com --profile staging\",\n },\n ]);\n\n const get = config\n .command(\"get\")\n .description(\"Get a config value\")\n .argument(\"<key>\", \"Configuration key\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n const value = getConfigValue(key, profile);\n if (value === undefined) {\n printInfo(`Key \"${key}\" is not set.`);\n } else {\n printOutput(value, \"json\");\n }\n });\n\n addExamples(get, [\n {\n description: \"Get server URL\",\n command: \"geonic config get url\",\n },\n {\n description: \"Get config value for a specific profile\",\n command: \"geonic config get url --profile staging\",\n },\n ]);\n\n const list = config\n .command(\"list\")\n .description(\"List all config values\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n const all = loadConfig(profile);\n if (Object.keys(all).length === 0) {\n printInfo(`No configuration set. Config path: ${getConfigPath()}`);\n } else {\n printOutput(all, \"json\");\n }\n });\n\n addExamples(list, [\n {\n description: \"List all configuration values\",\n command: \"geonic config list\",\n },\n ]);\n\n const del = config\n .command(\"delete\")\n .description(\"Delete a config value\")\n .argument(\"<key>\", \"Configuration key\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n deleteConfigValue(key, profile);\n printSuccess(`Deleted key \"${key}\".`);\n });\n\n addExamples(del, [\n {\n description: \"Delete a config value\",\n command: \"geonic config delete url\",\n },\n ]);\n}\n","import { createHash } from \"node:crypto\";\nimport { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n resolveOptions,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { loadConfig, saveConfig, getCurrentProfile, validateUrl } from \"../config.js\";\nimport { printSuccess, printError, printInfo, printWarning } from \"../output.js\";\nimport { isInteractive, promptEmail, promptPassword, promptTenantSelection } from \"../prompt.js\";\nimport type { TenantChoice } from \"../prompt.js\";\nimport { getTokenStatus, formatDuration } from \"../token.js\";\nimport { clientCredentialsGrant } from \"../oauth.js\";\nimport { addExamples } from \"./help.js\";\nimport { addMeOAuthClientsSubcommand } from \"./me-oauth-clients.js\";\nimport { addMeApiKeysSubcommand } from \"./me-api-keys.js\";\n\nfunction createLoginCommand(): Command {\n return new Command(\"login\")\n .description(\"Authenticate and save token\")\n .option(\"--client-credentials\", \"Use OAuth 2.0 Client Credentials flow\")\n .option(\"--client-id <id>\", \"OAuth client ID\")\n .option(\"--client-secret <secret>\", \"OAuth client secret\")\n .option(\"--scope <scopes>\", \"OAuth scopes (space-separated)\")\n .option(\"--tenant-id <id>\", \"Tenant ID for scoped authentication\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const loginOpts = cmd.opts() as {\n clientCredentials?: boolean;\n clientId?: string;\n clientSecret?: string;\n scope?: string;\n tenantId?: string;\n };\n const globalOpts = resolveOptions(cmd);\n\n if (loginOpts.clientCredentials) {\n const clientId = loginOpts.clientId ?? process.env.GDB_OAUTH_CLIENT_ID;\n const clientSecret = loginOpts.clientSecret ?? process.env.GDB_OAUTH_CLIENT_SECRET;\n\n if (!clientId || !clientSecret) {\n printError(\n \"Client ID and secret are required. Use --client-id/--client-secret or GDB_OAUTH_CLIENT_ID/GDB_OAUTH_CLIENT_SECRET.\",\n );\n process.exit(1);\n }\n\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n const result = await clientCredentialsGrant({\n baseUrl: globalOpts.url,\n clientId,\n clientSecret,\n scope: loginOpts.scope,\n });\n\n const config = loadConfig(globalOpts.profile);\n config.token = result.access_token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n\n printSuccess(\"Login successful (OAuth Client Credentials). Token saved to config.\");\n return;\n }\n\n // Email/password flow (interactive only)\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n try {\n validateUrl(globalOpts.url);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n\n if (!isInteractive()) {\n printError(\n \"Interactive terminal required. Run `geonic auth login` in a terminal with TTY.\",\n );\n process.exit(1);\n }\n\n const email = await promptEmail();\n const password = await promptPassword();\n\n const client = createClient(cmd);\n const body: Record<string, string> = { email, password };\n if (loginOpts.tenantId) {\n body.tenantId = loginOpts.tenantId;\n }\n\n const response = await client.rawRequest(\"POST\", \"/auth/login\", {\n body,\n skipTenantHeader: true,\n });\n\n const data = response.data as Record<string, unknown>;\n let token = (data.accessToken ?? data.token) as string | undefined;\n let refreshToken = data.refreshToken as string | undefined;\n\n if (!token) {\n printError(\"No token received from server.\");\n process.exit(1);\n }\n\n // Handle multi-tenant: show available tenants and prompt for selection\n const availableTenants = data.availableTenants as TenantChoice[] | undefined;\n const currentTenantId = data.tenantId as string | undefined;\n\n if (availableTenants && availableTenants.length > 1 && !loginOpts.tenantId) {\n const selectedTenantId = await promptTenantSelection(availableTenants, currentTenantId);\n if (selectedTenantId && selectedTenantId !== currentTenantId) {\n // Re-login with selected tenant\n const reloginResponse = await client.rawRequest(\"POST\", \"/auth/login\", {\n body: { email, password, tenantId: selectedTenantId },\n skipTenantHeader: true,\n });\n const reloginData = reloginResponse.data as Record<string, unknown>;\n const newToken = (reloginData.accessToken ?? reloginData.token) as string | undefined;\n if (!newToken) {\n printError(\"Re-login failed: no token received for selected tenant.\");\n process.exit(1);\n }\n token = newToken;\n refreshToken = reloginData.refreshToken as string | undefined;\n }\n }\n\n const config = loadConfig(globalOpts.profile);\n config.token = token;\n if (refreshToken) {\n config.refreshToken = refreshToken;\n } else {\n delete config.refreshToken;\n }\n saveConfig(config, globalOpts.profile);\n\n printSuccess(\"Login successful. Token saved to config.\");\n }),\n );\n}\n\nfunction createLogoutCommand(): Command {\n return new Command(\"logout\")\n .description(\"Clear saved authentication token\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const globalOpts = resolveOptions(cmd);\n const config = loadConfig(globalOpts.profile);\n\n // Try to notify server (best effort)\n if (config.token && globalOpts.url) {\n try {\n const client = createClient(cmd);\n await client.rawRequest(\"POST\", \"/auth/logout\");\n } catch {\n // Ignore errors - token may already be invalid\n }\n }\n\n delete config.token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n printSuccess(\"Logged out. Token cleared from config.\");\n }),\n );\n}\n\nfunction createMeAction() {\n return withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const globalOpts = resolveOptions(cmd);\n\n if (!globalOpts.token && !globalOpts.apiKey) {\n printInfo(\"Not logged in. Use `geonic auth login` to authenticate.\");\n return;\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me\");\n outputResponse(response, format);\n\n // Suppress additional human-readable logs for structured formats\n if (format && format !== \"table\") {\n return;\n }\n\n // Show token expiry if token exists (re-read in case of auto-refresh)\n const latestConfig = loadConfig(globalOpts.profile);\n if (latestConfig.token) {\n const status = getTokenStatus(latestConfig.token);\n if (status.expiresAt) {\n if (status.isExpired) {\n printError(`Token expires: ${status.expiresAt.toISOString()} (expired)`);\n } else if (status.isExpiringSoon) {\n printWarning(\n `Token expires: ${status.expiresAt.toISOString()} (${formatDuration(status.remainingMs!)} remaining)`,\n );\n } else {\n printInfo(\n `Token expires: ${status.expiresAt.toISOString()} (${formatDuration(status.remainingMs!)} remaining)`,\n );\n }\n }\n }\n\n // Show current profile\n const profileName = globalOpts.profile ?? getCurrentProfile();\n printInfo(`Profile: ${profileName}`);\n });\n}\n\nasync function fetchNonce(\n baseUrl: string,\n apiKey: string,\n): Promise<{ nonce: string; challenge: string; difficulty: number }> {\n const origin = new URL(baseUrl).origin;\n const url = new URL(\"/auth/nonce\", baseUrl).toString();\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Origin\": origin,\n },\n body: JSON.stringify({ api_key: apiKey }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Nonce request failed: ${text || `HTTP ${response.status}`}`);\n }\n\n return (await response.json()) as { nonce: string; challenge: string; difficulty: number };\n}\n\nfunction createNonceCommand(): Command {\n return new Command(\"nonce\")\n .description(\"Get a nonce and PoW challenge for API key authentication\")\n .option(\"--api-key <key>\", \"API key to get nonce for\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const nonceOpts = cmd.opts() as { apiKey?: string };\n const globalOpts = resolveOptions(cmd);\n const apiKey = nonceOpts.apiKey ?? globalOpts.apiKey;\n\n if (!apiKey) {\n printError(\"API key is required. Use --api-key or configure it with `geonic config set api-key <key>`.\");\n process.exit(1);\n }\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n const baseUrl = validateUrl(globalOpts.url);\n const data = await fetchNonce(baseUrl, apiKey);\n const format = getFormat(cmd);\n outputResponse({ status: 200, headers: new Headers(), data }, format);\n }),\n );\n}\n\nfunction hasLeadingZeroBits(hash: Buffer, bits: number): boolean {\n const fullBytes = Math.floor(bits / 8);\n const remainingBits = bits % 8;\n for (let i = 0; i < fullBytes; i++) {\n if (hash[i] !== 0) return false;\n }\n if (remainingBits > 0) {\n const mask = 0xff << (8 - remainingBits);\n if ((hash[fullBytes] & mask) !== 0) return false;\n }\n return true;\n}\n\nconst MAX_POW_ITERATIONS = 10_000_000;\n\nfunction solvePoW(challenge: string, difficulty: number): number {\n for (let nonce = 0; nonce < MAX_POW_ITERATIONS; nonce++) {\n const hash = createHash(\"sha256\")\n .update(`${challenge}${nonce}`)\n .digest();\n if (hasLeadingZeroBits(hash, difficulty)) return nonce;\n }\n throw new Error(`PoW could not be solved within ${MAX_POW_ITERATIONS} iterations`);\n}\n\nfunction createTokenExchangeCommand(): Command {\n return new Command(\"token-exchange\")\n .description(\"Exchange API key for a session JWT via nonce + PoW\")\n .option(\"--api-key <key>\", \"API key to exchange\")\n .option(\"--save\", \"Save the obtained token to profile config\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const exchangeOpts = cmd.opts() as { apiKey?: string; save?: boolean };\n const globalOpts = resolveOptions(cmd);\n const apiKey = exchangeOpts.apiKey ?? globalOpts.apiKey;\n\n if (!apiKey) {\n printError(\"API key is required. Use --api-key or configure it with `geonic config set api-key <key>`.\");\n process.exit(1);\n }\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n const baseUrl = validateUrl(globalOpts.url);\n const origin = new URL(baseUrl).origin;\n\n // Step 1: Get nonce\n const nonceData = await fetchNonce(baseUrl, apiKey);\n\n printInfo(`Nonce received. Solving PoW (difficulty=${nonceData.difficulty})...`);\n\n // Step 2: Solve PoW\n const powNonce = solvePoW(nonceData.challenge, nonceData.difficulty);\n\n // Step 3: Exchange for JWT\n const tokenUrl = new URL(\"/oauth/token\", baseUrl).toString();\n const tokenResponse = await fetch(tokenUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Origin\": origin,\n },\n body: JSON.stringify({\n grant_type: \"api_key\",\n api_key: apiKey,\n nonce: nonceData.nonce,\n proof: String(powNonce),\n }),\n });\n\n if (!tokenResponse.ok) {\n const text = await tokenResponse.text();\n throw new Error(`Token exchange failed: ${text || `HTTP ${tokenResponse.status}`}`);\n }\n\n const tokenData = (await tokenResponse.json()) as {\n access_token: string;\n token_type: string;\n expires_in?: number;\n };\n\n if (exchangeOpts.save) {\n const config = loadConfig(globalOpts.profile);\n config.token = tokenData.access_token;\n saveConfig(config, globalOpts.profile);\n printSuccess(\"Token exchange successful. Token saved to config.\");\n } else {\n const format = getFormat(cmd);\n outputResponse({ status: tokenResponse.status, headers: tokenResponse.headers, data: tokenData }, format);\n printSuccess(\"Token exchange successful.\");\n }\n }),\n );\n}\n\nexport function registerAuthCommands(program: Command): void {\n // auth command group with login/logout subcommands\n const auth = program\n .command(\"auth\")\n .description(\"Manage authentication\");\n\n const login = createLoginCommand();\n addExamples(login, [\n {\n description: \"Interactive login (email/password prompt)\",\n command: \"geonic auth login\",\n },\n {\n description: \"Login with OAuth client credentials\",\n command:\n \"geonic auth login --client-credentials --client-id MY_ID --client-secret MY_SECRET\",\n },\n {\n description: \"Login to a specific tenant\",\n command: \"geonic auth login --tenant-id my-tenant\",\n },\n ]);\n auth.addCommand(login);\n\n const logout = createLogoutCommand();\n addExamples(logout, [\n {\n description: \"Clear saved authentication token\",\n command: \"geonic auth logout\",\n },\n ]);\n auth.addCommand(logout);\n\n const nonce = createNonceCommand();\n addExamples(nonce, [\n {\n description: \"Get a nonce for API key authentication\",\n command: \"geonic auth nonce --api-key gdb_abcdef...\",\n },\n ]);\n auth.addCommand(nonce);\n\n const tokenExchange = createTokenExchangeCommand();\n addExamples(tokenExchange, [\n {\n description: \"Exchange API key for a JWT and save it\",\n command: \"geonic auth token-exchange --api-key gdb_abcdef... --save\",\n },\n ]);\n auth.addCommand(tokenExchange);\n\n // me command (top-level, maps to /me API endpoint)\n const me = program\n .command(\"me\")\n .description(\"Display current authenticated user and manage user resources\");\n\n // Default action: show user info when no subcommand is given\n const meInfo = me\n .command(\"info\", { isDefault: true, hidden: true })\n .description(\"Display current authenticated user\")\n .action(createMeAction());\n\n addExamples(me, [\n {\n description: \"Show current user info\",\n command: \"geonic me\",\n },\n {\n description: \"List your OAuth clients\",\n command: \"geonic me oauth-clients list\",\n },\n {\n description: \"List your API keys\",\n command: \"geonic me api-keys list\",\n },\n ]);\n\n addExamples(meInfo, [\n {\n description: \"Show current user info\",\n command: \"geonic me\",\n },\n ]);\n\n // Add me oauth-clients subcommands\n addMeOAuthClientsSubcommand(me);\n\n // Add me api-keys subcommands\n addMeApiKeysSubcommand(me);\n\n // Backward-compatible hidden aliases\n program.addCommand(createLoginCommand(), { hidden: true });\n program.addCommand(createLogoutCommand(), { hidden: true });\n\n const hiddenWhoami = new Command(\"whoami\")\n .description(\"Display current authenticated user\")\n .action(createMeAction());\n program.addCommand(hiddenWhoami, { hidden: true });\n}\n","export interface OAuthTokenResponse {\n access_token: string;\n token_type: string;\n expires_in?: number;\n scope?: string;\n}\n\nexport async function clientCredentialsGrant(options: {\n baseUrl: string;\n clientId: string;\n clientSecret: string;\n scope?: string;\n}): Promise<OAuthTokenResponse> {\n const url = new URL(\"/oauth/token\", options.baseUrl).toString();\n const credentials = Buffer.from(`${options.clientId}:${options.clientSecret}`).toString(\"base64\");\n\n const body: Record<string, string> = { grant_type: \"client_credentials\" };\n if (options.scope) {\n body.scope = options.scope;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${credentials}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let message: string;\n try {\n const err = JSON.parse(text) as Record<string, unknown>;\n message = (err.error_description ?? err.error ?? text) as string;\n } catch {\n message = text || `HTTP ${response.status}`;\n }\n throw new Error(`OAuth token request failed: ${message}`);\n }\n\n return (await response.json()) as OAuthTokenResponse;\n}\n","import type { ClientOptions, ClientResponse, NgsiError } from \"./types.js\";\nimport { clientCredentialsGrant } from \"./oauth.js\";\n\nexport class DryRunSignal extends Error {\n constructor() {\n super(\"dry-run\");\n this.name = \"DryRunSignal\";\n }\n}\n\nexport class GdbClient {\n private baseUrl: string;\n private service?: string;\n private token?: string;\n private refreshToken?: string;\n private apiKey?: string;\n private clientId?: string;\n private clientSecret?: string;\n private onTokenRefresh?: (token: string, refreshToken?: string) => void;\n private verbose: boolean;\n private dryRun: boolean;\n private refreshPromise?: Promise<boolean>;\n\n constructor(options: ClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.service = options.service;\n this.token = options.token;\n this.refreshToken = options.refreshToken;\n this.apiKey = options.apiKey;\n this.clientId = options.clientId;\n this.clientSecret = options.clientSecret;\n this.onTokenRefresh = options.onTokenRefresh;\n this.verbose = options.verbose ?? false;\n this.dryRun = options.dryRun ?? false;\n }\n\n private buildHeaders(extra?: Record<string, string>): Record<string, string> {\n const headers: Record<string, string> = {};\n\n headers[\"Content-Type\"] = \"application/ld+json\";\n headers[\"Accept\"] = \"application/ld+json\";\n if (this.service) headers[\"NGSILD-Tenant\"] = this.service;\n\n if (this.token) {\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n } else if (this.apiKey) {\n headers[\"X-Api-Key\"] = this.apiKey;\n }\n\n if (extra) {\n Object.assign(headers, extra);\n }\n\n return headers;\n }\n\n private buildUrl(path: string, params?: Record<string, string>): string {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== \"\") {\n url.searchParams.set(key, value);\n }\n }\n }\n return url.toString();\n }\n\n private getBasePath(): string {\n return \"/ngsi-ld/v1\";\n }\n\n private static readonly SENSITIVE_HEADERS = new Set([\"authorization\", \"x-api-key\"]);\n private static readonly SENSITIVE_BODY_KEYS = new Set([\n \"password\",\n \"refreshToken\",\n \"token\",\n \"client_secret\",\n \"clientSecret\",\n \"key\",\n \"apiKey\",\n ]);\n\n private logRequest(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): void {\n if (!this.verbose) return;\n process.stderr.write(`> ${method} ${url}\\n`);\n for (const [k, v] of Object.entries(headers)) {\n if (GdbClient.SENSITIVE_HEADERS.has(k.toLowerCase())) {\n process.stderr.write(`> ${k}: ***\\n`);\n } else {\n process.stderr.write(`> ${k}: ${v}\\n`);\n }\n }\n if (body) {\n process.stderr.write(`> Body: ${GdbClient.maskBodySecrets(body)}\\n`);\n }\n process.stderr.write(\"\\n\");\n }\n\n private static maskBodySecrets(raw: string): string {\n try {\n const obj = JSON.parse(raw) as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n if (GdbClient.SENSITIVE_BODY_KEYS.has(key)) {\n obj[key] = \"***\";\n }\n }\n return JSON.stringify(obj);\n } catch {\n return raw;\n }\n }\n\n private logResponse(response: Response): void {\n if (!this.verbose) return;\n process.stderr.write(`< ${response.status} ${response.statusText}\\n`);\n response.headers.forEach((v, k) => {\n process.stderr.write(`< ${k}: ${v}\\n`);\n });\n process.stderr.write(\"\\n\");\n }\n\n private static shellQuote(value: string): string {\n return `'${value.split(\"'\").join(\"'\\\"'\\\"'\")}'`;\n }\n\n static buildCurlCommand(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): string {\n const parts: string[] = [\"curl\"];\n if (method !== \"GET\") {\n parts.push(`-X ${method}`);\n }\n for (const [key, value] of Object.entries(headers)) {\n parts.push(`-H ${GdbClient.shellQuote(`${key}: ${value}`)}`);\n }\n if (body) {\n parts.push(`-d ${GdbClient.shellQuote(body)}`);\n }\n parts.push(GdbClient.shellQuote(url));\n return parts.join(\" \\\\\\n \");\n }\n\n private handleDryRun(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): void {\n if (!this.dryRun) return;\n console.log(GdbClient.buildCurlCommand(method, url, headers, body));\n throw new DryRunSignal();\n }\n\n private canRefresh(): boolean {\n return (!!this.refreshToken || (!!this.clientId && !!this.clientSecret)) && !this.apiKey;\n }\n\n private async performTokenRefresh(): Promise<boolean> {\n if (this.refreshPromise) return this.refreshPromise;\n\n this.refreshPromise = this.doRefresh();\n try {\n return await this.refreshPromise;\n } finally {\n this.refreshPromise = undefined;\n }\n }\n\n private async doRefresh(): Promise<boolean> {\n // Try refreshToken first\n if (this.refreshToken) {\n try {\n const url = this.buildUrl(\"/auth/refresh\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refreshToken: this.refreshToken }),\n });\n\n if (response.ok) {\n const data = (await response.json()) as Record<string, unknown>;\n const newToken = (data.accessToken ?? data.token) as string | undefined;\n const newRefreshToken = data.refreshToken as string | undefined;\n\n if (newToken) {\n this.token = newToken;\n if (newRefreshToken) this.refreshToken = newRefreshToken;\n this.onTokenRefresh?.(newToken, newRefreshToken);\n return true;\n }\n }\n } catch {\n // Fall through to client credentials\n }\n }\n\n // Fallback: client_credentials grant\n if (this.clientId && this.clientSecret) {\n try {\n const result = await clientCredentialsGrant({\n baseUrl: this.baseUrl,\n clientId: this.clientId,\n clientSecret: this.clientSecret,\n });\n this.token = result.access_token;\n this.onTokenRefresh?.(result.access_token);\n return true;\n } catch {\n return false;\n }\n }\n\n return false;\n }\n\n private async executeRequest<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n const url = this.buildUrl(`${this.getBasePath()}${path}`, options?.params);\n const headers = this.buildHeaders(options?.headers);\n const body = options?.body ? JSON.stringify(options.body) : undefined;\n\n this.logRequest(method, url, headers, body);\n this.handleDryRun(method, url, headers, body);\n const response = await fetch(url, { method, headers, body });\n this.logResponse(response);\n\n const countHeader = response.headers.get(\"NGSILD-Results-Count\");\n const count = countHeader ? parseInt(countHeader, 10) : undefined;\n\n let data: T;\n /* v8 ignore next -- null coalescing for missing content-type header */\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const text = await response.text();\n if (text && (contentType.includes(\"json\") || contentType.includes(\"ld+json\"))) {\n data = JSON.parse(text) as T;\n } else {\n data = text as unknown as T;\n }\n\n if (!response.ok) {\n const err = data as unknown as NgsiError;\n const message =\n err?.description || err?.detail || err?.error || err?.title || `HTTP ${response.status}`;\n throw new GdbClientError(message, response.status, err);\n }\n\n return { status: response.status, headers: response.headers, data, count };\n }\n\n private async executeRawRequest<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n skipTenantHeader?: boolean;\n },\n ): Promise<ClientResponse<T>> {\n const url = this.buildUrl(path, options?.params);\n const headers = this.buildHeaders(options?.headers);\n if (options?.skipTenantHeader) {\n delete headers[\"NGSILD-Tenant\"];\n }\n const body = options?.body ? JSON.stringify(options.body) : undefined;\n\n this.logRequest(method, url, headers, body);\n this.handleDryRun(method, url, headers, body);\n const response = await fetch(url, { method, headers, body });\n this.logResponse(response);\n\n let data: T;\n /* v8 ignore next -- null coalescing for missing content-type header */\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const text = await response.text();\n if (text && (contentType.includes(\"json\") || contentType.includes(\"ld+json\"))) {\n data = JSON.parse(text) as T;\n } else {\n data = text as unknown as T;\n }\n\n if (!response.ok) {\n const err = data as unknown as NgsiError;\n const message =\n err?.description || err?.detail || err?.error || err?.title || `HTTP ${response.status}`;\n throw new GdbClientError(message, response.status, err);\n }\n\n return { status: response.status, headers: response.headers, data };\n }\n\n async request<T = unknown>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n try {\n return await this.executeRequest<T>(method, path, options);\n } catch (err) {\n if (err instanceof GdbClientError && err.status === 401 && this.canRefresh()) {\n const refreshed = await this.performTokenRefresh();\n if (refreshed) {\n return await this.executeRequest<T>(method, path, options);\n }\n }\n throw err;\n }\n }\n\n async get<T = unknown>(\n path: string,\n params?: Record<string, string>,\n headers?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"GET\", path, { params, headers });\n }\n\n async post<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"POST\", path, { body, params });\n }\n\n async patch<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"PATCH\", path, { body, params });\n }\n\n async put<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"PUT\", path, { body, params });\n }\n\n async delete<T = unknown>(\n path: string,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"DELETE\", path, { params });\n }\n\n /** Make a request to a raw URL path (not prefixed with API base path) */\n async rawRequest<T = unknown>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n skipTenantHeader?: boolean;\n },\n ): Promise<ClientResponse<T>> {\n try {\n return await this.executeRawRequest<T>(method, path, options);\n } catch (err) {\n if (err instanceof GdbClientError && err.status === 401 && this.canRefresh()) {\n const refreshed = await this.performTokenRefresh();\n if (refreshed) {\n return await this.executeRawRequest<T>(method, path, options);\n }\n }\n throw err;\n }\n }\n}\n\nexport class GdbClientError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly ngsiError?: NgsiError,\n ) {\n super(message);\n this.name = \"GdbClientError\";\n }\n}\n","import { Command } from \"commander\";\nimport { loadConfig, saveConfig, validateUrl } from \"./config.js\";\nimport { DryRunSignal, GdbClient, GdbClientError } from \"./client.js\";\nimport { printError, printOutput, printCount } from \"./output.js\";\nimport type { ClientResponse, GlobalOptions, OutputFormat } from \"./types.js\";\n\n/**\n * Valid scope values for --scopes option help text (OAuth clients).\n */\nexport const SCOPES_HELP_NOTES = [\n \"Valid scopes:\",\n \" read:entities, write:entities, read:subscriptions, write:subscriptions,\",\n \" read:registrations, write:registrations, read:rules, write:rules,\",\n \" read:custom-data-models, write:custom-data-models,\",\n \" admin:users, admin:tenants, admin:policies, admin:oauth-clients,\",\n \" admin:api-keys, admin:metrics\",\n \"\",\n \"write:X implies read:X. admin:X implies both read:X and write:X.\",\n];\n\n/**\n * Valid scope values for --scopes option help text (API keys).\n */\nexport const API_KEY_SCOPES_HELP_NOTES = [\n \"Valid scopes:\",\n \" read:entities, write:entities, read:subscriptions, write:subscriptions,\",\n \" read:registrations, write:registrations\",\n];\n\n/**\n * Resolve merged options from config + CLI flags.\n */\nexport function resolveOptions(cmd: Command): GlobalOptions {\n const opts = cmd.optsWithGlobals() as GlobalOptions;\n const config = loadConfig(opts.profile);\n return {\n url: opts.url ?? config.url,\n service: opts.service ?? config.service,\n token: opts.token ?? config.token,\n format: opts.format ?? config.format ?? \"json\",\n color: opts.color,\n verbose: opts.verbose,\n profile: opts.profile,\n apiKey: opts.apiKey ?? process.env.GDB_API_KEY ?? config.apiKey,\n dryRun: opts.dryRun,\n };\n}\n\n/**\n * Create a GdbClient from resolved options.\n */\nexport function createClient(cmd: Command): GdbClient {\n const opts = resolveOptions(cmd);\n if (!opts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n opts.url = validateUrl(opts.url);\n const cliOpts = cmd.optsWithGlobals() as GlobalOptions;\n const usingCliToken = !!cliOpts.token;\n const config = loadConfig(opts.profile);\n return new GdbClient({\n baseUrl: opts.url,\n service: opts.service,\n token: opts.token,\n refreshToken: usingCliToken ? undefined : config.refreshToken,\n clientId: usingCliToken ? undefined : config.clientId,\n clientSecret: usingCliToken ? undefined : config.clientSecret,\n apiKey: opts.apiKey,\n onTokenRefresh: usingCliToken\n ? undefined\n : (token, refreshToken) => {\n const cfg = loadConfig(opts.profile);\n cfg.token = token;\n if (refreshToken) cfg.refreshToken = refreshToken;\n saveConfig(cfg, opts.profile);\n },\n verbose: opts.verbose,\n dryRun: opts.dryRun,\n });\n}\n\n/**\n * Get the output format from resolved options.\n */\nexport function getFormat(cmd: Command): OutputFormat {\n const opts = resolveOptions(cmd);\n return opts.format as OutputFormat;\n}\n\n/**\n * Standard handler for outputting API responses.\n */\nexport function outputResponse(\n response: ClientResponse,\n format: OutputFormat,\n showCount?: boolean,\n): void {\n if (showCount && response.count !== undefined) {\n printCount(response.count);\n }\n if (response.data !== undefined && response.data !== \"\") {\n printOutput(response.data, format);\n }\n}\n\n/**\n * Wrap an async command handler with error handling.\n */\nexport function withErrorHandler<T extends unknown[]>(fn: (...args: T) => Promise<void>) {\n return async (...args: T) => {\n try {\n await fn(...args);\n } catch (err: unknown) {\n if (err instanceof DryRunSignal) {\n return;\n }\n if (err instanceof GdbClientError && err.status === 401) {\n printError(\"Authentication failed. Please re-authenticate (e.g., `geonic auth login` or check your API key).\");\n } else if (err instanceof GdbClientError && err.status === 403) {\n const detail = (err.ngsiError?.detail ?? err.ngsiError?.description ?? \"\").toLowerCase();\n if (detail.includes(\"entity type\") || detail.includes(\"allowedentitytypes\")) {\n printError(`Entity type restriction: ${err.message}`);\n } else {\n printError(err.message);\n }\n } else if (err instanceof Error) {\n printError(err.message);\n } else {\n printError(String(err));\n }\n process.exit(1);\n }\n };\n}\n","import { createInterface } from \"node:readline/promises\";\n\nexport function isInteractive(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nexport async function promptEmail(): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const email = await rl.question(\"Email: \");\n return email.trim();\n } finally {\n rl.close();\n }\n}\n\nexport async function promptPassword(): Promise<string> {\n return new Promise((resolve, reject) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n stdout.write(\"Password: \");\n\n if (!stdin.isTTY) {\n let data = \"\";\n stdin.setEncoding(\"utf-8\");\n stdin.resume();\n const cleanup = () => {\n stdin.removeListener(\"data\", onData);\n stdin.removeListener(\"end\", onEnd);\n stdin.removeListener(\"error\", onError);\n stdin.pause();\n };\n const onData = (chunk: string) => {\n const newline = chunk.indexOf(\"\\n\");\n if (newline !== -1) {\n data += chunk.slice(0, newline);\n cleanup();\n stdout.write(\"\\n\");\n resolve(data);\n } else {\n data += chunk;\n }\n };\n const onEnd = () => {\n cleanup();\n stdout.write(\"\\n\");\n resolve(data);\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n stdin.on(\"data\", onData);\n stdin.on(\"end\", onEnd);\n stdin.on(\"error\", onError);\n return;\n }\n\n const wasRaw = stdin.isRaw;\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding(\"utf-8\");\n\n let password = \"\";\n\n const restoreTerminal = () => {\n stdin.removeListener(\"data\", onData);\n stdin.removeListener(\"error\", onError);\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n };\n\n const onError = (err: Error) => {\n restoreTerminal();\n stdout.write(\"\\n\");\n reject(err);\n };\n\n const onData = (char: string) => {\n const code = char.charCodeAt(0);\n\n if (char === \"\\r\" || char === \"\\n\") {\n restoreTerminal();\n stdout.write(\"\\n\");\n resolve(password);\n } else if (code === 3) {\n restoreTerminal();\n stdout.write(\"\\n\");\n reject(new Error(\"User cancelled\"));\n } else if (code === 127 || code === 8) {\n if (password.length > 0) {\n password = password.slice(0, -1);\n stdout.write(\"\\b \\b\");\n }\n } else if (code >= 32) {\n password += char;\n stdout.write(\"*\");\n }\n };\n\n stdin.on(\"data\", onData);\n stdin.on(\"error\", onError);\n });\n}\n\nexport interface TenantChoice {\n tenantId: string;\n role: string;\n}\n\nexport async function promptTenantSelection(\n tenants: TenantChoice[],\n currentTenantId?: string,\n): Promise<string | undefined> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n console.log(\"\\nAvailable tenants:\");\n for (let i = 0; i < tenants.length; i++) {\n const t = tenants[i];\n const current = t.tenantId === currentTenantId ? \" ← current\" : \"\";\n const marker = t.tenantId === currentTenantId ? \" *\" : \" \";\n console.log(`${marker} ${i + 1}) ${t.tenantId} (${t.role})${current}`);\n }\n for (;;) {\n const answer = await rl.question(\"\\nSelect tenant number (Enter to keep current): \");\n const trimmed = answer.trim();\n if (!trimmed) return undefined;\n const index = parseInt(trimmed, 10) - 1;\n if (index >= 0 && index < tenants.length) {\n return tenants[index].tenantId;\n }\n console.log(`Invalid selection. Please enter a number between 1 and ${tenants.length}.`);\n }\n } finally {\n rl.close();\n }\n}\n","export interface TokenStatus {\n expiresAt: Date | null;\n isExpired: boolean;\n isExpiringSoon: boolean;\n remainingMs: number | null;\n}\n\nexport function decodeJwtPayload(token: string): Record<string, unknown> | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n const payload = parts[1];\n const json = Buffer.from(payload, \"base64\").toString(\"utf-8\");\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport function getTokenStatus(token: string): TokenStatus {\n const payload = decodeJwtPayload(token);\n if (!payload || typeof payload.exp !== \"number\") {\n return { expiresAt: null, isExpired: false, isExpiringSoon: false, remainingMs: null };\n }\n\n const expiresAt = new Date(payload.exp * 1000);\n const now = Date.now();\n const remainingMs = expiresAt.getTime() - now;\n const fiveMinutes = 5 * 60 * 1000;\n\n return {\n expiresAt,\n isExpired: remainingMs <= 0,\n isExpiringSoon: remainingMs > 0 && remainingMs <= fiveMinutes,\n remainingMs,\n };\n}\n\nexport function formatDuration(ms: number): string {\n if (ms <= 0) return \"expired\";\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours % 24 > 0) parts.push(`${hours % 24}h`);\n if (minutes % 60 > 0 && days === 0) parts.push(`${minutes % 60}m`);\n if (parts.length === 0) parts.push(`${seconds}s`);\n\n return parts.join(\" \");\n}\n","import JSON5 from \"json5\";\nimport { readFileSync } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\n\n/**\n * Parse JSON input from a string, file (@path), stdin (-), pipe, or interactive mode.\n *\n * Resolution order:\n * 1. Explicit input provided → parse directly (inline, @file, or - for stdin)\n * 2. No input + piped stdin (non-TTY) → auto-read stdin\n * 3. No input + TTY stdin → interactive mode with brace-balanced auto-submit\n *\n * Supports JSON5 syntax (unquoted keys, single quotes, trailing commas).\n */\nexport async function parseJsonInput(input?: string): Promise<unknown> {\n // 1. Explicit input\n if (input !== undefined) {\n if (input === \"-\") return parseData(readFileSync(0, \"utf-8\"));\n if (input.startsWith(\"@\")) return parseData(readFileSync(input.slice(1), \"utf-8\"));\n return parseData(input);\n }\n\n // 2. Piped stdin (non-TTY)\n if (!process.stdin.isTTY) {\n return parseData(readFileSync(0, \"utf-8\"));\n }\n\n // 3. Interactive mode (TTY)\n return readInteractiveJson();\n}\n\nfunction parseData(text: string): unknown {\n return JSON5.parse(text.trim());\n}\n\n/**\n * Read JSON interactively from TTY with brace-balance auto-submit.\n * Tracks depth of {}/[] while respecting string literals.\n * When depth returns to 0, automatically parses and returns.\n */\nasync function readInteractiveJson(): Promise<unknown> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n prompt: \"json> \",\n });\n\n process.stderr.write(\"Enter JSON (auto-submits when braces close, Ctrl+C to cancel):\\n\");\n rl.prompt();\n\n const lines: string[] = [];\n let depth = 0;\n let started = false;\n let inBlockComment = false;\n let inString = false;\n let stringChar = \"\";\n let cancelled = false;\n\n return new Promise<unknown>((resolve, reject) => {\n rl.on(\"SIGINT\", () => {\n cancelled = true;\n rl.close();\n });\n\n rl.on(\"line\", (line) => {\n lines.push(line);\n const result = trackDepth(line, depth, started, inBlockComment, inString, stringChar);\n depth = result.depth;\n started = result.started;\n inBlockComment = result.inBlockComment;\n inString = result.inString;\n stringChar = result.stringChar;\n\n if (started && depth <= 0 && !inBlockComment && !inString) {\n rl.close();\n try {\n resolve(parseData(lines.join(\"\\n\")));\n } catch (err) {\n reject(err);\n }\n } else {\n rl.setPrompt(\"... \");\n rl.prompt();\n }\n });\n\n rl.on(\"close\", () => {\n if (cancelled) {\n reject(new Error(\"Input cancelled.\"));\n return;\n }\n if (lines.length > 0 && (!started || depth > 0 || inBlockComment || inString)) {\n // EOF before balanced — attempt to parse what we have\n try {\n resolve(parseData(lines.join(\"\\n\")));\n } catch (err) {\n reject(err);\n }\n } else if (lines.length === 0) {\n reject(new Error(\"No input provided.\"));\n }\n });\n });\n}\n\n/**\n * Track brace/bracket depth for a line, respecting string literals and JSON5 comments.\n * String and block-comment state is passed in and returned to handle multi-line constructs.\n */\nfunction trackDepth(\n line: string,\n depth: number,\n started: boolean,\n inBlockComment: boolean,\n inString: boolean,\n stringChar: string,\n): { depth: number; started: boolean; inBlockComment: boolean; inString: boolean; stringChar: string } {\n\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n const next = i + 1 < line.length ? line[i + 1] : \"\";\n\n if (inBlockComment) {\n if (ch === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n\n if (inString) {\n if (ch === \"\\\\\" && i + 1 < line.length) {\n i++; // skip escaped character\n } else if (ch === stringChar) {\n inString = false;\n }\n continue;\n }\n\n // Line comment — skip rest of line\n if (ch === \"/\" && next === \"/\") break;\n // Block comment start\n if (ch === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n\n if (ch === '\"' || ch === \"'\") {\n inString = true;\n stringChar = ch;\n } else if (ch === \"{\" || ch === \"[\") {\n depth++;\n started = true;\n } else if (ch === \"}\" || ch === \"]\") {\n depth--;\n }\n }\n\n return { depth, started, inBlockComment, inString, stringChar };\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, resolveOptions, getFormat, outputResponse } from \"../helpers.js\";\nimport { loadConfig, saveConfig, validateUrl } from \"../config.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess, printError, printInfo, printWarning } from \"../output.js\";\nimport { clientCredentialsGrant } from \"../oauth.js\";\nimport { addExamples, addNotes } from \"./help.js\";\nimport { SCOPES_HELP_NOTES } from \"../helpers.js\";\n\nexport function addMeOAuthClientsSubcommand(me: Command): void {\n const oauthClients = me\n .command(\"oauth-clients\")\n .description(\"Manage your OAuth clients\");\n\n // oauth-clients list\n const list = oauthClients\n .command(\"list\")\n .description(\"List your OAuth clients\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me/oauth-clients\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List your OAuth clients\",\n command: \"geonic me oauth-clients list\",\n },\n ]);\n\n // oauth-clients create\n const create = oauthClients\n .command(\"create [json]\")\n .description(\"Create a new OAuth client\")\n .option(\"--name <name>\", \"Client name\")\n .option(\"--scopes <scopes>\", \"Allowed scopes (comma-separated)\")\n .option(\"--save\", \"Save credentials to config for automatic re-authentication\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n scopes?: string;\n save?: boolean;\n };\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.scopes) {\n // Build body from flags\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.clientName = opts.name;\n if (opts.scopes) payload.allowedScopes = opts.scopes.split(\",\").map((s) => s.trim());\n body = payload;\n } else {\n // Read from stdin (pipe or interactive)\n body = await parseJsonInput();\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/me/oauth-clients\", { body });\n\n const data = response.data as Record<string, unknown>;\n\n if (opts.save) {\n const globalOpts = resolveOptions(cmd);\n const clientId = data.clientId as string | undefined;\n const clientSecret = data.clientSecret as string | undefined;\n\n if (!clientId || !clientSecret) {\n printError(\"Response missing clientId or clientSecret. Cannot save credentials.\");\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n return;\n }\n\n // Perform client_credentials grant to get a fresh token\n const baseUrl = validateUrl(globalOpts.url!);\n const tokenResult = await clientCredentialsGrant({\n baseUrl,\n clientId,\n clientSecret,\n scope: (data.allowedScopes as string[] | undefined)?.join(\" \"),\n });\n\n const config = loadConfig(globalOpts.profile);\n config.clientId = clientId;\n config.clientSecret = clientSecret;\n config.token = tokenResult.access_token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n\n printInfo(\"Client credentials saved to config. Auto-reauth enabled.\");\n } else {\n printWarning(\n \"Save the clientSecret now — it will not be shown again.\",\n );\n }\n\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n }),\n );\n\n addNotes(create, SCOPES_HELP_NOTES);\n\n addExamples(create, [\n {\n description: \"Create an OAuth client with flags\",\n command: \"geonic me oauth-clients create --name my-ci-bot --scopes read:entities,write:entities\",\n },\n {\n description: \"Create and save credentials for auto-reauth\",\n command: \"geonic me oauth-clients create --name my-ci-bot --save\",\n },\n {\n description: \"Create an OAuth client from JSON\",\n command: 'geonic me oauth-clients create \\'{\"clientName\":\"my-bot\",\"allowedScopes\":[\"read:entities\"]}\\'',\n },\n ]);\n\n // oauth-clients delete\n const del = oauthClients\n .command(\"delete <id>\")\n .description(\"Delete an OAuth client\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/me/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"OAuth client deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an OAuth client\",\n command: \"geonic me oauth-clients delete <client-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, resolveOptions, getFormat, outputResponse } from \"../helpers.js\";\nimport { loadConfig, saveConfig } from \"../config.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printError, printWarning } from \"../output.js\";\nimport { addExamples, addNotes } from \"./help.js\";\nimport { API_KEY_SCOPES_HELP_NOTES } from \"../helpers.js\";\n\nexport function addMeApiKeysSubcommand(me: Command): void {\n const apiKeys = me\n .command(\"api-keys\")\n .description(\"Manage your API keys\");\n\n // api-keys list\n const list = apiKeys\n .command(\"list\")\n .description(\"List your API keys\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me/api-keys\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List your API keys\",\n command: \"geonic me api-keys list\",\n },\n ]);\n\n // api-keys create\n const create = apiKeys\n .command(\"create [json]\")\n .description(\"Create a new API key\")\n .option(\"--name <name>\", \"Key name\")\n .option(\"--scopes <scopes>\", \"Allowed scopes (comma-separated)\")\n .option(\"--origins <origins>\", \"Allowed origins (comma-separated)\")\n .option(\"--entity-types <types>\", \"Allowed entity types (comma-separated)\")\n .option(\"--rate-limit <n>\", \"Rate limit per minute\")\n .option(\"--dpop-required\", \"Require DPoP token binding\")\n .option(\"--save\", \"Save the API key to config for automatic use\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n scopes?: string;\n origins?: string;\n entityTypes?: string;\n rateLimit?: string;\n dpopRequired?: boolean;\n save?: boolean;\n };\n\n // Validate --origins flag early\n if (opts.origins !== undefined) {\n const parsed = opts.origins.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (parsed.length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.scopes || opts.origins || opts.entityTypes || opts.rateLimit || opts.dpopRequired !== undefined) {\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.name = opts.name;\n if (opts.scopes) payload.allowedScopes = opts.scopes.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.origins) payload.allowedOrigins = opts.origins.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.entityTypes) payload.allowedEntityTypes = opts.entityTypes.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.dpopRequired !== undefined) payload.dpopRequired = opts.dpopRequired;\n if (opts.rateLimit) {\n const raw = opts.rateLimit.trim();\n if (!/^\\d+$/.test(raw)) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n const perMinute = Number(raw);\n if (perMinute <= 0) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n payload.rateLimit = { perMinute };\n }\n body = payload;\n } else {\n body = await parseJsonInput();\n }\n\n // Validate allowedOrigins from JSON input\n if (body && typeof body === \"object\" && \"allowedOrigins\" in (body as Record<string, unknown>)) {\n const origins = (body as Record<string, unknown>).allowedOrigins;\n if (Array.isArray(origins) && origins.filter((o: unknown) => typeof o === \"string\" && o.trim() !== \"\").length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/me/api-keys\", { body });\n\n const data = response.data as Record<string, unknown>;\n\n if (opts.save) {\n const globalOpts = resolveOptions(cmd);\n const key = data.key as string | undefined;\n if (!key) {\n printError(\"Response missing key. API key was created, but it could not be saved.\");\n outputResponse(response, format);\n process.exitCode = 1;\n return;\n }\n const config = loadConfig(globalOpts.profile);\n config.apiKey = key;\n saveConfig(config, globalOpts.profile);\n console.error(\"API key saved to config. X-Api-Key header will be sent automatically.\");\n } else {\n printWarning(\"Save the API key now — it will not be shown again. Use --save to store it automatically.\");\n }\n\n outputResponse(response, format);\n console.error(\"API key created.\");\n }),\n );\n\n addNotes(create, API_KEY_SCOPES_HELP_NOTES);\n\n addExamples(create, [\n {\n description: \"Create an API key with flags\",\n command: \"geonic me api-keys create --name my-app --scopes read:entities --origins 'https://example.com'\",\n },\n {\n description: \"Create and save API key to config\",\n command: \"geonic me api-keys create --name my-app --save\",\n },\n {\n description: \"Create an API key from JSON\",\n command: 'geonic me api-keys create \\'{\"name\":\"my-app\",\"allowedScopes\":[\"read:entities\"]}\\'',\n },\n {\n description: \"Create an API key with rate limiting\",\n command: \"geonic me api-keys create --name my-app --rate-limit 100\",\n },\n {\n description: \"Create an API key with DPoP required\",\n command: \"geonic me api-keys create --name my-app --dpop-required\",\n },\n ]);\n\n // api-keys delete\n const del = apiKeys\n .command(\"delete <keyId>\")\n .description(\"Delete an API key\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/me/api-keys/${encodeURIComponent(String(keyId))}`,\n );\n console.error(\"API key deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an API key\",\n command: \"geonic me api-keys delete <key-id>\",\n },\n ]);\n}\n","import { Command } from \"commander\";\nimport {\n listProfiles,\n getCurrentProfile,\n setCurrentProfile,\n createProfile,\n deleteProfile,\n loadConfig,\n} from \"../config.js\";\nimport { printSuccess, printInfo, printError } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerProfileCommands(program: Command): void {\n const profile = program.command(\"profile\").description(\"Manage connection profiles\");\n\n const list = profile\n .command(\"list\")\n .description(\"List all profiles\")\n .action(() => {\n const profiles = listProfiles();\n for (const p of profiles) {\n const marker = p.active ? \" *\" : \"\";\n console.log(`${p.name}${marker}`);\n }\n });\n\n addExamples(list, [\n {\n description: \"List all profiles (active profile marked with *)\",\n command: \"geonic profile list\",\n },\n ]);\n\n const use = profile\n .command(\"use <name>\")\n .description(\"Switch active profile\")\n .action((name: string) => {\n try {\n setCurrentProfile(name);\n printSuccess(`Switched to profile \"${name}\".`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(use, [\n {\n description: \"Switch to staging profile\",\n command: \"geonic profile use staging\",\n },\n ]);\n\n const profileCreate = profile\n .command(\"create <name>\")\n .description(\"Create a new profile\")\n .action((name: string) => {\n try {\n createProfile(name);\n printSuccess(`Profile \"${name}\" created.`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(profileCreate, [\n {\n description: \"Create a new profile for staging\",\n command: \"geonic profile create staging\",\n },\n ]);\n\n const del = profile\n .command(\"delete <name>\")\n .description(\"Delete a profile\")\n .action((name: string) => {\n try {\n deleteProfile(name);\n printSuccess(`Profile \"${name}\" deleted.`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(del, [\n {\n description: \"Delete a profile\",\n command: \"geonic profile delete staging\",\n },\n ]);\n\n const show = profile\n .command(\"show [name]\")\n .description(\"Show profile settings\")\n .action((name?: string) => {\n const profileName = name ?? getCurrentProfile();\n const config = loadConfig(profileName);\n const entries = Object.entries(config).filter(([, v]) => v !== undefined);\n if (entries.length === 0) {\n printInfo(`Profile \"${profileName}\" has no settings.`);\n return;\n }\n for (const [key, value] of entries) {\n if (\n (key === \"token\" || key === \"refreshToken\" || key === \"apiKey\") &&\n typeof value === \"string\"\n ) {\n console.log(`${key}: ***`);\n } else {\n console.log(`${key}: ${value}`);\n }\n }\n });\n\n addExamples(show, [\n {\n description: \"Show current profile settings\",\n command: \"geonic profile show\",\n },\n {\n description: \"Show settings for a specific profile\",\n command: \"geonic profile show production\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function addAttrsSubcommands(attrs: Command): void {\n // attrs list\n const list = attrs\n .command(\"list\")\n .description(\"List all attributes of an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .action(\n withErrorHandler(\n async (entityId: string, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/entities/${encodeURIComponent(entityId)}/attrs`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(list, [\n {\n description: \"List all attributes of an entity\",\n command: \"geonic entities attrs list urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // attrs get\n const get = attrs\n .command(\"get\")\n .description(\"Get a specific attribute of an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific attribute\",\n command: \"geonic entities attrs get urn:ngsi-ld:Sensor:001 temperature\",\n },\n ]);\n\n // attrs add\n const add = attrs\n .command(\"add\")\n .description(\n \"Add attributes to an entity\\n\\n\" +\n \"JSON payload example:\\n\" +\n ' {\"humidity\": {\"type\": \"Property\", \"value\": 60}}',\n )\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n json: string | undefined,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\n `/entities/${encodeURIComponent(entityId)}/attrs`,\n data,\n );\n printSuccess(\"Attributes added.\");\n },\n ),\n );\n\n addExamples(add, [\n {\n description: \"Add an attribute with inline JSON\",\n command: `geonic entities attrs add urn:ngsi-ld:Sensor:001 '{\"humidity\":{\"type\":\"Property\",\"value\":60}}'`,\n },\n {\n description: \"Add attributes from a file\",\n command: \"geonic entities attrs add urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n {\n description: \"Add from stdin pipe\",\n command: \"cat attrs.json | geonic entities attrs add urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // attrs update\n const attrUpdate = attrs\n .command(\"update\")\n .description(\n \"Update a specific attribute of an entity\\n\\n\" +\n \"JSON payload example:\\n\" +\n ' {\"type\": \"Property\", \"value\": 25}',\n )\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n json: string | undefined,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.put(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n data,\n );\n printSuccess(\"Attribute updated.\");\n },\n ),\n );\n\n addExamples(attrUpdate, [\n {\n description: \"Update a Property value\",\n command: `geonic entities attrs update urn:ngsi-ld:Sensor:001 temperature '{\"type\":\"Property\",\"value\":25}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic entities attrs update urn:ngsi-ld:Sensor:001 temperature @attr.json\",\n },\n ]);\n\n // attrs delete\n const del = attrs\n .command(\"delete\")\n .description(\"Delete a specific attribute from an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n );\n printSuccess(\"Attribute deleted.\");\n },\n ),\n );\n\n addExamples(del, [\n {\n description: \"Delete a specific attribute\",\n command:\n \"geonic entities attrs delete urn:ngsi-ld:Sensor:001 temperature\",\n },\n ]);\n}\n\nexport function registerAttrsSubcommand(entitiesCmd: Command): void {\n const attrs = entitiesCmd\n .command(\"attrs\")\n .description(\"Manage entity attributes\");\n\n addAttrsSubcommands(attrs);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printCount, printSuccess } from \"../output.js\";\nimport { registerAttrsSubcommand } from \"./attrs.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerEntitiesCommand(program: Command): void {\n const entities = program\n .command(\"entities\")\n .description(\"Manage context entities\");\n\n // entities list\n const list = entities\n .command(\"list\")\n .description(\"List entities with optional filters\")\n .option(\"--type <type>\", \"Filter by entity type\")\n .option(\"--id-pattern <pat>\", \"Filter by entity ID pattern (regex)\")\n .option(\"--query <q>\", \"NGSI query expression\")\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--georel <rel>\", \"Geo-relationship (e.g. near;maxDistance:1000)\")\n .option(\"--geometry <geo>\", \"Geometry type for geo-query (e.g. point)\")\n .option(\"--coords <coords>\", \"Coordinates for geo-query\")\n .option(\"--spatial-id <zfxy>\", \"Spatial ID filter (ZFXY tile)\")\n .option(\"--limit <n>\", \"Maximum number of entities to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N entities\", parseInt)\n .option(\"--order-by <field>\", \"Order results by field\")\n .option(\"--count\", \"Include total count in response\")\n .option(\"--count-only\", \"Only show the total count without listing entities\")\n .option(\"--key-values\", \"Request simplified key-value format\")\n .action(\n withErrorHandler(async (opts: Record<string, unknown>, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const params: Record<string, string> = {};\n\n if (opts.type) params.type = String(opts.type);\n if (opts.idPattern) params.idPattern = String(opts.idPattern);\n if (opts.query) params.q = String(opts.query);\n if (opts.attrs) params.attrs = String(opts.attrs);\n if (opts.georel) params.georel = String(opts.georel);\n if (opts.geometry) params.geometry = String(opts.geometry);\n if (opts.coords) params.coordinates = String(opts.coords);\n if (opts.spatialId) params.spatialId = String(opts.spatialId);\n if (opts.limit !== undefined) params.limit = String(opts.limit);\n if (opts.offset !== undefined) params.offset = String(opts.offset);\n if (opts.orderBy) params.orderBy = String(opts.orderBy);\n if (opts.count || opts.countOnly) params.count = \"true\";\n if (opts.countOnly) params.limit = \"0\";\n if (opts.keyValues) params.options = \"keyValues\";\n\n const response = await client.get(\"/entities\", params);\n if (opts.countOnly) {\n printCount(response.count ?? 0);\n } else {\n outputResponse(response, format, !!opts.count);\n }\n }),\n );\n\n addExamples(list, [\n {\n description: \"Filter by entity type\",\n command: \"geonic entities list --type Sensor\",\n },\n {\n description: \"Filter by entity ID pattern (regex)\",\n command: \"geonic entities list --id-pattern 'urn:ngsi-ld:Sensor:.*'\",\n },\n {\n description: \"Filter by attribute value\",\n command: \"geonic entities list --query 'temperature>30'\",\n },\n {\n description: \"AND conditions (semicolon)\",\n command: \"geonic entities list --query 'temperature>30;humidity<50'\",\n },\n {\n description: \"String match\",\n command: \"geonic entities list --query 'name==\\\"Tokyo\\\"'\",\n },\n {\n description: \"Pattern match\",\n command: \"geonic entities list --query 'name~=\\\"Tok.*\\\"'\",\n },\n {\n description: \"Check attribute existence\",\n command: \"geonic entities list --query 'temperature'\",\n },\n {\n description: \"Select specific attributes\",\n command: \"geonic entities list --attrs temperature,humidity\",\n },\n {\n description: \"Geo-query: entities near a point (within 1km)\",\n command:\n \"geonic entities list --georel 'near;maxDistance==1000' --geometry Point --coords '[139.7671,35.6812]'\",\n },\n {\n description: \"Geo-query: entities within a polygon\",\n command:\n \"geonic entities list --georel within --geometry Polygon --coords '[[[139.7,35.7],[139.8,35.7],[139.8,35.6],[139.7,35.6],[139.7,35.7]]]'\",\n },\n {\n description: \"Filter by Spatial ID (ZFXY tile)\",\n command: \"geonic entities list --spatial-id 15/0/29101/12903\",\n },\n {\n description: \"Paginate results\",\n command: \"geonic entities list --limit 20 --offset 40\",\n },\n {\n description: \"Order by attribute\",\n command: \"geonic entities list --order-by temperature\",\n },\n {\n description: \"Get total count with results\",\n command: \"geonic entities list --type Sensor --count\",\n },\n {\n description: \"Get only the total count (no entity data)\",\n command: \"geonic entities list --type Sensor --count-only\",\n },\n ]);\n\n // entities get\n const get = entities\n .command(\"get\")\n .description(\"Get a single entity by ID\")\n .argument(\"<id>\", \"Entity ID\")\n .option(\"--key-values\", \"Request simplified key-value format\")\n .action(\n withErrorHandler(async (id: string, opts: Record<string, unknown>, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const params: Record<string, string> = {};\n if (opts.keyValues) {\n params.options = \"keyValues\";\n }\n\n const response = await client.get(\n `/entities/${encodeURIComponent(id)}`,\n params,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get entity by ID\",\n command: \"geonic entities get urn:ngsi-ld:Sensor:001\",\n },\n {\n description: \"Get entity in keyValues format\",\n command: \"geonic entities get urn:ngsi-ld:Sensor:001 --key-values\",\n },\n ]);\n\n // entities create\n const create = entities\n .command(\"create\")\n .description(\n \"Create a new entity\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"id\": \"urn:ngsi-ld:Sensor:001\",\\n' +\n ' \"type\": \"Sensor\",\\n' +\n ' \"temperature\": {\"type\": \"Property\", \"value\": 25}\\n' +\n \" }\",\n )\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(async (json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\"/entities\", data);\n printSuccess(\"Entity created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create from inline JSON (minimal)\",\n command: `geonic entities create '{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\"}'`,\n },\n {\n description: \"Create with attributes\",\n command: `geonic entities create '{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\",\"temperature\":{\"type\":\"Property\",\"value\":25},\"location\":{\"type\":\"GeoProperty\",\"value\":{\"type\":\"Point\",\"coordinates\":[139.77,35.68]}}}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic entities create @entity.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat entity.json | geonic entities create\",\n },\n {\n description: \"Interactive mode (omit JSON argument)\",\n command: \"geonic entities create\",\n },\n ]);\n\n // entities update\n const update = entities\n .command(\"update\")\n .description(\n \"Update attributes of an entity (PATCH)\\n\\n\" +\n \"JSON payload: only specified attributes are modified.\\n\" +\n ' e.g. {\"temperature\": {\"type\": \"Property\", \"value\": 30}}',\n )\n .argument(\"<id>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (id: string, json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.patch(\n `/entities/${encodeURIComponent(id)}/attrs`,\n data,\n );\n printSuccess(\"Entity updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a Property attribute\",\n command:\n `geonic entities update urn:ngsi-ld:Sensor:001 '{\"temperature\":{\"type\":\"Property\",\"value\":30}}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic entities update urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat attrs.json | geonic entities update urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // entities replace\n const replace = entities\n .command(\"replace\")\n .description(\n \"Replace all attributes of an entity (PUT)\\n\\n\" +\n \"JSON payload: all existing attributes are replaced.\\n\" +\n ' e.g. {\"temperature\": {\"type\": \"Property\", \"value\": 20}}',\n )\n .argument(\"<id>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (id: string, json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.put(\n `/entities/${encodeURIComponent(id)}/attrs`,\n data,\n );\n printSuccess(\"Entity replaced.\");\n },\n ),\n );\n\n addExamples(replace, [\n {\n description: \"Replace all attributes with inline JSON\",\n command: `geonic entities replace urn:ngsi-ld:Sensor:001 '{\"temperature\":{\"type\":\"Property\",\"value\":20}}'`,\n },\n {\n description: \"Replace from a file\",\n command: \"geonic entities replace urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n {\n description: \"Replace from stdin pipe\",\n command: \"cat attrs.json | geonic entities replace urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // entities upsert\n const upsert = entities\n .command(\"upsert\")\n .description(\"Create or update entities\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(async (json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\"/entityOperations/upsert\", data);\n printSuccess(\"Entity upserted.\");\n }),\n );\n\n addExamples(upsert, [\n {\n description: \"Upsert entities from a file\",\n command: \"geonic entities upsert @entities.json\",\n },\n {\n description: \"Upsert from stdin pipe\",\n command: \"cat entities.json | geonic entities upsert\",\n },\n ]);\n\n // entities delete\n const del = entities\n .command(\"delete\")\n .description(\"Delete an entity by ID\")\n .argument(\"<id>\", \"Entity ID\")\n .action(\n withErrorHandler(async (id: string, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(`/entities/${encodeURIComponent(id)}`);\n printSuccess(\"Entity deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an entity by ID\",\n command: \"geonic entities delete urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // Register attrs as a subcommand of entities\n registerAttrsSubcommand(entities);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerBatchCommand(program: Command): void {\n const batch = program\n .command(\"entityOperations\")\n .alias(\"batch\")\n .description(\"Perform batch operations on entities\");\n\n // batch create\n const create = batch\n .command(\"create [json]\")\n .description(\n \"Batch create entities\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities.\\n\" +\n ' e.g. [{\"id\": \"urn:ngsi-ld:Sensor:001\", \"type\": \"Sensor\"}, ...]',\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/create\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(create, [\n {\n description: \"Batch create with inline JSON\",\n command: `geonic batch create '[{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\"},{\"id\":\"urn:ngsi-ld:Sensor:002\",\"type\":\"Sensor\"}]'`,\n },\n {\n description: \"Batch create from a file\",\n command: \"geonic batch create @entities.json\",\n },\n {\n description: \"Batch create from stdin pipe\",\n command: \"cat entities.json | geonic batch create\",\n },\n ]);\n\n // batch upsert\n const upsert = batch\n .command(\"upsert [json]\")\n .description(\n \"Batch upsert entities\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities.\\n\" +\n \"Creates entities that don't exist, updates those that do.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/upsert\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(upsert, [\n {\n description: \"Batch upsert with inline JSON\",\n command: `geonic batch upsert '[{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\",\"temperature\":{\"type\":\"Property\",\"value\":25}}]'`,\n },\n {\n description: \"Batch upsert from a file\",\n command: \"geonic batch upsert @entities.json\",\n },\n {\n description: \"Batch upsert from stdin pipe\",\n command: \"cat entities.json | geonic batch upsert\",\n },\n ]);\n\n // batch update\n const update = batch\n .command(\"update [json]\")\n .description(\n \"Batch update entity attributes\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities with attributes to update.\\n\" +\n \"Each entity must include id and type; only specified attributes are modified.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/update\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(update, [\n {\n description: \"Batch update from a file\",\n command: \"geonic batch update @updates.json\",\n },\n {\n description: \"Batch update from stdin\",\n command: \"cat updates.json | geonic batch update\",\n },\n ]);\n\n // batch delete\n const del = batch\n .command(\"delete [json]\")\n .description(\n \"Batch delete entities by ID\\n\\n\" +\n 'JSON payload: an array of entity ID strings.\\n' +\n ' e.g. [\"urn:ngsi-ld:Sensor:001\",\"urn:ngsi-ld:Sensor:002\"]',\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/delete\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(del, [\n {\n description: \"Batch delete with inline JSON\",\n command: `geonic batch delete '[\"urn:ngsi-ld:Sensor:001\",\"urn:ngsi-ld:Sensor:002\"]'`,\n },\n {\n description: \"Batch delete from a file\",\n command: \"geonic batch delete @entity-ids.json\",\n },\n {\n description: \"Batch delete from stdin pipe\",\n command: \"cat entity-ids.json | geonic batch delete\",\n },\n ]);\n\n // batch query\n const query = batch\n .command(\"query [json]\")\n .description(\n \"Query entities by posting a query payload\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"entities\": [{\"type\": \"Sensor\"}],\\n' +\n ' \"attrs\": [\"temperature\"],\\n' +\n ' \"q\": \"temperature>30\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/query\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(query, [\n {\n description: \"Query with inline JSON\",\n command: `geonic batch query '{\"entities\":[{\"type\":\"Sensor\"}],\"attrs\":[\"temperature\"]}'`,\n },\n {\n description: \"Query from a file\",\n command: \"geonic batch query @query.json\",\n },\n {\n description: \"Query from stdin pipe\",\n command: \"cat query.json | geonic batch query\",\n },\n ]);\n\n // batch merge\n const merge = batch\n .command(\"merge [json]\")\n .description(\n \"Batch merge-patch entities\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities.\\n\" +\n \"Each entity must include id and type; attributes are merge-patched.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/merge\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(merge, [\n {\n description: \"Batch merge-patch from a file\",\n command: \"geonic batch merge @patches.json\",\n },\n {\n description: \"Batch merge-patch from stdin\",\n command: \"cat patches.json | geonic batch merge\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerSubscriptionsCommand(program: Command): void {\n const subscriptions = program\n .command(\"subscriptions\")\n .alias(\"sub\")\n .description(\"Manage context subscriptions\");\n\n // subscriptions list\n const list = subscriptions\n .command(\"list\")\n .description(\"List subscriptions\")\n .option(\"--limit <n>\", \"Maximum number of results\", parseInt)\n .option(\"--offset <n>\", \"Skip N results\", parseInt)\n .option(\"--count\", \"Include total count in response\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/subscriptions\", params);\n outputResponse(response, format, !!cmdOpts.count);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all subscriptions\",\n command: \"geonic subscriptions list\",\n },\n {\n description: \"List with pagination\",\n command: \"geonic subscriptions list --limit 10 --offset 20\",\n },\n {\n description: \"List with total count\",\n command: \"geonic subscriptions list --count\",\n },\n ]);\n\n // subscriptions get\n const get = subscriptions\n .command(\"get <id>\")\n .description(\"Get a subscription by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get subscription by ID\",\n command: \"geonic subscriptions get urn:ngsi-ld:Subscription:001\",\n },\n ]);\n\n // subscriptions create\n const create = subscriptions\n .command(\"create [json]\")\n .description(\n \"Create a subscription\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"type\": \"Subscription\",\\n' +\n ' \"entities\": [{\"type\": \"Sensor\"}],\\n' +\n ' \"watchedAttributes\": [\"temperature\"],\\n' +\n ' \"notification\": {\"endpoint\": {\"uri\": \"http://localhost:3000/notify\"}}\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/subscriptions\", data);\n outputResponse(response, format);\n printSuccess(\"Subscription created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic subscriptions create '{\"type\":\"Subscription\",\"entities\":[{\"type\":\"Sensor\"}],\"watchedAttributes\":[\"temperature\"],\"notification\":{\"endpoint\":{\"uri\":\"http://localhost:3000/notify\"}}}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic subscriptions create @subscription.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat subscription.json | geonic subscriptions create\",\n },\n {\n description: \"Interactive mode\",\n command: \"geonic subscriptions create\",\n },\n ]);\n\n // subscriptions update\n const update = subscriptions\n .command(\"update <id> [json]\")\n .description(\n \"Update a subscription\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated subscription\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.patch(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n data,\n );\n outputResponse(response, format);\n printSuccess(\"Subscription updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic subscriptions update urn:ngsi-ld:Subscription:001 '{\"description\":\"Updated subscription\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic subscriptions update urn:ngsi-ld:Subscription:001 @sub.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat sub.json | geonic subscriptions update urn:ngsi-ld:Subscription:001\",\n },\n ]);\n\n // subscriptions delete\n const del = subscriptions\n .command(\"delete <id>\")\n .description(\"Delete a subscription\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Subscription deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a subscription\",\n command: \"geonic subscriptions delete urn:ngsi-ld:Subscription:001\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerRegistrationsCommand(program: Command): void {\n const registrations = program\n .command(\"registrations\")\n .alias(\"reg\")\n .description(\"Manage context registrations\");\n\n // registrations list\n const list = registrations\n .command(\"list\")\n .description(\"List registrations\")\n .option(\"--limit <n>\", \"Maximum number of results\", parseInt)\n .option(\"--offset <n>\", \"Skip N results\", parseInt)\n .option(\"--count\", \"Include total count in response\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/csourceRegistrations\", params);\n outputResponse(response, format, !!cmdOpts.count);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all registrations\",\n command: \"geonic registrations list\",\n },\n {\n description: \"List with pagination\",\n command: \"geonic registrations list --limit 10\",\n },\n ]);\n\n // registrations get\n const get = registrations\n .command(\"get <id>\")\n .description(\"Get a registration by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get registration by ID\",\n command:\n \"geonic registrations get urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n\n // registrations create\n const create = registrations\n .command(\"create [json]\")\n .description(\n \"Create a registration\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"type\": \"ContextSourceRegistration\",\\n' +\n ' \"information\": [{\"entities\": [{\"type\": \"Room\"}]}],\\n' +\n ' \"endpoint\": \"http://localhost:4000/source\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/csourceRegistrations\", data);\n outputResponse(response, format);\n printSuccess(\"Registration created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic registrations create '{\"type\":\"ContextSourceRegistration\",\"information\":[{\"entities\":[{\"type\":\"Room\"}]}],\"endpoint\":\"http://localhost:4000/source\"}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic registrations create @registration.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat registration.json | geonic registrations create\",\n },\n ]);\n\n // registrations update\n const regUpdate = registrations\n .command(\"update <id> [json]\")\n .description(\"Update a registration\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.patch(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n data,\n );\n outputResponse(response, format);\n printSuccess(\"Registration updated.\");\n },\n ),\n );\n\n addExamples(regUpdate, [\n {\n description: \"Update endpoint\",\n command: `geonic registrations update urn:ngsi-ld:ContextSourceRegistration:001 '{\"endpoint\":\"http://localhost:5000/source\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic registrations update urn:ngsi-ld:ContextSourceRegistration:001 @registration.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat registration.json | geonic registrations update urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n\n // registrations delete\n const del = registrations\n .command(\"delete <id>\")\n .description(\"Delete a registration\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Registration deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a registration\",\n command:\n \"geonic registrations delete urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerTypesCommand(program: Command): void {\n const types = program\n .command(\"types\")\n .description(\"Browse entity types\");\n\n // types list\n const list = types\n .command(\"list\")\n .description(\"List available entity types\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\"/types\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all entity types\",\n command: \"geonic types list\",\n },\n ]);\n\n // types get\n const get = types\n .command(\"get <typeName>\")\n .description(\"Get details for an entity type\")\n .action(\n withErrorHandler(\n async (typeName: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/types/${encodeURIComponent(String(typeName))}`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(get, [\n {\n description: \"Get details for a specific type\",\n command: \"geonic types get Sensor\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nfunction addTemporalListOptions(cmd: Command): Command {\n return cmd\n .option(\"--type <type>\", \"Filter by entity type\")\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--query <q>\", \"NGSI query expression\")\n .option(\"--georel <rel>\", \"Geo-relationship (e.g. near;maxDistance:1000)\")\n .option(\"--geometry <geo>\", \"Geometry type for geo-query (e.g. point)\")\n .option(\"--coords <coords>\", \"Coordinates for geo-query\")\n .option(\"--time-rel <rel>\", \"Temporal relationship (before, after, between)\")\n .option(\"--time-at <time>\", \"Temporal query start time (ISO 8601)\")\n .option(\"--end-time-at <time>\", \"Temporal query end time (ISO 8601)\")\n .option(\"--last-n <n>\", \"Return last N temporal values\", parseInt)\n .option(\"--limit <n>\", \"Maximum number of entities to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N entities\", parseInt)\n .option(\"--count\", \"Include total count in response\");\n}\n\nfunction createListAction() {\n return withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.type) params[\"type\"] = cmdOpts.type;\n if (cmdOpts.attrs) params[\"attrs\"] = cmdOpts.attrs;\n if (cmdOpts.query) params[\"q\"] = cmdOpts.query;\n if (cmdOpts.georel) params[\"georel\"] = cmdOpts.georel;\n if (cmdOpts.geometry) params[\"geometry\"] = cmdOpts.geometry;\n if (cmdOpts.coords) params[\"coordinates\"] = cmdOpts.coords;\n if (cmdOpts.timeRel) params[\"timerel\"] = cmdOpts.timeRel;\n if (cmdOpts.timeAt) params[\"timeAt\"] = cmdOpts.timeAt;\n if (cmdOpts.endTimeAt) params[\"endTimeAt\"] = cmdOpts.endTimeAt;\n if (cmdOpts.lastN !== undefined) params[\"lastN\"] = String(cmdOpts.lastN);\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/temporal/entities\", params);\n outputResponse(response, format, cmdOpts.count);\n });\n}\n\nfunction addTemporalGetOptions(cmd: Command): Command {\n return cmd\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--time-rel <rel>\", \"Temporal relationship (before, after, between)\")\n .option(\"--time-at <time>\", \"Temporal query start time (ISO 8601)\")\n .option(\"--end-time-at <time>\", \"Temporal query end time (ISO 8601)\")\n .option(\"--last-n <n>\", \"Return last N temporal values\", parseInt);\n}\n\nfunction createGetAction() {\n return withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.attrs) params[\"attrs\"] = cmdOpts.attrs;\n if (cmdOpts.timeRel) params[\"timerel\"] = cmdOpts.timeRel;\n if (cmdOpts.timeAt) params[\"timeAt\"] = cmdOpts.timeAt;\n if (cmdOpts.endTimeAt) params[\"endTimeAt\"] = cmdOpts.endTimeAt;\n if (cmdOpts.lastN !== undefined) params[\"lastN\"] = String(cmdOpts.lastN);\n\n const response = await client.get(\n `/temporal/entities/${encodeURIComponent(String(id))}`,\n params,\n );\n outputResponse(response, format);\n });\n}\n\nfunction createCreateAction() {\n return withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n\n await client.post(\"/temporal/entities\", body);\n printSuccess(\"Temporal entity created.\");\n });\n}\n\nfunction createDeleteAction() {\n return withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/temporal/entities/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Temporal entity deleted.\");\n });\n}\n\nfunction createQueryAction() {\n return withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.aggrMethods) params[\"aggrMethods\"] = cmdOpts.aggrMethods;\n if (cmdOpts.aggrPeriod) params[\"aggrPeriodDuration\"] = cmdOpts.aggrPeriod;\n\n const response = await client.post(\n \"/temporal/entityOperations/query\",\n body,\n params,\n );\n outputResponse(response, format);\n });\n}\n\nfunction addQueryOptions(cmd: Command): Command {\n return cmd\n .option(\"--aggr-methods <methods>\", \"Aggregation methods (e.g. totalCount,sum)\")\n .option(\"--aggr-period <period>\", \"Aggregation period (e.g. PT1H)\");\n}\n\nexport function registerTemporalCommand(program: Command): void {\n const temporal = program\n .command(\"temporal\")\n .description(\"Manage temporal entities\");\n\n const entities = temporal\n .command(\"entities\")\n .description(\"List, get, create, and delete temporal entities\");\n\n const entityOperations = temporal\n .command(\"entityOperations\")\n .description(\"Perform batch operations on temporal entities\");\n\n // temporal entities list\n const entitiesList = addTemporalListOptions(\n entities.command(\"list\").description(\"List temporal entities with optional filters\"),\n );\n entitiesList.action(createListAction());\n\n addExamples(entitiesList, [\n {\n description: \"List by type with time range\",\n command:\n \"geonic temporal entities list --type Sensor --time-rel between --time-at 2025-01-01T00:00:00Z --end-time-at 2025-01-31T23:59:59Z\",\n },\n {\n description: \"Get last 5 temporal values\",\n command: \"geonic temporal entities list --type Sensor --last-n 5\",\n },\n {\n description: \"Filter by time (after a point)\",\n command:\n \"geonic temporal entities list --time-rel after --time-at 2025-06-01T00:00:00Z\",\n },\n ]);\n\n // temporal entities get\n const entitiesGet = addTemporalGetOptions(\n entities.command(\"get <id>\").description(\"Get a temporal entity by ID\"),\n );\n entitiesGet.action(createGetAction());\n\n addExamples(entitiesGet, [\n {\n description: \"Get temporal entity with specific attributes\",\n command:\n \"geonic temporal entities get urn:ngsi-ld:Sensor:001 --attrs temperature,humidity\",\n },\n {\n description: \"Get last 10 values for an entity\",\n command: \"geonic temporal entities get urn:ngsi-ld:Sensor:001 --last-n 10\",\n },\n ]);\n\n // temporal entities create\n const create = entities\n .command(\"create [json]\")\n .description(\n \"Create a temporal entity\\n\\n\" +\n \"JSON payload: an NGSI-LD entity with temporal attribute instances.\\n\" +\n \"Each attribute value is an array of {value, observedAt} objects.\",\n )\n .action(createCreateAction());\n\n addExamples(create, [\n {\n description: \"Create from a file\",\n command: \"geonic temporal entities create @temporal-entity.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat temporal-entity.json | geonic temporal entities create\",\n },\n {\n description: \"Interactive mode\",\n command: \"geonic temporal entities create\",\n },\n ]);\n\n // temporal entities delete\n const del = entities\n .command(\"delete <id>\")\n .description(\"Delete a temporal entity by ID\")\n .action(createDeleteAction());\n\n addExamples(del, [\n {\n description: \"Delete temporal data for an entity\",\n command: \"geonic temporal entities delete urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // temporal entityOperations query\n const opsQuery = addQueryOptions(\n entityOperations.command(\"query [json]\").description(\"Query temporal entities (POST)\"),\n );\n opsQuery.action(createQueryAction());\n\n addExamples(opsQuery, [\n {\n description: \"Query with inline JSON\",\n command: `geonic temporal entityOperations query '{\"entities\":[{\"type\":\"Sensor\"}],\"attrs\":[\"temperature\"]}'`,\n },\n {\n description: \"Query with aggregation (hourly count)\",\n command:\n \"geonic temporal entityOperations query @query.json --aggr-methods totalCount --aggr-period PT1H\",\n },\n {\n description: \"Query from a file\",\n command: \"geonic temporal entityOperations query @query.json\",\n },\n ]);\n\n // Backward-compatible hidden aliases at the temporal level\n addTemporalListOptions(\n temporal\n .command(\"list\", { hidden: true })\n .description(\"List temporal entities (deprecated: use temporal entities list)\"),\n ).action(createListAction());\n\n addTemporalGetOptions(\n temporal\n .command(\"get <id>\", { hidden: true })\n .description(\"Get a temporal entity (deprecated: use temporal entities get)\"),\n ).action(createGetAction());\n\n temporal\n .command(\"create [json]\", { hidden: true })\n .description(\"Create a temporal entity (deprecated: use temporal entities create)\")\n .action(createCreateAction());\n\n temporal\n .command(\"delete <id>\", { hidden: true })\n .description(\"Delete a temporal entity (deprecated: use temporal entities delete)\")\n .action(createDeleteAction());\n\n addQueryOptions(\n temporal\n .command(\"query [json]\", { hidden: true })\n .description(\"Query temporal entities (deprecated: use temporal entityOperations query)\"),\n ).action(createQueryAction());\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerSnapshotsCommand(program: Command): void {\n const snapshots = program\n .command(\"snapshots\")\n .description(\"Manage snapshots\");\n\n // snapshots list\n const list = snapshots\n .command(\"list\")\n .description(\"List snapshots\")\n .option(\"--limit <n>\", \"Maximum number of snapshots to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N snapshots\", parseInt)\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n\n const response = await client.get(\"/snapshots\", params);\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all snapshots\",\n command: \"geonic snapshots list\",\n },\n {\n description: \"List with a limit\",\n command: \"geonic snapshots list --limit 10\",\n },\n ]);\n\n // snapshots get\n const get = snapshots\n .command(\"get <id>\")\n .description(\"Get a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/snapshots/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific snapshot\",\n command: \"geonic snapshots get <snapshot-id>\",\n },\n ]);\n\n // snapshots create\n const create = snapshots\n .command(\"create\")\n .description(\"Create a new snapshot\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.post(\"/snapshots\");\n printSuccess(\"Snapshot created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a new snapshot\",\n command: \"geonic snapshots create\",\n },\n ]);\n\n // snapshots delete\n const del = snapshots\n .command(\"delete <id>\")\n .description(\"Delete a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/snapshots/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Snapshot deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a snapshot\",\n command: \"geonic snapshots delete <snapshot-id>\",\n },\n ]);\n\n // snapshots clone\n const clone = snapshots\n .command(\"clone <id>\")\n .description(\"Clone a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.post(\n `/snapshots/${encodeURIComponent(String(id))}/clone`,\n );\n if (response.data !== undefined && response.data !== \"\") {\n outputResponse(response, format);\n } else {\n printSuccess(\"Snapshot cloned.\");\n }\n }),\n );\n\n addExamples(clone, [\n {\n description: \"Clone a snapshot\",\n command: \"geonic snapshots clone <snapshot-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerTenantsCommand(parent: Command): void {\n const tenants = parent\n .command(\"tenants\")\n .description(\"Manage tenants\");\n\n // tenants list\n const list = tenants\n .command(\"list\")\n .description(\"List all tenants\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/tenants\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all tenants\",\n command: \"geonic admin tenants list\",\n },\n ]);\n\n // tenants get\n const get = tenants\n .command(\"get <id>\")\n .description(\"Get a tenant by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a tenant by ID\",\n command: \"geonic admin tenants get <tenant-id>\",\n },\n ]);\n\n // tenants create\n const create = tenants\n .command(\"create [json]\")\n .description(\n \"Create a new tenant\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"name\": \"production\",\\n' +\n ' \"description\": \"Production environment tenant\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/tenants\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"Tenant created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic admin tenants create '{\"name\":\"my-tenant\",\"description\":\"My first tenant\"}'`,\n },\n {\n description: \"Minimal (name only)\",\n command: `geonic admin tenants create '{\"name\":\"production\"}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin tenants create @tenant.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat tenant.json | geonic admin tenants create\",\n },\n {\n description: \"Interactive mode (omit JSON argument)\",\n command: \"geonic admin tenants create\",\n },\n ]);\n\n // tenants update\n const update = tenants\n .command(\"update <id> [json]\")\n .description(\n \"Update a tenant\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"name\": \"new-name\", \"description\": \"Updated description\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Tenant updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description with inline JSON\",\n command: `geonic admin tenants update <tenant-id> '{\"description\":\"Updated description\"}'`,\n },\n {\n description: \"Rename a tenant\",\n command: `geonic admin tenants update <tenant-id> '{\"name\":\"new-name\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin tenants update <tenant-id> @patch.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat patch.json | geonic admin tenants update <tenant-id>\",\n },\n {\n description: \"Interactive mode\",\n command: \"geonic admin tenants update <tenant-id>\",\n },\n ]);\n\n // tenants delete\n const del = tenants\n .command(\"delete <id>\")\n .description(\"Delete a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Tenant deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a tenant\",\n command: \"geonic admin tenants delete <tenant-id>\",\n },\n ]);\n\n // tenants activate\n const activate = tenants\n .command(\"activate <id>\")\n .description(\"Activate a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/tenants/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Tenant activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a tenant\",\n command: \"geonic admin tenants activate <tenant-id>\",\n },\n ]);\n\n // tenants deactivate\n const deactivate = tenants\n .command(\"deactivate <id>\")\n .description(\"Deactivate a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/tenants/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Tenant deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a tenant\",\n command: \"geonic admin tenants deactivate <tenant-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerUsersCommand(parent: Command): void {\n const users = parent\n .command(\"users\")\n .description(\"Manage users\");\n\n // users list\n const list = users\n .command(\"list\")\n .description(\"List all users\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/users\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all users\",\n command: \"geonic admin users list\",\n },\n ]);\n\n // users get\n const get = users\n .command(\"get <id>\")\n .description(\"Get a user by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a user by ID\",\n command: \"geonic admin users get <user-id>\",\n },\n ]);\n\n // users create\n const create = users\n .command(\"create [json]\")\n .description(\n \"Create a new user\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"email\": \"user@example.com\",\\n' +\n ' \"password\": \"SecurePassword123!\",\\n' +\n ' \"role\": \"super_admin\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/users\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"User created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic admin users create '{\"email\":\"user@example.com\",\"password\":\"SecurePassword123!\",\"role\":\"super_admin\"}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin users create @user.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat user.json | geonic admin users create\",\n },\n ]);\n\n // users update\n const update = users\n .command(\"update <id> [json]\")\n .description(\n \"Update a user\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"role\": \"admin\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"User updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update role with inline JSON\",\n command: `geonic admin users update <user-id> '{\"role\":\"admin\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin users update <user-id> @user.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat user.json | geonic admin users update <user-id>\",\n },\n ]);\n\n // users delete\n const del = users\n .command(\"delete <id>\")\n .description(\"Delete a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"User deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a user\",\n command: \"geonic admin users delete <user-id>\",\n },\n ]);\n\n // users activate\n const activate = users\n .command(\"activate <id>\")\n .description(\"Activate a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"User activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a user\",\n command: \"geonic admin users activate <user-id>\",\n },\n ]);\n\n // users deactivate\n const deactivate = users\n .command(\"deactivate <id>\")\n .description(\"Deactivate a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"User deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a user\",\n command: \"geonic admin users deactivate <user-id>\",\n },\n ]);\n\n // users unlock\n const unlock = users\n .command(\"unlock <id>\")\n .description(\"Unlock a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/unlock`,\n );\n printSuccess(\"User unlocked.\");\n }),\n );\n\n addExamples(unlock, [\n {\n description: \"Unlock a locked user account\",\n command: \"geonic admin users unlock <user-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerPoliciesCommand(parent: Command): void {\n const policies = parent\n .command(\"policies\")\n .description(\"Manage policies\");\n\n // policies list\n const list = policies\n .command(\"list\")\n .description(\"List all policies\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/policies\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all policies\",\n command: \"geonic admin policies list\",\n },\n ]);\n\n // policies get\n const get = policies\n .command(\"get <id>\")\n .description(\"Get a policy by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a policy by ID\",\n command: \"geonic admin policies get <policy-id>\",\n },\n ]);\n\n // policies create\n const create = policies\n .command(\"create [json]\")\n .description(\n \"Create a new policy\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"description\": \"Allow all entities\",\\n' +\n ' \"rules\": [{\"ruleId\": \"allow-all\", \"effect\": \"Permit\"}]\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/policies\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"Policy created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic admin policies create '{\"description\":\"Allow all entities\",\"rules\":[{\"ruleId\":\"allow-all\",\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin policies create @policy.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat policy.json | geonic admin policies create\",\n },\n ]);\n\n // policies update\n const update = policies\n .command(\"update <id> [json]\")\n .description(\n \"Update a policy\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated policy\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Policy updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic admin policies update <policy-id> '{\"description\":\"Updated policy\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin policies update <policy-id> @policy.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat policy.json | geonic admin policies update <policy-id>\",\n },\n ]);\n\n // policies delete\n const del = policies\n .command(\"delete <id>\")\n .description(\"Delete a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Policy deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a policy\",\n command: \"geonic admin policies delete <policy-id>\",\n },\n ]);\n\n // policies activate\n const activate = policies\n .command(\"activate <id>\")\n .description(\"Activate a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/policies/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Policy activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a policy\",\n command: \"geonic admin policies activate <policy-id>\",\n },\n ]);\n\n // policies deactivate\n const deactivate = policies\n .command(\"deactivate <id>\")\n .description(\"Deactivate a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/policies/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Policy deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a policy\",\n command: \"geonic admin policies deactivate <policy-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerOAuthClientsCommand(parent: Command): void {\n const oauthClients = parent\n .command(\"oauth-clients\")\n .description(\"Manage OAuth clients\");\n\n // oauth-clients list\n const list = oauthClients\n .command(\"list\")\n .description(\"List all OAuth clients\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/oauth-clients\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all OAuth clients\",\n command: \"geonic admin oauth-clients list\",\n },\n ]);\n\n // oauth-clients get\n const get = oauthClients\n .command(\"get <id>\")\n .description(\"Get an OAuth client by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get an OAuth client by ID\",\n command: \"geonic admin oauth-clients get <client-id>\",\n },\n ]);\n\n // oauth-clients create\n const create = oauthClients\n .command(\"create [json]\")\n .description(\n \"Create a new OAuth client\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"clientName\": \"my-app\",\\n' +\n ' \"allowedScopes\": [\"read:entities\", \"write:entities\"]\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/oauth-clients\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic admin oauth-clients create '{\"clientName\":\"my-app\",\"allowedScopes\":[\"read:entities\",\"write:entities\"]}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin oauth-clients create @client.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat client.json | geonic admin oauth-clients create\",\n },\n ]);\n\n // oauth-clients update\n const update = oauthClients\n .command(\"update <id> [json]\")\n .description(\n \"Update an OAuth client\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated client\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"OAuth client updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic admin oauth-clients update <client-id> '{\"description\":\"Updated client\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin oauth-clients update <client-id> @client.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat client.json | geonic admin oauth-clients update <client-id>\",\n },\n ]);\n\n // oauth-clients delete\n const del = oauthClients\n .command(\"delete <id>\")\n .description(\"Delete an OAuth client\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"OAuth client deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an OAuth client\",\n command: \"geonic admin oauth-clients delete <client-id>\",\n },\n ]);\n}\n\nexport function registerCaddeCommand(parent: Command): void {\n const cadde = parent\n .command(\"cadde\")\n .description(\"Manage CADDE configuration\");\n\n // cadde get\n const caddeGet = cadde\n .command(\"get\")\n .description(\"Get CADDE configuration\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/cadde\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(caddeGet, [\n {\n description: \"Get CADDE configuration\",\n command: \"geonic admin cadde get\",\n },\n ]);\n\n // cadde set\n const caddeSet = cadde\n .command(\"set [json]\")\n .description(\n \"Set CADDE configuration\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"provider\": \"my-provider\",\\n' +\n ' \"endpoint\": \"http://localhost:6000\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"PUT\", \"/admin/cadde\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"CADDE configuration set.\");\n }),\n );\n\n addExamples(caddeSet, [\n {\n description: \"Set with inline JSON\",\n command: `geonic admin cadde set '{\"provider\":\"my-provider\",\"endpoint\":\"http://localhost:6000\"}'`,\n },\n {\n description: \"Set from a JSON file\",\n command: \"geonic admin cadde set @cadde-config.json\",\n },\n {\n description: \"Set from stdin pipe\",\n command: \"cat cadde-config.json | geonic admin cadde set\",\n },\n ]);\n\n // cadde delete\n const caddeDelete = cadde\n .command(\"delete\")\n .description(\"Delete CADDE configuration\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\"DELETE\", \"/admin/cadde\");\n printSuccess(\"CADDE configuration deleted.\");\n }),\n );\n\n addExamples(caddeDelete, [\n {\n description: \"Delete CADDE configuration\",\n command: \"geonic admin cadde delete\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, resolveOptions, getFormat, outputResponse } from \"../../helpers.js\";\nimport { loadConfig, saveConfig } from \"../../config.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printError, printWarning } from \"../../output.js\";\nimport { addExamples, addNotes } from \"../help.js\";\nimport { API_KEY_SCOPES_HELP_NOTES } from \"../../helpers.js\";\n\nfunction validateOrigins(body: unknown, opts: Record<string, unknown>): void {\n // Validate origins if provided via flags\n if (opts.origins !== undefined) {\n const origins = String(opts.origins).split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (origins.length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n // Also validate if provided via JSON input\n if (body && typeof body === \"object\" && \"allowedOrigins\" in (body as Record<string, unknown>)) {\n const origins = (body as Record<string, unknown>).allowedOrigins;\n if (Array.isArray(origins) && origins.filter((o: unknown) => typeof o === \"string\" && o.trim() !== \"\").length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n}\n\nfunction buildBodyFromFlags(opts: Record<string, unknown>): Record<string, unknown> {\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.name = opts.name;\n if (opts.scopes) payload.allowedScopes = (opts.scopes as string).split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.origins) payload.allowedOrigins = (opts.origins as string).split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.entityTypes) payload.allowedEntityTypes = (opts.entityTypes as string).split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.rateLimit) {\n const raw = String(opts.rateLimit).trim();\n if (!/^\\d+$/.test(raw)) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n const perMinute = Number(raw);\n if (perMinute <= 0) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n payload.rateLimit = { perMinute };\n }\n if (opts.dpopRequired !== undefined) payload.dpopRequired = opts.dpopRequired;\n if (opts.tenantId) payload.tenantId = opts.tenantId;\n return payload;\n}\n\nexport function registerApiKeysCommand(parent: Command): void {\n const apiKeys = parent\n .command(\"api-keys\")\n .description(\"Manage API keys\");\n\n // api-keys list\n const list = apiKeys\n .command(\"list\")\n .description(\"List all API keys\")\n .option(\"--tenant-id <id>\", \"Filter by tenant ID\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as { tenantId?: string };\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const params: Record<string, string> = {};\n if (opts.tenantId) params.tenantId = opts.tenantId;\n const response = await client.rawRequest(\"GET\", \"/admin/api-keys\", {\n params,\n });\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all API keys\",\n command: \"geonic admin api-keys list\",\n },\n {\n description: \"List API keys for a specific tenant\",\n command: \"geonic admin api-keys list --tenant-id <tenant-id>\",\n },\n ]);\n\n // api-keys get\n const get = apiKeys\n .command(\"get <keyId>\")\n .description(\"Get an API key by ID\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/api-keys/${encodeURIComponent(String(keyId))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get an API key by ID\",\n command: \"geonic admin api-keys get <key-id>\",\n },\n ]);\n\n // api-keys create\n const create = apiKeys\n .command(\"create [json]\")\n .description(\"Create a new API key\")\n .option(\"--name <name>\", \"Key name\")\n .option(\"--scopes <scopes>\", \"Comma-separated scopes\")\n .option(\"--origins <origins>\", \"Comma-separated origins\")\n .option(\"--entity-types <types>\", \"Comma-separated entity types\")\n .option(\"--rate-limit <n>\", \"Rate limit per minute\")\n .option(\"--dpop-required\", \"Require DPoP token binding\")\n .option(\"--tenant-id <id>\", \"Tenant ID\")\n .option(\"--save\", \"Save the API key to profile config\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n scopes?: string;\n origins?: string;\n entityTypes?: string;\n rateLimit?: string;\n dpopRequired?: boolean;\n tenantId?: string;\n save?: boolean;\n };\n\n validateOrigins(undefined, opts);\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.scopes || opts.origins || opts.entityTypes || opts.rateLimit || opts.dpopRequired !== undefined || opts.tenantId) {\n body = buildBodyFromFlags(opts);\n } else {\n body = await parseJsonInput();\n }\n\n validateOrigins(body, {});\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/api-keys\", {\n body,\n });\n const data = response.data as Record<string, unknown>;\n\n if (opts.save) {\n const globalOpts = resolveOptions(cmd);\n const key = data.key as string | undefined;\n if (!key) {\n printError(\"Response missing key. API key was created, but it could not be saved.\");\n outputResponse(response, format);\n process.exitCode = 1;\n return;\n }\n const config = loadConfig(globalOpts.profile);\n config.apiKey = key;\n saveConfig(config, globalOpts.profile);\n console.error(\"API key saved to config. X-Api-Key header will be sent automatically.\");\n } else {\n printWarning(\"Save the API key now — it will not be shown again. Use --save to store it automatically.\");\n }\n\n outputResponse(response, format);\n console.error(\"API key created.\");\n }),\n );\n\n addNotes(create, API_KEY_SCOPES_HELP_NOTES);\n\n addExamples(create, [\n {\n description: \"Create an API key with flags\",\n command: \"geonic admin api-keys create --name my-key --scopes read:entities,write:entities --origins '*'\",\n },\n {\n description: \"Create an API key with DPoP required\",\n command: \"geonic admin api-keys create --name my-key --dpop-required\",\n },\n {\n description: \"Create an API key from JSON and save to config\",\n command: \"geonic admin api-keys create @key.json --save\",\n },\n ]);\n\n // api-keys update\n const update = apiKeys\n .command(\"update <keyId> [json]\")\n .description(\"Update an API key\")\n .option(\"--name <name>\", \"Key name\")\n .option(\"--scopes <scopes>\", \"Comma-separated scopes\")\n .option(\"--origins <origins>\", \"Comma-separated origins\")\n .option(\"--entity-types <types>\", \"Comma-separated entity types\")\n .option(\"--rate-limit <n>\", \"Rate limit per minute\")\n .option(\"--dpop-required\", \"Require DPoP token binding\")\n .option(\"--no-dpop-required\", \"Disable DPoP token binding\")\n .action(\n withErrorHandler(\n async (keyId: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n scopes?: string;\n origins?: string;\n entityTypes?: string;\n rateLimit?: string;\n dpopRequired?: boolean;\n };\n\n validateOrigins(undefined, opts);\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.scopes || opts.origins || opts.entityTypes || opts.rateLimit || opts.dpopRequired !== undefined) {\n body = buildBodyFromFlags(opts);\n } else {\n body = await parseJsonInput();\n }\n\n validateOrigins(body, {});\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/api-keys/${encodeURIComponent(String(keyId))}`,\n { body },\n );\n outputResponse(response, format);\n console.error(\"API key updated.\");\n },\n ),\n );\n\n addNotes(update, API_KEY_SCOPES_HELP_NOTES);\n\n addExamples(update, [\n {\n description: \"Update an API key name\",\n command: \"geonic admin api-keys update <key-id> --name new-name\",\n },\n {\n description: \"Enable DPoP requirement\",\n command: \"geonic admin api-keys update <key-id> --dpop-required\",\n },\n {\n description: \"Disable DPoP requirement\",\n command: \"geonic admin api-keys update <key-id> --no-dpop-required\",\n },\n {\n description: \"Update an API key from a JSON file\",\n command: \"geonic admin api-keys update <key-id> @key.json\",\n },\n ]);\n\n // api-keys delete\n const del = apiKeys\n .command(\"delete <keyId>\")\n .description(\"Delete an API key\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/api-keys/${encodeURIComponent(String(keyId))}`,\n );\n console.error(\"API key deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an API key\",\n command: \"geonic admin api-keys delete <key-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { registerTenantsCommand } from \"./tenants.js\";\nimport { registerUsersCommand } from \"./users.js\";\nimport { registerPoliciesCommand } from \"./policies.js\";\nimport { registerOAuthClientsCommand, registerCaddeCommand } from \"./oauth-clients.js\";\nimport { registerApiKeysCommand } from \"./api-keys.js\";\n\nexport function registerAdminCommand(program: Command): void {\n const admin = program\n .command(\"admin\")\n .description(\"Manage admin resources\");\n\n registerTenantsCommand(admin);\n registerUsersCommand(admin);\n registerPoliciesCommand(admin);\n registerOAuthClientsCommand(admin);\n registerApiKeysCommand(admin);\n registerCaddeCommand(admin);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerRulesCommand(program: Command): void {\n const rules = program\n .command(\"rules\")\n .description(\"Manage rule engine\");\n\n // rules list\n const list = rules\n .command(\"list\")\n .description(\"List all rules\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/rules\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all rules\",\n command: \"geonic rules list\",\n },\n ]);\n\n // rules get\n const get = rules\n .command(\"get <id>\")\n .description(\"Get a rule by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/rules/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific rule\",\n command: \"geonic rules get <rule-id>\",\n },\n ]);\n\n // rules create\n const create = rules\n .command(\"create [json]\")\n .description(\n \"Create a new rule\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"name\": \"high-temp-alert\",\\n' +\n ' \"description\": \"Alert on high temperature\",\\n' +\n ' \"conditions\": [{\"type\": \"celExpression\", \"expression\": \"entity.temperature > 30\"}],\\n' +\n ' \"actions\": [{\"type\": \"webhook\", \"url\": \"http://localhost:5000/alert\", \"method\": \"POST\"}]\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/rules\", { body });\n outputResponse(response, format);\n printSuccess(\"Rule created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic rules create '{\"name\":\"high-temp-alert\",\"conditions\":[{\"type\":\"celExpression\",\"expression\":\"entity.temperature > 30\"}],\"actions\":[{\"type\":\"webhook\",\"url\":\"http://localhost:5000/alert\",\"method\":\"POST\"}]}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic rules create @rule.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat rule.json | geonic rules create\",\n },\n ]);\n\n // rules update\n const update = rules\n .command(\"update <id> [json]\")\n .description(\n \"Update a rule\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n \" e.g. {\\\"description\\\": \\\"Updated rule\\\"}\",\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/rules/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Rule updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic rules update <rule-id> '{\"description\":\"Updated rule\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic rules update <rule-id> @rule.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat rule.json | geonic rules update <rule-id>\",\n },\n ]);\n\n // rules delete\n const del = rules\n .command(\"delete <id>\")\n .description(\"Delete a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/rules/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Rule deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a rule\",\n command: \"geonic rules delete <rule-id>\",\n },\n ]);\n\n // rules activate\n const activate = rules\n .command(\"activate <id>\")\n .description(\"Activate a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/rules/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Rule activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a rule\",\n command: \"geonic rules activate <rule-id>\",\n },\n ]);\n\n // rules deactivate\n const deactivate = rules\n .command(\"deactivate <id>\")\n .description(\"Deactivate a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/rules/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Rule deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a rule\",\n command: \"geonic rules deactivate <rule-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerModelsCommand(program: Command): void {\n const models = program\n .command(\"custom-data-models\")\n .alias(\"models\")\n .description(\"Manage custom data models\");\n\n // models list\n const list = models\n .command(\"list\")\n .description(\"List all models\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/custom-data-models\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all models\",\n command: \"geonic models list\",\n },\n ]);\n\n // models get\n const get = models\n .command(\"get <id>\")\n .description(\"Get a model by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific model\",\n command: \"geonic models get <model-id>\",\n },\n ]);\n\n // models create\n const create = models\n .command(\"create [json]\")\n .description(\n \"Create a new model\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"type\": \"Sensor\",\\n' +\n ' \"domain\": \"iot\",\\n' +\n ' \"description\": \"IoT Sensor\",\\n' +\n ' \"propertyDetails\": {\\n' +\n ' \"temperature\": {\"ngsiType\": \"Property\", \"valueType\": \"Number\", \"example\": 25}\\n' +\n \" }\\n\" +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/custom-data-models\", { body });\n outputResponse(response, format);\n printSuccess(\"Model created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic models create '{\"type\":\"Sensor\",\"domain\":\"iot\",\"description\":\"IoT Sensor\",\"propertyDetails\":{\"temperature\":{\"ngsiType\":\"Property\",\"valueType\":\"Number\",\"example\":25}}}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic models create @model.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat model.json | geonic models create\",\n },\n ]);\n\n // models update\n const update = models\n .command(\"update <id> [json]\")\n .description(\n \"Update a model\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated model\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Model updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic models update <model-id> '{\"description\":\"Updated description\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic models update <model-id> @model.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat model.json | geonic models update <model-id>\",\n },\n ]);\n\n // models delete\n const del = models\n .command(\"delete <id>\")\n .description(\"Delete a model\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Model deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a model\",\n command: \"geonic models delete <model-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerCatalogCommand(program: Command): void {\n const catalog = program\n .command(\"catalog\")\n .description(\"Browse DCAT-AP catalog\");\n\n // catalog get\n const get = catalog\n .command(\"get\")\n .description(\"Get the catalog\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/catalog\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get the DCAT-AP catalog\",\n command: \"geonic catalog get\",\n },\n ]);\n\n // catalog datasets\n const datasets = catalog\n .command(\"datasets\")\n .description(\"Manage catalog datasets\");\n\n // catalog datasets list\n const datasetsList = datasets\n .command(\"list\")\n .description(\"List all datasets\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/catalog/datasets\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsList, [\n {\n description: \"List all catalog datasets\",\n command: \"geonic catalog datasets list\",\n },\n ]);\n\n // catalog datasets get\n const datasetsGet = datasets\n .command(\"get <id>\")\n .description(\"Get a dataset by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/catalog/datasets/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsGet, [\n {\n description: \"Get a specific dataset\",\n command: \"geonic catalog datasets get <dataset-id>\",\n },\n ]);\n\n // catalog datasets sample\n const datasetsSample = datasets\n .command(\"sample <id>\")\n .description(\"Get sample data for a dataset\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/catalog/datasets/${encodeURIComponent(String(id))}/sample`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsSample, [\n {\n description: \"Get sample data for a dataset\",\n command: \"geonic catalog datasets sample <dataset-id>\",\n },\n ]);\n}\n","import { createRequire } from \"node:module\";\nimport type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { printInfo } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerHealthCommand(program: Command): void {\n const health = program\n .command(\"health\")\n .description(\"Check the health status of the server\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.rawRequest(\"GET\", \"/health\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(health, [\n {\n description: \"Check server health\",\n command: \"geonic health\",\n },\n ]);\n}\n\nexport function registerVersionCommand(program: Command): void {\n const version = program\n .command(\"version\")\n .description(\"Display CLI and server version information\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version: string };\n const cliVersion = pkg.version;\n\n printInfo(`CLI version: ${cliVersion}`);\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.rawRequest(\"GET\", \"/version\");\n printInfo(\"Server version:\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(version, [\n {\n description: \"Show CLI and server version\",\n command: \"geonic version\",\n },\n ]);\n}\n","import { createRequire } from \"node:module\";\nimport type { Command, Option } from \"commander\";\nimport { addExamples } from \"./help.js\";\n\nfunction findOption(\n cmd: Command,\n program: Command,\n flag: string,\n): Option | undefined {\n return (\n cmd.options.find((o) => o.long === flag || o.short === flag) ||\n program.options.find((o) => o.long === flag || o.short === flag)\n );\n}\n\nfunction optionTakesValue(\n cmd: Command,\n program: Command,\n flag: string,\n): boolean {\n const opt = findOption(cmd, program, flag);\n if (!opt) return false;\n return !!(opt.required || opt.optional);\n}\n\nfunction findSubcommand(cmd: Command, name: string): Command | undefined {\n return cmd.commands.find(\n (c) => c.name() === name || c.aliases().includes(name),\n );\n}\n\nexport function generateCompletions(\n program: Command,\n line: string,\n point: number,\n): string[] {\n const truncated = line.slice(0, point);\n const tokens = truncated.trim().split(/\\s+/).filter(Boolean);\n const startingNewWord = /\\s$/.test(truncated);\n\n // Determine partial input (what the user is currently typing)\n const partial =\n !startingNewWord && tokens.length > 1 ? tokens[tokens.length - 1] : \"\";\n\n // Tokens to walk the command tree (exclude program name and partial)\n const walkTokens = startingNewWord ? tokens.slice(1) : tokens.slice(1, -1);\n\n // Walk the command tree\n let currentCmd = program;\n let i = 0;\n\n while (i < walkTokens.length) {\n const token = walkTokens[i];\n\n if (token.startsWith(\"-\")) {\n if (optionTakesValue(currentCmd, program, token)) {\n i += 2; // skip option + its value\n } else {\n i += 1;\n }\n continue;\n }\n\n const sub = findSubcommand(currentCmd, token);\n if (sub) {\n currentCmd = sub;\n }\n i++;\n }\n\n // Special handling: `help` command mirrors the main command tree for completions\n if (currentCmd.name() === \"help\" && currentCmd.parent === program) {\n const helpIdx = walkTokens.indexOf(\"help\");\n const rawArgs = walkTokens.slice(helpIdx + 1);\n const helpArgs: string[] = [];\n for (let j = 0; j < rawArgs.length; j++) {\n const t = rawArgs[j];\n if (t.startsWith(\"-\")) {\n if (optionTakesValue(currentCmd, program, t)) {\n j++; // skip the option's value\n }\n continue;\n }\n helpArgs.push(t);\n }\n\n let target = program;\n for (const arg of helpArgs) {\n const sub = findSubcommand(target, arg);\n if (sub) target = sub;\n else break;\n }\n\n const subs = target.commands\n .filter((c) => !(c as { _hidden?: boolean })._hidden)\n .map((c) => c.name());\n return subs.filter((s) => s.startsWith(partial));\n }\n\n // Determine predecessor token (immediately before the completion point)\n const predecessor = startingNewWord\n ? tokens[tokens.length - 1]\n : tokens.length >= 2\n ? tokens[tokens.length - 2]\n : undefined;\n\n // Case 1: Previous token is a value-taking option → complete option values\n if (\n predecessor &&\n predecessor.startsWith(\"-\") &&\n optionTakesValue(currentCmd, program, predecessor)\n ) {\n return getOptionValueCompletions(predecessor, partial);\n }\n\n // Case 2: Partial starts with '-' → complete options\n if (partial.startsWith(\"-\")) {\n return getOptionCompletions(currentCmd, program, partial);\n }\n\n // Case 3: Current command has non-hidden subcommands → complete them\n const subcommands = currentCmd.commands\n .filter((c) => !(c as { _hidden?: boolean })._hidden)\n .map((c) => c.name());\n\n if (subcommands.length > 0) {\n return subcommands.filter((s) => s.startsWith(partial));\n }\n\n // Case 4: Command takes file arguments → signal <file>\n for (const arg of currentCmd.registeredArguments) {\n if (arg.description && arg.description.includes(\"@file\")) {\n return [\"<file>\"];\n }\n }\n\n return [];\n}\n\nfunction getOptionCompletions(\n cmd: Command,\n program: Command,\n partial: string,\n): string[] {\n const options = new Set<string>();\n\n for (const opt of cmd.options) {\n if (opt.hidden) continue;\n if (opt.long) options.add(opt.long);\n }\n\n for (const opt of program.options) {\n if (opt.hidden) continue;\n if (opt.long) options.add(opt.long);\n }\n\n return [...options].filter((o) => o.startsWith(partial));\n}\n\nfunction getOptionValueCompletions(\n optionFlag: string,\n partial: string,\n): string[] {\n if (optionFlag === \"--format\" || optionFlag === \"-f\") {\n return [\"json\", \"table\", \"geojson\"].filter((v) =>\n v.startsWith(partial),\n );\n }\n return [];\n}\n\nconst ZSH_SCRIPT = `_geonic_completions() {\n local completions\n completions=(\\${(f)\"$(geonic cli completions --line=\"$BUFFER\" --point=\"$CURSOR\" 2>/dev/null)\"})\n if [[ \"\\${completions[1]}\" == \"<file>\" ]]; then\n _files\n return\n fi\n compadd -a completions\n}\ncompdef _geonic_completions geonic`;\n\nconst BASH_SCRIPT = `_geonic_completions() {\n local cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n local completions\n completions=$(geonic cli completions --line=\"\\${COMP_LINE}\" --point=\"\\${COMP_POINT}\" 2>/dev/null)\n if [[ \"$completions\" == \"<file>\" ]]; then\n COMPREPLY=()\n return\n fi\n COMPREPLY=($(compgen -W \"$completions\" -- \"$cur\"))\n}\ncomplete -o default -F _geonic_completions geonic`;\n\nexport function registerCliCommand(program: Command): void {\n const cli = program\n .command(\"cli\")\n .summary(\"Manage CLI internals\")\n .description(\"Manage CLI internals such as shell completions.\");\n\n const completions = cli\n .command(\"completions\")\n .summary(\"Generate shell completions\")\n .description(\"Generate shell completions for geonic CLI.\")\n .option(\"--line <line>\", \"Current command line content\")\n .option(\"--point <point>\", \"Cursor position in the command line\")\n .action((opts: { line?: string; point?: string }) => {\n if (opts.line !== undefined && opts.point !== undefined) {\n const point = parseInt(opts.point, 10);\n const results = generateCompletions(program, opts.line, point);\n for (const r of results) {\n console.log(r);\n }\n }\n });\n\n const bash = completions\n .command(\"bash\")\n .description(\"Output bash completion script\")\n .action(() => {\n console.log(BASH_SCRIPT);\n });\n\n addExamples(bash, [\n {\n description: \"Print the bash completion script\",\n command: \"geonic cli completions bash\",\n },\n {\n description: \"Enable in current shell session\",\n command: 'eval \"$(geonic cli completions bash)\"',\n },\n {\n description: \"Persist in ~/.bashrc\",\n command:\n 'echo \\'eval \"$(geonic cli completions bash)\"\\' >> ~/.bashrc',\n },\n ]);\n\n const zsh = completions\n .command(\"zsh\")\n .description(\"Output zsh completion script\")\n .action(() => {\n console.log(ZSH_SCRIPT);\n });\n\n addExamples(zsh, [\n {\n description: \"Print the zsh completion script\",\n command: \"geonic cli completions zsh\",\n },\n {\n description: \"Enable in current shell session\",\n command: 'eval \"$(geonic cli completions zsh)\"',\n },\n {\n description: \"Persist in ~/.zshrc\",\n command:\n 'echo \\'eval \"$(geonic cli completions zsh)\"\\' >> ~/.zshrc',\n },\n ]);\n\n const version = cli\n .command(\"version\")\n .description(\"Display the CLI version\")\n .action(() => {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version: string };\n console.log(pkg.version);\n });\n\n addExamples(version, [\n {\n description: \"Show CLI version\",\n command: \"geonic cli version\",\n },\n ]);\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { getConfigDir, ensureConfigDir } from \"./config.js\";\n\nconst PACKAGE_NAME = \"@geolonia/geonicdb-cli\";\nconst REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst FETCH_TIMEOUT_MS = 5000;\n\ninterface UpdateCache {\n lastCheck: number;\n latestVersion?: string;\n}\n\nexport interface UpdateCheckResult {\n currentVersion: string;\n latestVersion: string;\n}\n\nconst CI_ENV_VARS = [\n \"CI\",\n \"CONTINUOUS_INTEGRATION\",\n \"BUILD_NUMBER\",\n \"GITHUB_ACTIONS\",\n \"GITLAB_CI\",\n \"CIRCLECI\",\n \"JENKINS_URL\",\n \"HUDSON_URL\",\n \"TRAVIS\",\n];\n\nfunction getCacheFile(): string {\n return join(getConfigDir(), \"update-check.json\");\n}\n\nfunction isCheckDisabled(): boolean {\n if (process.env.NO_UPDATE_NOTIFIER) return true;\n if (!process.stdout.isTTY) return true;\n for (const envVar of CI_ENV_VARS) {\n if (process.env[envVar]) return true;\n }\n return false;\n}\n\nfunction loadCache(): UpdateCache | null {\n try {\n const raw = readFileSync(getCacheFile(), \"utf-8\");\n return JSON.parse(raw) as UpdateCache;\n } catch {\n return null;\n }\n}\n\nfunction saveCache(cache: UpdateCache): void {\n try {\n ensureConfigDir();\n writeFileSync(getCacheFile(), JSON.stringify(cache), \"utf-8\");\n } catch {\n /* v8 ignore next -- defensive: write errors silently ignored */\n }\n}\n\nfunction shouldCheck(cache: UpdateCache | null): boolean {\n if (!cache) return true;\n return Date.now() - cache.lastCheck >= CHECK_INTERVAL_MS;\n}\n\nexport function compareSemver(current: string, latest: string): boolean {\n const parse = (v: string) =>\n v.replace(/^v/, \"\").split(\".\").map(Number) as [number, number, number];\n const [cMajor, cMinor, cPatch] = parse(current);\n const [lMajor, lMinor, lPatch] = parse(latest);\n if (lMajor !== cMajor) return lMajor > cMajor;\n if (lMinor !== cMinor) return lMinor > cMinor;\n return lPatch > cPatch;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const res = await fetch(REGISTRY_URL, {\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\n/* v8 ignore next 3 -- fallback for bundled builds where package.json is unavailable */\nfunction getCurrentVersion(): string {\n return process.env.npm_package_version ?? \"0.0.0\";\n}\n\nexport function formatUpdateBox(current: string, latest: string): string {\n const message = `Update available: ${current} → ${latest}`;\n const install = `Run ${chalk.cyan(`npm i -g ${PACKAGE_NAME}`)} to update`;\n const lines = [message, install];\n const maxLen = Math.max(\n ...lines.map((l) => stripAnsi(l).length),\n );\n const pad = (line: string) => {\n const visible = stripAnsi(line).length;\n return line + \" \".repeat(maxLen - visible);\n };\n const empty = \" \".repeat(maxLen);\n const top = `╭${\"─\".repeat(maxLen + 4)}╮`;\n const bottom = `╰${\"─\".repeat(maxLen + 4)}╯`;\n const boxLines = [\n top,\n `│ ${empty} │`,\n ...lines.map((l) => `│ ${pad(l)} │`),\n `│ ${empty} │`,\n bottom,\n ];\n return chalk.yellow(boxLines.join(\"\\n\"));\n}\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n}\n\nexport async function startUpdateCheck(): Promise<UpdateCheckResult | null> {\n if (isCheckDisabled()) return null;\n\n let currentVersion: string;\n try {\n const pkgPath = new URL(\"../package.json\", import.meta.url);\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as {\n version: string;\n };\n currentVersion = pkg.version;\n /* v8 ignore start -- fallback for bundled builds */\n } catch {\n currentVersion = getCurrentVersion();\n }\n /* v8 ignore stop */\n\n const cache = loadCache();\n\n if (!shouldCheck(cache)) {\n if (cache?.latestVersion && compareSemver(currentVersion, cache.latestVersion)) {\n return { currentVersion, latestVersion: cache.latestVersion };\n }\n return null;\n }\n\n const latestVersion = await fetchLatestVersion();\n\n saveCache({\n lastCheck: Date.now(),\n latestVersion: latestVersion ?? cache?.latestVersion,\n });\n\n if (latestVersion && compareSemver(currentVersion, latestVersion)) {\n return { currentVersion, latestVersion };\n }\n\n return null;\n}\n\nexport function printUpdateNotification(result: UpdateCheckResult | null): void {\n if (!result) return;\n const box = formatUpdateBox(result.currentVersion, result.latestVersion);\n process.stderr.write(\"\\n\" + box + \"\\n\");\n}\n","import { createProgram } from \"./cli.js\";\nimport { startUpdateCheck, printUpdateNotification } from \"./update-notifier.js\";\n\nconst updateCheckPromise = startUpdateCheck();\nconst program = createProgram();\nawait program.parseAsync();\nconst updateResult = await updateCheckPromise;\nprintUpdateNotification(updateResult);\n"],"mappings":"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","names":["createRequire","Command","header","chalk","program","program","onData","onError","readFileSync","createInterface","config","program","program","program","program","program","program","program","program","program","program","program","program","program","program","require","createRequire","program","require","createRequire","require","createRequire","program","Command","readFileSync","writeFileSync","join","chalk","join","readFileSync","writeFileSync","chalk"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/config.ts","../src/output.ts","../src/commands/help.ts","../src/commands/config.ts","../src/commands/auth.ts","../src/oauth.ts","../src/client.ts","../src/helpers.ts","../src/prompt.ts","../src/token.ts","../src/input.ts","../src/commands/me-oauth-clients.ts","../src/commands/me-api-keys.ts","../src/commands/profile.ts","../src/commands/attrs.ts","../src/commands/entities.ts","../src/commands/batch.ts","../src/commands/subscriptions.ts","../src/commands/registrations.ts","../src/commands/types.ts","../src/commands/temporal.ts","../src/commands/snapshots.ts","../src/commands/admin/tenants.ts","../src/commands/admin/users.ts","../src/commands/admin/policies.ts","../src/commands/admin/oauth-clients.ts","../src/commands/admin/api-keys.ts","../src/commands/admin/index.ts","../src/commands/rules.ts","../src/commands/models.ts","../src/commands/catalog.ts","../src/commands/health.ts","../src/commands/cli.ts","../src/update-notifier.ts","../src/index.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { Command } from \"commander\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerProfileCommands } from \"./commands/profile.js\";\nimport { registerEntitiesCommand } from \"./commands/entities.js\";\nimport { registerBatchCommand } from \"./commands/batch.js\";\nimport { registerSubscriptionsCommand } from \"./commands/subscriptions.js\";\nimport { registerRegistrationsCommand } from \"./commands/registrations.js\";\nimport { registerTypesCommand } from \"./commands/types.js\";\nimport { registerTemporalCommand } from \"./commands/temporal.js\";\nimport { registerSnapshotsCommand } from \"./commands/snapshots.js\";\nimport { registerAdminCommand } from \"./commands/admin/index.js\";\nimport { registerRulesCommand } from \"./commands/rules.js\";\nimport { registerModelsCommand } from \"./commands/models.js\";\nimport { registerCatalogCommand } from \"./commands/catalog.js\";\nimport { registerHealthCommand, registerVersionCommand } from \"./commands/health.js\";\nimport { registerHelpCommand } from \"./commands/help.js\";\nimport { registerCliCommand } from \"./commands/cli.js\";\nimport { addAttrsSubcommands } from \"./commands/attrs.js\";\n\nexport function createProgram(): Command {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { description: string };\n const program = new Command();\n\n program\n .name(\"geonic\")\n .description(pkg.description)\n .option(\"-u, --url <url>\", \"Base URL of the GeonicDB server\")\n .option(\"-s, --service <name>\", \"NGSILD-Tenant header\")\n .option(\"--token <token>\", \"Authentication token\")\n .option(\"-p, --profile <name>\", \"Use a named profile\")\n .option(\"--api-key <key>\", \"API key for authentication\")\n .option(\"-f, --format <fmt>\", \"Output format: json, table, geojson\")\n .option(\"--no-color\", \"Disable color output\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .option(\"--dry-run\", \"Print the equivalent curl command without executing\");\n\n registerHelpCommand(program);\n registerConfigCommand(program);\n registerAuthCommands(program);\n registerProfileCommands(program);\n registerEntitiesCommand(program);\n registerBatchCommand(program);\n registerSubscriptionsCommand(program);\n registerRegistrationsCommand(program);\n registerTypesCommand(program);\n registerTemporalCommand(program);\n registerSnapshotsCommand(program);\n registerAdminCommand(program);\n registerRulesCommand(program);\n registerModelsCommand(program);\n registerCatalogCommand(program);\n registerHealthCommand(program);\n registerVersionCommand(program);\n registerCliCommand(program);\n\n // Backward-compatible hidden 'attrs' command at top level\n const hiddenAttrs = new Command(\"attrs\")\n .description(\"Manage entity attributes\");\n addAttrsSubcommands(hiddenAttrs);\n program.addCommand(hiddenAttrs, { hidden: true });\n\n return program;\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { GdbConfig, GdbConfigFile } from \"./types.js\";\n\nexport function getConfigDir(): string {\n return process.env.GEONIC_CONFIG_DIR ?? join(homedir(), \".config\", \"geonic\");\n}\n\nfunction getConfigFile(): string {\n return join(getConfigDir(), \"config.json\");\n}\n\nexport function ensureConfigDir(): void {\n const dir = getConfigDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nfunction migrateV1ToV2(data: Record<string, unknown>): GdbConfigFile {\n const profile: GdbConfig = {};\n const knownKeys = [\n \"url\",\n \"service\",\n \"token\",\n \"refreshToken\",\n \"format\",\n \"apiKey\",\n ];\n for (const key of knownKeys) {\n if (key in data) {\n (profile as Record<string, unknown>)[key] = data[key];\n }\n }\n return {\n version: 2,\n currentProfile: \"default\",\n profiles: { default: profile },\n };\n}\n\nfunction isGdbConfigFile(value: unknown): value is GdbConfigFile {\n /* v8 ignore next -- loadConfigFile always passes an object with version key */\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n v.version === 2 &&\n typeof v.currentProfile === \"string\" &&\n typeof v.profiles === \"object\" &&\n v.profiles !== null\n );\n}\n\nfunction defaultConfig(): GdbConfigFile {\n return { version: 2, currentProfile: \"default\", profiles: { default: {} } };\n}\n\nexport function loadConfigFile(): GdbConfigFile {\n try {\n const raw = readFileSync(getConfigFile(), \"utf-8\");\n const data = JSON.parse(raw) as Record<string, unknown>;\n\n if (!(\"version\" in data)) {\n const migrated = migrateV1ToV2(data);\n saveConfigFile(migrated);\n return migrated;\n }\n\n if (!isGdbConfigFile(data)) {\n return defaultConfig();\n }\n\n return data;\n } catch {\n return defaultConfig();\n }\n}\n\nexport function saveConfigFile(configFile: GdbConfigFile): void {\n ensureConfigDir();\n writeFileSync(getConfigFile(), JSON.stringify(configFile, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function loadConfig(profileName?: string): GdbConfig {\n const configFile = loadConfigFile();\n const name = profileName ?? configFile.currentProfile;\n return configFile.profiles[name] ?? {};\n}\n\nexport function saveConfig(config: GdbConfig, profileName?: string): void {\n const configFile = loadConfigFile();\n const name = profileName ?? configFile.currentProfile;\n configFile.profiles[name] = config;\n saveConfigFile(configFile);\n}\n\nexport function getConfigValue(key: string, profileName?: string): unknown {\n const config = loadConfig(profileName);\n return config[key as keyof GdbConfig];\n}\n\nexport function validateUrl(url: string): string {\n url = url.trim();\n if (!url) {\n throw new Error(\"URL must not be empty.\");\n }\n if (!/^https?:\\/\\//i.test(url)) {\n throw new Error(`Invalid URL: \"${url}\". URL must start with http:// or https://.`);\n }\n try {\n new URL(url);\n } catch {\n throw new Error(`Invalid URL: \"${url}\".`);\n }\n return url.replace(/\\/+$/, \"\") + \"/\";\n}\n\nexport function setConfigValue(key: string, value: string, profileName?: string): void {\n const config = loadConfig(profileName);\n if (key === \"url\") {\n value = validateUrl(value);\n }\n (config as Record<string, unknown>)[key] = value;\n saveConfig(config, profileName);\n}\n\nexport function deleteConfigValue(key: string, profileName?: string): void {\n const config = loadConfig(profileName);\n delete (config as Record<string, unknown>)[key];\n saveConfig(config, profileName);\n}\n\nexport function getConfigPath(): string {\n return getConfigFile();\n}\n\nexport function listProfiles(): { name: string; active: boolean }[] {\n const configFile = loadConfigFile();\n return Object.keys(configFile.profiles).map((name) => ({\n name,\n active: name === configFile.currentProfile,\n }));\n}\n\nexport function getCurrentProfile(): string {\n return loadConfigFile().currentProfile;\n}\n\nexport function setCurrentProfile(name: string): void {\n const configFile = loadConfigFile();\n if (!(name in configFile.profiles)) {\n throw new Error(`Profile \"${name}\" does not exist.`);\n }\n configFile.currentProfile = name;\n saveConfigFile(configFile);\n}\n\nexport function createProfile(name: string): void {\n const configFile = loadConfigFile();\n if (name in configFile.profiles) {\n throw new Error(`Profile \"${name}\" already exists.`);\n }\n configFile.profiles[name] = {};\n saveConfigFile(configFile);\n}\n\nexport function deleteProfile(name: string): void {\n if (name === \"default\") {\n throw new Error('Cannot delete the \"default\" profile.');\n }\n const configFile = loadConfigFile();\n if (!(name in configFile.profiles)) {\n throw new Error(`Profile \"${name}\" does not exist.`);\n }\n delete configFile.profiles[name];\n if (configFile.currentProfile === name) {\n configFile.currentProfile = \"default\";\n }\n saveConfigFile(configFile);\n}\n","import chalk from \"chalk\";\nimport type { OutputFormat } from \"./types.js\";\n\nexport function formatOutput(data: unknown, format: OutputFormat): string {\n switch (format) {\n case \"json\":\n return JSON.stringify(data, null, 2);\n case \"table\":\n return formatTable(data);\n case \"geojson\":\n return JSON.stringify(toGeoJSON(data), null, 2);\n default:\n return JSON.stringify(data, null, 2);\n }\n}\n\nexport function printOutput(data: unknown, format: OutputFormat): void {\n console.log(formatOutput(data, format));\n}\n\nexport function printSuccess(message: string): void {\n console.log(chalk.green(message));\n}\n\nexport function printError(message: string): void {\n console.error(chalk.red(`Error: ${message}`));\n}\n\nexport function printInfo(message: string): void {\n console.log(chalk.cyan(message));\n}\n\nexport function printWarning(message: string): void {\n console.error(chalk.yellow(message));\n}\n\nexport function printCount(count: number): void {\n console.log(chalk.dim(`Count: ${count}`));\n}\n\nfunction formatTable(data: unknown): string {\n if (!Array.isArray(data)) {\n if (typeof data === \"object\" && data !== null) {\n return formatObjectTable(data as Record<string, unknown>);\n }\n return String(data);\n }\n\n if (data.length === 0) return \"(empty)\";\n\n const items = data as Record<string, unknown>[];\n const keys = collectKeys(items);\n\n const widths = new Map<string, number>();\n for (const key of keys) {\n widths.set(key, key.length);\n }\n for (const item of items) {\n for (const key of keys) {\n const val = cellValue(item[key]);\n widths.set(key, Math.max(widths.get(key)!, val.length));\n }\n }\n\n const header = keys.map((k) => chalk.bold(k.padEnd(widths.get(k)!))).join(\" \");\n const separator = keys.map((k) => \"─\".repeat(widths.get(k)!)).join(\"──\");\n const rows = items.map((item) =>\n keys.map((k) => cellValue(item[k]).padEnd(widths.get(k)!)).join(\" \"),\n );\n\n return [header, separator, ...rows].join(\"\\n\");\n}\n\nfunction formatObjectTable(obj: Record<string, unknown>): string {\n const entries = Object.entries(obj);\n if (entries.length === 0) return \"(empty)\";\n\n const keyWidth = Math.max(...entries.map(([k]) => k.length));\n return entries.map(([k, v]) => `${chalk.bold(k.padEnd(keyWidth))} ${cellValue(v)}`).join(\"\\n\");\n}\n\nfunction collectKeys(items: Record<string, unknown>[]): string[] {\n const priority = [\"id\", \"type\"];\n const keySet = new Set<string>();\n for (const item of items) {\n for (const key of Object.keys(item)) {\n keySet.add(key);\n }\n }\n const sorted: string[] = [];\n for (const p of priority) {\n if (keySet.has(p)) {\n sorted.push(p);\n keySet.delete(p);\n }\n }\n sorted.push(...Array.from(keySet).sort());\n return sorted;\n}\n\nfunction formatGeoJSON(geo: Record<string, unknown>): string {\n const geoType = String(geo.type);\n const coords = geo.coordinates;\n if (geoType === \"Point\" && Array.isArray(coords) && coords.length >= 2) {\n return `Point(${Number(coords[0]).toFixed(2)}, ${Number(coords[1]).toFixed(2)})`;\n }\n if (Array.isArray(coords)) {\n const count = geoType === \"Polygon\"\n ? (Array.isArray(coords[0]) ? (coords[0] as unknown[]).length : 0)\n : coords.length;\n return `${geoType}(${count} coords)`;\n }\n return `${geoType}(...)`;\n}\n\nfunction isGeoJSON(v: unknown): boolean {\n if (typeof v !== \"object\" || v === null) return false;\n const o = v as Record<string, unknown>;\n return typeof o.type === \"string\" && \"coordinates\" in o;\n}\n\nfunction cellValue(val: unknown): string {\n if (val === undefined || val === null) return \"\";\n if (typeof val !== \"object\") return String(val);\n const obj = val as Record<string, unknown>;\n if (isGeoJSON(obj)) return formatGeoJSON(obj);\n if (\"value\" in obj) {\n const v = obj.value;\n if (isGeoJSON(v)) return formatGeoJSON(v as Record<string, unknown>);\n return String(v);\n }\n return JSON.stringify(val);\n}\n\nfunction toGeoJSON(data: unknown): unknown {\n if (Array.isArray(data)) {\n return {\n type: \"FeatureCollection\",\n features: data.map(entityToFeature),\n };\n }\n return entityToFeature(data);\n}\n\nfunction entityToFeature(entity: unknown): unknown {\n if (typeof entity !== \"object\" || entity === null) {\n return { type: \"Feature\", geometry: null, properties: entity };\n }\n\n const obj = entity as Record<string, unknown>;\n let geometry = null;\n\n if (obj.location) {\n const loc = obj.location as Record<string, unknown>;\n geometry = loc.value ?? loc;\n }\n\n const properties: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"location\") continue;\n if (typeof value === \"object\" && value !== null && \"value\" in (value as object)) {\n properties[key] = (value as Record<string, unknown>).value;\n } else {\n properties[key] = value;\n }\n }\n\n return { type: \"Feature\", geometry, properties };\n}\n","import chalk from \"chalk\";\nimport type { Command, Help, Option } from \"commander\";\n\ninterface Example {\n description: string;\n command: string;\n}\n\nconst examplesMap = new WeakMap<Command, Example[]>();\nconst notesMap = new WeakMap<Command, string[]>();\n\nexport function addExamples(cmd: Command, examples: Example[]): void {\n examplesMap.set(cmd, examples);\n}\n\nexport function addNotes(cmd: Command, notes: string[]): void {\n notesMap.set(cmd, notes);\n}\n\nfunction header(title: string): string {\n return chalk.yellow.bold(title);\n}\n\nfunction findCommand(parent: Command, name: string): Command | undefined {\n return parent.commands.find(\n (c) => c.name() === name || c.aliases().includes(name),\n );\n}\n\nfunction getCommandPath(cmd: Command): string {\n const parts: string[] = [];\n let current: Command | null = cmd;\n while (current) {\n parts.unshift(current.name());\n current = current.parent;\n }\n return parts.join(\" \");\n}\n\nfunction getRootProgram(cmd: Command): Command {\n let root = cmd;\n while (root.parent) {\n root = root.parent;\n }\n return root;\n}\n\nfunction formatOptionSynopsis(opt: Option): string {\n /* v8 ignore next -- Commander always sets long or short */\n const flag = opt.long || opt.short || \"\";\n if (opt.required) {\n const match = opt.flags.match(/<([^>]+)>/);\n const valueName = match ? match[1] : \"value\";\n return `[${flag}=<${valueName}>]`;\n } else if (opt.optional) {\n const match = opt.flags.match(/\\[([^\\]]+)\\]/);\n const valueName = match ? match[1] : \"value\";\n return `[${flag}[=<${valueName}>]]`;\n }\n return `[${flag}]`;\n}\n\nfunction formatSynopsis(path: string, cmd: Command): string {\n const parts = [path];\n\n for (const arg of cmd.registeredArguments) {\n if (arg.required) {\n parts.push(`<${arg.name()}>`);\n } else {\n parts.push(`[<${arg.name()}>]`);\n }\n }\n\n for (const opt of cmd.options) {\n if (opt.hidden) continue;\n parts.push(formatOptionSynopsis(opt));\n }\n\n return parts.join(\" \");\n}\n\nfunction formatOptionList(options: readonly Option[]): string[] {\n const maxLen = Math.max(...options.map((o) => o.flags.length));\n return options.map((opt) => {\n const flags = opt.flags.padEnd(maxLen + 2);\n /* v8 ignore next -- Commander always sets description to '' */\n return ` ${chalk.green(flags)}${opt.description ?? \"\"}`;\n });\n}\n\nfunction formatGlobalParameters(program: Command): string {\n const lines: string[] = [];\n lines.push(header(\"GLOBAL PARAMETERS\"));\n lines.push(\"\");\n lines.push(...formatOptionList(program.options));\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nexport function formatTopLevelHelp(program: Command): string {\n const lines: string[] = [];\n\n lines.push(header(\"NAME\"));\n lines.push(\"\");\n lines.push(` ${program.name()}`);\n lines.push(\"\");\n lines.push(header(\"DESCRIPTION\"));\n lines.push(\"\");\n lines.push(` ${program.description()}`);\n lines.push(\"\");\n lines.push(header(\"AVAILABLE COMMANDS\"));\n lines.push(\"\");\n\n const commands = program.commands\n .filter((c) => !(c as Command & { _hidden?: boolean })._hidden)\n .slice()\n .sort((a, b) => a.name().localeCompare(b.name()));\n\n const maxLen = Math.max(...commands.map((c) => c.name().length));\n\n for (const cmd of commands) {\n const name = cmd.name().padEnd(maxLen + 2);\n lines.push(` ${chalk.green(name)}${cmd.summary() || cmd.description()}`);\n }\n\n lines.push(\"\");\n lines.push(formatGlobalParameters(program));\n\n return lines.join(\"\\n\");\n}\n\nexport function formatCommandDetails(\n program: Command,\n cmd: Command,\n path: string,\n): string {\n const lines: string[] = [];\n\n // NAME\n lines.push(header(\"NAME\"));\n lines.push(\"\");\n const aliases = cmd.aliases().filter((a) => a.length > 0);\n if (aliases.length > 0) {\n lines.push(` ${path} ${chalk.dim(`(alias: ${aliases.join(\", \")})`)}`);\n } else {\n lines.push(` ${path}`);\n }\n\n // DESCRIPTION\n lines.push(\"\");\n lines.push(header(\"DESCRIPTION\"));\n lines.push(\"\");\n for (const descLine of cmd.description().split(\"\\n\")) {\n lines.push(` ${descLine}`);\n }\n\n const subcommands = cmd.commands.filter(\n (c) => !(c as Command & { _hidden?: boolean })._hidden,\n );\n\n if (subcommands.length > 0) {\n // Command group with subcommands\n lines.push(\"\");\n lines.push(header(\"SYNOPSIS\"));\n lines.push(\"\");\n lines.push(` ${path} <command>`);\n lines.push(\"\");\n lines.push(header(\"SUBCOMMANDS\"));\n lines.push(\"\");\n\n const maxLen = Math.max(...subcommands.map((c) => c.name().length));\n for (const sub of subcommands) {\n const name = sub.name().padEnd(maxLen + 2);\n lines.push(` ${chalk.green(name)}${sub.summary() || sub.description()}`);\n }\n } else {\n // Leaf command\n lines.push(\"\");\n lines.push(header(\"SYNOPSIS\"));\n lines.push(\"\");\n lines.push(` ${formatSynopsis(path, cmd)}`);\n\n const options = cmd.options.filter((o) => !o.hidden);\n if (options.length > 0) {\n lines.push(\"\");\n lines.push(header(\"OPTIONS\"));\n lines.push(\"\");\n lines.push(...formatOptionList(options));\n }\n }\n\n // EXAMPLES\n const examples = examplesMap.get(cmd);\n if (examples && examples.length > 0) {\n lines.push(\"\");\n lines.push(header(\"EXAMPLES\"));\n lines.push(\"\");\n for (const ex of examples) {\n lines.push(` ${ex.description}:`);\n lines.push(` $ ${ex.command}`);\n lines.push(\"\");\n }\n }\n\n // NOTES\n const notes = notesMap.get(cmd);\n if (notes && notes.length > 0) {\n lines.push(\"\");\n lines.push(header(\"NOTES\"));\n lines.push(\"\");\n for (const note of notes) {\n lines.push(` ${note}`);\n }\n }\n\n // GLOBAL PARAMETERS\n lines.push(\"\");\n lines.push(formatGlobalParameters(program));\n\n return lines.join(\"\\n\");\n}\n\nfunction showHelp(program: Command, args: string[]): void {\n if (args.length === 0) {\n console.log(formatTopLevelHelp(program));\n return;\n }\n\n let current = program;\n const resolved: Command[] = [];\n\n for (let i = 0; i < args.length; i++) {\n const found = findCommand(current, args[i]);\n if (!found) {\n const attempted = args.slice(0, i + 1).join(\" \");\n console.error(\n chalk.red(`Error: '${attempted}' is not a geonic command.`),\n );\n console.error(`\\nSee 'geonic help' for available commands.`);\n process.exit(1);\n }\n resolved.push(found);\n current = found;\n }\n\n const target = resolved[resolved.length - 1];\n const path = [program.name(), ...resolved.map((c) => c.name())].join(\" \");\n\n console.log(formatCommandDetails(program, target, path));\n}\n\nexport function registerHelpCommand(program: Command): void {\n // Disable Commander's built-in help command\n program.addHelpCommand(false);\n\n // Override --help to use our wp-cli style format\n program.configureHelp({\n formatHelp: (cmd: Command, _helper: Help): string => {\n const root = getRootProgram(cmd);\n if (cmd === root) {\n return formatTopLevelHelp(root);\n }\n const path = getCommandPath(cmd);\n return formatCommandDetails(root, cmd, path);\n },\n });\n\n // Register the `help` command\n program\n .command(\"help\")\n .description(\"Get help on a specific command\")\n .argument(\"[args...]\")\n .allowUnknownOption()\n .action((args: string[]) => {\n showHelp(program, args);\n });\n\n // Show help when `geonic` is run with no arguments, or show error for unknown commands\n program.argument(\"[command...]\").action((commands: string[]) => {\n if (commands.length > 0) {\n console.error(\n `geonic: '${commands[0]}' is not a geonic command. See 'geonic help'.`,\n );\n process.exitCode = 1;\n return;\n }\n showHelp(program, []);\n });\n}\n","import type { Command } from \"commander\";\nimport {\n loadConfig,\n getConfigValue,\n setConfigValue,\n deleteConfigValue,\n getConfigPath,\n} from \"../config.js\";\nimport { printOutput, printSuccess, printInfo } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nconst SENSITIVE_CONFIG_KEYS = new Set([\"token\", \"refreshToken\", \"apiKey\"]);\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"Manage CLI configuration\");\n\n const set = config\n .command(\"set\")\n .description(\"Save a config value\")\n .argument(\n \"<key>\",\n \"Configuration key (url, service, token, refreshToken, format, apiKey)\",\n )\n .argument(\"<value>\", \"Configuration value\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const value = args[1] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n setConfigValue(key, value, profile);\n const display = SENSITIVE_CONFIG_KEYS.has(key) ? \"***\" : value;\n printSuccess(`Set ${key} = ${display}`);\n });\n\n addExamples(set, [\n {\n description: \"Set server URL\",\n command: \"geonic config set url https://api.example.com\",\n },\n {\n description: \"Set tenant (NGSILD-Tenant header)\",\n command: \"geonic config set service my-tenant\",\n },\n {\n description: \"Set authentication token\",\n command: \"geonic config set token eyJhbGciOi...\",\n },\n {\n description: \"Set API key\",\n command: \"geonic config set apiKey your-api-key\",\n },\n {\n description: \"Set default output format\",\n command: \"geonic config set format table\",\n },\n {\n description: \"Set config for a specific profile\",\n command:\n \"geonic config set url https://staging.example.com --profile staging\",\n },\n ]);\n\n const get = config\n .command(\"get\")\n .description(\"Get a config value\")\n .argument(\"<key>\", \"Configuration key\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n const value = getConfigValue(key, profile);\n if (value === undefined) {\n printInfo(`Key \"${key}\" is not set.`);\n } else {\n printOutput(value, \"json\");\n }\n });\n\n addExamples(get, [\n {\n description: \"Get server URL\",\n command: \"geonic config get url\",\n },\n {\n description: \"Get config value for a specific profile\",\n command: \"geonic config get url --profile staging\",\n },\n ]);\n\n const list = config\n .command(\"list\")\n .description(\"List all config values\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n const all = loadConfig(profile);\n if (Object.keys(all).length === 0) {\n printInfo(`No configuration set. Config path: ${getConfigPath()}`);\n } else {\n printOutput(all, \"json\");\n }\n });\n\n addExamples(list, [\n {\n description: \"List all configuration values\",\n command: \"geonic config list\",\n },\n ]);\n\n const del = config\n .command(\"delete\")\n .description(\"Delete a config value\")\n .argument(\"<key>\", \"Configuration key\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n deleteConfigValue(key, profile);\n printSuccess(`Deleted key \"${key}\".`);\n });\n\n addExamples(del, [\n {\n description: \"Delete a config value\",\n command: \"geonic config delete url\",\n },\n ]);\n}\n","import { createHash } from \"node:crypto\";\nimport { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n resolveOptions,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { loadConfig, saveConfig, getCurrentProfile, validateUrl } from \"../config.js\";\nimport { printSuccess, printError, printInfo, printWarning } from \"../output.js\";\nimport { isInteractive, promptEmail, promptPassword, promptTenantSelection } from \"../prompt.js\";\nimport type { TenantChoice } from \"../prompt.js\";\nimport { getTokenStatus, formatDuration } from \"../token.js\";\nimport { clientCredentialsGrant } from \"../oauth.js\";\nimport { addExamples } from \"./help.js\";\nimport { addMeOAuthClientsSubcommand } from \"./me-oauth-clients.js\";\nimport { addMeApiKeysSubcommand } from \"./me-api-keys.js\";\n\nfunction createLoginCommand(): Command {\n return new Command(\"login\")\n .description(\"Authenticate and save token\")\n .option(\"--client-credentials\", \"Use OAuth 2.0 Client Credentials flow\")\n .option(\"--client-id <id>\", \"OAuth client ID\")\n .option(\"--client-secret <secret>\", \"OAuth client secret\")\n .option(\"--scope <scopes>\", \"OAuth scopes (space-separated)\")\n .option(\"--tenant-id <id>\", \"Tenant ID for scoped authentication\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const loginOpts = cmd.opts() as {\n clientCredentials?: boolean;\n clientId?: string;\n clientSecret?: string;\n scope?: string;\n tenantId?: string;\n };\n const globalOpts = resolveOptions(cmd);\n\n if (loginOpts.clientCredentials) {\n const clientId = loginOpts.clientId ?? process.env.GDB_OAUTH_CLIENT_ID;\n const clientSecret = loginOpts.clientSecret ?? process.env.GDB_OAUTH_CLIENT_SECRET;\n\n if (!clientId || !clientSecret) {\n printError(\n \"Client ID and secret are required. Use --client-id/--client-secret or GDB_OAUTH_CLIENT_ID/GDB_OAUTH_CLIENT_SECRET.\",\n );\n process.exit(1);\n }\n\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n const result = await clientCredentialsGrant({\n baseUrl: globalOpts.url,\n clientId,\n clientSecret,\n scope: loginOpts.scope,\n });\n\n const config = loadConfig(globalOpts.profile);\n config.token = result.access_token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n\n printSuccess(\"Login successful (OAuth Client Credentials). Token saved to config.\");\n return;\n }\n\n // Email/password flow (interactive only)\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n try {\n validateUrl(globalOpts.url);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n\n if (!isInteractive()) {\n printError(\n \"Interactive terminal required. Run `geonic auth login` in a terminal with TTY.\",\n );\n process.exit(1);\n }\n\n const email = await promptEmail();\n const password = await promptPassword();\n\n const client = createClient(cmd);\n const body: Record<string, string> = { email, password };\n if (loginOpts.tenantId) {\n body.tenantId = loginOpts.tenantId;\n }\n\n const response = await client.rawRequest(\"POST\", \"/auth/login\", {\n body,\n skipTenantHeader: true,\n });\n\n const data = response.data as Record<string, unknown>;\n let token = (data.accessToken ?? data.token) as string | undefined;\n let refreshToken = data.refreshToken as string | undefined;\n\n if (!token) {\n printError(\"No token received from server.\");\n process.exit(1);\n }\n\n // Handle multi-tenant: show available tenants and prompt for selection\n const availableTenants = data.availableTenants as TenantChoice[] | undefined;\n const currentTenantId = data.tenantId as string | undefined;\n\n if (availableTenants && availableTenants.length > 1 && !loginOpts.tenantId) {\n const selectedTenantId = await promptTenantSelection(availableTenants, currentTenantId);\n if (selectedTenantId && selectedTenantId !== currentTenantId) {\n // Re-login with selected tenant\n const reloginResponse = await client.rawRequest(\"POST\", \"/auth/login\", {\n body: { email, password, tenantId: selectedTenantId },\n skipTenantHeader: true,\n });\n const reloginData = reloginResponse.data as Record<string, unknown>;\n const newToken = (reloginData.accessToken ?? reloginData.token) as string | undefined;\n if (!newToken) {\n printError(\"Re-login failed: no token received for selected tenant.\");\n process.exit(1);\n }\n token = newToken;\n refreshToken = reloginData.refreshToken as string | undefined;\n }\n }\n\n const config = loadConfig(globalOpts.profile);\n config.token = token;\n if (refreshToken) {\n config.refreshToken = refreshToken;\n } else {\n delete config.refreshToken;\n }\n saveConfig(config, globalOpts.profile);\n\n printSuccess(\"Login successful. Token saved to config.\");\n }),\n );\n}\n\nfunction createLogoutCommand(): Command {\n return new Command(\"logout\")\n .description(\"Clear saved authentication token\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const globalOpts = resolveOptions(cmd);\n const config = loadConfig(globalOpts.profile);\n\n // Try to notify server (best effort)\n if (config.token && globalOpts.url) {\n try {\n const client = createClient(cmd);\n await client.rawRequest(\"POST\", \"/auth/logout\");\n } catch {\n // Ignore errors - token may already be invalid\n }\n }\n\n delete config.token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n printSuccess(\"Logged out. Token cleared from config.\");\n }),\n );\n}\n\nfunction createMeAction() {\n return withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const globalOpts = resolveOptions(cmd);\n\n if (!globalOpts.token && !globalOpts.apiKey) {\n printInfo(\"Not logged in. Use `geonic auth login` to authenticate.\");\n return;\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me\");\n outputResponse(response, format);\n\n // Suppress additional human-readable logs for structured formats\n if (format && format !== \"table\") {\n return;\n }\n\n // Show token expiry if token exists (re-read in case of auto-refresh)\n const latestConfig = loadConfig(globalOpts.profile);\n if (latestConfig.token) {\n const status = getTokenStatus(latestConfig.token);\n if (status.expiresAt) {\n if (status.isExpired) {\n printError(`Token expires: ${status.expiresAt.toISOString()} (expired)`);\n } else if (status.isExpiringSoon) {\n printWarning(\n `Token expires: ${status.expiresAt.toISOString()} (${formatDuration(status.remainingMs!)} remaining)`,\n );\n } else {\n printInfo(\n `Token expires: ${status.expiresAt.toISOString()} (${formatDuration(status.remainingMs!)} remaining)`,\n );\n }\n }\n }\n\n // Show current profile\n const profileName = globalOpts.profile ?? getCurrentProfile();\n printInfo(`Profile: ${profileName}`);\n });\n}\n\nasync function fetchNonce(\n baseUrl: string,\n apiKey: string,\n): Promise<{ nonce: string; challenge: string; difficulty: number }> {\n const origin = new URL(baseUrl).origin;\n const url = new URL(\"/auth/nonce\", baseUrl).toString();\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Origin\": origin,\n },\n body: JSON.stringify({ api_key: apiKey }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Nonce request failed: ${text || `HTTP ${response.status}`}`);\n }\n\n return (await response.json()) as { nonce: string; challenge: string; difficulty: number };\n}\n\nfunction createNonceCommand(): Command {\n return new Command(\"nonce\")\n .description(\"Get a nonce and PoW challenge for API key authentication\")\n .option(\"--api-key <key>\", \"API key to get nonce for\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const nonceOpts = cmd.opts() as { apiKey?: string };\n const globalOpts = resolveOptions(cmd);\n const apiKey = nonceOpts.apiKey ?? globalOpts.apiKey;\n\n if (!apiKey) {\n printError(\"API key is required. Use --api-key or configure it with `geonic config set api-key <key>`.\");\n process.exit(1);\n }\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n const baseUrl = validateUrl(globalOpts.url);\n const data = await fetchNonce(baseUrl, apiKey);\n const format = getFormat(cmd);\n outputResponse({ status: 200, headers: new Headers(), data }, format);\n }),\n );\n}\n\nfunction hasLeadingZeroBits(hash: Buffer, bits: number): boolean {\n const fullBytes = Math.floor(bits / 8);\n const remainingBits = bits % 8;\n for (let i = 0; i < fullBytes; i++) {\n if (hash[i] !== 0) return false;\n }\n if (remainingBits > 0) {\n const mask = 0xff << (8 - remainingBits);\n if ((hash[fullBytes] & mask) !== 0) return false;\n }\n return true;\n}\n\nconst MAX_POW_ITERATIONS = 10_000_000;\n\nfunction solvePoW(challenge: string, difficulty: number): number {\n for (let nonce = 0; nonce < MAX_POW_ITERATIONS; nonce++) {\n const hash = createHash(\"sha256\")\n .update(`${challenge}${nonce}`)\n .digest();\n if (hasLeadingZeroBits(hash, difficulty)) return nonce;\n }\n throw new Error(`PoW could not be solved within ${MAX_POW_ITERATIONS} iterations`);\n}\n\nfunction createTokenExchangeCommand(): Command {\n return new Command(\"token-exchange\")\n .description(\"Exchange API key for a session JWT via nonce + PoW\")\n .option(\"--api-key <key>\", \"API key to exchange\")\n .option(\"--save\", \"Save the obtained token to profile config\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const exchangeOpts = cmd.opts() as { apiKey?: string; save?: boolean };\n const globalOpts = resolveOptions(cmd);\n const apiKey = exchangeOpts.apiKey ?? globalOpts.apiKey;\n\n if (!apiKey) {\n printError(\"API key is required. Use --api-key or configure it with `geonic config set api-key <key>`.\");\n process.exit(1);\n }\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n const baseUrl = validateUrl(globalOpts.url);\n const origin = new URL(baseUrl).origin;\n\n // Step 1: Get nonce\n const nonceData = await fetchNonce(baseUrl, apiKey);\n\n printInfo(`Nonce received. Solving PoW (difficulty=${nonceData.difficulty})...`);\n\n // Step 2: Solve PoW\n const powNonce = solvePoW(nonceData.challenge, nonceData.difficulty);\n\n // Step 3: Exchange for JWT\n const tokenUrl = new URL(\"/oauth/token\", baseUrl).toString();\n const tokenResponse = await fetch(tokenUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Origin\": origin,\n },\n body: JSON.stringify({\n grant_type: \"api_key\",\n api_key: apiKey,\n nonce: nonceData.nonce,\n proof: String(powNonce),\n }),\n });\n\n if (!tokenResponse.ok) {\n const text = await tokenResponse.text();\n throw new Error(`Token exchange failed: ${text || `HTTP ${tokenResponse.status}`}`);\n }\n\n const tokenData = (await tokenResponse.json()) as {\n access_token: string;\n token_type: string;\n expires_in?: number;\n };\n\n if (exchangeOpts.save) {\n const config = loadConfig(globalOpts.profile);\n config.token = tokenData.access_token;\n saveConfig(config, globalOpts.profile);\n printSuccess(\"Token exchange successful. Token saved to config.\");\n } else {\n const format = getFormat(cmd);\n outputResponse({ status: tokenResponse.status, headers: tokenResponse.headers, data: tokenData }, format);\n printSuccess(\"Token exchange successful.\");\n }\n }),\n );\n}\n\nexport function registerAuthCommands(program: Command): void {\n // auth command group with login/logout subcommands\n const auth = program\n .command(\"auth\")\n .description(\"Manage authentication\");\n\n const login = createLoginCommand();\n addExamples(login, [\n {\n description: \"Interactive login (email/password prompt)\",\n command: \"geonic auth login\",\n },\n {\n description: \"Login with OAuth client credentials\",\n command:\n \"geonic auth login --client-credentials --client-id MY_ID --client-secret MY_SECRET\",\n },\n {\n description: \"Login to a specific tenant\",\n command: \"geonic auth login --tenant-id my-tenant\",\n },\n ]);\n auth.addCommand(login);\n\n const logout = createLogoutCommand();\n addExamples(logout, [\n {\n description: \"Clear saved authentication token\",\n command: \"geonic auth logout\",\n },\n ]);\n auth.addCommand(logout);\n\n const nonce = createNonceCommand();\n addExamples(nonce, [\n {\n description: \"Get a nonce for API key authentication\",\n command: \"geonic auth nonce --api-key gdb_abcdef...\",\n },\n ]);\n auth.addCommand(nonce);\n\n const tokenExchange = createTokenExchangeCommand();\n addExamples(tokenExchange, [\n {\n description: \"Exchange API key for a JWT and save it\",\n command: \"geonic auth token-exchange --api-key gdb_abcdef... --save\",\n },\n ]);\n auth.addCommand(tokenExchange);\n\n // me command (top-level, maps to /me API endpoint)\n const me = program\n .command(\"me\")\n .description(\"Display current authenticated user and manage user resources\");\n\n // Default action: show user info when no subcommand is given\n const meInfo = me\n .command(\"info\", { isDefault: true, hidden: true })\n .description(\"Display current authenticated user\")\n .action(createMeAction());\n\n addExamples(me, [\n {\n description: \"Show current user info\",\n command: \"geonic me\",\n },\n {\n description: \"List your OAuth clients\",\n command: \"geonic me oauth-clients list\",\n },\n {\n description: \"List your API keys\",\n command: \"geonic me api-keys list\",\n },\n ]);\n\n addExamples(meInfo, [\n {\n description: \"Show current user info\",\n command: \"geonic me\",\n },\n ]);\n\n // Add me oauth-clients subcommands\n addMeOAuthClientsSubcommand(me);\n\n // Add me api-keys subcommands\n addMeApiKeysSubcommand(me);\n\n // Backward-compatible hidden aliases\n program.addCommand(createLoginCommand(), { hidden: true });\n program.addCommand(createLogoutCommand(), { hidden: true });\n\n const hiddenWhoami = new Command(\"whoami\")\n .description(\"Display current authenticated user\")\n .action(createMeAction());\n program.addCommand(hiddenWhoami, { hidden: true });\n}\n","export interface OAuthTokenResponse {\n access_token: string;\n token_type: string;\n expires_in?: number;\n scope?: string;\n}\n\nexport async function clientCredentialsGrant(options: {\n baseUrl: string;\n clientId: string;\n clientSecret: string;\n scope?: string;\n}): Promise<OAuthTokenResponse> {\n const url = new URL(\"/oauth/token\", options.baseUrl).toString();\n const credentials = Buffer.from(`${options.clientId}:${options.clientSecret}`).toString(\"base64\");\n\n const body: Record<string, string> = { grant_type: \"client_credentials\" };\n if (options.scope) {\n body.scope = options.scope;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${credentials}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let message: string;\n try {\n const err = JSON.parse(text) as Record<string, unknown>;\n message = (err.error_description ?? err.error ?? text) as string;\n } catch {\n message = text || `HTTP ${response.status}`;\n }\n throw new Error(`OAuth token request failed: ${message}`);\n }\n\n return (await response.json()) as OAuthTokenResponse;\n}\n","import type { ClientOptions, ClientResponse, NgsiError } from \"./types.js\";\nimport { clientCredentialsGrant } from \"./oauth.js\";\n\nexport class DryRunSignal extends Error {\n constructor() {\n super(\"dry-run\");\n this.name = \"DryRunSignal\";\n }\n}\n\nexport class GdbClient {\n private baseUrl: string;\n private service?: string;\n private token?: string;\n private refreshToken?: string;\n private apiKey?: string;\n private clientId?: string;\n private clientSecret?: string;\n private onTokenRefresh?: (token: string, refreshToken?: string) => void;\n private verbose: boolean;\n private dryRun: boolean;\n private refreshPromise?: Promise<boolean>;\n\n constructor(options: ClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.service = options.service;\n this.token = options.token;\n this.refreshToken = options.refreshToken;\n this.apiKey = options.apiKey;\n this.clientId = options.clientId;\n this.clientSecret = options.clientSecret;\n this.onTokenRefresh = options.onTokenRefresh;\n this.verbose = options.verbose ?? false;\n this.dryRun = options.dryRun ?? false;\n }\n\n private buildHeaders(extra?: Record<string, string>): Record<string, string> {\n const headers: Record<string, string> = {};\n\n headers[\"Content-Type\"] = \"application/ld+json\";\n headers[\"Accept\"] = \"application/ld+json\";\n if (this.service) headers[\"NGSILD-Tenant\"] = this.service;\n\n if (this.token) {\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n } else if (this.apiKey) {\n headers[\"X-Api-Key\"] = this.apiKey;\n }\n\n if (extra) {\n Object.assign(headers, extra);\n }\n\n return headers;\n }\n\n private buildUrl(path: string, params?: Record<string, string>): string {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== \"\") {\n url.searchParams.set(key, value);\n }\n }\n }\n return url.toString();\n }\n\n private getBasePath(): string {\n return \"/ngsi-ld/v1\";\n }\n\n private static readonly SENSITIVE_HEADERS = new Set([\"authorization\", \"x-api-key\"]);\n private static readonly SENSITIVE_BODY_KEYS = new Set([\n \"password\",\n \"refreshToken\",\n \"token\",\n \"client_secret\",\n \"clientSecret\",\n \"key\",\n \"apiKey\",\n ]);\n\n private logRequest(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): void {\n if (!this.verbose) return;\n process.stderr.write(`> ${method} ${url}\\n`);\n for (const [k, v] of Object.entries(headers)) {\n if (GdbClient.SENSITIVE_HEADERS.has(k.toLowerCase())) {\n process.stderr.write(`> ${k}: ***\\n`);\n } else {\n process.stderr.write(`> ${k}: ${v}\\n`);\n }\n }\n if (body) {\n process.stderr.write(`> Body: ${GdbClient.maskBodySecrets(body)}\\n`);\n }\n process.stderr.write(\"\\n\");\n }\n\n private static maskBodySecrets(raw: string): string {\n try {\n const obj = JSON.parse(raw) as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n if (GdbClient.SENSITIVE_BODY_KEYS.has(key)) {\n obj[key] = \"***\";\n }\n }\n return JSON.stringify(obj);\n } catch {\n return raw;\n }\n }\n\n private logResponse(response: Response): void {\n if (!this.verbose) return;\n process.stderr.write(`< ${response.status} ${response.statusText}\\n`);\n response.headers.forEach((v, k) => {\n process.stderr.write(`< ${k}: ${v}\\n`);\n });\n process.stderr.write(\"\\n\");\n }\n\n private static shellQuote(value: string): string {\n return `'${value.split(\"'\").join(\"'\\\"'\\\"'\")}'`;\n }\n\n static buildCurlCommand(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): string {\n const parts: string[] = [\"curl\"];\n if (method !== \"GET\") {\n parts.push(`-X ${method}`);\n }\n for (const [key, value] of Object.entries(headers)) {\n parts.push(`-H ${GdbClient.shellQuote(`${key}: ${value}`)}`);\n }\n if (body) {\n parts.push(`-d ${GdbClient.shellQuote(body)}`);\n }\n parts.push(GdbClient.shellQuote(url));\n return parts.join(\" \\\\\\n \");\n }\n\n private handleDryRun(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): void {\n if (!this.dryRun) return;\n console.log(GdbClient.buildCurlCommand(method, url, headers, body));\n throw new DryRunSignal();\n }\n\n private canRefresh(): boolean {\n return (!!this.refreshToken || (!!this.clientId && !!this.clientSecret)) && !this.apiKey;\n }\n\n private async performTokenRefresh(): Promise<boolean> {\n if (this.refreshPromise) return this.refreshPromise;\n\n this.refreshPromise = this.doRefresh();\n try {\n return await this.refreshPromise;\n } finally {\n this.refreshPromise = undefined;\n }\n }\n\n private async doRefresh(): Promise<boolean> {\n // Try refreshToken first\n if (this.refreshToken) {\n try {\n const url = this.buildUrl(\"/auth/refresh\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refreshToken: this.refreshToken }),\n });\n\n if (response.ok) {\n const data = (await response.json()) as Record<string, unknown>;\n const newToken = (data.accessToken ?? data.token) as string | undefined;\n const newRefreshToken = data.refreshToken as string | undefined;\n\n if (newToken) {\n this.token = newToken;\n if (newRefreshToken) this.refreshToken = newRefreshToken;\n this.onTokenRefresh?.(newToken, newRefreshToken);\n return true;\n }\n }\n } catch {\n // Fall through to client credentials\n }\n }\n\n // Fallback: client_credentials grant\n if (this.clientId && this.clientSecret) {\n try {\n const result = await clientCredentialsGrant({\n baseUrl: this.baseUrl,\n clientId: this.clientId,\n clientSecret: this.clientSecret,\n });\n this.token = result.access_token;\n this.onTokenRefresh?.(result.access_token);\n return true;\n } catch {\n return false;\n }\n }\n\n return false;\n }\n\n private async executeRequest<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n const url = this.buildUrl(`${this.getBasePath()}${path}`, options?.params);\n const headers = this.buildHeaders(options?.headers);\n const body = options?.body ? JSON.stringify(options.body) : undefined;\n\n this.logRequest(method, url, headers, body);\n this.handleDryRun(method, url, headers, body);\n const response = await fetch(url, { method, headers, body });\n this.logResponse(response);\n\n const countHeader = response.headers.get(\"NGSILD-Results-Count\");\n const count = countHeader ? parseInt(countHeader, 10) : undefined;\n\n let data: T;\n /* v8 ignore next -- null coalescing for missing content-type header */\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const text = await response.text();\n if (text && (contentType.includes(\"json\") || contentType.includes(\"ld+json\"))) {\n data = JSON.parse(text) as T;\n } else {\n data = text as unknown as T;\n }\n\n if (!response.ok) {\n const err = data as unknown as NgsiError;\n const message =\n err?.description || err?.detail || err?.error || err?.title || `HTTP ${response.status}`;\n throw new GdbClientError(message, response.status, err);\n }\n\n return { status: response.status, headers: response.headers, data, count };\n }\n\n private async executeRawRequest<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n skipTenantHeader?: boolean;\n },\n ): Promise<ClientResponse<T>> {\n const url = this.buildUrl(path, options?.params);\n const headers = this.buildHeaders(options?.headers);\n if (options?.skipTenantHeader) {\n delete headers[\"NGSILD-Tenant\"];\n }\n const body = options?.body ? JSON.stringify(options.body) : undefined;\n\n this.logRequest(method, url, headers, body);\n this.handleDryRun(method, url, headers, body);\n const response = await fetch(url, { method, headers, body });\n this.logResponse(response);\n\n let data: T;\n /* v8 ignore next -- null coalescing for missing content-type header */\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const text = await response.text();\n if (text && (contentType.includes(\"json\") || contentType.includes(\"ld+json\"))) {\n data = JSON.parse(text) as T;\n } else {\n data = text as unknown as T;\n }\n\n if (!response.ok) {\n const err = data as unknown as NgsiError;\n const message =\n err?.description || err?.detail || err?.error || err?.title || `HTTP ${response.status}`;\n throw new GdbClientError(message, response.status, err);\n }\n\n return { status: response.status, headers: response.headers, data };\n }\n\n async request<T = unknown>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n try {\n return await this.executeRequest<T>(method, path, options);\n } catch (err) {\n if (err instanceof GdbClientError && err.status === 401 && this.canRefresh()) {\n const refreshed = await this.performTokenRefresh();\n if (refreshed) {\n return await this.executeRequest<T>(method, path, options);\n }\n }\n throw err;\n }\n }\n\n async get<T = unknown>(\n path: string,\n params?: Record<string, string>,\n headers?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"GET\", path, { params, headers });\n }\n\n async post<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"POST\", path, { body, params });\n }\n\n async patch<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"PATCH\", path, { body, params });\n }\n\n async put<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"PUT\", path, { body, params });\n }\n\n async delete<T = unknown>(\n path: string,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"DELETE\", path, { params });\n }\n\n /** Make a request to a raw URL path (not prefixed with API base path) */\n async rawRequest<T = unknown>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n skipTenantHeader?: boolean;\n },\n ): Promise<ClientResponse<T>> {\n try {\n return await this.executeRawRequest<T>(method, path, options);\n } catch (err) {\n if (err instanceof GdbClientError && err.status === 401 && this.canRefresh()) {\n const refreshed = await this.performTokenRefresh();\n if (refreshed) {\n return await this.executeRawRequest<T>(method, path, options);\n }\n }\n throw err;\n }\n }\n}\n\nexport class GdbClientError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly ngsiError?: NgsiError,\n ) {\n super(message);\n this.name = \"GdbClientError\";\n }\n}\n","import { Command } from \"commander\";\nimport { loadConfig, saveConfig, validateUrl } from \"./config.js\";\nimport { DryRunSignal, GdbClient, GdbClientError } from \"./client.js\";\nimport { printError, printOutput, printCount } from \"./output.js\";\nimport type { ClientResponse, GlobalOptions, OutputFormat } from \"./types.js\";\n\n/**\n * Valid scope values for --scopes option help text (OAuth clients).\n */\nexport const SCOPES_HELP_NOTES = [\n \"Valid scopes:\",\n \" read:entities, write:entities, read:subscriptions, write:subscriptions,\",\n \" read:registrations, write:registrations, read:rules, write:rules,\",\n \" read:custom-data-models, write:custom-data-models,\",\n \" admin:users, admin:tenants, admin:policies, admin:oauth-clients,\",\n \" admin:api-keys, admin:metrics\",\n \"\",\n \"admin:X implies both read:X and write:X.\",\n \"write:X does NOT imply read:X — specify both if needed.\",\n];\n\n/**\n * Valid scope values for --scopes option help text (API keys).\n */\nexport const API_KEY_SCOPES_HELP_NOTES = [\n \"Valid scopes:\",\n \" read:entities, write:entities, read:subscriptions, write:subscriptions,\",\n \" read:registrations, write:registrations\",\n];\n\n/**\n * Valid permission values for --permissions option.\n */\nexport const VALID_PERMISSIONS = new Set([\"read\", \"write\", \"create\", \"update\", \"delete\"]);\n\n/**\n * Parse and validate --permissions flag value.\n * Returns the parsed array or calls process.exit(1) on invalid input.\n */\nexport function parsePermissions(raw: string): string[] {\n const permissions = raw.split(\",\").map((s) => s.trim()).filter(Boolean);\n if (permissions.length === 0 || permissions.some((p) => !VALID_PERMISSIONS.has(p))) {\n printError(\"--permissions must be a comma-separated list of: read, write, create, update, delete\");\n process.exit(1);\n }\n return permissions;\n}\n\n/**\n * Resolve merged options from config + CLI flags.\n */\nexport function resolveOptions(cmd: Command): GlobalOptions {\n const opts = cmd.optsWithGlobals() as GlobalOptions;\n const config = loadConfig(opts.profile);\n return {\n url: opts.url ?? config.url,\n service: opts.service ?? config.service,\n token: opts.token ?? config.token,\n format: opts.format ?? config.format ?? \"json\",\n color: opts.color,\n verbose: opts.verbose,\n profile: opts.profile,\n apiKey: opts.apiKey ?? process.env.GDB_API_KEY ?? config.apiKey,\n dryRun: opts.dryRun,\n };\n}\n\n/**\n * Create a GdbClient from resolved options.\n */\nexport function createClient(cmd: Command): GdbClient {\n const opts = resolveOptions(cmd);\n if (!opts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n opts.url = validateUrl(opts.url);\n const cliOpts = cmd.optsWithGlobals() as GlobalOptions;\n const usingCliToken = !!cliOpts.token;\n const config = loadConfig(opts.profile);\n return new GdbClient({\n baseUrl: opts.url,\n service: opts.service,\n token: opts.token,\n refreshToken: usingCliToken ? undefined : config.refreshToken,\n clientId: usingCliToken ? undefined : config.clientId,\n clientSecret: usingCliToken ? undefined : config.clientSecret,\n apiKey: opts.apiKey,\n onTokenRefresh: usingCliToken\n ? undefined\n : (token, refreshToken) => {\n const cfg = loadConfig(opts.profile);\n cfg.token = token;\n if (refreshToken) cfg.refreshToken = refreshToken;\n saveConfig(cfg, opts.profile);\n },\n verbose: opts.verbose,\n dryRun: opts.dryRun,\n });\n}\n\n/**\n * Get the output format from resolved options.\n */\nexport function getFormat(cmd: Command): OutputFormat {\n const opts = resolveOptions(cmd);\n return opts.format as OutputFormat;\n}\n\n/**\n * Standard handler for outputting API responses.\n */\nexport function outputResponse(\n response: ClientResponse,\n format: OutputFormat,\n showCount?: boolean,\n): void {\n if (showCount && response.count !== undefined) {\n printCount(response.count);\n }\n if (response.data !== undefined && response.data !== \"\") {\n printOutput(response.data, format);\n }\n}\n\n/**\n * Wrap an async command handler with error handling.\n */\nexport function withErrorHandler<T extends unknown[]>(fn: (...args: T) => Promise<void>) {\n return async (...args: T) => {\n try {\n await fn(...args);\n } catch (err: unknown) {\n if (err instanceof DryRunSignal) {\n return;\n }\n if (err instanceof GdbClientError && err.status === 401) {\n printError(\"Authentication failed. Please re-authenticate (e.g., `geonic auth login` or check your API key).\");\n } else if (err instanceof GdbClientError && err.status === 403) {\n const detail = (err.ngsiError?.detail ?? err.ngsiError?.description ?? \"\").toLowerCase();\n if (detail.includes(\"entity type\") || detail.includes(\"allowedentitytypes\")) {\n printError(`Entity type restriction: ${err.message}`);\n } else {\n printError(err.message);\n }\n } else if (err instanceof Error) {\n printError(err.message);\n } else {\n printError(String(err));\n }\n process.exit(1);\n }\n };\n}\n","import { createInterface } from \"node:readline/promises\";\n\nexport function isInteractive(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nexport async function promptEmail(): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const email = await rl.question(\"Email: \");\n return email.trim();\n } finally {\n rl.close();\n }\n}\n\nexport async function promptPassword(): Promise<string> {\n return new Promise((resolve, reject) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n stdout.write(\"Password: \");\n\n if (!stdin.isTTY) {\n let data = \"\";\n stdin.setEncoding(\"utf-8\");\n stdin.resume();\n const cleanup = () => {\n stdin.removeListener(\"data\", onData);\n stdin.removeListener(\"end\", onEnd);\n stdin.removeListener(\"error\", onError);\n stdin.pause();\n };\n const onData = (chunk: string) => {\n const newline = chunk.indexOf(\"\\n\");\n if (newline !== -1) {\n data += chunk.slice(0, newline);\n cleanup();\n stdout.write(\"\\n\");\n resolve(data);\n } else {\n data += chunk;\n }\n };\n const onEnd = () => {\n cleanup();\n stdout.write(\"\\n\");\n resolve(data);\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n stdin.on(\"data\", onData);\n stdin.on(\"end\", onEnd);\n stdin.on(\"error\", onError);\n return;\n }\n\n const wasRaw = stdin.isRaw;\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding(\"utf-8\");\n\n let password = \"\";\n\n const restoreTerminal = () => {\n stdin.removeListener(\"data\", onData);\n stdin.removeListener(\"error\", onError);\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n };\n\n const onError = (err: Error) => {\n restoreTerminal();\n stdout.write(\"\\n\");\n reject(err);\n };\n\n const onData = (char: string) => {\n const code = char.charCodeAt(0);\n\n if (char === \"\\r\" || char === \"\\n\") {\n restoreTerminal();\n stdout.write(\"\\n\");\n resolve(password);\n } else if (code === 3) {\n restoreTerminal();\n stdout.write(\"\\n\");\n reject(new Error(\"User cancelled\"));\n } else if (code === 127 || code === 8) {\n if (password.length > 0) {\n password = password.slice(0, -1);\n stdout.write(\"\\b \\b\");\n }\n } else if (code >= 32) {\n password += char;\n stdout.write(\"*\");\n }\n };\n\n stdin.on(\"data\", onData);\n stdin.on(\"error\", onError);\n });\n}\n\nexport interface TenantChoice {\n tenantId: string;\n role: string;\n}\n\nexport async function promptTenantSelection(\n tenants: TenantChoice[],\n currentTenantId?: string,\n): Promise<string | undefined> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n console.log(\"\\nAvailable tenants:\");\n for (let i = 0; i < tenants.length; i++) {\n const t = tenants[i];\n const current = t.tenantId === currentTenantId ? \" ← current\" : \"\";\n const marker = t.tenantId === currentTenantId ? \" *\" : \" \";\n console.log(`${marker} ${i + 1}) ${t.tenantId} (${t.role})${current}`);\n }\n for (;;) {\n const answer = await rl.question(\"\\nSelect tenant number (Enter to keep current): \");\n const trimmed = answer.trim();\n if (!trimmed) return undefined;\n const index = parseInt(trimmed, 10) - 1;\n if (index >= 0 && index < tenants.length) {\n return tenants[index].tenantId;\n }\n console.log(`Invalid selection. Please enter a number between 1 and ${tenants.length}.`);\n }\n } finally {\n rl.close();\n }\n}\n","export interface TokenStatus {\n expiresAt: Date | null;\n isExpired: boolean;\n isExpiringSoon: boolean;\n remainingMs: number | null;\n}\n\nexport function decodeJwtPayload(token: string): Record<string, unknown> | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n const payload = parts[1];\n const json = Buffer.from(payload, \"base64\").toString(\"utf-8\");\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport function getTokenStatus(token: string): TokenStatus {\n const payload = decodeJwtPayload(token);\n if (!payload || typeof payload.exp !== \"number\") {\n return { expiresAt: null, isExpired: false, isExpiringSoon: false, remainingMs: null };\n }\n\n const expiresAt = new Date(payload.exp * 1000);\n const now = Date.now();\n const remainingMs = expiresAt.getTime() - now;\n const fiveMinutes = 5 * 60 * 1000;\n\n return {\n expiresAt,\n isExpired: remainingMs <= 0,\n isExpiringSoon: remainingMs > 0 && remainingMs <= fiveMinutes,\n remainingMs,\n };\n}\n\nexport function formatDuration(ms: number): string {\n if (ms <= 0) return \"expired\";\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours % 24 > 0) parts.push(`${hours % 24}h`);\n if (minutes % 60 > 0 && days === 0) parts.push(`${minutes % 60}m`);\n if (parts.length === 0) parts.push(`${seconds}s`);\n\n return parts.join(\" \");\n}\n","import JSON5 from \"json5\";\nimport { readFileSync } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\n\n/**\n * Parse JSON input from a string, file (@path), stdin (-), pipe, or interactive mode.\n *\n * Resolution order:\n * 1. Explicit input provided → parse directly (inline, @file, or - for stdin)\n * 2. No input + piped stdin (non-TTY) → auto-read stdin\n * 3. No input + TTY stdin → interactive mode with brace-balanced auto-submit\n *\n * Supports JSON5 syntax (unquoted keys, single quotes, trailing commas).\n */\nexport async function parseJsonInput(input?: string): Promise<unknown> {\n // 1. Explicit input\n if (input !== undefined) {\n if (input === \"-\") return parseData(readFileSync(0, \"utf-8\"));\n if (input.startsWith(\"@\")) return parseData(readFileSync(input.slice(1), \"utf-8\"));\n return parseData(input);\n }\n\n // 2. Piped stdin (non-TTY)\n if (!process.stdin.isTTY) {\n return parseData(readFileSync(0, \"utf-8\"));\n }\n\n // 3. Interactive mode (TTY)\n return readInteractiveJson();\n}\n\nfunction parseData(text: string): unknown {\n return JSON5.parse(text.trim());\n}\n\n/**\n * Read JSON interactively from TTY with brace-balance auto-submit.\n * Tracks depth of {}/[] while respecting string literals.\n * When depth returns to 0, automatically parses and returns.\n */\nasync function readInteractiveJson(): Promise<unknown> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n prompt: \"json> \",\n });\n\n process.stderr.write(\"Enter JSON (auto-submits when braces close, Ctrl+C to cancel):\\n\");\n rl.prompt();\n\n const lines: string[] = [];\n let depth = 0;\n let started = false;\n let inBlockComment = false;\n let inString = false;\n let stringChar = \"\";\n let cancelled = false;\n\n return new Promise<unknown>((resolve, reject) => {\n rl.on(\"SIGINT\", () => {\n cancelled = true;\n rl.close();\n });\n\n rl.on(\"line\", (line) => {\n lines.push(line);\n const result = trackDepth(line, depth, started, inBlockComment, inString, stringChar);\n depth = result.depth;\n started = result.started;\n inBlockComment = result.inBlockComment;\n inString = result.inString;\n stringChar = result.stringChar;\n\n if (started && depth <= 0 && !inBlockComment && !inString) {\n rl.close();\n try {\n resolve(parseData(lines.join(\"\\n\")));\n } catch (err) {\n reject(err);\n }\n } else {\n rl.setPrompt(\"... \");\n rl.prompt();\n }\n });\n\n rl.on(\"close\", () => {\n if (cancelled) {\n reject(new Error(\"Input cancelled.\"));\n return;\n }\n if (lines.length > 0 && (!started || depth > 0 || inBlockComment || inString)) {\n // EOF before balanced — attempt to parse what we have\n try {\n resolve(parseData(lines.join(\"\\n\")));\n } catch (err) {\n reject(err);\n }\n } else if (lines.length === 0) {\n reject(new Error(\"No input provided.\"));\n }\n });\n });\n}\n\n/**\n * Track brace/bracket depth for a line, respecting string literals and JSON5 comments.\n * String and block-comment state is passed in and returned to handle multi-line constructs.\n */\nfunction trackDepth(\n line: string,\n depth: number,\n started: boolean,\n inBlockComment: boolean,\n inString: boolean,\n stringChar: string,\n): { depth: number; started: boolean; inBlockComment: boolean; inString: boolean; stringChar: string } {\n\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n const next = i + 1 < line.length ? line[i + 1] : \"\";\n\n if (inBlockComment) {\n if (ch === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n\n if (inString) {\n if (ch === \"\\\\\" && i + 1 < line.length) {\n i++; // skip escaped character\n } else if (ch === stringChar) {\n inString = false;\n }\n continue;\n }\n\n // Line comment — skip rest of line\n if (ch === \"/\" && next === \"/\") break;\n // Block comment start\n if (ch === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n\n if (ch === '\"' || ch === \"'\") {\n inString = true;\n stringChar = ch;\n } else if (ch === \"{\" || ch === \"[\") {\n depth++;\n started = true;\n } else if (ch === \"}\" || ch === \"]\") {\n depth--;\n }\n }\n\n return { depth, started, inBlockComment, inString, stringChar };\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, resolveOptions, getFormat, outputResponse } from \"../helpers.js\";\nimport { loadConfig, saveConfig, validateUrl } from \"../config.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess, printError, printInfo, printWarning } from \"../output.js\";\nimport { clientCredentialsGrant } from \"../oauth.js\";\nimport { addExamples, addNotes } from \"./help.js\";\nimport { SCOPES_HELP_NOTES } from \"../helpers.js\";\n\nexport function addMeOAuthClientsSubcommand(me: Command): void {\n const oauthClients = me\n .command(\"oauth-clients\")\n .description(\"Manage your OAuth clients\");\n\n // oauth-clients list\n const list = oauthClients\n .command(\"list\")\n .description(\"List your OAuth clients\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me/oauth-clients\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List your OAuth clients\",\n command: \"geonic me oauth-clients list\",\n },\n ]);\n\n // oauth-clients create\n const create = oauthClients\n .command(\"create [json]\")\n .description(\"Create a new OAuth client\")\n .option(\"--name <name>\", \"Client name\")\n .option(\"--scopes <scopes>\", \"Allowed scopes (comma-separated)\")\n .option(\"--save\", \"Save credentials to config for automatic re-authentication\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n scopes?: string;\n save?: boolean;\n };\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.scopes) {\n // Build body from flags\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.clientName = opts.name;\n if (opts.scopes) payload.allowedScopes = opts.scopes.split(\",\").map((s) => s.trim());\n body = payload;\n } else {\n // Read from stdin (pipe or interactive)\n body = await parseJsonInput();\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/me/oauth-clients\", { body });\n\n const data = response.data as Record<string, unknown>;\n\n if (opts.save) {\n const globalOpts = resolveOptions(cmd);\n const clientId = data.clientId as string | undefined;\n const clientSecret = data.clientSecret as string | undefined;\n\n if (!clientId || !clientSecret) {\n printError(\"Response missing clientId or clientSecret. Cannot save credentials.\");\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n return;\n }\n\n // Perform client_credentials grant to get a fresh token\n const baseUrl = validateUrl(globalOpts.url!);\n const tokenResult = await clientCredentialsGrant({\n baseUrl,\n clientId,\n clientSecret,\n scope: (data.allowedScopes as string[] | undefined)?.join(\" \"),\n });\n\n const config = loadConfig(globalOpts.profile);\n config.clientId = clientId;\n config.clientSecret = clientSecret;\n config.token = tokenResult.access_token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n\n printInfo(\"Client credentials saved to config. Auto-reauth enabled.\");\n } else {\n printWarning(\n \"Save the clientSecret now — it will not be shown again.\",\n );\n }\n\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n }),\n );\n\n addNotes(create, SCOPES_HELP_NOTES);\n\n addExamples(create, [\n {\n description: \"Create an OAuth client with flags\",\n command: \"geonic me oauth-clients create --name my-ci-bot --scopes read:entities,write:entities\",\n },\n {\n description: \"Create and save credentials for auto-reauth\",\n command: \"geonic me oauth-clients create --name my-ci-bot --save\",\n },\n {\n description: \"Create an OAuth client from JSON\",\n command: 'geonic me oauth-clients create \\'{\"clientName\":\"my-bot\",\"allowedScopes\":[\"read:entities\"]}\\'',\n },\n ]);\n\n // oauth-clients delete\n const del = oauthClients\n .command(\"delete <id>\")\n .description(\"Delete an OAuth client\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/me/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"OAuth client deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an OAuth client\",\n command: \"geonic me oauth-clients delete <client-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, resolveOptions, getFormat, outputResponse } from \"../helpers.js\";\nimport { loadConfig, saveConfig } from \"../config.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printError, printWarning } from \"../output.js\";\nimport { addExamples, addNotes } from \"./help.js\";\nimport { API_KEY_SCOPES_HELP_NOTES, parsePermissions } from \"../helpers.js\";\n\nexport function addMeApiKeysSubcommand(me: Command): void {\n const apiKeys = me\n .command(\"api-keys\")\n .description(\"Manage your API keys\");\n\n // api-keys list\n const list = apiKeys\n .command(\"list\")\n .description(\"List your API keys\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me/api-keys\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List your API keys\",\n command: \"geonic me api-keys list\",\n },\n ]);\n\n // api-keys create\n const create = apiKeys\n .command(\"create [json]\")\n .description(\"Create a new API key\")\n .option(\"--name <name>\", \"Key name\")\n .option(\"--scopes <scopes>\", \"Allowed scopes (comma-separated)\")\n .option(\"--origins <origins>\", \"Allowed origins (comma-separated)\")\n .option(\"--entity-types <types>\", \"Allowed entity types (comma-separated)\")\n .option(\"--rate-limit <n>\", \"Rate limit per minute\")\n .option(\"--dpop-required\", \"Require DPoP token binding\")\n .option(\"--permissions <perms>\", \"Comma-separated permissions (read, write, create, update, delete)\")\n .option(\"--save\", \"Save the API key to config for automatic use\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n scopes?: string;\n origins?: string;\n entityTypes?: string;\n rateLimit?: string;\n dpopRequired?: boolean;\n permissions?: string;\n save?: boolean;\n };\n\n // Validate --origins flag early\n if (opts.origins !== undefined) {\n const parsed = opts.origins.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (parsed.length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.scopes || opts.origins || opts.entityTypes || opts.rateLimit || opts.dpopRequired !== undefined || opts.permissions) {\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.name = opts.name;\n if (opts.scopes) payload.allowedScopes = opts.scopes.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.origins) payload.allowedOrigins = opts.origins.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.entityTypes) payload.allowedEntityTypes = opts.entityTypes.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.dpopRequired !== undefined) payload.dpopRequired = opts.dpopRequired;\n if (opts.permissions) payload.permissions = parsePermissions(opts.permissions);\n if (opts.rateLimit) {\n const raw = opts.rateLimit.trim();\n if (!/^\\d+$/.test(raw)) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n const perMinute = Number(raw);\n if (perMinute <= 0) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n payload.rateLimit = { perMinute };\n }\n body = payload;\n } else {\n body = await parseJsonInput();\n }\n\n // Validate allowedOrigins from JSON input\n if (body && typeof body === \"object\" && \"allowedOrigins\" in (body as Record<string, unknown>)) {\n const origins = (body as Record<string, unknown>).allowedOrigins;\n if (Array.isArray(origins) && origins.filter((o: unknown) => typeof o === \"string\" && o.trim() !== \"\").length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/me/api-keys\", { body });\n\n const data = response.data as Record<string, unknown>;\n\n if (opts.save) {\n const globalOpts = resolveOptions(cmd);\n const key = data.key as string | undefined;\n if (!key) {\n printError(\"Response missing key. API key was created, but it could not be saved.\");\n outputResponse(response, format);\n process.exitCode = 1;\n return;\n }\n const config = loadConfig(globalOpts.profile);\n config.apiKey = key;\n saveConfig(config, globalOpts.profile);\n console.error(\"API key saved to config. X-Api-Key header will be sent automatically.\");\n } else {\n printWarning(\"Save the API key now — it will not be shown again. Use --save to store it automatically.\");\n }\n\n outputResponse(response, format);\n console.error(\"API key created.\");\n }),\n );\n\n addNotes(create, [\n ...API_KEY_SCOPES_HELP_NOTES,\n \"\",\n \"Valid permissions: read, write, create, update, delete\",\n \" write = create + update + delete\",\n \" Permissions auto-generate XACML policies (allowedEntityTypes respected).\",\n ]);\n\n addExamples(create, [\n {\n description: \"Create an API key with flags\",\n command: \"geonic me api-keys create --name my-app --scopes read:entities --origins 'https://example.com'\",\n },\n {\n description: \"Create with permissions (auto-generates XACML policy)\",\n command: \"geonic me api-keys create --name my-app --permissions read,write --save\",\n },\n {\n description: \"Create and save API key to config\",\n command: \"geonic me api-keys create --name my-app --save\",\n },\n {\n description: \"Create an API key from JSON\",\n command: 'geonic me api-keys create \\'{\"name\":\"my-app\",\"allowedScopes\":[\"read:entities\"]}\\'',\n },\n {\n description: \"Create an API key with rate limiting\",\n command: \"geonic me api-keys create --name my-app --rate-limit 100\",\n },\n {\n description: \"Create an API key with DPoP required\",\n command: \"geonic me api-keys create --name my-app --dpop-required\",\n },\n ]);\n\n // api-keys delete\n const del = apiKeys\n .command(\"delete <keyId>\")\n .description(\"Delete an API key\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/me/api-keys/${encodeURIComponent(String(keyId))}`,\n );\n console.error(\"API key deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an API key\",\n command: \"geonic me api-keys delete <key-id>\",\n },\n ]);\n}\n","import { Command } from \"commander\";\nimport {\n listProfiles,\n getCurrentProfile,\n setCurrentProfile,\n createProfile,\n deleteProfile,\n loadConfig,\n} from \"../config.js\";\nimport { printSuccess, printInfo, printError } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerProfileCommands(program: Command): void {\n const profile = program.command(\"profile\").description(\"Manage connection profiles\");\n\n const list = profile\n .command(\"list\")\n .description(\"List all profiles\")\n .action(() => {\n const profiles = listProfiles();\n for (const p of profiles) {\n const marker = p.active ? \" *\" : \"\";\n console.log(`${p.name}${marker}`);\n }\n });\n\n addExamples(list, [\n {\n description: \"List all profiles (active profile marked with *)\",\n command: \"geonic profile list\",\n },\n ]);\n\n const use = profile\n .command(\"use <name>\")\n .description(\"Switch active profile\")\n .action((name: string) => {\n try {\n setCurrentProfile(name);\n printSuccess(`Switched to profile \"${name}\".`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(use, [\n {\n description: \"Switch to staging profile\",\n command: \"geonic profile use staging\",\n },\n ]);\n\n const profileCreate = profile\n .command(\"create <name>\")\n .description(\"Create a new profile\")\n .action((name: string) => {\n try {\n createProfile(name);\n printSuccess(`Profile \"${name}\" created.`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(profileCreate, [\n {\n description: \"Create a new profile for staging\",\n command: \"geonic profile create staging\",\n },\n ]);\n\n const del = profile\n .command(\"delete <name>\")\n .description(\"Delete a profile\")\n .action((name: string) => {\n try {\n deleteProfile(name);\n printSuccess(`Profile \"${name}\" deleted.`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(del, [\n {\n description: \"Delete a profile\",\n command: \"geonic profile delete staging\",\n },\n ]);\n\n const show = profile\n .command(\"show [name]\")\n .description(\"Show profile settings\")\n .action((name?: string) => {\n const profileName = name ?? getCurrentProfile();\n const config = loadConfig(profileName);\n const entries = Object.entries(config).filter(([, v]) => v !== undefined);\n if (entries.length === 0) {\n printInfo(`Profile \"${profileName}\" has no settings.`);\n return;\n }\n for (const [key, value] of entries) {\n if (\n (key === \"token\" || key === \"refreshToken\" || key === \"apiKey\") &&\n typeof value === \"string\"\n ) {\n console.log(`${key}: ***`);\n } else {\n console.log(`${key}: ${value}`);\n }\n }\n });\n\n addExamples(show, [\n {\n description: \"Show current profile settings\",\n command: \"geonic profile show\",\n },\n {\n description: \"Show settings for a specific profile\",\n command: \"geonic profile show production\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function addAttrsSubcommands(attrs: Command): void {\n // attrs list\n const list = attrs\n .command(\"list\")\n .description(\"List all attributes of an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .action(\n withErrorHandler(\n async (entityId: string, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/entities/${encodeURIComponent(entityId)}/attrs`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(list, [\n {\n description: \"List all attributes of an entity\",\n command: \"geonic entities attrs list urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // attrs get\n const get = attrs\n .command(\"get\")\n .description(\"Get a specific attribute of an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific attribute\",\n command: \"geonic entities attrs get urn:ngsi-ld:Sensor:001 temperature\",\n },\n ]);\n\n // attrs add\n const add = attrs\n .command(\"add\")\n .description(\n \"Add attributes to an entity\\n\\n\" +\n \"JSON payload example:\\n\" +\n ' {\"humidity\": {\"type\": \"Property\", \"value\": 60}}',\n )\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n json: string | undefined,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\n `/entities/${encodeURIComponent(entityId)}/attrs`,\n data,\n );\n printSuccess(\"Attributes added.\");\n },\n ),\n );\n\n addExamples(add, [\n {\n description: \"Add an attribute with inline JSON\",\n command: `geonic entities attrs add urn:ngsi-ld:Sensor:001 '{\"humidity\":{\"type\":\"Property\",\"value\":60}}'`,\n },\n {\n description: \"Add attributes from a file\",\n command: \"geonic entities attrs add urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n {\n description: \"Add from stdin pipe\",\n command: \"cat attrs.json | geonic entities attrs add urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // attrs update\n const attrUpdate = attrs\n .command(\"update\")\n .description(\n \"Update a specific attribute of an entity\\n\\n\" +\n \"JSON payload example:\\n\" +\n ' {\"type\": \"Property\", \"value\": 25}',\n )\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n json: string | undefined,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.put(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n data,\n );\n printSuccess(\"Attribute updated.\");\n },\n ),\n );\n\n addExamples(attrUpdate, [\n {\n description: \"Update a Property value\",\n command: `geonic entities attrs update urn:ngsi-ld:Sensor:001 temperature '{\"type\":\"Property\",\"value\":25}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic entities attrs update urn:ngsi-ld:Sensor:001 temperature @attr.json\",\n },\n ]);\n\n // attrs delete\n const del = attrs\n .command(\"delete\")\n .description(\"Delete a specific attribute from an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n );\n printSuccess(\"Attribute deleted.\");\n },\n ),\n );\n\n addExamples(del, [\n {\n description: \"Delete a specific attribute\",\n command:\n \"geonic entities attrs delete urn:ngsi-ld:Sensor:001 temperature\",\n },\n ]);\n}\n\nexport function registerAttrsSubcommand(entitiesCmd: Command): void {\n const attrs = entitiesCmd\n .command(\"attrs\")\n .description(\"Manage entity attributes\");\n\n addAttrsSubcommands(attrs);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printCount, printSuccess } from \"../output.js\";\nimport { registerAttrsSubcommand } from \"./attrs.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerEntitiesCommand(program: Command): void {\n const entities = program\n .command(\"entities\")\n .description(\"Manage context entities\");\n\n // entities list\n const list = entities\n .command(\"list\")\n .description(\"List entities with optional filters\")\n .option(\"--type <type>\", \"Filter by entity type\")\n .option(\"--id-pattern <pat>\", \"Filter by entity ID pattern (regex)\")\n .option(\"--query <q>\", \"NGSI query expression\")\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--georel <rel>\", \"Geo-relationship (e.g. near;maxDistance:1000)\")\n .option(\"--geometry <geo>\", \"Geometry type for geo-query (e.g. point)\")\n .option(\"--coords <coords>\", \"Coordinates for geo-query\")\n .option(\"--spatial-id <zfxy>\", \"Spatial ID filter (ZFXY tile)\")\n .option(\"--limit <n>\", \"Maximum number of entities to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N entities\", parseInt)\n .option(\"--order-by <field>\", \"Order results by field\")\n .option(\"--count\", \"Include total count in response\")\n .option(\"--count-only\", \"Only show the total count without listing entities\")\n .option(\"--key-values\", \"Request simplified key-value format\")\n .action(\n withErrorHandler(async (opts: Record<string, unknown>, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const params: Record<string, string> = {};\n\n if (opts.type) params.type = String(opts.type);\n if (opts.idPattern) params.idPattern = String(opts.idPattern);\n if (opts.query) params.q = String(opts.query);\n if (opts.attrs) params.attrs = String(opts.attrs);\n if (opts.georel) params.georel = String(opts.georel);\n if (opts.geometry) params.geometry = String(opts.geometry);\n if (opts.coords) params.coordinates = String(opts.coords);\n if (opts.spatialId) params.spatialId = String(opts.spatialId);\n if (opts.limit !== undefined) params.limit = String(opts.limit);\n if (opts.offset !== undefined) params.offset = String(opts.offset);\n if (opts.orderBy) params.orderBy = String(opts.orderBy);\n if (opts.count || opts.countOnly) params.count = \"true\";\n if (opts.countOnly) params.limit = \"0\";\n if (opts.keyValues) params.options = \"keyValues\";\n\n const response = await client.get(\"/entities\", params);\n if (opts.countOnly) {\n printCount(response.count ?? 0);\n } else {\n outputResponse(response, format, !!opts.count);\n }\n }),\n );\n\n addExamples(list, [\n {\n description: \"Filter by entity type\",\n command: \"geonic entities list --type Sensor\",\n },\n {\n description: \"Filter by entity ID pattern (regex)\",\n command: \"geonic entities list --id-pattern 'urn:ngsi-ld:Sensor:.*'\",\n },\n {\n description: \"Filter by attribute value\",\n command: \"geonic entities list --query 'temperature>30'\",\n },\n {\n description: \"AND conditions (semicolon)\",\n command: \"geonic entities list --query 'temperature>30;humidity<50'\",\n },\n {\n description: \"String match\",\n command: \"geonic entities list --query 'name==\\\"Tokyo\\\"'\",\n },\n {\n description: \"Pattern match\",\n command: \"geonic entities list --query 'name~=\\\"Tok.*\\\"'\",\n },\n {\n description: \"Check attribute existence\",\n command: \"geonic entities list --query 'temperature'\",\n },\n {\n description: \"Select specific attributes\",\n command: \"geonic entities list --attrs temperature,humidity\",\n },\n {\n description: \"Geo-query: entities near a point (within 1km)\",\n command:\n \"geonic entities list --georel 'near;maxDistance==1000' --geometry Point --coords '[139.7671,35.6812]'\",\n },\n {\n description: \"Geo-query: entities within a polygon\",\n command:\n \"geonic entities list --georel within --geometry Polygon --coords '[[[139.7,35.7],[139.8,35.7],[139.8,35.6],[139.7,35.6],[139.7,35.7]]]'\",\n },\n {\n description: \"Filter by Spatial ID (ZFXY tile)\",\n command: \"geonic entities list --spatial-id 15/0/29101/12903\",\n },\n {\n description: \"Paginate results\",\n command: \"geonic entities list --limit 20 --offset 40\",\n },\n {\n description: \"Order by attribute\",\n command: \"geonic entities list --order-by temperature\",\n },\n {\n description: \"Get total count with results\",\n command: \"geonic entities list --type Sensor --count\",\n },\n {\n description: \"Get only the total count (no entity data)\",\n command: \"geonic entities list --type Sensor --count-only\",\n },\n ]);\n\n // entities get\n const get = entities\n .command(\"get\")\n .description(\"Get a single entity by ID\")\n .argument(\"<id>\", \"Entity ID\")\n .option(\"--key-values\", \"Request simplified key-value format\")\n .action(\n withErrorHandler(async (id: string, opts: Record<string, unknown>, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const params: Record<string, string> = {};\n if (opts.keyValues) {\n params.options = \"keyValues\";\n }\n\n const response = await client.get(\n `/entities/${encodeURIComponent(id)}`,\n params,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get entity by ID\",\n command: \"geonic entities get urn:ngsi-ld:Sensor:001\",\n },\n {\n description: \"Get entity in keyValues format\",\n command: \"geonic entities get urn:ngsi-ld:Sensor:001 --key-values\",\n },\n ]);\n\n // entities create\n const create = entities\n .command(\"create\")\n .description(\n \"Create a new entity\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"id\": \"urn:ngsi-ld:Sensor:001\",\\n' +\n ' \"type\": \"Sensor\",\\n' +\n ' \"temperature\": {\"type\": \"Property\", \"value\": 25}\\n' +\n \" }\",\n )\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(async (json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\"/entities\", data);\n printSuccess(\"Entity created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create from inline JSON (minimal)\",\n command: `geonic entities create '{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\"}'`,\n },\n {\n description: \"Create with attributes\",\n command: `geonic entities create '{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\",\"temperature\":{\"type\":\"Property\",\"value\":25},\"location\":{\"type\":\"GeoProperty\",\"value\":{\"type\":\"Point\",\"coordinates\":[139.77,35.68]}}}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic entities create @entity.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat entity.json | geonic entities create\",\n },\n {\n description: \"Interactive mode (omit JSON argument)\",\n command: \"geonic entities create\",\n },\n ]);\n\n // entities update\n const update = entities\n .command(\"update\")\n .description(\n \"Update attributes of an entity (PATCH)\\n\\n\" +\n \"JSON payload: only specified attributes are modified.\\n\" +\n ' e.g. {\"temperature\": {\"type\": \"Property\", \"value\": 30}}',\n )\n .argument(\"<id>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (id: string, json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.patch(\n `/entities/${encodeURIComponent(id)}/attrs`,\n data,\n );\n printSuccess(\"Entity updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a Property attribute\",\n command:\n `geonic entities update urn:ngsi-ld:Sensor:001 '{\"temperature\":{\"type\":\"Property\",\"value\":30}}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic entities update urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat attrs.json | geonic entities update urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // entities replace\n const replace = entities\n .command(\"replace\")\n .description(\n \"Replace all attributes of an entity (PUT)\\n\\n\" +\n \"JSON payload: all existing attributes are replaced.\\n\" +\n ' e.g. {\"temperature\": {\"type\": \"Property\", \"value\": 20}}',\n )\n .argument(\"<id>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (id: string, json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.put(\n `/entities/${encodeURIComponent(id)}/attrs`,\n data,\n );\n printSuccess(\"Entity replaced.\");\n },\n ),\n );\n\n addExamples(replace, [\n {\n description: \"Replace all attributes with inline JSON\",\n command: `geonic entities replace urn:ngsi-ld:Sensor:001 '{\"temperature\":{\"type\":\"Property\",\"value\":20}}'`,\n },\n {\n description: \"Replace from a file\",\n command: \"geonic entities replace urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n {\n description: \"Replace from stdin pipe\",\n command: \"cat attrs.json | geonic entities replace urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // entities upsert\n const upsert = entities\n .command(\"upsert\")\n .description(\"Create or update entities\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(async (json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\"/entityOperations/upsert\", data);\n printSuccess(\"Entity upserted.\");\n }),\n );\n\n addExamples(upsert, [\n {\n description: \"Upsert entities from a file\",\n command: \"geonic entities upsert @entities.json\",\n },\n {\n description: \"Upsert from stdin pipe\",\n command: \"cat entities.json | geonic entities upsert\",\n },\n ]);\n\n // entities delete\n const del = entities\n .command(\"delete\")\n .description(\"Delete an entity by ID\")\n .argument(\"<id>\", \"Entity ID\")\n .action(\n withErrorHandler(async (id: string, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(`/entities/${encodeURIComponent(id)}`);\n printSuccess(\"Entity deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an entity by ID\",\n command: \"geonic entities delete urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // Register attrs as a subcommand of entities\n registerAttrsSubcommand(entities);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerBatchCommand(program: Command): void {\n const batch = program\n .command(\"entityOperations\")\n .alias(\"batch\")\n .description(\"Perform batch operations on entities\");\n\n // batch create\n const create = batch\n .command(\"create [json]\")\n .description(\n \"Batch create entities\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities.\\n\" +\n ' e.g. [{\"id\": \"urn:ngsi-ld:Sensor:001\", \"type\": \"Sensor\"}, ...]',\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/create\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(create, [\n {\n description: \"Batch create with inline JSON\",\n command: `geonic batch create '[{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\"},{\"id\":\"urn:ngsi-ld:Sensor:002\",\"type\":\"Sensor\"}]'`,\n },\n {\n description: \"Batch create from a file\",\n command: \"geonic batch create @entities.json\",\n },\n {\n description: \"Batch create from stdin pipe\",\n command: \"cat entities.json | geonic batch create\",\n },\n ]);\n\n // batch upsert\n const upsert = batch\n .command(\"upsert [json]\")\n .description(\n \"Batch upsert entities\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities.\\n\" +\n \"Creates entities that don't exist, updates those that do.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/upsert\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(upsert, [\n {\n description: \"Batch upsert with inline JSON\",\n command: `geonic batch upsert '[{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\",\"temperature\":{\"type\":\"Property\",\"value\":25}}]'`,\n },\n {\n description: \"Batch upsert from a file\",\n command: \"geonic batch upsert @entities.json\",\n },\n {\n description: \"Batch upsert from stdin pipe\",\n command: \"cat entities.json | geonic batch upsert\",\n },\n ]);\n\n // batch update\n const update = batch\n .command(\"update [json]\")\n .description(\n \"Batch update entity attributes\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities with attributes to update.\\n\" +\n \"Each entity must include id and type; only specified attributes are modified.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/update\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(update, [\n {\n description: \"Batch update from a file\",\n command: \"geonic batch update @updates.json\",\n },\n {\n description: \"Batch update from stdin\",\n command: \"cat updates.json | geonic batch update\",\n },\n ]);\n\n // batch delete\n const del = batch\n .command(\"delete [json]\")\n .description(\n \"Batch delete entities by ID\\n\\n\" +\n 'JSON payload: an array of entity ID strings.\\n' +\n ' e.g. [\"urn:ngsi-ld:Sensor:001\",\"urn:ngsi-ld:Sensor:002\"]',\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/delete\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(del, [\n {\n description: \"Batch delete with inline JSON\",\n command: `geonic batch delete '[\"urn:ngsi-ld:Sensor:001\",\"urn:ngsi-ld:Sensor:002\"]'`,\n },\n {\n description: \"Batch delete from a file\",\n command: \"geonic batch delete @entity-ids.json\",\n },\n {\n description: \"Batch delete from stdin pipe\",\n command: \"cat entity-ids.json | geonic batch delete\",\n },\n ]);\n\n // batch query\n const query = batch\n .command(\"query [json]\")\n .description(\n \"Query entities by posting a query payload\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"entities\": [{\"type\": \"Sensor\"}],\\n' +\n ' \"attrs\": [\"temperature\"],\\n' +\n ' \"q\": \"temperature>30\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/query\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(query, [\n {\n description: \"Query with inline JSON\",\n command: `geonic batch query '{\"entities\":[{\"type\":\"Sensor\"}],\"attrs\":[\"temperature\"]}'`,\n },\n {\n description: \"Query from a file\",\n command: \"geonic batch query @query.json\",\n },\n {\n description: \"Query from stdin pipe\",\n command: \"cat query.json | geonic batch query\",\n },\n ]);\n\n // batch merge\n const merge = batch\n .command(\"merge [json]\")\n .description(\n \"Batch merge-patch entities\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities.\\n\" +\n \"Each entity must include id and type; attributes are merge-patched.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/merge\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(merge, [\n {\n description: \"Batch merge-patch from a file\",\n command: \"geonic batch merge @patches.json\",\n },\n {\n description: \"Batch merge-patch from stdin\",\n command: \"cat patches.json | geonic batch merge\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerSubscriptionsCommand(program: Command): void {\n const subscriptions = program\n .command(\"subscriptions\")\n .alias(\"sub\")\n .description(\"Manage context subscriptions\");\n\n // subscriptions list\n const list = subscriptions\n .command(\"list\")\n .description(\"List subscriptions\")\n .option(\"--limit <n>\", \"Maximum number of results\", parseInt)\n .option(\"--offset <n>\", \"Skip N results\", parseInt)\n .option(\"--count\", \"Include total count in response\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/subscriptions\", params);\n outputResponse(response, format, !!cmdOpts.count);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all subscriptions\",\n command: \"geonic subscriptions list\",\n },\n {\n description: \"List with pagination\",\n command: \"geonic subscriptions list --limit 10 --offset 20\",\n },\n {\n description: \"List with total count\",\n command: \"geonic subscriptions list --count\",\n },\n ]);\n\n // subscriptions get\n const get = subscriptions\n .command(\"get <id>\")\n .description(\"Get a subscription by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get subscription by ID\",\n command: \"geonic subscriptions get urn:ngsi-ld:Subscription:001\",\n },\n ]);\n\n // subscriptions create\n const create = subscriptions\n .command(\"create [json]\")\n .description(\n \"Create a subscription\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"type\": \"Subscription\",\\n' +\n ' \"entities\": [{\"type\": \"Sensor\"}],\\n' +\n ' \"watchedAttributes\": [\"temperature\"],\\n' +\n ' \"notification\": {\"endpoint\": {\"uri\": \"http://localhost:3000/notify\"}}\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/subscriptions\", data);\n outputResponse(response, format);\n printSuccess(\"Subscription created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic subscriptions create '{\"type\":\"Subscription\",\"entities\":[{\"type\":\"Sensor\"}],\"watchedAttributes\":[\"temperature\"],\"notification\":{\"endpoint\":{\"uri\":\"http://localhost:3000/notify\"}}}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic subscriptions create @subscription.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat subscription.json | geonic subscriptions create\",\n },\n {\n description: \"Interactive mode\",\n command: \"geonic subscriptions create\",\n },\n ]);\n\n // subscriptions update\n const update = subscriptions\n .command(\"update <id> [json]\")\n .description(\n \"Update a subscription\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated subscription\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.patch(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n data,\n );\n outputResponse(response, format);\n printSuccess(\"Subscription updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic subscriptions update urn:ngsi-ld:Subscription:001 '{\"description\":\"Updated subscription\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic subscriptions update urn:ngsi-ld:Subscription:001 @sub.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat sub.json | geonic subscriptions update urn:ngsi-ld:Subscription:001\",\n },\n ]);\n\n // subscriptions delete\n const del = subscriptions\n .command(\"delete <id>\")\n .description(\"Delete a subscription\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Subscription deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a subscription\",\n command: \"geonic subscriptions delete urn:ngsi-ld:Subscription:001\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerRegistrationsCommand(program: Command): void {\n const registrations = program\n .command(\"registrations\")\n .alias(\"reg\")\n .description(\"Manage context registrations\");\n\n // registrations list\n const list = registrations\n .command(\"list\")\n .description(\"List registrations\")\n .option(\"--limit <n>\", \"Maximum number of results\", parseInt)\n .option(\"--offset <n>\", \"Skip N results\", parseInt)\n .option(\"--count\", \"Include total count in response\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/csourceRegistrations\", params);\n outputResponse(response, format, !!cmdOpts.count);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all registrations\",\n command: \"geonic registrations list\",\n },\n {\n description: \"List with pagination\",\n command: \"geonic registrations list --limit 10\",\n },\n ]);\n\n // registrations get\n const get = registrations\n .command(\"get <id>\")\n .description(\"Get a registration by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get registration by ID\",\n command:\n \"geonic registrations get urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n\n // registrations create\n const create = registrations\n .command(\"create [json]\")\n .description(\n \"Create a registration\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"type\": \"ContextSourceRegistration\",\\n' +\n ' \"information\": [{\"entities\": [{\"type\": \"Room\"}]}],\\n' +\n ' \"endpoint\": \"http://localhost:4000/source\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/csourceRegistrations\", data);\n outputResponse(response, format);\n printSuccess(\"Registration created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic registrations create '{\"type\":\"ContextSourceRegistration\",\"information\":[{\"entities\":[{\"type\":\"Room\"}]}],\"endpoint\":\"http://localhost:4000/source\"}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic registrations create @registration.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat registration.json | geonic registrations create\",\n },\n ]);\n\n // registrations update\n const regUpdate = registrations\n .command(\"update <id> [json]\")\n .description(\"Update a registration\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.patch(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n data,\n );\n outputResponse(response, format);\n printSuccess(\"Registration updated.\");\n },\n ),\n );\n\n addExamples(regUpdate, [\n {\n description: \"Update endpoint\",\n command: `geonic registrations update urn:ngsi-ld:ContextSourceRegistration:001 '{\"endpoint\":\"http://localhost:5000/source\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic registrations update urn:ngsi-ld:ContextSourceRegistration:001 @registration.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat registration.json | geonic registrations update urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n\n // registrations delete\n const del = registrations\n .command(\"delete <id>\")\n .description(\"Delete a registration\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Registration deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a registration\",\n command:\n \"geonic registrations delete urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerTypesCommand(program: Command): void {\n const types = program\n .command(\"types\")\n .description(\"Browse entity types\");\n\n // types list\n const list = types\n .command(\"list\")\n .description(\"List available entity types\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\"/types\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all entity types\",\n command: \"geonic types list\",\n },\n ]);\n\n // types get\n const get = types\n .command(\"get <typeName>\")\n .description(\"Get details for an entity type\")\n .action(\n withErrorHandler(\n async (typeName: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/types/${encodeURIComponent(String(typeName))}`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(get, [\n {\n description: \"Get details for a specific type\",\n command: \"geonic types get Sensor\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nfunction addTemporalListOptions(cmd: Command): Command {\n return cmd\n .option(\"--type <type>\", \"Filter by entity type\")\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--query <q>\", \"NGSI query expression\")\n .option(\"--georel <rel>\", \"Geo-relationship (e.g. near;maxDistance:1000)\")\n .option(\"--geometry <geo>\", \"Geometry type for geo-query (e.g. point)\")\n .option(\"--coords <coords>\", \"Coordinates for geo-query\")\n .option(\"--time-rel <rel>\", \"Temporal relationship (before, after, between)\")\n .option(\"--time-at <time>\", \"Temporal query start time (ISO 8601)\")\n .option(\"--end-time-at <time>\", \"Temporal query end time (ISO 8601)\")\n .option(\"--last-n <n>\", \"Return last N temporal values\", parseInt)\n .option(\"--limit <n>\", \"Maximum number of entities to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N entities\", parseInt)\n .option(\"--count\", \"Include total count in response\");\n}\n\nfunction createListAction() {\n return withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.type) params[\"type\"] = cmdOpts.type;\n if (cmdOpts.attrs) params[\"attrs\"] = cmdOpts.attrs;\n if (cmdOpts.query) params[\"q\"] = cmdOpts.query;\n if (cmdOpts.georel) params[\"georel\"] = cmdOpts.georel;\n if (cmdOpts.geometry) params[\"geometry\"] = cmdOpts.geometry;\n if (cmdOpts.coords) params[\"coordinates\"] = cmdOpts.coords;\n if (cmdOpts.timeRel) params[\"timerel\"] = cmdOpts.timeRel;\n if (cmdOpts.timeAt) params[\"timeAt\"] = cmdOpts.timeAt;\n if (cmdOpts.endTimeAt) params[\"endTimeAt\"] = cmdOpts.endTimeAt;\n if (cmdOpts.lastN !== undefined) params[\"lastN\"] = String(cmdOpts.lastN);\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/temporal/entities\", params);\n outputResponse(response, format, cmdOpts.count);\n });\n}\n\nfunction addTemporalGetOptions(cmd: Command): Command {\n return cmd\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--time-rel <rel>\", \"Temporal relationship (before, after, between)\")\n .option(\"--time-at <time>\", \"Temporal query start time (ISO 8601)\")\n .option(\"--end-time-at <time>\", \"Temporal query end time (ISO 8601)\")\n .option(\"--last-n <n>\", \"Return last N temporal values\", parseInt);\n}\n\nfunction createGetAction() {\n return withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.attrs) params[\"attrs\"] = cmdOpts.attrs;\n if (cmdOpts.timeRel) params[\"timerel\"] = cmdOpts.timeRel;\n if (cmdOpts.timeAt) params[\"timeAt\"] = cmdOpts.timeAt;\n if (cmdOpts.endTimeAt) params[\"endTimeAt\"] = cmdOpts.endTimeAt;\n if (cmdOpts.lastN !== undefined) params[\"lastN\"] = String(cmdOpts.lastN);\n\n const response = await client.get(\n `/temporal/entities/${encodeURIComponent(String(id))}`,\n params,\n );\n outputResponse(response, format);\n });\n}\n\nfunction createCreateAction() {\n return withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n\n await client.post(\"/temporal/entities\", body);\n printSuccess(\"Temporal entity created.\");\n });\n}\n\nfunction createDeleteAction() {\n return withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/temporal/entities/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Temporal entity deleted.\");\n });\n}\n\nfunction createQueryAction() {\n return withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.aggrMethods) params[\"aggrMethods\"] = cmdOpts.aggrMethods;\n if (cmdOpts.aggrPeriod) params[\"aggrPeriodDuration\"] = cmdOpts.aggrPeriod;\n\n const response = await client.post(\n \"/temporal/entityOperations/query\",\n body,\n params,\n );\n outputResponse(response, format);\n });\n}\n\nfunction addQueryOptions(cmd: Command): Command {\n return cmd\n .option(\"--aggr-methods <methods>\", \"Aggregation methods (e.g. totalCount,sum)\")\n .option(\"--aggr-period <period>\", \"Aggregation period (e.g. PT1H)\");\n}\n\nexport function registerTemporalCommand(program: Command): void {\n const temporal = program\n .command(\"temporal\")\n .description(\"Manage temporal entities\");\n\n const entities = temporal\n .command(\"entities\")\n .description(\"List, get, create, and delete temporal entities\");\n\n const entityOperations = temporal\n .command(\"entityOperations\")\n .description(\"Perform batch operations on temporal entities\");\n\n // temporal entities list\n const entitiesList = addTemporalListOptions(\n entities.command(\"list\").description(\"List temporal entities with optional filters\"),\n );\n entitiesList.action(createListAction());\n\n addExamples(entitiesList, [\n {\n description: \"List by type with time range\",\n command:\n \"geonic temporal entities list --type Sensor --time-rel between --time-at 2025-01-01T00:00:00Z --end-time-at 2025-01-31T23:59:59Z\",\n },\n {\n description: \"Get last 5 temporal values\",\n command: \"geonic temporal entities list --type Sensor --last-n 5\",\n },\n {\n description: \"Filter by time (after a point)\",\n command:\n \"geonic temporal entities list --time-rel after --time-at 2025-06-01T00:00:00Z\",\n },\n ]);\n\n // temporal entities get\n const entitiesGet = addTemporalGetOptions(\n entities.command(\"get <id>\").description(\"Get a temporal entity by ID\"),\n );\n entitiesGet.action(createGetAction());\n\n addExamples(entitiesGet, [\n {\n description: \"Get temporal entity with specific attributes\",\n command:\n \"geonic temporal entities get urn:ngsi-ld:Sensor:001 --attrs temperature,humidity\",\n },\n {\n description: \"Get last 10 values for an entity\",\n command: \"geonic temporal entities get urn:ngsi-ld:Sensor:001 --last-n 10\",\n },\n ]);\n\n // temporal entities create\n const create = entities\n .command(\"create [json]\")\n .description(\n \"Create a temporal entity\\n\\n\" +\n \"JSON payload: an NGSI-LD entity with temporal attribute instances.\\n\" +\n \"Each attribute value is an array of {value, observedAt} objects.\",\n )\n .action(createCreateAction());\n\n addExamples(create, [\n {\n description: \"Create from a file\",\n command: \"geonic temporal entities create @temporal-entity.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat temporal-entity.json | geonic temporal entities create\",\n },\n {\n description: \"Interactive mode\",\n command: \"geonic temporal entities create\",\n },\n ]);\n\n // temporal entities delete\n const del = entities\n .command(\"delete <id>\")\n .description(\"Delete a temporal entity by ID\")\n .action(createDeleteAction());\n\n addExamples(del, [\n {\n description: \"Delete temporal data for an entity\",\n command: \"geonic temporal entities delete urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // temporal entityOperations query\n const opsQuery = addQueryOptions(\n entityOperations.command(\"query [json]\").description(\"Query temporal entities (POST)\"),\n );\n opsQuery.action(createQueryAction());\n\n addExamples(opsQuery, [\n {\n description: \"Query with inline JSON\",\n command: `geonic temporal entityOperations query '{\"entities\":[{\"type\":\"Sensor\"}],\"attrs\":[\"temperature\"]}'`,\n },\n {\n description: \"Query with aggregation (hourly count)\",\n command:\n \"geonic temporal entityOperations query @query.json --aggr-methods totalCount --aggr-period PT1H\",\n },\n {\n description: \"Query from a file\",\n command: \"geonic temporal entityOperations query @query.json\",\n },\n ]);\n\n // Backward-compatible hidden aliases at the temporal level\n addTemporalListOptions(\n temporal\n .command(\"list\", { hidden: true })\n .description(\"List temporal entities (deprecated: use temporal entities list)\"),\n ).action(createListAction());\n\n addTemporalGetOptions(\n temporal\n .command(\"get <id>\", { hidden: true })\n .description(\"Get a temporal entity (deprecated: use temporal entities get)\"),\n ).action(createGetAction());\n\n temporal\n .command(\"create [json]\", { hidden: true })\n .description(\"Create a temporal entity (deprecated: use temporal entities create)\")\n .action(createCreateAction());\n\n temporal\n .command(\"delete <id>\", { hidden: true })\n .description(\"Delete a temporal entity (deprecated: use temporal entities delete)\")\n .action(createDeleteAction());\n\n addQueryOptions(\n temporal\n .command(\"query [json]\", { hidden: true })\n .description(\"Query temporal entities (deprecated: use temporal entityOperations query)\"),\n ).action(createQueryAction());\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerSnapshotsCommand(program: Command): void {\n const snapshots = program\n .command(\"snapshots\")\n .description(\"Manage snapshots\");\n\n // snapshots list\n const list = snapshots\n .command(\"list\")\n .description(\"List snapshots\")\n .option(\"--limit <n>\", \"Maximum number of snapshots to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N snapshots\", parseInt)\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n\n const response = await client.get(\"/snapshots\", params);\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all snapshots\",\n command: \"geonic snapshots list\",\n },\n {\n description: \"List with a limit\",\n command: \"geonic snapshots list --limit 10\",\n },\n ]);\n\n // snapshots get\n const get = snapshots\n .command(\"get <id>\")\n .description(\"Get a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/snapshots/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific snapshot\",\n command: \"geonic snapshots get <snapshot-id>\",\n },\n ]);\n\n // snapshots create\n const create = snapshots\n .command(\"create\")\n .description(\"Create a new snapshot\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.post(\"/snapshots\");\n printSuccess(\"Snapshot created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a new snapshot\",\n command: \"geonic snapshots create\",\n },\n ]);\n\n // snapshots delete\n const del = snapshots\n .command(\"delete <id>\")\n .description(\"Delete a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/snapshots/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Snapshot deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a snapshot\",\n command: \"geonic snapshots delete <snapshot-id>\",\n },\n ]);\n\n // snapshots clone\n const clone = snapshots\n .command(\"clone <id>\")\n .description(\"Clone a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.post(\n `/snapshots/${encodeURIComponent(String(id))}/clone`,\n );\n if (response.data !== undefined && response.data !== \"\") {\n outputResponse(response, format);\n } else {\n printSuccess(\"Snapshot cloned.\");\n }\n }),\n );\n\n addExamples(clone, [\n {\n description: \"Clone a snapshot\",\n command: \"geonic snapshots clone <snapshot-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerTenantsCommand(parent: Command): void {\n const tenants = parent\n .command(\"tenants\")\n .description(\"Manage tenants\");\n\n // tenants list\n const list = tenants\n .command(\"list\")\n .description(\"List all tenants\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/tenants\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all tenants\",\n command: \"geonic admin tenants list\",\n },\n ]);\n\n // tenants get\n const get = tenants\n .command(\"get <id>\")\n .description(\"Get a tenant by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a tenant by ID\",\n command: \"geonic admin tenants get <tenant-id>\",\n },\n ]);\n\n // tenants create\n const create = tenants\n .command(\"create [json]\")\n .description(\n \"Create a new tenant\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"name\": \"production\",\\n' +\n ' \"description\": \"Production environment tenant\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/tenants\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"Tenant created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic admin tenants create '{\"name\":\"my-tenant\",\"description\":\"My first tenant\"}'`,\n },\n {\n description: \"Minimal (name only)\",\n command: `geonic admin tenants create '{\"name\":\"production\"}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin tenants create @tenant.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat tenant.json | geonic admin tenants create\",\n },\n {\n description: \"Interactive mode (omit JSON argument)\",\n command: \"geonic admin tenants create\",\n },\n ]);\n\n // tenants update\n const update = tenants\n .command(\"update <id> [json]\")\n .description(\n \"Update a tenant\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"name\": \"new-name\", \"description\": \"Updated description\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = (await parseJsonInput(json as string | undefined)) as Record<string, unknown>;\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Tenant updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description with inline JSON\",\n command: `geonic admin tenants update <tenant-id> '{\"description\":\"Updated description\"}'`,\n },\n {\n description: \"Rename a tenant\",\n command: `geonic admin tenants update <tenant-id> '{\"name\":\"new-name\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin tenants update <tenant-id> @patch.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat patch.json | geonic admin tenants update <tenant-id>\",\n },\n {\n description: \"Interactive mode\",\n command: \"geonic admin tenants update <tenant-id>\",\n },\n ]);\n\n // tenants delete\n const del = tenants\n .command(\"delete <id>\")\n .description(\"Delete a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Tenant deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a tenant\",\n command: \"geonic admin tenants delete <tenant-id>\",\n },\n ]);\n\n // tenants activate\n const activate = tenants\n .command(\"activate <id>\")\n .description(\"Activate a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/tenants/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Tenant activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a tenant\",\n command: \"geonic admin tenants activate <tenant-id>\",\n },\n ]);\n\n // tenants deactivate\n const deactivate = tenants\n .command(\"deactivate <id>\")\n .description(\"Deactivate a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/tenants/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Tenant deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a tenant\",\n command: \"geonic admin tenants deactivate <tenant-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerUsersCommand(parent: Command): void {\n const users = parent\n .command(\"users\")\n .description(\"Manage users\");\n\n // users list\n const list = users\n .command(\"list\")\n .description(\"List all users\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/users\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all users\",\n command: \"geonic admin users list\",\n },\n ]);\n\n // users get\n const get = users\n .command(\"get <id>\")\n .description(\"Get a user by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a user by ID\",\n command: \"geonic admin users get <user-id>\",\n },\n ]);\n\n // users create\n const create = users\n .command(\"create [json]\")\n .description(\n \"Create a new user\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"email\": \"user@example.com\",\\n' +\n ' \"password\": \"SecurePassword123!\",\\n' +\n ' \"role\": \"tenant_admin\",\\n' +\n ' \"tenantId\": \"<tenant-id>\"\\n' +\n \" }\\n\\n\" +\n \"Roles: super_admin, tenant_admin, user\\n\" +\n \"tenantId is required for tenant_admin and user roles.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/users\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"User created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a tenant admin\",\n command: `geonic admin users create '{\"email\":\"admin@example.com\",\"password\":\"SecurePass12345!\",\"role\":\"tenant_admin\",\"tenantId\":\"<tenant-id>\"}'`,\n },\n {\n description: \"Create a user for a tenant\",\n command: `geonic admin users create '{\"email\":\"user@example.com\",\"password\":\"SecurePass12345!\",\"role\":\"user\",\"tenantId\":\"<tenant-id>\"}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin users create @user.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat user.json | geonic admin users create\",\n },\n ]);\n\n // users update\n const update = users\n .command(\"update <id> [json]\")\n .description(\n \"Update a user\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"role\": \"admin\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"User updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update role with inline JSON\",\n command: `geonic admin users update <user-id> '{\"role\":\"admin\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin users update <user-id> @user.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat user.json | geonic admin users update <user-id>\",\n },\n ]);\n\n // users delete\n const del = users\n .command(\"delete <id>\")\n .description(\"Delete a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"User deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a user\",\n command: \"geonic admin users delete <user-id>\",\n },\n ]);\n\n // users activate\n const activate = users\n .command(\"activate <id>\")\n .description(\"Activate a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"User activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a user\",\n command: \"geonic admin users activate <user-id>\",\n },\n ]);\n\n // users deactivate\n const deactivate = users\n .command(\"deactivate <id>\")\n .description(\"Deactivate a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"User deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a user\",\n command: \"geonic admin users deactivate <user-id>\",\n },\n ]);\n\n // users unlock\n const unlock = users\n .command(\"unlock <id>\")\n .description(\"Unlock a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/unlock`,\n );\n printSuccess(\"User unlocked.\");\n }),\n );\n\n addExamples(unlock, [\n {\n description: \"Unlock a locked user account\",\n command: \"geonic admin users unlock <user-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerPoliciesCommand(parent: Command): void {\n const policies = parent\n .command(\"policies\")\n .description(\"Manage policies\");\n\n // policies list\n const list = policies\n .command(\"list\")\n .description(\"List all policies\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/policies\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all policies\",\n command: \"geonic admin policies list\",\n },\n ]);\n\n // policies get\n const get = policies\n .command(\"get <id>\")\n .description(\"Get a policy by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a policy by ID\",\n command: \"geonic admin policies get <policy-id>\",\n },\n ]);\n\n // policies create\n const create = policies\n .command(\"create [json]\")\n .description(\n \"Create a new policy\\n\\n\" +\n \"JSON payload examples:\\n\\n\" +\n \" Allow all entities:\\n\" +\n \" {\\n\" +\n ' \"description\": \"Allow all entities\",\\n' +\n ' \"rules\": [{\"ruleId\": \"allow-all\", \"effect\": \"Permit\"}]\\n' +\n \" }\\n\\n\" +\n \" Allow GET access to a specific entity type:\\n\" +\n \" {\\n\" +\n ' \"description\": \"Allow GET access to Landmark entities\",\\n' +\n ' \"target\": {\\n' +\n ' \"resources\": [{\"attributeId\": \"entityType\", \"matchValue\": \"Landmark\"}],\\n' +\n ' \"actions\": [{\"attributeId\": \"method\", \"matchValue\": \"GET\"}]\\n' +\n \" },\\n\" +\n ' \"rules\": [{\"ruleId\": \"permit-get\", \"effect\": \"Permit\"}]\\n' +\n \" }\\n\\n\" +\n \"Target fields:\\n\" +\n \" subjects — attributeId: role, userId, email, tenantId\\n\" +\n \" resources — attributeId: path, entityType, entityId, entityOwner, tenantService, servicePath\\n\" +\n \" actions — attributeId: method (GET, POST, PATCH, DELETE)\\n\\n\" +\n \"Each element: {attributeId, matchValue, matchFunction?}\\n\" +\n \" matchFunction: \\\"string-equal\\\" (default) | \\\"string-regexp\\\" | \\\"glob\\\"\\n\\n\" +\n \"Priority: higher number = higher priority (default: 0).\\n\" +\n \" Custom policies (e.g. 100) override default role policies (0).\\n\\n\" +\n \"Default role policies (priority 0):\\n\" +\n \" user → GET only, api_key → all Deny, anonymous → all Deny\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/policies\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"Policy created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic admin policies create '{\"description\":\"Allow all entities\",\"rules\":[{\"ruleId\":\"allow-all\",\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Create with target (entity type + method)\",\n command: `geonic admin policies create '{\"description\":\"Allow GET Landmark\",\"target\":{\"resources\":[{\"attributeId\":\"entityType\",\"matchValue\":\"Landmark\"}],\"actions\":[{\"attributeId\":\"method\",\"matchValue\":\"GET\"}]},\"rules\":[{\"ruleId\":\"permit-get\",\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Create anonymous access policy\",\n command: `geonic admin policies create '{\"policyId\":\"public-read\",\"target\":{\"subjects\":[{\"attributeId\":\"role\",\"matchValue\":\"anonymous\"}],\"resources\":[{\"attributeId\":\"entityType\",\"matchValue\":\"WeatherObserved\"}],\"actions\":[{\"attributeId\":\"method\",\"matchValue\":\"GET\"}]},\"rules\":[{\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Create servicePath-based policy (glob match)\",\n command: `geonic admin policies create '{\"description\":\"Allow read on /opendata/**\",\"priority\":100,\"target\":{\"resources\":[{\"attributeId\":\"servicePath\",\"matchValue\":\"/opendata/**\",\"matchFunction\":\"glob\"}],\"actions\":[{\"attributeId\":\"method\",\"matchValue\":\"GET\"}]},\"rules\":[{\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin policies create @policy.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat policy.json | geonic admin policies create\",\n },\n ]);\n\n // policies update\n const update = policies\n .command(\"update <id> [json]\")\n .description(\n \"Update a policy\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated policy\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Policy updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic admin policies update <policy-id> '{\"description\":\"Updated policy\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin policies update <policy-id> @policy.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat policy.json | geonic admin policies update <policy-id>\",\n },\n ]);\n\n // policies delete\n const del = policies\n .command(\"delete <id>\")\n .description(\"Delete a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Policy deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a policy\",\n command: \"geonic admin policies delete <policy-id>\",\n },\n ]);\n\n // policies activate\n const activate = policies\n .command(\"activate <id>\")\n .description(\"Activate a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/policies/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Policy activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a policy\",\n command: \"geonic admin policies activate <policy-id>\",\n },\n ]);\n\n // policies deactivate\n const deactivate = policies\n .command(\"deactivate <id>\")\n .description(\"Deactivate a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/policies/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Policy deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a policy\",\n command: \"geonic admin policies deactivate <policy-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerOAuthClientsCommand(parent: Command): void {\n const oauthClients = parent\n .command(\"oauth-clients\")\n .description(\"Manage OAuth clients\");\n\n // oauth-clients list\n const list = oauthClients\n .command(\"list\")\n .description(\"List all OAuth clients\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/oauth-clients\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all OAuth clients\",\n command: \"geonic admin oauth-clients list\",\n },\n ]);\n\n // oauth-clients get\n const get = oauthClients\n .command(\"get <id>\")\n .description(\"Get an OAuth client by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get an OAuth client by ID\",\n command: \"geonic admin oauth-clients get <client-id>\",\n },\n ]);\n\n // oauth-clients create\n const create = oauthClients\n .command(\"create [json]\")\n .description(\n \"Create a new OAuth client\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"clientName\": \"my-app\",\\n' +\n ' \"allowedScopes\": [\"read:entities\", \"write:entities\"]\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/oauth-clients\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic admin oauth-clients create '{\"clientName\":\"my-app\",\"allowedScopes\":[\"read:entities\",\"write:entities\"]}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin oauth-clients create @client.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat client.json | geonic admin oauth-clients create\",\n },\n ]);\n\n // oauth-clients update\n const update = oauthClients\n .command(\"update <id> [json]\")\n .description(\n \"Update an OAuth client\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated client\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"OAuth client updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic admin oauth-clients update <client-id> '{\"description\":\"Updated client\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin oauth-clients update <client-id> @client.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat client.json | geonic admin oauth-clients update <client-id>\",\n },\n ]);\n\n // oauth-clients delete\n const del = oauthClients\n .command(\"delete <id>\")\n .description(\"Delete an OAuth client\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"OAuth client deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an OAuth client\",\n command: \"geonic admin oauth-clients delete <client-id>\",\n },\n ]);\n}\n\nexport function registerCaddeCommand(parent: Command): void {\n const cadde = parent\n .command(\"cadde\")\n .description(\"Manage CADDE configuration\");\n\n // cadde get\n const caddeGet = cadde\n .command(\"get\")\n .description(\"Get CADDE configuration\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/cadde\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(caddeGet, [\n {\n description: \"Get CADDE configuration\",\n command: \"geonic admin cadde get\",\n },\n ]);\n\n // cadde set\n const caddeSet = cadde\n .command(\"set [json]\")\n .description(\n \"Set CADDE configuration\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"provider\": \"my-provider\",\\n' +\n ' \"endpoint\": \"http://localhost:6000\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"PUT\", \"/admin/cadde\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"CADDE configuration set.\");\n }),\n );\n\n addExamples(caddeSet, [\n {\n description: \"Set with inline JSON\",\n command: `geonic admin cadde set '{\"provider\":\"my-provider\",\"endpoint\":\"http://localhost:6000\"}'`,\n },\n {\n description: \"Set from a JSON file\",\n command: \"geonic admin cadde set @cadde-config.json\",\n },\n {\n description: \"Set from stdin pipe\",\n command: \"cat cadde-config.json | geonic admin cadde set\",\n },\n ]);\n\n // cadde delete\n const caddeDelete = cadde\n .command(\"delete\")\n .description(\"Delete CADDE configuration\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\"DELETE\", \"/admin/cadde\");\n printSuccess(\"CADDE configuration deleted.\");\n }),\n );\n\n addExamples(caddeDelete, [\n {\n description: \"Delete CADDE configuration\",\n command: \"geonic admin cadde delete\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, resolveOptions, getFormat, outputResponse } from \"../../helpers.js\";\nimport { loadConfig, saveConfig } from \"../../config.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printError, printWarning } from \"../../output.js\";\nimport { addExamples, addNotes } from \"../help.js\";\nimport { API_KEY_SCOPES_HELP_NOTES, parsePermissions } from \"../../helpers.js\";\n\nfunction validateOrigins(body: unknown, opts: Record<string, unknown>): void {\n // Validate origins if provided via flags\n if (opts.origins !== undefined) {\n const origins = String(opts.origins).split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (origins.length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n // Also validate if provided via JSON input\n if (body && typeof body === \"object\" && \"allowedOrigins\" in (body as Record<string, unknown>)) {\n const origins = (body as Record<string, unknown>).allowedOrigins;\n if (Array.isArray(origins) && origins.filter((o: unknown) => typeof o === \"string\" && o.trim() !== \"\").length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n}\n\nfunction buildBodyFromFlags(opts: Record<string, unknown>): Record<string, unknown> {\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.name = opts.name;\n if (opts.scopes) payload.allowedScopes = (opts.scopes as string).split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.origins) payload.allowedOrigins = (opts.origins as string).split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.entityTypes) payload.allowedEntityTypes = (opts.entityTypes as string).split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.rateLimit) {\n const raw = String(opts.rateLimit).trim();\n if (!/^\\d+$/.test(raw)) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n const perMinute = Number(raw);\n if (perMinute <= 0) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n payload.rateLimit = { perMinute };\n }\n if (opts.dpopRequired !== undefined) payload.dpopRequired = opts.dpopRequired;\n if (opts.permissions) payload.permissions = parsePermissions(opts.permissions as string);\n if (opts.tenantId) payload.tenantId = opts.tenantId;\n return payload;\n}\n\nexport function registerApiKeysCommand(parent: Command): void {\n const apiKeys = parent\n .command(\"api-keys\")\n .description(\"Manage API keys\");\n\n // api-keys list\n const list = apiKeys\n .command(\"list\")\n .description(\"List all API keys\")\n .option(\"--tenant-id <id>\", \"Filter by tenant ID\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as { tenantId?: string };\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const params: Record<string, string> = {};\n if (opts.tenantId) params.tenantId = opts.tenantId;\n const response = await client.rawRequest(\"GET\", \"/admin/api-keys\", {\n params,\n });\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all API keys\",\n command: \"geonic admin api-keys list\",\n },\n {\n description: \"List API keys for a specific tenant\",\n command: \"geonic admin api-keys list --tenant-id <tenant-id>\",\n },\n ]);\n\n // api-keys get\n const get = apiKeys\n .command(\"get <keyId>\")\n .description(\"Get an API key by ID\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/api-keys/${encodeURIComponent(String(keyId))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get an API key by ID\",\n command: \"geonic admin api-keys get <key-id>\",\n },\n ]);\n\n // api-keys create\n const create = apiKeys\n .command(\"create [json]\")\n .description(\"Create a new API key\")\n .option(\"--name <name>\", \"Key name\")\n .option(\"--scopes <scopes>\", \"Comma-separated scopes\")\n .option(\"--origins <origins>\", \"Comma-separated origins\")\n .option(\"--entity-types <types>\", \"Comma-separated entity types\")\n .option(\"--rate-limit <n>\", \"Rate limit per minute\")\n .option(\"--dpop-required\", \"Require DPoP token binding\")\n .option(\"--permissions <perms>\", \"Comma-separated permissions (read, write, create, update, delete)\")\n .option(\"--tenant-id <id>\", \"Tenant ID\")\n .option(\"--save\", \"Save the API key to profile config\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n scopes?: string;\n origins?: string;\n entityTypes?: string;\n rateLimit?: string;\n dpopRequired?: boolean;\n permissions?: string;\n tenantId?: string;\n save?: boolean;\n };\n\n validateOrigins(undefined, opts);\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.scopes || opts.origins || opts.entityTypes || opts.rateLimit || opts.dpopRequired !== undefined || opts.permissions || opts.tenantId) {\n body = buildBodyFromFlags(opts);\n } else {\n body = await parseJsonInput();\n }\n\n validateOrigins(body, {});\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/api-keys\", {\n body,\n });\n const data = response.data as Record<string, unknown>;\n\n if (opts.save) {\n const globalOpts = resolveOptions(cmd);\n const key = data.key as string | undefined;\n if (!key) {\n printError(\"Response missing key. API key was created, but it could not be saved.\");\n outputResponse(response, format);\n process.exitCode = 1;\n return;\n }\n const config = loadConfig(globalOpts.profile);\n config.apiKey = key;\n saveConfig(config, globalOpts.profile);\n console.error(\"API key saved to config. X-Api-Key header will be sent automatically.\");\n } else {\n printWarning(\"Save the API key now — it will not be shown again. Use --save to store it automatically.\");\n }\n\n outputResponse(response, format);\n console.error(\"API key created.\");\n }),\n );\n\n addNotes(create, [\n ...API_KEY_SCOPES_HELP_NOTES,\n \"\",\n \"Valid permissions: read, write, create, update, delete\",\n \" write = create + update + delete\",\n \" Permissions auto-generate XACML policies (allowedEntityTypes respected).\",\n ]);\n\n addExamples(create, [\n {\n description: \"Create an API key with flags\",\n command: \"geonic admin api-keys create --name my-key --scopes read:entities,write:entities --origins '*'\",\n },\n {\n description: \"Create with permissions (auto-generates XACML policy)\",\n command: \"geonic admin api-keys create --name my-key --permissions read,write --origins '*'\",\n },\n {\n description: \"Create an API key with DPoP required\",\n command: \"geonic admin api-keys create --name my-key --dpop-required\",\n },\n {\n description: \"Create an API key from JSON and save to config\",\n command: \"geonic admin api-keys create @key.json --save\",\n },\n ]);\n\n // api-keys update\n const update = apiKeys\n .command(\"update <keyId> [json]\")\n .description(\"Update an API key\")\n .option(\"--name <name>\", \"Key name\")\n .option(\"--scopes <scopes>\", \"Comma-separated scopes\")\n .option(\"--origins <origins>\", \"Comma-separated origins\")\n .option(\"--entity-types <types>\", \"Comma-separated entity types\")\n .option(\"--rate-limit <n>\", \"Rate limit per minute\")\n .option(\"--dpop-required\", \"Require DPoP token binding\")\n .option(\"--no-dpop-required\", \"Disable DPoP token binding\")\n .option(\"--permissions <perms>\", \"Comma-separated permissions (read, write, create, update, delete)\")\n .action(\n withErrorHandler(\n async (keyId: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n scopes?: string;\n origins?: string;\n entityTypes?: string;\n rateLimit?: string;\n dpopRequired?: boolean;\n permissions?: string;\n };\n\n validateOrigins(undefined, opts);\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.scopes || opts.origins || opts.entityTypes || opts.rateLimit || opts.dpopRequired !== undefined || opts.permissions) {\n body = buildBodyFromFlags(opts);\n } else {\n body = await parseJsonInput();\n }\n\n validateOrigins(body, {});\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/api-keys/${encodeURIComponent(String(keyId))}`,\n { body },\n );\n outputResponse(response, format);\n console.error(\"API key updated.\");\n },\n ),\n );\n\n addNotes(update, [\n ...API_KEY_SCOPES_HELP_NOTES,\n \"\",\n \"Valid permissions: read, write, create, update, delete\",\n \" write = create + update + delete\",\n \" Permissions auto-generate XACML policies (allowedEntityTypes respected).\",\n ]);\n\n addExamples(update, [\n {\n description: \"Update an API key name\",\n command: \"geonic admin api-keys update <key-id> --name new-name\",\n },\n {\n description: \"Update permissions\",\n command: \"geonic admin api-keys update <key-id> --permissions read,write\",\n },\n {\n description: \"Enable DPoP requirement\",\n command: \"geonic admin api-keys update <key-id> --dpop-required\",\n },\n {\n description: \"Disable DPoP requirement\",\n command: \"geonic admin api-keys update <key-id> --no-dpop-required\",\n },\n {\n description: \"Update an API key from a JSON file\",\n command: \"geonic admin api-keys update <key-id> @key.json\",\n },\n ]);\n\n // api-keys delete\n const del = apiKeys\n .command(\"delete <keyId>\")\n .description(\"Delete an API key\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/api-keys/${encodeURIComponent(String(keyId))}`,\n );\n console.error(\"API key deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an API key\",\n command: \"geonic admin api-keys delete <key-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { registerTenantsCommand } from \"./tenants.js\";\nimport { registerUsersCommand } from \"./users.js\";\nimport { registerPoliciesCommand } from \"./policies.js\";\nimport { registerOAuthClientsCommand, registerCaddeCommand } from \"./oauth-clients.js\";\nimport { registerApiKeysCommand } from \"./api-keys.js\";\n\nexport function registerAdminCommand(program: Command): void {\n const admin = program\n .command(\"admin\")\n .description(\"Manage admin resources\");\n\n registerTenantsCommand(admin);\n registerUsersCommand(admin);\n registerPoliciesCommand(admin);\n registerOAuthClientsCommand(admin);\n registerApiKeysCommand(admin);\n registerCaddeCommand(admin);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerRulesCommand(program: Command): void {\n const rules = program\n .command(\"rules\")\n .description(\"Manage rule engine\");\n\n // rules list\n const list = rules\n .command(\"list\")\n .description(\"List all rules\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/rules\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all rules\",\n command: \"geonic rules list\",\n },\n ]);\n\n // rules get\n const get = rules\n .command(\"get <id>\")\n .description(\"Get a rule by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/rules/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific rule\",\n command: \"geonic rules get <rule-id>\",\n },\n ]);\n\n // rules create\n const create = rules\n .command(\"create [json]\")\n .description(\n \"Create a new rule\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"name\": \"high-temp-alert\",\\n' +\n ' \"description\": \"Alert on high temperature\",\\n' +\n ' \"conditions\": [{\"type\": \"celExpression\", \"expression\": \"entity.temperature > 30\"}],\\n' +\n ' \"actions\": [{\"type\": \"webhook\", \"url\": \"http://localhost:5000/alert\", \"method\": \"POST\"}]\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/rules\", { body });\n outputResponse(response, format);\n printSuccess(\"Rule created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic rules create '{\"name\":\"high-temp-alert\",\"conditions\":[{\"type\":\"celExpression\",\"expression\":\"entity.temperature > 30\"}],\"actions\":[{\"type\":\"webhook\",\"url\":\"http://localhost:5000/alert\",\"method\":\"POST\"}]}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic rules create @rule.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat rule.json | geonic rules create\",\n },\n ]);\n\n // rules update\n const update = rules\n .command(\"update <id> [json]\")\n .description(\n \"Update a rule\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n \" e.g. {\\\"description\\\": \\\"Updated rule\\\"}\",\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/rules/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Rule updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic rules update <rule-id> '{\"description\":\"Updated rule\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic rules update <rule-id> @rule.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat rule.json | geonic rules update <rule-id>\",\n },\n ]);\n\n // rules delete\n const del = rules\n .command(\"delete <id>\")\n .description(\"Delete a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/rules/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Rule deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a rule\",\n command: \"geonic rules delete <rule-id>\",\n },\n ]);\n\n // rules activate\n const activate = rules\n .command(\"activate <id>\")\n .description(\"Activate a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/rules/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Rule activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a rule\",\n command: \"geonic rules activate <rule-id>\",\n },\n ]);\n\n // rules deactivate\n const deactivate = rules\n .command(\"deactivate <id>\")\n .description(\"Deactivate a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/rules/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Rule deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a rule\",\n command: \"geonic rules deactivate <rule-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerModelsCommand(program: Command): void {\n const models = program\n .command(\"custom-data-models\")\n .alias(\"models\")\n .description(\"Manage custom data models\");\n\n // models list\n const list = models\n .command(\"list\")\n .description(\"List all models\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/custom-data-models\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all models\",\n command: \"geonic models list\",\n },\n ]);\n\n // models get\n const get = models\n .command(\"get <id>\")\n .description(\"Get a model by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific model\",\n command: \"geonic models get <model-id>\",\n },\n ]);\n\n // models create\n const create = models\n .command(\"create [json]\")\n .description(\n \"Create a new model\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"type\": \"Sensor\",\\n' +\n ' \"domain\": \"iot\",\\n' +\n ' \"description\": \"IoT Sensor\",\\n' +\n ' \"propertyDetails\": {\\n' +\n ' \"temperature\": {\"ngsiType\": \"Property\", \"valueType\": \"Number\", \"example\": 25}\\n' +\n \" }\\n\" +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/custom-data-models\", { body });\n outputResponse(response, format);\n printSuccess(\"Model created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic models create '{\"type\":\"Sensor\",\"domain\":\"iot\",\"description\":\"IoT Sensor\",\"propertyDetails\":{\"temperature\":{\"ngsiType\":\"Property\",\"valueType\":\"Number\",\"example\":25}}}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic models create @model.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat model.json | geonic models create\",\n },\n ]);\n\n // models update\n const update = models\n .command(\"update <id> [json]\")\n .description(\n \"Update a model\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated model\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Model updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic models update <model-id> '{\"description\":\"Updated description\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic models update <model-id> @model.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat model.json | geonic models update <model-id>\",\n },\n ]);\n\n // models delete\n const del = models\n .command(\"delete <id>\")\n .description(\"Delete a model\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Model deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a model\",\n command: \"geonic models delete <model-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerCatalogCommand(program: Command): void {\n const catalog = program\n .command(\"catalog\")\n .description(\"Browse DCAT-AP catalog\");\n\n // catalog get\n const get = catalog\n .command(\"get\")\n .description(\"Get the catalog\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/catalog\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get the DCAT-AP catalog\",\n command: \"geonic catalog get\",\n },\n ]);\n\n // catalog datasets\n const datasets = catalog\n .command(\"datasets\")\n .description(\"Manage catalog datasets\");\n\n // catalog datasets list\n const datasetsList = datasets\n .command(\"list\")\n .description(\"List all datasets\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/catalog/datasets\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsList, [\n {\n description: \"List all catalog datasets\",\n command: \"geonic catalog datasets list\",\n },\n ]);\n\n // catalog datasets get\n const datasetsGet = datasets\n .command(\"get <id>\")\n .description(\"Get a dataset by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/catalog/datasets/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsGet, [\n {\n description: \"Get a specific dataset\",\n command: \"geonic catalog datasets get <dataset-id>\",\n },\n ]);\n\n // catalog datasets sample\n const datasetsSample = datasets\n .command(\"sample <id>\")\n .description(\"Get sample data for a dataset\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/catalog/datasets/${encodeURIComponent(String(id))}/sample`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsSample, [\n {\n description: \"Get sample data for a dataset\",\n command: \"geonic catalog datasets sample <dataset-id>\",\n },\n ]);\n}\n","import { createRequire } from \"node:module\";\nimport type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { printInfo } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerHealthCommand(program: Command): void {\n const health = program\n .command(\"health\")\n .description(\"Check the health status of the server\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.rawRequest(\"GET\", \"/health\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(health, [\n {\n description: \"Check server health\",\n command: \"geonic health\",\n },\n ]);\n}\n\nexport function registerVersionCommand(program: Command): void {\n const version = program\n .command(\"version\")\n .description(\"Display CLI and server version information\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version: string };\n const cliVersion = pkg.version;\n\n printInfo(`CLI version: ${cliVersion}`);\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.rawRequest(\"GET\", \"/version\");\n printInfo(\"Server version:\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(version, [\n {\n description: \"Show CLI and server version\",\n command: \"geonic version\",\n },\n ]);\n}\n","import { createRequire } from \"node:module\";\nimport type { Command, Option } from \"commander\";\nimport { addExamples } from \"./help.js\";\n\nfunction findOption(\n cmd: Command,\n program: Command,\n flag: string,\n): Option | undefined {\n return (\n cmd.options.find((o) => o.long === flag || o.short === flag) ||\n program.options.find((o) => o.long === flag || o.short === flag)\n );\n}\n\nfunction optionTakesValue(\n cmd: Command,\n program: Command,\n flag: string,\n): boolean {\n const opt = findOption(cmd, program, flag);\n if (!opt) return false;\n return !!(opt.required || opt.optional);\n}\n\nfunction findSubcommand(cmd: Command, name: string): Command | undefined {\n return cmd.commands.find(\n (c) => c.name() === name || c.aliases().includes(name),\n );\n}\n\nexport function generateCompletions(\n program: Command,\n line: string,\n point: number,\n): string[] {\n const truncated = line.slice(0, point);\n const tokens = truncated.trim().split(/\\s+/).filter(Boolean);\n const startingNewWord = /\\s$/.test(truncated);\n\n // Determine partial input (what the user is currently typing)\n const partial =\n !startingNewWord && tokens.length > 1 ? tokens[tokens.length - 1] : \"\";\n\n // Tokens to walk the command tree (exclude program name and partial)\n const walkTokens = startingNewWord ? tokens.slice(1) : tokens.slice(1, -1);\n\n // Walk the command tree\n let currentCmd = program;\n let i = 0;\n\n while (i < walkTokens.length) {\n const token = walkTokens[i];\n\n if (token.startsWith(\"-\")) {\n if (optionTakesValue(currentCmd, program, token)) {\n i += 2; // skip option + its value\n } else {\n i += 1;\n }\n continue;\n }\n\n const sub = findSubcommand(currentCmd, token);\n if (sub) {\n currentCmd = sub;\n }\n i++;\n }\n\n // Special handling: `help` command mirrors the main command tree for completions\n if (currentCmd.name() === \"help\" && currentCmd.parent === program) {\n const helpIdx = walkTokens.indexOf(\"help\");\n const rawArgs = walkTokens.slice(helpIdx + 1);\n const helpArgs: string[] = [];\n for (let j = 0; j < rawArgs.length; j++) {\n const t = rawArgs[j];\n if (t.startsWith(\"-\")) {\n if (optionTakesValue(currentCmd, program, t)) {\n j++; // skip the option's value\n }\n continue;\n }\n helpArgs.push(t);\n }\n\n let target = program;\n for (const arg of helpArgs) {\n const sub = findSubcommand(target, arg);\n if (sub) target = sub;\n else break;\n }\n\n const subs = target.commands\n .filter((c) => !(c as { _hidden?: boolean })._hidden)\n .map((c) => c.name());\n return subs.filter((s) => s.startsWith(partial));\n }\n\n // Determine predecessor token (immediately before the completion point)\n const predecessor = startingNewWord\n ? tokens[tokens.length - 1]\n : tokens.length >= 2\n ? tokens[tokens.length - 2]\n : undefined;\n\n // Case 1: Previous token is a value-taking option → complete option values\n if (\n predecessor &&\n predecessor.startsWith(\"-\") &&\n optionTakesValue(currentCmd, program, predecessor)\n ) {\n return getOptionValueCompletions(predecessor, partial);\n }\n\n // Case 2: Partial starts with '-' → complete options\n if (partial.startsWith(\"-\")) {\n return getOptionCompletions(currentCmd, program, partial);\n }\n\n // Case 3: Current command has non-hidden subcommands → complete them\n const subcommands = currentCmd.commands\n .filter((c) => !(c as { _hidden?: boolean })._hidden)\n .map((c) => c.name());\n\n if (subcommands.length > 0) {\n return subcommands.filter((s) => s.startsWith(partial));\n }\n\n // Case 4: Command takes file arguments → signal <file>\n for (const arg of currentCmd.registeredArguments) {\n if (arg.description && arg.description.includes(\"@file\")) {\n return [\"<file>\"];\n }\n }\n\n return [];\n}\n\nfunction getOptionCompletions(\n cmd: Command,\n program: Command,\n partial: string,\n): string[] {\n const options = new Set<string>();\n\n for (const opt of cmd.options) {\n if (opt.hidden) continue;\n if (opt.long) options.add(opt.long);\n }\n\n for (const opt of program.options) {\n if (opt.hidden) continue;\n if (opt.long) options.add(opt.long);\n }\n\n return [...options].filter((o) => o.startsWith(partial));\n}\n\nfunction getOptionValueCompletions(\n optionFlag: string,\n partial: string,\n): string[] {\n if (optionFlag === \"--format\" || optionFlag === \"-f\") {\n return [\"json\", \"table\", \"geojson\"].filter((v) =>\n v.startsWith(partial),\n );\n }\n return [];\n}\n\nconst ZSH_SCRIPT = `_geonic_completions() {\n local completions\n completions=(\\${(f)\"$(geonic cli completions --line=\"$BUFFER\" --point=\"$CURSOR\" 2>/dev/null)\"})\n if [[ \"\\${completions[1]}\" == \"<file>\" ]]; then\n _files\n return\n fi\n compadd -a completions\n}\ncompdef _geonic_completions geonic`;\n\nconst BASH_SCRIPT = `_geonic_completions() {\n local cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n local completions\n completions=$(geonic cli completions --line=\"\\${COMP_LINE}\" --point=\"\\${COMP_POINT}\" 2>/dev/null)\n if [[ \"$completions\" == \"<file>\" ]]; then\n COMPREPLY=()\n return\n fi\n COMPREPLY=($(compgen -W \"$completions\" -- \"$cur\"))\n}\ncomplete -o default -F _geonic_completions geonic`;\n\nexport function registerCliCommand(program: Command): void {\n const cli = program\n .command(\"cli\")\n .summary(\"Manage CLI internals\")\n .description(\"Manage CLI internals such as shell completions.\");\n\n const completions = cli\n .command(\"completions\")\n .summary(\"Generate shell completions\")\n .description(\"Generate shell completions for geonic CLI.\")\n .option(\"--line <line>\", \"Current command line content\")\n .option(\"--point <point>\", \"Cursor position in the command line\")\n .action((opts: { line?: string; point?: string }) => {\n if (opts.line !== undefined && opts.point !== undefined) {\n const point = parseInt(opts.point, 10);\n const results = generateCompletions(program, opts.line, point);\n for (const r of results) {\n console.log(r);\n }\n }\n });\n\n const bash = completions\n .command(\"bash\")\n .description(\"Output bash completion script\")\n .action(() => {\n console.log(BASH_SCRIPT);\n });\n\n addExamples(bash, [\n {\n description: \"Print the bash completion script\",\n command: \"geonic cli completions bash\",\n },\n {\n description: \"Enable in current shell session\",\n command: 'eval \"$(geonic cli completions bash)\"',\n },\n {\n description: \"Persist in ~/.bashrc\",\n command:\n 'echo \\'eval \"$(geonic cli completions bash)\"\\' >> ~/.bashrc',\n },\n ]);\n\n const zsh = completions\n .command(\"zsh\")\n .description(\"Output zsh completion script\")\n .action(() => {\n console.log(ZSH_SCRIPT);\n });\n\n addExamples(zsh, [\n {\n description: \"Print the zsh completion script\",\n command: \"geonic cli completions zsh\",\n },\n {\n description: \"Enable in current shell session\",\n command: 'eval \"$(geonic cli completions zsh)\"',\n },\n {\n description: \"Persist in ~/.zshrc\",\n command:\n 'echo \\'eval \"$(geonic cli completions zsh)\"\\' >> ~/.zshrc',\n },\n ]);\n\n const version = cli\n .command(\"version\")\n .description(\"Display the CLI version\")\n .action(() => {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version: string };\n console.log(pkg.version);\n });\n\n addExamples(version, [\n {\n description: \"Show CLI version\",\n command: \"geonic cli version\",\n },\n ]);\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { getConfigDir, ensureConfigDir } from \"./config.js\";\n\nconst PACKAGE_NAME = \"@geolonia/geonicdb-cli\";\nconst REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst FETCH_TIMEOUT_MS = 5000;\n\ninterface UpdateCache {\n lastCheck: number;\n latestVersion?: string;\n}\n\nexport interface UpdateCheckResult {\n currentVersion: string;\n latestVersion: string;\n}\n\nconst CI_ENV_VARS = [\n \"CI\",\n \"CONTINUOUS_INTEGRATION\",\n \"BUILD_NUMBER\",\n \"GITHUB_ACTIONS\",\n \"GITLAB_CI\",\n \"CIRCLECI\",\n \"JENKINS_URL\",\n \"HUDSON_URL\",\n \"TRAVIS\",\n];\n\nfunction getCacheFile(): string {\n return join(getConfigDir(), \"update-check.json\");\n}\n\nfunction isCheckDisabled(): boolean {\n if (process.env.NO_UPDATE_NOTIFIER) return true;\n if (!process.stdout.isTTY) return true;\n for (const envVar of CI_ENV_VARS) {\n if (process.env[envVar]) return true;\n }\n return false;\n}\n\nfunction loadCache(): UpdateCache | null {\n try {\n const raw = readFileSync(getCacheFile(), \"utf-8\");\n return JSON.parse(raw) as UpdateCache;\n } catch {\n return null;\n }\n}\n\nfunction saveCache(cache: UpdateCache): void {\n try {\n ensureConfigDir();\n writeFileSync(getCacheFile(), JSON.stringify(cache), \"utf-8\");\n } catch {\n /* v8 ignore next -- defensive: write errors silently ignored */\n }\n}\n\nfunction shouldCheck(cache: UpdateCache | null): boolean {\n if (!cache) return true;\n return Date.now() - cache.lastCheck >= CHECK_INTERVAL_MS;\n}\n\nexport function compareSemver(current: string, latest: string): boolean {\n const parse = (v: string) =>\n v.replace(/^v/, \"\").split(\".\").map(Number) as [number, number, number];\n const [cMajor, cMinor, cPatch] = parse(current);\n const [lMajor, lMinor, lPatch] = parse(latest);\n if (lMajor !== cMajor) return lMajor > cMajor;\n if (lMinor !== cMinor) return lMinor > cMinor;\n return lPatch > cPatch;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const res = await fetch(REGISTRY_URL, {\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\n/* v8 ignore next 3 -- fallback for bundled builds where package.json is unavailable */\nfunction getCurrentVersion(): string {\n return process.env.npm_package_version ?? \"0.0.0\";\n}\n\nexport function formatUpdateBox(current: string, latest: string): string {\n const message = `Update available: ${current} → ${latest}`;\n const install = `Run ${chalk.cyan(`npm i -g ${PACKAGE_NAME}`)} to update`;\n const lines = [message, install];\n const maxLen = Math.max(\n ...lines.map((l) => stripAnsi(l).length),\n );\n const pad = (line: string) => {\n const visible = stripAnsi(line).length;\n return line + \" \".repeat(maxLen - visible);\n };\n const empty = \" \".repeat(maxLen);\n const top = `╭${\"─\".repeat(maxLen + 4)}╮`;\n const bottom = `╰${\"─\".repeat(maxLen + 4)}╯`;\n const boxLines = [\n top,\n `│ ${empty} │`,\n ...lines.map((l) => `│ ${pad(l)} │`),\n `│ ${empty} │`,\n bottom,\n ];\n return chalk.yellow(boxLines.join(\"\\n\"));\n}\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n}\n\nexport async function startUpdateCheck(): Promise<UpdateCheckResult | null> {\n if (isCheckDisabled()) return null;\n\n let currentVersion: string;\n try {\n const pkgPath = new URL(\"../package.json\", import.meta.url);\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as {\n version: string;\n };\n currentVersion = pkg.version;\n /* v8 ignore start -- fallback for bundled builds */\n } catch {\n currentVersion = getCurrentVersion();\n }\n /* v8 ignore stop */\n\n const cache = loadCache();\n\n if (!shouldCheck(cache)) {\n if (cache?.latestVersion && compareSemver(currentVersion, cache.latestVersion)) {\n return { currentVersion, latestVersion: cache.latestVersion };\n }\n return null;\n }\n\n const latestVersion = await fetchLatestVersion();\n\n saveCache({\n lastCheck: Date.now(),\n latestVersion: latestVersion ?? cache?.latestVersion,\n });\n\n if (latestVersion && compareSemver(currentVersion, latestVersion)) {\n return { currentVersion, latestVersion };\n }\n\n return null;\n}\n\nexport function printUpdateNotification(result: UpdateCheckResult | null): void {\n if (!result) return;\n const box = formatUpdateBox(result.currentVersion, result.latestVersion);\n process.stderr.write(\"\\n\" + box + \"\\n\");\n}\n","import { createProgram } from \"./cli.js\";\nimport { startUpdateCheck, printUpdateNotification } from \"./update-notifier.js\";\n\nconst updateCheckPromise = startUpdateCheck();\nconst program = createProgram();\nawait program.parseAsync();\nconst updateResult = await updateCheckPromise;\nprintUpdateNotification(updateResult);\n"],"mappings":"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","names":["createRequire","Command","header","chalk","program","program","onData","onError","readFileSync","createInterface","config","program","program","program","program","program","program","program","program","program","program","program","program","program","program","require","createRequire","program","require","createRequire","require","createRequire","program","Command","readFileSync","writeFileSync","join","chalk","join","readFileSync","writeFileSync","chalk"]}