@getpilfer/cli 0.1.1 → 0.1.3

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/build-program.ts","../src/lib/command-discovery.ts","../src/lib/reports.ts","../src/lib/resource-resolver.ts","../src/lib/source-body.ts","../src/lib/workflows.ts"],"sourcesContent":["/**\n * Builds the Commander program for the Pilfer CLI.\n * Used by the main entry (index.ts) and by docs/tools that inspect the program.\n */\nimport { createRequire } from \"module\";\nimport { Command } from \"commander\";\n\nimport type { CommandHelpers } from \"./commands/generated/index.js\";\nimport { resolveToken } from \"./lib/auth.js\";\nimport { apiRequest, getBaseUrl } from \"./lib/client.js\";\nimport { buildResourceSchema, discoverCommands } from \"./lib/command-discovery.js\";\nimport { fetchList, printList } from \"./lib/list-controls.js\";\nimport {\n formatErrorPayload,\n getDefaultOutputFormat,\n printOutput,\n printStructuredError,\n type OutputFormat,\n} from \"./lib/output.js\";\nimport {\n buildAssetReport,\n buildBalanceReport,\n buildPipelineGroups,\n buildScoutingReport,\n buildShortlistRows,\n} from \"./lib/reports.js\";\nimport { resolveResourceByName } from \"./lib/resource-resolver.js\";\nimport { sourceBodyFromFlags } from \"./lib/source-body.js\";\nimport { purchaseScout } from \"./lib/workflows.js\";\n\nconst _require = createRequire(import.meta.url);\nconst { version: CLI_VERSION } = _require(\"../package.json\") as {\n version: string;\n};\n\nlet rootOpts: { token?: string; output?: string; baseUrl?: string; api?: string } =\n {};\n\ntype MaybeCommand = Partial<Command> & {\n parent?: MaybeCommand;\n opts?: () => Record<string, unknown>;\n};\n\n/** Call from a subcommand's preAction so rootOpts is set from the root program. */\nexport function syncRootOptsFromCommand(cmd: Command | unknown): void {\n const maybeCommand = cmd as MaybeCommand | null | undefined;\n if (!maybeCommand || typeof maybeCommand !== \"object\") return;\n if (typeof maybeCommand.opts !== \"function\") return;\n\n let root: MaybeCommand = maybeCommand;\n while (root.parent) root = root.parent;\n\n if (typeof root.opts !== \"function\") return;\n rootOpts = root.opts() as typeof rootOpts;\n}\n\nconst DUMMY_HELPERS: CommandHelpers = {\n getOutputFormat: () => \"json\",\n requireToken: () => null,\n exitWithError: () => {\n throw new Error(\"Docs generator: action should not run\");\n },\n getBaseUrl: () => \"https://api.getpilfer.com\",\n syncRootOptsFromCommand: () => {},\n};\n\nfunction addTopLevelCommands(program: Command, helpers: CommandHelpers): void {\n const { getOutputFormat, requireToken, exitWithError } = helpers;\n\n function getRequiredToken(): string {\n const token = requireToken();\n if (!token) exitWithError(401, \"Missing or invalid token. Run: pilfer login\");\n return token as string;\n }\n\n function getOutputFormatFromProgram(_p: Command): OutputFormat {\n const raw = rootOpts.output as string | undefined;\n if (raw === \"json\" || raw === \"table\" || raw === \"csv\") return raw;\n return getDefaultOutputFormat();\n }\n\n function exitWithErrorHandler(\n program: Command,\n status: number,\n message: string,\n ): never {\n const format = getOutputFormatFromProgram(program);\n const payload = formatErrorPayload(status, message);\n printStructuredError(format, payload);\n process.exit(status === 401 || status === 403 ? 1 : 2);\n }\n\n program.action(() => {\n console.log(`\n Welcome to the Pilfer CLI - manage your Pilfer data from the terminal.\n\n Get started\n ----------\n Log in: pilfer login\n Verify: pilfer whoami\n Overview: pilfer status\n\n Resources (list | get | create | update | delete)\n ------------------------------------------------\n organizations projects spaces scouts\n sources assets categories labels views\n\n Examples\n --------\n pilfer organizations list\n pilfer projects create --name \"Studio upgrade\"\n pilfer scouts list --status Shortlist\n pilfer sources list --scout-id scout_123\n\n Help\n ----\n pilfer --help\n pilfer <resource> --help\n`);\n });\n\n program\n .command(\"resolve <resource>\")\n .description(\"Resolve one resource id by an exact field match\")\n .requiredOption(\"--name <value>\", \"Value to resolve\")\n .option(\"--field <field>\", \"Field to match\", \"name\")\n .option(\"--id-only\", \"Print only the resolved id\")\n .action(async (resource: string, opts: { name: string; field: string; idOnly?: boolean }) => {\n const token = getRequiredToken();\n const result = await resolveResourceByName({\n resource,\n field: opts.field,\n name: opts.name,\n token,\n baseUrl: getBaseUrl(rootOpts.baseUrl ?? rootOpts.api),\n request: apiRequest,\n });\n\n if (!result.ok) {\n const suffix =\n result.candidates && result.candidates.length > 0\n ? ` Candidates: ${JSON.stringify(result.candidates)}`\n : \"\";\n exitWithError(result.status, `${result.message}${suffix}`);\n return;\n }\n\n if (opts.idOnly) {\n const id = result.item._id ?? result.item.id;\n if (typeof id !== \"string\") exitWithError(404, \"Resolved item has no id\");\n console.log(id);\n return;\n }\n printOutput(getOutputFormat(), result.item, false);\n });\n\n program\n .command(\"commands\")\n .description(\"Print machine-readable command metadata\")\n .option(\"--json\", \"Print JSON metadata\")\n .action(() => {\n const payload = discoverCommands(program, CLI_VERSION);\n console.log(JSON.stringify(payload));\n });\n\n program\n .command(\"schema\")\n .description(\"Print machine-readable resource schema\")\n .option(\"--json\", \"Print JSON schema\")\n .action(() => {\n const payload = discoverCommands(program, CLI_VERSION);\n console.log(JSON.stringify(buildResourceSchema(payload)));\n });\n\n program\n .command(\"whoami\")\n .description(\"Verify auth and show current user and token scopes\")\n .action(async () => {\n const token = getRequiredToken();\n const res = await apiRequest<{\n data?: { userId?: string; organizationId?: string | null; scopes?: string[] };\n }>({\n method: \"GET\",\n path: \"me\",\n token,\n baseUrl: rootOpts.baseUrl,\n });\n if (!res.ok) exitWithError(res.status || 401, res.error ?? \"Unauthorized\");\n const data = res.data?.data ?? res.data;\n printOutput(getOutputFormat(), data ?? {}, false);\n });\n\n program\n .command(\"login [token]\")\n .description(\"Store API token (prompt or pass token as argument)\")\n .action(async (tokenArg: string | undefined) => {\n const { saveToken } = await import(\"./lib/auth.js\");\n let token = tokenArg?.trim();\n if (!token) {\n const readline = await import(\"readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n token = await new Promise<string>((resolve) => {\n rl.question(\"API token: \", (answer) => {\n rl.close();\n resolve(answer?.trim() ?? \"\");\n });\n });\n }\n if (!token) {\n console.error(\"No token provided.\");\n process.exit(1);\n }\n const res = await apiRequest({\n method: \"GET\",\n path: \"me\",\n token,\n baseUrl: rootOpts.baseUrl,\n });\n if (!res.ok) {\n console.error(\"Invalid token or API error:\", res.error ?? res.status);\n process.exit(1);\n }\n saveToken(token);\n console.log(\"Logged in successfully.\");\n });\n\n const config = program.command(\"config\").description(\"Persist and inspect CLI config\");\n\n config\n .command(\"show\")\n .description(\"Show stored CLI config\")\n .action(async () => {\n const { getCredentialsPath, resolveStoredBaseUrl } = await import(\n \"./lib/auth.js\"\n );\n const token = resolveToken(rootOpts.token ?? undefined);\n const baseUrl = getBaseUrl(rootOpts.baseUrl ?? rootOpts.api);\n const storedBaseUrl = resolveStoredBaseUrl();\n printOutput(\n getOutputFormat(),\n {\n configPath: getCredentialsPath(),\n tokenConfigured: Boolean(token),\n baseUrl,\n baseUrlSource: rootOpts.baseUrl ?? rootOpts.api\n ? \"flag\"\n : process.env.PILFER_API_BASE_URL\n ? \"env\"\n : storedBaseUrl\n ? \"config\"\n : \"default\",\n },\n false,\n );\n });\n\n config\n .command(\"set-base-url <url>\")\n .alias(\"set-api\")\n .description(\"Persist default API base URL\")\n .action(async (url: string) => {\n const { saveBaseUrl } = await import(\"./lib/auth.js\");\n const normalized = url.trim().replace(/\\/$/, \"\");\n if (!normalized) {\n console.error(\"No base URL provided.\");\n process.exit(1);\n }\n saveBaseUrl(normalized);\n console.log(`Saved API base URL: ${normalized}`);\n });\n\n config\n .command(\"unset-base-url\")\n .alias(\"unset-api\")\n .description(\"Remove persisted API base URL\")\n .action(async () => {\n const { clearBaseUrl } = await import(\"./lib/auth.js\");\n clearBaseUrl();\n console.log(\"Cleared stored API base URL.\");\n });\n\n program\n .command(\"logout\")\n .description(\"Remove stored API token\")\n .action(async () => {\n const { clearCredentials } = await import(\"./lib/auth.js\");\n clearCredentials();\n console.log(\"Logged out.\");\n });\n\n program\n .command(\"setup-agent\")\n .description(\"Print instructions for configuring Pilfer CLI for AI agents\")\n .action(() => {\n console.log(`\nTo use the Pilfer CLI from an AI agent or script:\n\n1. Set your API token:\n export PILFER_API_TOKEN=\"plf_...\"\n\n2. Optional: override API base URL for local or early deployments:\n export PILFER_API_BASE_URL=\"https://api.getpilfer.com\"\n\n3. Verify auth:\n pilfer whoami\n\n4. Commands use the pattern: pilfer <resource> list|get|create|update|delete\n When stdout is not a TTY, output defaults to JSON.\n`);\n });\n\n program\n .command(\"status\")\n .description(\"Situational summary: organizations, projects, spaces, scouts, assets\")\n .action(async () => {\n const token = getRequiredToken();\n const baseUrl = rootOpts.baseUrl;\n const [orgsRes, projectsRes, spacesRes, scoutsRes, assetsRes] =\n await Promise.all([\n apiRequest<{ data?: unknown[] }>({\n method: \"GET\",\n path: \"organizations\",\n token,\n baseUrl,\n }),\n apiRequest<{ data?: unknown[] }>({\n method: \"GET\",\n path: \"projects\",\n token,\n baseUrl,\n }),\n apiRequest<{ data?: unknown[] }>({\n method: \"GET\",\n path: \"spaces\",\n token,\n baseUrl,\n }),\n apiRequest<{ data?: unknown[] }>({\n method: \"GET\",\n path: \"scouts\",\n token,\n baseUrl,\n }),\n apiRequest<{ data?: unknown[] }>({\n method: \"GET\",\n path: \"assets\",\n token,\n baseUrl,\n }),\n ]);\n const unwrap = (res: { ok: boolean; data?: { data?: unknown[] } }) =>\n res.ok && res.data ? (res.data.data ?? []) : [];\n const scouts = unwrap(scoutsRes);\n const scoutStatuses = (scouts as { status?: string }[]).reduce<\n Record<string, number>\n >((acc, scout) => {\n const status = scout.status ?? \"unknown\";\n acc[status] = (acc[status] ?? 0) + 1;\n return acc;\n }, {});\n printOutput(\n getOutputFormat(),\n {\n organizations: unwrap(orgsRes).length,\n projects: unwrap(projectsRes).length,\n spaces: unwrap(spacesRes).length,\n scouts: scouts.length,\n assets: unwrap(assetsRes).length,\n scoutsByStatus: scoutStatuses,\n },\n false,\n );\n });\n\n program.exitOverride((err) => {\n if (\n err.code === \"commander.helpDisplayed\" ||\n err.code === \"commander.version\"\n ) {\n throw err;\n }\n exitWithErrorHandler(program, 2, err.message);\n });\n}\n\nasync function registerGeneratedCommands(\n program: Command,\n helpers: CommandHelpers,\n): Promise<void> {\n const mod = await import(\"./commands/generated/index.js\").catch(() => null);\n if (mod?.register) mod.register(program, helpers);\n}\n\nfunction registerWorkflowCommands(program: Command, helpers: CommandHelpers): void {\n const { getOutputFormat, requireToken, exitWithError, getBaseUrl } = helpers;\n const scouts = program.commands.find((command) => command.name() === \"scouts\");\n const reports = program.command(\"reports\").description(\"Agent-oriented reports\");\n\n function getRequiredToken(): string {\n const token = requireToken();\n if (!token) exitWithError(401, \"Missing or invalid token. Run: pilfer login\");\n return token as string;\n }\n\n registerRelationCommands(program, helpers, getRequiredToken);\n\n reports\n .command(\"assets\")\n .description(\"Summarize asset value and category concentration\")\n .option(\"--project-id <id>\", \"Project scope\")\n .option(\"--space-id <id>\", \"Space scope\")\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (opts: { projectId?: string; spaceId?: string }) => {\n const token = getRequiredToken();\n const baseUrl = getBaseUrl();\n const assetsRes = await fetchList({\n path: \"assets\",\n token,\n baseUrl,\n query: {},\n all: true,\n request: apiRequest,\n });\n if (!assetsRes.ok) {\n exitWithError(assetsRes.status || 500, assetsRes.error ?? \"Request failed\");\n }\n printOutput(\n getOutputFormat(),\n buildAssetReport(assetsRes.data?.data ?? [], scopeFromOptions(opts)),\n false,\n );\n });\n\n reports\n .command(\"balance\")\n .description(\"Compare owned asset value with active scouting pipeline\")\n .option(\"--project-id <id>\", \"Project scope\")\n .option(\"--space-id <id>\", \"Space scope\")\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (opts: { projectId?: string; spaceId?: string }) => {\n const token = getRequiredToken();\n const baseUrl = getBaseUrl();\n const [assetsRes, scoutsRes] = await Promise.all([\n fetchList({\n path: \"assets\",\n token,\n baseUrl,\n query: {},\n all: true,\n request: apiRequest,\n }),\n fetchList({\n path: \"scouts\",\n token,\n baseUrl,\n query: {},\n all: true,\n request: apiRequest,\n }),\n ]);\n if (!assetsRes.ok) {\n exitWithError(assetsRes.status || 500, assetsRes.error ?? \"Request failed\");\n }\n if (!scoutsRes.ok) {\n exitWithError(scoutsRes.status || 500, scoutsRes.error ?? \"Request failed\");\n }\n printOutput(\n getOutputFormat(),\n buildBalanceReport(\n assetsRes.data?.data ?? [],\n scoutsRes.data?.data ?? [],\n scopeFromOptions(opts),\n ),\n false,\n );\n });\n\n reports\n .command(\"scouting\")\n .description(\"Summarize scouting pipeline, shortlist pressure, and source gaps\")\n .option(\"--skip-sources\", \"Skip per-scout source checks\")\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (opts: { skipSources?: boolean }) => {\n const token = getRequiredToken();\n const baseUrl = getBaseUrl();\n const scoutsRes = await fetchList({\n path: \"scouts\",\n token,\n baseUrl,\n query: {},\n all: true,\n request: apiRequest,\n });\n if (!scoutsRes.ok) {\n exitWithError(scoutsRes.status || 500, scoutsRes.error ?? \"Request failed\");\n }\n const scoutsData = scoutsRes.data?.data ?? [];\n const sourcesByScout = opts.skipSources\n ? {}\n : await fetchSourcesByScout(scoutsData, token, baseUrl);\n printOutput(\n getOutputFormat(),\n buildScoutingReport(scoutsData, sourcesByScout),\n false,\n );\n });\n\n if (!scouts) return;\n\n scouts\n .command(\"shortlist\")\n .description(\"Show shortlisted scouts in purchase priority order\")\n .option(\"--limit <n>\", \"Max rows\")\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (opts: { limit?: string }) => {\n const token = getRequiredToken();\n const res = await fetchList({\n path: \"scouts\",\n token,\n baseUrl: getBaseUrl(),\n query: {},\n all: true,\n request: apiRequest,\n });\n if (!res.ok) exitWithError(res.status || 500, res.error ?? \"Request failed\");\n const rows = buildShortlistRows(res.data?.data ?? []);\n const limit = parseOptionalNumber(opts.limit, \"--limit\", exitWithError);\n printOutput(\n getOutputFormat(),\n typeof limit === \"number\" ? rows.slice(0, limit) : rows,\n false,\n );\n });\n\n scouts\n .command(\"pipeline\")\n .description(\"Summarize active scout pipeline by status\")\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async () => {\n const token = getRequiredToken();\n const res = await fetchList({\n path: \"scouts\",\n token,\n baseUrl: getBaseUrl(),\n query: {},\n all: true,\n request: apiRequest,\n });\n if (!res.ok) exitWithError(res.status || 500, res.error ?? \"Request failed\");\n printOutput(getOutputFormat(), buildPipelineGroups(res.data?.data ?? []), false);\n });\n\n scouts\n .command(\"purchase <id>\")\n .description(\"Create an asset from a purchased scout and mark the scout Purchased\")\n .option(\"--name <value>\", \"Asset name override\")\n .option(\"--cost <value>\", \"Actual purchase cost\")\n .option(\"--acquisition-date <value>\", \"Acquisition timestamp in milliseconds\")\n .option(\"--dry-run\", \"Print proposed asset body without writing\")\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(\n async (\n id: string,\n opts: {\n name?: string;\n cost?: string;\n acquisitionDate?: string;\n dryRun?: boolean;\n },\n ) => {\n const token = getRequiredToken();\n const cost = parseOptionalNumber(opts.cost, \"--cost\", exitWithError);\n const acquisitionDate = parseOptionalNumber(\n opts.acquisitionDate,\n \"--acquisition-date\",\n exitWithError,\n );\n const res = await purchaseScout({\n scoutId: id,\n token,\n baseUrl: getBaseUrl(),\n assetName: opts.name,\n cost,\n acquisitionDate,\n dryRun: Boolean(opts.dryRun),\n request: apiRequest,\n });\n if (!res.ok) {\n exitWithError(res.status || 500, res.error ?? \"Purchase workflow failed\");\n }\n printOutput(getOutputFormat(), res.data ?? {}, false);\n },\n );\n}\n\nfunction registerRelationCommands(\n program: Command,\n helpers: CommandHelpers,\n getRequiredToken: () => string,\n): void {\n const { getOutputFormat, exitWithError, getBaseUrl } = helpers;\n const configs: Record<string, { relations: string[]; relate?: boolean }> = {\n scouts: { relations: [\"projects\", \"spaces\", \"labels\"], relate: true },\n assets: { relations: [\"projects\", \"spaces\", \"labels\"] },\n projects: { relations: [\"spaces\", \"scouts\", \"assets\"] },\n spaces: { relations: [\"scouts\", \"assets\"] },\n };\n const singularToPlural: Record<string, string> = {\n project: \"projects\",\n projects: \"projects\",\n space: \"spaces\",\n spaces: \"spaces\",\n label: \"labels\",\n labels: \"labels\",\n scout: \"scouts\",\n scouts: \"scouts\",\n asset: \"assets\",\n assets: \"assets\",\n };\n\n function relationFor(resource: string, raw: string): string {\n const relation = singularToPlural[raw];\n if (!relation || !configs[resource]?.relations.includes(relation)) {\n exitWithError(400, `Invalid relation for ${resource}: ${raw}`);\n }\n return relation;\n }\n\n function idsFromOption(raw?: string): string[] {\n if (!raw) return [];\n return [...new Set(raw.split(\",\").map((id) => id.trim()).filter(Boolean))];\n }\n\n for (const [resource, config] of Object.entries(configs)) {\n const cmd = program.commands.find((command) => command.name() === resource);\n if (!cmd) continue;\n\n cmd\n .command(\"relations <id>\")\n .description(`List ${resource} relations`)\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (id: string) => {\n const token = getRequiredToken();\n const res = await apiRequest({\n method: \"GET\",\n path: `${resource}/${encodeURIComponent(id)}/relations`,\n token,\n baseUrl: getBaseUrl(),\n });\n if (!res.ok) exitWithError(res.status || 500, res.error ?? \"Request failed\");\n printOutput(getOutputFormat(), (res.data as { data?: unknown })?.data ?? res.data ?? {}, false);\n });\n\n cmd\n .command(\"link <relation> <id> <targetId>\")\n .description(`Add a ${resource} relation`)\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (rawRelation: string, id: string, targetId: string) => {\n const token = getRequiredToken();\n const relation = relationFor(resource, rawRelation);\n const res = await apiRequest({\n method: \"POST\",\n path: `${resource}/${encodeURIComponent(id)}/${relation}/${encodeURIComponent(targetId)}`,\n token,\n baseUrl: getBaseUrl(),\n });\n if (!res.ok) exitWithError(res.status || 500, res.error ?? \"Request failed\");\n printOutput(getOutputFormat(), (res.data as { data?: unknown })?.data ?? res.data ?? {}, false);\n });\n\n cmd\n .command(\"unlink <relation> <id> <targetId>\")\n .description(`Remove a ${resource} relation`)\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (rawRelation: string, id: string, targetId: string) => {\n const token = getRequiredToken();\n const relation = relationFor(resource, rawRelation);\n const res = await apiRequest({\n method: \"DELETE\",\n path: `${resource}/${encodeURIComponent(id)}/${relation}/${encodeURIComponent(targetId)}`,\n token,\n baseUrl: getBaseUrl(),\n });\n if (!res.ok) exitWithError(res.status || 500, res.error ?? \"Request failed\");\n printOutput(getOutputFormat(), (res.data as { data?: unknown })?.data ?? res.data ?? {}, false);\n });\n\n for (const relation of config.relations) {\n cmd\n .command(`set-${relation} <id>`)\n .description(`Replace ${resource} ${relation} links`)\n .requiredOption(\"--ids <ids>\", \"Comma-separated target ids\")\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (id: string, opts: { ids: string }) => {\n const token = getRequiredToken();\n const res = await apiRequest({\n method: \"PUT\",\n path: `${resource}/${encodeURIComponent(id)}/${relation}`,\n token,\n baseUrl: getBaseUrl(),\n body: { ids: idsFromOption(opts.ids) },\n });\n if (!res.ok) exitWithError(res.status || 500, res.error ?? \"Request failed\");\n printOutput(getOutputFormat(), (res.data as { data?: unknown })?.data ?? res.data ?? {}, false);\n });\n }\n\n if (resource === \"scouts\" && config.relate) {\n cmd\n .command(\"relate <id> <relatedId>\")\n .description(\"Add a typed scout relationship\")\n .requiredOption(\"--type <type>\", \"parent_of|sub_scout_of|blocking|blocked_by|related_to|duplicate_of\")\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (id: string, relatedId: string, opts: { type: string }) => {\n const token = getRequiredToken();\n const res = await apiRequest({\n method: \"POST\",\n path: `scouts/${encodeURIComponent(id)}/relationships`,\n token,\n baseUrl: getBaseUrl(),\n body: { relatedScoutId: relatedId, type: opts.type },\n });\n if (!res.ok) exitWithError(res.status || 500, res.error ?? \"Request failed\");\n printOutput(getOutputFormat(), (res.data as { data?: unknown })?.data ?? res.data ?? {}, false);\n });\n\n cmd\n .command(\"unrelate <id> <linkId>\")\n .description(\"Remove a typed scout relationship by link id\")\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (id: string, linkId: string) => {\n const token = getRequiredToken();\n const res = await apiRequest({\n method: \"DELETE\",\n path: `scouts/${encodeURIComponent(id)}/relationships/${encodeURIComponent(linkId)}`,\n token,\n baseUrl: getBaseUrl(),\n });\n if (!res.ok) exitWithError(res.status || 500, res.error ?? \"Request failed\");\n printOutput(getOutputFormat(), (res.data as { data?: unknown })?.data ?? res.data ?? {}, false);\n });\n }\n }\n}\n\nfunction scopeFromOptions(opts: { projectId?: string; spaceId?: string }): {\n projectId?: string;\n spaceId?: string;\n} {\n return {\n ...(opts.projectId ? { projectId: opts.projectId } : {}),\n ...(opts.spaceId ? { spaceId: opts.spaceId } : {}),\n };\n}\n\nasync function fetchSourcesByScout(\n scouts: unknown[],\n token: string | null,\n baseUrl: string,\n): Promise<Record<string, unknown[]>> {\n const rows = scouts.filter(isRecord);\n const entries = await Promise.all(\n rows.map(async (scout) => {\n const id = typeof scout._id === \"string\" ? scout._id : undefined;\n if (!id) return null;\n const res = await apiRequest<{ data?: unknown[] }>({\n method: \"GET\",\n path: `scouts/${encodeURIComponent(id)}/sources`,\n token,\n baseUrl,\n });\n return [id, res.ok ? (res.data?.data ?? []) : []] as const;\n }),\n );\n return Object.fromEntries(entries.filter((entry) => entry !== null));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseOptionalNumber(\n value: string | undefined,\n flag: string,\n exitWithError: (status: number, message: string) => never,\n): number | undefined {\n if (value == null || value === \"\") return undefined;\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) {\n exitWithError(400, `${flag} expected number, got ${JSON.stringify(value)}`);\n }\n return parsed;\n}\n\nfunction registerSourceCommands(program: Command, helpers: CommandHelpers): void {\n const { getOutputFormat, requireToken, exitWithError, getBaseUrl } = helpers;\n\n function getRequiredToken(): string {\n const token = requireToken();\n if (!token) exitWithError(401, \"Missing or invalid token. Run: pilfer login\");\n return token as string;\n }\n\n const sources = program.command(\"sources\").description(\"Manage scout sources\");\n\n sources\n .command(\"list\")\n .description(\"List sources for a scout\")\n .requiredOption(\"--scout-id <id>\", \"Scout id\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--offset <n>\", \"Skip n results\")\n .option(\"--all\", \"Fetch all pages\")\n .option(\"--fields <fields>\", \"Comma-separated fields to print\")\n .option(\"--where <field=value>\", \"Client-side exact filters, comma-separated\")\n .option(\"--jsonl\", \"Print one compact JSON object per row\")\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (opts: { scoutId: string; limit?: string; offset?: string; all?: boolean; fields?: string; where?: string; jsonl?: boolean }) => {\n const token = getRequiredToken();\n const res = await fetchList({\n path: `scouts/${encodeURIComponent(opts.scoutId)}/sources`,\n token,\n baseUrl: getBaseUrl(),\n query: { limit: opts.limit, offset: opts.offset },\n all: Boolean(opts.all),\n request: apiRequest,\n });\n if (!res.ok) exitWithError(res.status || 500, res.error ?? \"Request failed\");\n const data = (res.data as { data?: unknown[] })?.data ?? [];\n printList({\n format: getOutputFormat(),\n data,\n fields: opts.fields,\n where: opts.where,\n jsonl: Boolean(opts.jsonl),\n });\n });\n\n sources\n .command(\"get <sourceId>\")\n .description(\"Get one source by id\")\n .requiredOption(\"--scout-id <id>\", \"Scout id\")\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (sourceId: string, opts: { scoutId: string }) => {\n const token = getRequiredToken();\n const res = await apiRequest({\n method: \"GET\",\n path: `scouts/${encodeURIComponent(opts.scoutId)}/sources/${encodeURIComponent(\n sourceId,\n )}`,\n token,\n baseUrl: getBaseUrl(),\n });\n if (!res.ok) exitWithError(res.status || 500, res.error ?? \"Request failed\");\n const data = (res.data as { data?: unknown })?.data ?? res.data;\n printOutput(getOutputFormat(), data ?? {}, false);\n });\n\n sources\n .command(\"create\")\n .description(\"Create a source for a scout\")\n .requiredOption(\"--scout-id <id>\", \"Scout id\")\n .option(\"--url <value>\", \"url\")\n .option(\"--name <value>\", \"name\")\n .option(\"--title <value>\", \"deprecated alias for --name\")\n .option(\"--description <value>\", \"description\")\n .option(\"--price <value>\", \"price\")\n .option(\"--image <value>\", \"image\")\n .option(\"--image-url <value>\", \"deprecated alias for --image\")\n .option(\"--address <value>\", \"address\")\n .option(\"--source-type <value>\", \"sourceType\")\n .option(\"--condition <value>\", \"condition\")\n .option(\"--notes <value>\", \"notes\")\n .option(\"--starred <value>\", \"starred\")\n .option(\"--body <json>\", \"Request body JSON (merged with flags)\")\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (opts) => {\n const token = getRequiredToken();\n const res = await apiRequest({\n method: \"POST\",\n path: `scouts/${encodeURIComponent(opts.scoutId)}/sources`,\n token,\n baseUrl: getBaseUrl(),\n body: sourceBodyFromFlags(opts, false, exitWithError),\n });\n if (!res.ok) exitWithError(res.status || 500, res.error ?? \"Request failed\");\n const data = (res.data as { data?: unknown })?.data ?? res.data;\n printOutput(getOutputFormat(), data ?? {}, false);\n });\n\n sources\n .command(\"update <sourceId>\")\n .description(\"Update a source\")\n .requiredOption(\"--scout-id <id>\", \"Scout id\")\n .option(\"--url <value>\", \"url\")\n .option(\"--name <value>\", \"name\")\n .option(\"--title <value>\", \"deprecated alias for --name\")\n .option(\"--description <value>\", \"description\")\n .option(\"--price <value>\", \"price\")\n .option(\"--image <value>\", \"image\")\n .option(\"--image-url <value>\", \"deprecated alias for --image\")\n .option(\"--address <value>\", \"address\")\n .option(\"--source-type <value>\", \"sourceType\")\n .option(\"--condition <value>\", \"condition\")\n .option(\"--notes <value>\", \"notes\")\n .option(\"--starred <value>\", \"starred\")\n .option(\"--body <json>\", \"Request body JSON (merged with flags)\")\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (sourceId: string, opts) => {\n const token = getRequiredToken();\n const res = await apiRequest({\n method: \"PATCH\",\n path: `scouts/${encodeURIComponent(opts.scoutId)}/sources/${encodeURIComponent(\n sourceId,\n )}`,\n token,\n baseUrl: getBaseUrl(),\n body: sourceBodyFromFlags(opts, true, exitWithError),\n });\n if (!res.ok) exitWithError(res.status || 500, res.error ?? \"Request failed\");\n const data = (res.data as { data?: unknown })?.data ?? res.data;\n printOutput(getOutputFormat(), data ?? {}, false);\n });\n\n sources\n .command(\"delete <sourceId>\")\n .description(\"Delete a source\")\n .requiredOption(\"--scout-id <id>\", \"Scout id\")\n .hook(\"preAction\", (thisCommand: Command) => {\n helpers.syncRootOptsFromCommand(thisCommand);\n })\n .action(async (sourceId: string, opts: { scoutId: string }) => {\n const token = getRequiredToken();\n const res = await apiRequest({\n method: \"DELETE\",\n path: `scouts/${encodeURIComponent(opts.scoutId)}/sources/${encodeURIComponent(\n sourceId,\n )}`,\n token,\n baseUrl: getBaseUrl(),\n });\n if (!res.ok) exitWithError(res.status || 500, res.error ?? \"Request failed\");\n if (getOutputFormat() === \"json\") {\n console.log(JSON.stringify({ data: null, deleted: true }));\n }\n });\n}\n\nexport async function createProgram(helpers?: CommandHelpers): Promise<Command> {\n const program = new Command();\n\n program\n .name(\"pilfer\")\n .description(\"Pilfer REST API CLI\")\n .version(CLI_VERSION)\n .option(\"-t, --token <token>\", \"API token (overrides env and config file)\")\n .option(\"-o, --output <format>\", \"Output format: json | table | csv\")\n .option(\"--base-url <url>\", \"API base URL (default: https://api.getpilfer.com)\")\n .option(\"--api <url>\", \"Alias for --base-url\")\n .hook(\"preAction\", (thisCommand) => {\n syncRootOptsFromCommand(thisCommand);\n const opts = thisCommand.opts();\n if (opts.output == null || opts.output === \"\") {\n thisCommand.setOptionValue(\"output\", getDefaultOutputFormat());\n }\n });\n\n const resolvedHelpers = helpers ?? DUMMY_HELPERS;\n addTopLevelCommands(program, resolvedHelpers);\n await registerGeneratedCommands(program, resolvedHelpers);\n registerWorkflowCommands(program, resolvedHelpers);\n registerSourceCommands(program, resolvedHelpers);\n\n return program;\n}\n\nexport async function createProgramForCLI(): Promise<Command> {\n const realHelpers: CommandHelpers = {\n getOutputFormat: () => {\n const raw = rootOpts.output as string | undefined;\n if (raw === \"json\" || raw === \"table\" || raw === \"csv\") return raw;\n return getDefaultOutputFormat();\n },\n requireToken: () => resolveToken(rootOpts.token ?? undefined),\n exitWithError: (status: number, message: string): never => {\n const raw = rootOpts.output as string | undefined;\n const format: OutputFormat =\n raw === \"json\" || raw === \"table\" || raw === \"csv\"\n ? raw\n : getDefaultOutputFormat();\n const payload = formatErrorPayload(status, message);\n printStructuredError(format, payload);\n process.exit(status === 401 || status === 403 ? 1 : 2);\n },\n getBaseUrl: () => getBaseUrl(rootOpts.baseUrl ?? rootOpts.api),\n syncRootOptsFromCommand,\n };\n return createProgram(realHelpers);\n}\n\nexport async function getProgramForDocs(): Promise<Command> {\n return createProgram();\n}\n","import type { Command } from \"commander\";\n\nexport interface DiscoveredOption {\n flags: string;\n description: string;\n required: boolean;\n optional: boolean;\n}\n\nexport interface DiscoveredArgument {\n name: string;\n required: boolean;\n variadic: boolean;\n}\n\nexport interface DiscoveredCommand {\n name: string;\n aliases: string[];\n description: string;\n usage: string;\n arguments: DiscoveredArgument[];\n options: DiscoveredOption[];\n commands: DiscoveredCommand[];\n}\n\nexport interface CommandDiscoveryPayload {\n cli: \"pilfer\";\n version: string;\n outputFormats: string[];\n auth: {\n tokenSources: string[];\n baseUrlSources: string[];\n };\n commands: DiscoveredCommand[];\n}\n\ntype CommandWithInternals = Command & {\n registeredArguments?: Array<{\n name: () => string;\n required: boolean;\n variadic: boolean;\n }>;\n};\n\nexport function discoverCommands(\n program: Command,\n version: string,\n): CommandDiscoveryPayload {\n return {\n cli: \"pilfer\",\n version,\n outputFormats: [\"json\", \"table\", \"csv\", \"jsonl\"],\n auth: {\n tokenSources: [\"--token\", \"PILFER_API_TOKEN\", \"credentials.json\"],\n baseUrlSources: [\"--base-url\", \"--api\", \"PILFER_API_BASE_URL\", \"config\", \"default\"],\n },\n commands: program.commands.map(discoverCommand),\n };\n}\n\nfunction discoverCommand(command: Command): DiscoveredCommand {\n const commandWithInternals = command as CommandWithInternals;\n return {\n name: command.name(),\n aliases: command.aliases(),\n description: command.description(),\n usage: command.usage(),\n arguments: (commandWithInternals.registeredArguments ?? []).map((arg) => ({\n name: arg.name(),\n required: arg.required,\n variadic: arg.variadic,\n })),\n options: command.options.map((option) => ({\n flags: option.flags,\n description: option.description,\n required: option.required,\n optional: option.optional,\n })),\n commands: command.commands.map(discoverCommand),\n };\n}\n\nexport function buildResourceSchema(payload: CommandDiscoveryPayload): unknown {\n const resources = payload.commands\n .filter((command) =>\n command.commands.some((subcommand) =>\n [\"list\", \"get\", \"create\", \"update\", \"delete\"].includes(subcommand.name),\n ),\n )\n .map((command) => ({\n name: command.name,\n actions: command.commands.map((subcommand) => ({\n name: subcommand.name,\n arguments: subcommand.arguments,\n options: subcommand.options,\n })),\n }));\n\n return {\n cli: payload.cli,\n version: payload.version,\n outputFormats: payload.outputFormats,\n auth: payload.auth,\n resources,\n };\n}\n","const PRIORITY_ORDER = [\"urgent\", \"high\", \"medium\", \"low\", \"none\"];\nconst ACTIVE_SCOUT_STATUSES = [\"New\", \"In Progress\", \"In Review\", \"Shortlist\", \"Approved\"];\n\nexport interface ScoutQueueRow {\n _id: string;\n name: string;\n status: string;\n priority: string;\n estimatedCost: number;\n ageDays: number;\n sourceCount?: number;\n hasStarredSource?: boolean;\n}\n\nexport interface ScoutPipelineGroup {\n status: string;\n count: number;\n totalEstimatedCost: number;\n averageAgeDays: number;\n oldestAgeDays: number;\n oldestScoutName?: string;\n}\n\nexport interface ScoutingReport {\n totalScouts: number;\n activeScouts: number;\n activeEstimatedCost: number;\n shortlist: {\n count: number;\n totalEstimatedCost: number;\n largestScout?: ScoutQueueRow;\n };\n pipeline: ScoutPipelineGroup[];\n missingSourceScouts: ScoutQueueRow[];\n statusCounts: Record<string, number>;\n}\n\nexport interface AssetReport {\n totalAssets: number;\n totalCost: number;\n byCategory: Array<{ category: string; count: number; totalCost: number }>;\n scopeWarning?: string;\n}\n\nexport interface BalanceReport {\n scope: { projectId?: string; spaceId?: string };\n assets: AssetReport;\n scouting: {\n activeScouts: number;\n activeEstimatedCost: number;\n shortlistCount: number;\n shortlistEstimatedCost: number;\n };\n gapSignals: Array<{ kind: string; message: string; value?: number }>;\n scopeWarning?: string;\n}\n\nexport function buildShortlistRows(\n scouts: unknown[],\n nowMs = Date.now(),\n): ScoutQueueRow[] {\n return scouts\n .filter(isRecord)\n .filter((scout) => scout.status === \"Shortlist\")\n .map((scout) => scoutToQueueRow(scout, nowMs))\n .sort(\n (a, b) =>\n comparePriority(a.priority, b.priority) ||\n b.estimatedCost - a.estimatedCost ||\n b.ageDays - a.ageDays,\n );\n}\n\nexport function buildPipelineGroups(\n scouts: unknown[],\n nowMs = Date.now(),\n): ScoutPipelineGroup[] {\n const rows = scouts.filter(isRecord).map((scout) => scoutToQueueRow(scout, nowMs));\n return ACTIVE_SCOUT_STATUSES.map((status) => {\n const statusRows = rows.filter((row) => row.status === status);\n const totalAge = statusRows.reduce((sum, row) => sum + row.ageDays, 0);\n const sortedByAge = [...statusRows].sort((a, b) => b.ageDays - a.ageDays);\n return {\n status,\n count: statusRows.length,\n totalEstimatedCost: sum(statusRows, \"estimatedCost\"),\n averageAgeDays: statusRows.length > 0 ? Math.round(totalAge / statusRows.length) : 0,\n oldestAgeDays: sortedByAge[0]?.ageDays ?? 0,\n ...(sortedByAge[0] ? { oldestScoutName: sortedByAge[0].name } : {}),\n };\n });\n}\n\nexport function buildScoutingReport(\n scouts: unknown[],\n sourcesByScout: Record<string, unknown[]> = {},\n nowMs = Date.now(),\n): ScoutingReport {\n const scoutRows = scouts.filter(isRecord).map((scout) => {\n const id = stringValue(scout._id ?? scout.id);\n return {\n ...scout,\n sources: sourcesByScout[id] ?? scout.sources,\n };\n });\n const queueRows = scoutRows.map((scout) => scoutToQueueRow(scout, nowMs));\n const activeRows = queueRows.filter((row) => ACTIVE_SCOUT_STATUSES.includes(row.status));\n const shortlistRows = buildShortlistRows(scoutRows, nowMs);\n const statusCounts = queueRows.reduce<Record<string, number>>((acc, row) => {\n acc[row.status] = (acc[row.status] ?? 0) + 1;\n return acc;\n }, {});\n\n return {\n totalScouts: queueRows.length,\n activeScouts: activeRows.length,\n activeEstimatedCost: sum(activeRows, \"estimatedCost\"),\n shortlist: {\n count: shortlistRows.length,\n totalEstimatedCost: sum(shortlistRows, \"estimatedCost\"),\n ...(shortlistRows[0] ? { largestScout: shortlistRows[0] } : {}),\n },\n pipeline: buildPipelineGroups(scoutRows, nowMs),\n missingSourceScouts: activeRows\n .filter((row) => (row.sourceCount ?? 0) === 0)\n .sort(\n (a, b) =>\n comparePriority(a.priority, b.priority) ||\n b.estimatedCost - a.estimatedCost ||\n b.ageDays - a.ageDays,\n ),\n statusCounts,\n };\n}\n\nexport function buildAssetReport(\n assets: unknown[],\n scope: { projectId?: string; spaceId?: string } = {},\n): AssetReport {\n const scoped = applyScope(assets.filter(isRecord), scope);\n const byCategory = new Map<string, { category: string; count: number; totalCost: number }>();\n for (const asset of scoped.rows) {\n const category = categoryName(asset);\n const current = byCategory.get(category) ?? { category, count: 0, totalCost: 0 };\n current.count += 1;\n current.totalCost += numberValue(asset.cost);\n byCategory.set(category, current);\n }\n return {\n totalAssets: scoped.rows.length,\n totalCost: scoped.rows.reduce((total, asset) => total + numberValue(asset.cost), 0),\n byCategory: Array.from(byCategory.values()).sort(\n (a, b) => b.totalCost - a.totalCost || b.count - a.count,\n ),\n ...(scoped.warning ? { scopeWarning: scoped.warning } : {}),\n };\n}\n\nexport function buildBalanceReport(\n assets: unknown[],\n scouts: unknown[],\n scope: { projectId?: string; spaceId?: string } = {},\n nowMs = Date.now(),\n): BalanceReport {\n const scopedScouts = applyScope(scouts.filter(isRecord), scope);\n const activeScouts = scopedScouts.rows\n .map((scout) => scoutToQueueRow(scout, nowMs))\n .filter((row) => ACTIVE_SCOUT_STATUSES.includes(row.status));\n const shortlistRows = activeScouts.filter((row) => row.status === \"Shortlist\");\n const assetReport = buildAssetReport(assets, scope);\n const gapSignals: BalanceReport[\"gapSignals\"] = [];\n\n if (activeScouts.length === 0) {\n gapSignals.push({ kind: \"no_active_scouts\", message: \"No active scouts in scope\" });\n }\n if (assetReport.totalAssets === 0) {\n gapSignals.push({ kind: \"no_assets\", message: \"No assets in scope\" });\n }\n if (assetReport.totalCost > 0 && activeScouts.length === 0) {\n gapSignals.push({\n kind: \"maintenance_only\",\n message: \"Scope has assets but no active scouting pipeline\",\n value: assetReport.totalCost,\n });\n }\n if (activeScouts.length > 0 && assetReport.totalAssets === 0) {\n gapSignals.push({\n kind: \"scouting_without_assets\",\n message: \"Scope has scouting pipeline but no owned assets yet\",\n value: sum(activeScouts, \"estimatedCost\"),\n });\n }\n\n const scopeWarning = scopedScouts.warning ?? assetReport.scopeWarning;\n return {\n scope,\n assets: assetReport,\n scouting: {\n activeScouts: activeScouts.length,\n activeEstimatedCost: sum(activeScouts, \"estimatedCost\"),\n shortlistCount: shortlistRows.length,\n shortlistEstimatedCost: sum(shortlistRows, \"estimatedCost\"),\n },\n gapSignals,\n ...(scopeWarning ? { scopeWarning } : {}),\n };\n}\n\nexport function scoutToQueueRow(\n scout: Record<string, unknown>,\n nowMs = Date.now(),\n): ScoutQueueRow {\n const sources = Array.isArray(scout.sources) ? scout.sources.filter(isRecord) : [];\n return {\n _id: stringValue(scout._id ?? scout.id),\n name: stringValue(scout.name, \"Untitled scout\"),\n status: stringValue(scout.status, \"unknown\"),\n priority: stringValue(scout.priority, \"none\"),\n estimatedCost: numberValue(scout.estimatedCost),\n ageDays: ageDays(scout._creationTime, nowMs),\n ...(sources.length > 0\n ? {\n sourceCount: sources.length,\n hasStarredSource: sources.some((source) => source.starred === true),\n }\n : {}),\n };\n}\n\nfunction comparePriority(a: string, b: string): number {\n const aIndex = PRIORITY_ORDER.indexOf(a);\n const bIndex = PRIORITY_ORDER.indexOf(b);\n return (aIndex === -1 ? PRIORITY_ORDER.length : aIndex) -\n (bIndex === -1 ? PRIORITY_ORDER.length : bIndex);\n}\n\nfunction ageDays(creationTime: unknown, nowMs: number): number {\n const created = numberValue(creationTime);\n if (created <= 0) return 0;\n return Math.max(0, Math.floor((nowMs - created) / 86_400_000));\n}\n\nfunction sum(rows: ScoutQueueRow[], field: \"estimatedCost\"): number {\n return rows.reduce((total, row) => total + row[field], 0);\n}\n\nfunction applyScope<T extends Record<string, unknown>>(\n rows: T[],\n scope: { projectId?: string; spaceId?: string },\n): { rows: T[]; warning?: string } {\n const key = scope.projectId ? \"projectId\" : scope.spaceId ? \"spaceId\" : null;\n const value = scope.projectId ?? scope.spaceId;\n if (!key || !value) return { rows };\n\n const rowsWithScopeData = rows.filter((row) => hasScopeValue(row, key, value));\n const anyHasScopeShape = rows.some((row) => hasScopeShape(row, key));\n if (!anyHasScopeShape) {\n return {\n rows,\n warning: `${key} filter requested, but REST payload has no relation data; totals are unfiltered`,\n };\n }\n return { rows: rowsWithScopeData };\n}\n\nfunction hasScopeShape(row: Record<string, unknown>, key: \"projectId\" | \"spaceId\"): boolean {\n if (typeof row[key] === \"string\") return true;\n const relationKey = key === \"projectId\" ? \"projects\" : \"spaces\";\n return Array.isArray(row[relationKey]);\n}\n\nfunction hasScopeValue(\n row: Record<string, unknown>,\n key: \"projectId\" | \"spaceId\",\n value: string,\n): boolean {\n if (row[key] === value) return true;\n const relationKey = key === \"projectId\" ? \"projects\" : \"spaces\";\n const relations = row[relationKey];\n if (!Array.isArray(relations)) return false;\n return relations.filter(isRecord).some((relation) => relation[key] === value || relation._id === value);\n}\n\nfunction categoryName(row: Record<string, unknown>): string {\n if (isRecord(row.category) && typeof row.category.name === \"string\") return row.category.name;\n if (typeof row.categoryId === \"string\") return row.categoryId;\n return \"Uncategorized\";\n}\n\nfunction numberValue(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n}\n\nfunction stringValue(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" && value.trim() ? value : fallback;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { ApiResponse, RequestOptions } from \"./client.js\";\n\nexport interface ResolveResourceOptions {\n resource: string;\n field: string;\n name: string;\n token: string;\n baseUrl: string;\n request: <T = unknown>(options: RequestOptions) => Promise<ApiResponse<T>>;\n}\n\nexport type ResolveResourceResult =\n | { ok: true; item: Record<string, unknown> }\n | { ok: false; status: number; message: string; candidates?: Record<string, unknown>[] };\n\nexport async function resolveResourceByName(\n options: ResolveResourceOptions,\n): Promise<ResolveResourceResult> {\n const res = await options.request<{ data?: unknown[] }>({\n method: \"GET\",\n path: options.resource,\n token: options.token,\n baseUrl: options.baseUrl,\n });\n\n if (!res.ok) {\n return {\n ok: false,\n status: res.status || 500,\n message: res.error ?? \"Request failed\",\n };\n }\n\n const rows = ((res.data as { data?: unknown[] } | undefined)?.data ?? []).filter(\n isRecord,\n );\n const expected = options.name.trim().toLowerCase();\n const matches = rows.filter((row) => {\n const raw = row[options.field];\n return typeof raw === \"string\" && raw.trim().toLowerCase() === expected;\n });\n\n if (matches.length === 0) {\n return {\n ok: false,\n status: 404,\n message: `No ${options.resource} found where ${options.field} is ${JSON.stringify(options.name)}`,\n };\n }\n\n if (matches.length > 1) {\n const candidates = matches.map((row) => ({\n _id: row._id ?? row.id,\n [options.field]: row[options.field],\n }));\n return {\n ok: false,\n status: 409,\n message: `Multiple ${options.resource} matched ${options.field}=${JSON.stringify(options.name)}`,\n candidates,\n };\n }\n\n return { ok: true, item: matches[0]! };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { coerceBodyFlag } from \"./flag-coercion.js\";\nimport { mergeBody } from \"./merge-body.js\";\n\nexport function sourceBodyFromFlags(\n opts: Record<string, unknown>,\n isUpdate: boolean,\n exitWithError: (status: number, message: string) => never,\n): Record<string, unknown> {\n const bodyFromFlags: Record<string, unknown> = {};\n const fieldSpecs = [\n { option: \"url\", field: \"url\", flag: \"--url\", kind: \"string\" },\n { option: \"name\", field: \"name\", flag: \"--name\", kind: \"string\" },\n { option: \"title\", field: \"name\", flag: \"--title\", kind: \"string\" },\n { option: \"description\", field: \"description\", flag: \"--description\", kind: \"string\" },\n { option: \"price\", field: \"price\", flag: \"--price\", kind: \"number\" },\n { option: \"image\", field: \"image\", flag: \"--image\", kind: \"string\" },\n { option: \"imageUrl\", field: \"image\", flag: \"--image-url\", kind: \"string\" },\n { option: \"address\", field: \"address\", flag: \"--address\", kind: \"string\" },\n { option: \"sourceType\", field: \"sourceType\", flag: \"--source-type\", kind: \"string\" },\n { option: \"condition\", field: \"condition\", flag: \"--condition\", kind: \"string\" },\n { option: \"notes\", field: \"notes\", flag: \"--notes\", kind: \"string\" },\n { option: \"starred\", field: \"starred\", flag: \"--starred\", kind: \"boolean\" },\n ] as const;\n\n for (const spec of fieldSpecs) {\n const value = opts[spec.option];\n const parsed = coerceBodyFlag(\n value,\n {\n field: spec.field,\n flag: spec.flag,\n kind: spec.kind,\n },\n exitWithError,\n );\n if (parsed !== undefined) bodyFromFlags[spec.field] = parsed;\n }\n\n if (!isUpdate && Object.keys(bodyFromFlags).length === 0 && !opts.body) {\n exitWithError(400, \"Provide source fields or --body JSON\");\n }\n return mergeBody(bodyFromFlags, opts.body as string | undefined);\n}\n","import type { ApiResponse, RequestOptions } from \"./client.js\";\n\nexport interface PurchaseScoutOptions {\n scoutId: string;\n token: string | null;\n baseUrl: string;\n assetName?: string;\n cost?: number;\n acquisitionDate?: number;\n dryRun?: boolean;\n request: <T = unknown>(options: RequestOptions) => Promise<ApiResponse<T>>;\n}\n\nexport interface PurchaseScoutResult {\n scout: Record<string, unknown>;\n assetBody: Record<string, unknown>;\n asset?: unknown;\n scoutUpdate?: unknown;\n dryRun?: boolean;\n}\n\nexport async function purchaseScout(\n options: PurchaseScoutOptions,\n): Promise<ApiResponse<PurchaseScoutResult>> {\n const scoutRes = await options.request<{ data?: unknown }>({\n method: \"GET\",\n path: `scouts/${encodeURIComponent(options.scoutId)}`,\n token: options.token,\n baseUrl: options.baseUrl,\n });\n if (!scoutRes.ok) return fail(scoutRes);\n\n const scout = unwrapRecord(scoutRes.data);\n if (!scout) {\n return { ok: false, status: 404, error: \"Scout not found\" };\n }\n\n const assetBody = buildAssetBodyFromScout(scout, options);\n if (options.dryRun) {\n return {\n ok: true,\n status: 200,\n data: { scout, assetBody, dryRun: true },\n };\n }\n\n const assetRes = await options.request<{ data?: unknown }>({\n method: \"POST\",\n path: \"assets\",\n token: options.token,\n baseUrl: options.baseUrl,\n body: assetBody,\n });\n if (!assetRes.ok) return fail(assetRes);\n\n const updateRes = await options.request<{ data?: unknown }>({\n method: \"PATCH\",\n path: `scouts/${encodeURIComponent(options.scoutId)}`,\n token: options.token,\n baseUrl: options.baseUrl,\n body: { status: \"Purchased\" },\n });\n if (!updateRes.ok) {\n return {\n ok: false,\n status: updateRes.status || 500,\n error: updateRes.error ?? \"Asset created but scout status update failed\",\n data: {\n scout,\n assetBody,\n asset: unwrapData(assetRes.data),\n },\n };\n }\n\n return {\n ok: true,\n status: 200,\n data: {\n scout,\n assetBody,\n asset: unwrapData(assetRes.data),\n scoutUpdate: unwrapData(updateRes.data),\n },\n };\n}\n\nfunction buildAssetBodyFromScout(\n scout: Record<string, unknown>,\n options: PurchaseScoutOptions,\n): Record<string, unknown> {\n const body: Record<string, unknown> = {\n name: options.assetName ?? scout.name ?? \"Purchased scout\",\n scoutId: options.scoutId,\n cost: options.cost ?? numericValue(scout.estimatedCost) ?? numericValue(scout.potentialCost) ?? 0,\n acquisitionDate: options.acquisitionDate ?? Date.now(),\n };\n\n for (const field of [\"organizationId\", \"categoryId\", \"heroImage\"]) {\n if (typeof scout[field] === \"string\") body[field] = scout[field];\n }\n return body;\n}\n\nfunction numericValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction unwrapData(data: unknown): unknown {\n if (isRecord(data) && \"data\" in data) return data.data;\n return data;\n}\n\nfunction unwrapRecord(data: unknown): Record<string, unknown> | null {\n const unwrapped = unwrapData(data);\n return isRecord(unwrapped) ? unwrapped : null;\n}\n\nfunction fail<T>(res: ApiResponse<unknown>): ApiResponse<T> {\n return {\n ok: false,\n status: res.status || 500,\n error: res.error ?? \"Request failed\",\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":["sum","isRecord","isRecord","program","getBaseUrl","isRecord"]}